mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 18:19:43 +00:00
Replace the Supabase application data plane with the Node/PostgreSQL API, migrate mobile, admin, web, and MCP callers, add controlled cutover tooling, and define hardened Dokploy infrastructure.
2.5 KiB
2.5 KiB
System architecture
Sauci is an npm workspace coordinated by Turborepo.
| Component | Technology | Responsibility |
|---|---|---|
| Mobile | Expo / React Native / Expo Router | primary customer product |
| Admin | Vite / React | content and administrative operations |
| Web | Next.js App Router | marketing, policies, redemption |
| API | Node.js / Hono / PostgreSQL | customer data, authorization, and workflows |
| Worker | Node.js / PostgreSQL-backed jobs | scheduled and asynchronous work |
| Auth | Hosted Supabase Auth | identity issuance and account recovery only |
| MCP | Hono / MCP SDK | authenticated internal administrative tools |
| Shared | TypeScript types | cross-application contracts only |
Trust boundaries
- Mobile and web use public Supabase credentials only for Auth. Application data is available exclusively through the versioned Sauci API.
- The API verifies Supabase access tokens against the hosted public JWKS and derives user, couple, and administrative authority server-side.
- PostgreSQL and object storage are private infrastructure and are never exposed directly to clients.
- Administrative access requires both an authenticated identity and role checks.
- The hosted Auth service-role credential is confined to the API's Auth Admin account-deletion and identity-enrichment calls; it is not a product-data credential and is not provided to the worker, MCP, or clients.
- MCP authenticates callers with
SAUCI_MCP_API_KEY, then calls the standalone admin API usingSAUCI_ADMIN_API_URLand a scopedSAUCI_ADMIN_API_TOKEN. It has no database, Supabase data-plane, or storage credentials. The API maps the service token to an active admin identity and owns authorization and audit evidence for every mutation. - Local product-data verification uses only loopback PostgreSQL/API services. Authenticated native acceptance may use only the designated hosted non-production Auth project and disposable fixture identities, never production.
Product flow
Two profiles join a couple, answer questions independently, and an API transaction creates a match when answers are compatible. Authenticated domain events surface matches and chat messages to the partner.
Change boundaries
- Database shape: API-owned migration plus shared contracts and affected clients.
- API contract: integration tests plus calling UI/store behavior.
- Shared contract: update every consumer in the same change.
- UI flow: component/unit coverage and observable E2E evidence.