Chat is the spine. Frapp is a multi-tenant chat app for Greek-letter organizations in which every other capability — events, tasks, dues, points, polls — is a chat integration, surfaced inline in the conversation rather than parked behind its own nav tab. Chat itself is free, unlimited, and non-optional: it is the default landing route on web and mobile.
Tiers, audience, vocabulary, and the rest of the positioning live in
spec/product/positioning.md.
An ops module ships as the same three surfaces rather than as a bespoke feature:
- a slash command in the composer — the primary way members create and act on artifacts;
- one or more rich message renderers, keyed off the artifact
kind; - an optional dashboard view — only when a calendar, kanban, or leaderboard materially adds something, and always secondary to chat.
Modules are gated per chapter, and the gating rules have qualifiers worth reading before you write a
check against them — absence is not disablement, and the always-on lock is a UI lock. They are
stated once, in spec/behavior/integrations.md § Module Gating.
Which modules exist is MODULE_CATALOG in
packages/org-archetypes; the pattern and the invariants every renderer
must honour are in spec/behavior/integrations.md. Those two
disagree today — the spec's prose roster omits two modules that ship slash commands, tracked as
#2468 — so read the catalog as the mechanism and
the spec as the pattern.
Frapp's AI surface (Q&A, summarization, drafting, suggestions) answers from the chapter's own sources and cites every answer. Official sources rank first, and that is the product decision rather than an implementation detail — an AI that is reliably right instead of one that is frequently embarrassing.
Prose is indexed and retrieved: meeting minutes and transcripts, uploaded chapter documents, formal announcements, and chapter-channel chat from members who agreed to it. Live structured data — officer roster, events, dues amounts, points balances, attendance — is never embedded; the model reads it at answer time through the same permission-guarded API endpoints the rest of the product uses, so structured answers are correct when given and inherit the caller's permissions. DMs are never read, vault documents are excluded, and every answer must cite its source inline.
It is built on the ai-integration branch and switched off. The API's ai module, web's
Ask card and the phone's Ask sheet exist there, behind one server switch, AI_ENABLED, which is
off by default everywhere. With it off every AI route answers 404 and neither client draws an AI
entry; a frapp://ask link goes to Chat home. With it on, a chapter still sees nothing until its
president turns a feature on and a member's role may use it. Scope, non-goals and the citation
mechanism:
spec/behavior/ai.md.
apps/
api/ — NestJS REST API (realtime is Supabase Realtime)
web/ — Next.js admin dashboard (app.frapp.live)
mobile/ — Expo mobile app (iOS + Android)
landing/ — Next.js marketing site (frapp.live)
packages/ — shared workspaces (`@repo/*`): API SDK, chat hot path, theme, hooks, validation, …
spec/ — Product spec, behavior spec, architecture, environments
supabase/ — Supabase project config + migrations
docs/ — Developer guides and runbooks (no Next.js docs app)
The per-package inventory lives in
spec/architecture/README.md § 4, not here. The
hand-written copy this file used to carry had drifted on two of its fourteen entries, which is the
argument against keeping a second one.
Turborepo + npm workspaces. NestJS (TypeScript, strict) on the API; Next.js App Router with Tailwind
and ShadCN UI on web and landing; Expo / React Native with Expo Router and RN StyleSheet on
mobile. Postgres, auth, storage, and realtime are all Supabase. Billing is Stripe; push is the Expo
Push Service; CI/CD is GitHub Actions with Vercel and EAS.
The canonical table is
spec/architecture/README.md § 1.
The product is Frapp (ADR-25, 2026-09-23). Signet is
the design system's internal name, so you'll see it in tokens (--signet-*), file names and
design-system specs. It never appears in user-visible text: ADR-25's code steps have all landed,
and scripts/ci/__tests__/frapp-naming.test.mjs fails a Signet string in any surface's copy.
Code identifiers, the root npm package name, the Expo slug, the iOS bundle id
(live.frapp.mobile) and the domains are frapp permanently. The binding rule is
spec/ui/brand-identity.md § 1.
All product decisions, behavior rules, and architecture are documented in the spec/ directory:
- spec/product/ — Features, user flows, surfaces, onboarding.
- spec/behavior/ — Rules, edge cases, invariants, error handling.
- spec/architecture/README.md — Stack, data model, auth, storage, API contracts.
- spec/environments/README.md — Environment model (local, staging, production); CI/CD.
How spec/ relates to code, and what to do when they disagree: AGENTS.md § Spec vs code.
Documentation map (guides + runbooks + how they relate to spec): docs/README.md.
- Set up a machine and run the stack: docs/guides/getting-started.md, the one step-by-step setup, from clone to a healthy API.
- Per-app commands, no-Infisical fallback, mobile, and URLs: docs/internal/environment/LOCAL_DEV.md.
- Working on a change: CONTRIBUTING.md.
- Environment model: spec/environments/README.md. Every variable, per app and environment: ENV_REFERENCE.md.