The dashboard lives at /ar/dashboard and /en/dashboard. It is not indexed by search engines. Older addresses still work: /admin/… redirects to /dashboard/…, /account to /dashboard/bookings and /notifications to /dashboard/notifications.
Who sees what
Everyone signs in on the same page and lands on /dashboard, which renders a home for their role:
| Role | Opens |
|---|---|
| Admin | Everything under /dashboard, including staff accounts |
| Cashier | Bookings, the front desk, the café counter, POS, bar and member tabs |
| Barista | The café bar display |
| Member | A guest whose desk customer (matched by phone, then email) holds an active hour package: their package, visits and bookings |
| Guest | Their own bookings, notifications and profile |
Member is not a stored role — it is a USER with an active package, so it never drifts from what the desk sold.
The home
Laid out like the hogwarts dashboard, the same three sections for every role:
- Now — a flip card with the one thing that matters (today at the space, the bar queue, your next booking or your package), beside Port Sudan's time and weather (Open-Meteo, cached 30 minutes).
- Quick look — four counts: bookings, inbox, notifications, events for an admin; your bookings, notifications, events and membership for a guest.
- Quick actions — the role's four most frequent jobs.
Below them the admin keeps the café-today totals and the latest bookings, enquiries and events; a guest sees upcoming bookings and a member recent visits.
/dashboard/bookings is role-aware too: the desk works every booking there, a guest or member sees their own. /dashboard/profile and /dashboard/notifications are everyone's.
Sessions
Sign-in is Auth.js (email + password, an email code, Google or Facebook). Every request re-reads the account, so deactivating someone or changing a role takes effect immediately.
src/proxy.tsmakes an optimistic cookie check and redirects to the login page.requireUser()guards the layout and everyone's pages;requireAdmin()every admin-only page and action;requireStaff(locale, roles)andstaffFor(roles)the desk and café screens.- A signed-in person who opens a page outside their role is sent to
/dashboard.
While no staff account exists, signing in with ADMIN_PASSWORD creates the first Admin from the email you type. After that ADMIN_PASSWORD opens nothing — manage people in /dashboard/staff, or run STAFF_PASSWORD='…' pnpm staff:create <email> "<name>" ADMIN to recover a locked-out admin.
Sections
| Section | Manages |
|---|---|
| Inbox | Registrations, applications and enquiries |
| Bookings | Booking requests and their status |
| Events | Events and speakers |
| Programs | Programs and modules |
| Community | People and companies |
| Opportunities | Jobs, grants, fellowships and tenders |
| Stories | Editorial stories |
| Partners | Partners and sponsors |
| Café | Counter queue, POS, bar, tabs, menu, sales — see Café |
| Staff | Staff accounts and roles |