Three Next.js apps + one Cloudflare Worker API, sharing eight packages, one schema, one design system, one liturgical engine.
| App | Audience | Job-to-be-done | Phase 1 surfaces |
|---|---|---|---|
apps/faithful |
Parishioners, lapsed, seekers | “What should I do next?” | Now · Mass Finder · Pray · Learn · Serve · Threshold |
apps/parish |
Priests, deacons, staff, volunteers | “Give me back 15 hours/week” | Pastoral CRM · Homily Co-Pilot · Schedule · Charity Ops |
apps/diocese |
Bishops, chanceries | “Show me where my diocese is alive” | Vitality Index · Resource Flow · Solidarity Console |
apps/api |
All apps + partners | Single source of truth | Hono on Cloudflare Workers + D1 |
| Package | Purpose |
|---|---|
@lumen/ui |
shadcn-based design system. Tokens, basic tools, motion. |
@lumen/liturgy |
Liturgical calendar engine — computus, seasons, ranks, color, readings. |
@lumen/catechism-rag |
Doctrinal corpus retrieval. CCC, Vatican II, encyclicals, Doctors. Strict citation. |
@lumen/charity-graph |
Donor → Need → Outcome graph. Audit-trail-first. |
@lumen/vitality |
Parish vitality index calculation. Multi-factor, time-windowed. |
@lumen/i18n |
next-intl catalogs. en + es from day one; 10 more in Phase 2. |
@lumen/schema |
Zod types shared across apps. Person, Parish, Need, Gift, Citation, … |
@lumen/auth |
Auth helpers (Clerk / Auth.js). Anonymous-first for Threshold. |
@lumen/schema)Person ── attends ──▶ Parish ◀── of ── Diocese
│ │ │
│ └─ surfaces ─▶ Need ◀── verifies ── Outcome
│ ▲ │
└────── Gift ────────────────────────┘ │
│
Encounter (Mass / confession / group / homily) │
SafeguardingRecord (training / background / audit) │
Citation (every AI output) ─────────────────────────────▶ ─┘
Every AI call goes through @lumen/catechism-rag/invoke() which:
{ text: string, citations: Citation[] }.sacrament-substitution-refuser before returning.If a caller wants AI without citations, refactor the caller. There are no exceptions.
infra/cloudflare/). D1 for relational, R2 for blobs, Vectorize for embeddings.