Row selection with a bulk bar: delete orders, delete/resend users,
delete/resend registration links. Each item runs independently with a
summary; failed rows stay selected. Orders table scrolls horizontally
on phones.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
My Orders: year calendar and lunch profile first, chips and "How you
compare" removed, open and paid payments merged into one table (open
first, then newest). Activity is now a line chart with a cumulative
switch and finer buckets (daily up to ~3 months, weekly up to ~13).
Cards get subtle elevation and tighter spacing.
Responsive: phone tab strip instead of the side menu, heatmap fits
narrow screens, grouped column-chart labels are truncated, the manager
weekday table scrolls instead of overflowing.
Tooling: viewports.mjs (presets, overflow detector), shoot.mjs --sizes
and --select, tests/responsive.ui.spec.ts, docs/ui-testing.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The backend now writes a timestamped tar.gz of the SQLite snapshot and all
per-order files to BACKUP_DIR on a cron schedule (default 03:00), keeps the
newest BACKUP_KEEP archives, and catches up once on start if a slot was
missed. Configurable via BACKUP_CRON / BACKUP_KEEP / BACKUP_DIR / TZ.
Includes user-facing restore docs in docs/backups.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Shared ChartCard/StatRow/CardGrid primitives for a consistent layout; fix
clipped axis labels, green 100% bars and uneven tiles
- One page-wide timeframe filter; period-over-period deltas on stat tiles;
per-period activity bars replace cumulative charts
- My Orders: lunch profile (personality, records, adventurousness), calendar
and weekday x hour heatmaps, anonymous community comparison. /api/stats/me
no longer returns other users' emails (organizers are numbered per response)
- Order Management: order insights, participant loyalty, median fill time,
regulars and drop-offs, submission heatmap, top item per weekday
- Site Overview: adoption funnel, weekly retention, order sizes, order value,
submission heatmap; active users now based on real contributions
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- src/dev/devenv.sh: run backend, Vite and Mailpit without Docker
- CONFIG_PATH env override for the backend config; optional Vite /api proxy
- src/e2e: Playwright API + UI tests (real email sign-in via Mailpit) and
shoot.mjs screenshot CLI
- Document the workflow in CLAUDE.md
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Per-user pages get fact rows from /api/stats/me and /api/stats/managed and
aggregate client-side; the site overview is aggregated by /api/admin/stats.
Items that need new data are tracked as TODOs in docs/statistics.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Poll for file changes (Vite, watchfiles) since host bind mounts don't deliver events
- Limit uvicorn reload to the app directory
- Dev nginx config re-resolves container names per request to avoid 502 after restarts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- GET /api/admin/orders (site admins only): orders with owner email and submission count
- ensure_owner_access also grants confirmed ADMIN_EMAILS users, so admins can manage/delete any order
- Order table with search (title/email), icon actions (inspect, manage, delete), no horizontal scroll
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Tabs inside one card, selected tab remembered across reloads
- Register and refresh buttons in the card header
- Table stats (count / selected) below each table
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Users and Registration links tabs
- Active, used and expired links in one filterable table
- Register-new-user popover and refresh button in the card header
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Admin API (/api/admin/users, registration links) guarded by require_site_admin:
confirmed profile email must be in ADMIN_EMAILS, checked server-side
- Block unverified switches to an admin email (PUT /me/profile, X-User-Email)
- Users table with registration date, activity counters, resend and delete
- Create, view (active/previous) and delete registration links
- user_profiles.created_at column with backfill
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
nginx defaults to 1 MB, so pasted screenshots failed with 413 and the order
was created without its image.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Notifications tab (create and admin view) to manage webhooks, event texts
and custom notifications
- Notification center card on the admin page for manual notifications
- Export restricted to order admins, optionally including notifications
- Payment details editable on existing orders (menu stays read-only)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Order admins can configure webhooks per order (admin-only endpoints, stored
next to the other per-order files and removed with the order). Preset events:
order created/closed/opened, last call and delivery started, with
customizable texts. Admins can define custom notifications and send manual
ones through POST /admin/notifications/send.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>