Google-SSO PWA for bistro employee clock-in/out, admin employee management, and stats with CSV export. Express + SQLite backend, React + Zustand frontend in the light-mono-tui design language. Multi-stage Dockerfile, compose.yaml for image-based deploys, nginx reverse-proxy template, and an OKF documentation bundle in docs/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.0 KiB
2.0 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | |||
|---|---|---|---|---|---|---|---|
| Architecture Overview | System overview | How the EatMe frontend, backend, and database fit together. |
|
2026-08-12T00:00:00Z |
System overview
EatMe is a small monorepo with two independently-runnable apps that ship as one Docker image in production.
backend/— Express + TypeScript API, SQLite viabetter-sqlite3(entry pointbackend/src/index.ts). Owns all state: employee whitelist, attendance events, sessions.frontend/— Vite + React + TypeScript PWA (entry pointfrontend/src/App.tsx). Talks to the backend only over/api/*; in dev, Vite proxies that path tohttp://localhost:4000(seefrontend/vite.config.ts).
Request flow
- Employee/admin signs in with Google Identity Services in the browser (ID-token flow, no server-side OAuth redirect) — see Auth flow.
- The frontend POSTs the Google ID token to
POST /api/auth/google; the backend verifies it, issues its own JWT session cookie, and from then on every/api/*call rides on that cookie (credentials: 'include'infrontend/src/api/client.ts). - All app logic (fetching, polling, derived state) lives in Zustand stores
under
frontend/src/store/— see Frontend. Components are thin consumers of store selectors/actions. - In production the backend also serves the built frontend as static files
(
dist/public/, see Deployment) — one process, one container, one origin.
Design language
The UI follows the "light monochrome TUI" style defined at
~/doc/concepts/ui/light-mono-tui.md: grey page background, black type and
1px borders, mono font, inverted fills for active/hover state, no accent
colors, no border-radius. Implemented as plain CSS tokens in
frontend/src/styles/tui.css.