Skip to content
pdcarlsonPublic

About

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

2,297 Commits

Folders and files

Repository files navigation

Frapp

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.

Modules are chat integrations

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.

AI

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.

Repository Structure

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.

Tech Stack

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.

A note on the two names

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.

Spec-Driven Development

All product decisions, behavior rules, and architecture are documented in the spec/ directory:

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.

Quick Start

About

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages