Completes the half-built dares feature: send a dare, respond, report done, confirm, and get a push notification on every transition. Backend (apps/api): - New `dares` domain with couple-shared premium entitlement, a free weekly send allowance, and server-enforced actor/state rules on every transition. - `submitted` status so the recipient reports completion and the sender confirms, rather than the sender guessing. - Notifications ride the existing operations outbox via a trigger on `sent_dares`. Push copy is generic; store compliance forbids dare text in a preview and a test asserts no payload leaks it. - Worker expiry sweep now covers `pending` as well as `active`/`submitted`; an invitation nobody opened previously stayed open forever. Fixes two latent defects: - Deleting any dare that had been sent aborted with a check violation, because `dare_id` is ON DELETE SET NULL while `sent_dares_dare_or_custom_check` required it. Dare text is now snapshotted at send time, which also keeps a couple's history stable across catalogue edits. - The free send allowance was raceable: concurrent requests all read the same count and every one succeeded. The count and insert are now serialized on the sender's profile row. Also ports `content_status` review metadata to the API catalogue, which had no store-safety gating at all, and mirrors the review decision already enforced on the legacy catalogue. Mobile: dares screen (active/send/history), send sheet with duration presets, home tile badging incoming dares, paywall on both proactive and 402 paths. Verified: lint, typecheck, 379 unit tests, build, 71 integration tests against local PostgreSQL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sauci
Sauci is a couples connection product built as a full-stack npm/Turborepo workspace.
Applications
| Path | Surface |
|---|---|
apps/mobile |
Expo React Native customer app |
apps/admin |
Vite/React administration app |
apps/web |
Next.js marketing and redemption app |
apps/supabase |
database, auth, realtime, storage, and Edge Functions |
apps/mcp |
authenticated internal MCP service |
packages/shared |
shared TypeScript contracts |
Bootstrap and run
Use Node 20.10.0 from .nvmrc, Docker-compatible containers, and tmux.
npm ci
scripts/dev-local.sh reset
scripts/dev-local.sh up
The launcher starts local Supabase, Edge Functions, web, admin, MCP, and Expo in one tmux session. See local stack documentation for ports, logs, native launch commands, and troubleshooting.
Verify
npm run verify:fast # lint, typecheck, unit/contract tests
npm run verify:full # fast checks, builds, Supabase integration
npm run verify:e2e # running-stack Playwright journeys
npm run verify # complete pre-PR gate
Native black-box flows use npm run test:mobile:e2e. Pull requests run static
and full-stack gates and retain browser traces/screenshots/videos on failure.
Agent harness
Start with AGENTS.md and the documentation index.
Task/risk agent routing lives in docs/agents/routing.md,
repository skills live under .codex/skills, and verified lessons follow the
learning promotion lifecycle.
Database schema changes must use committed files in apps/supabase/migrations.
Remote migration tools and DDL through MCP SQL execution are forbidden.