Skip to main content

Documentation Index

Fetch the complete documentation index at: https://grantmaster.dev/llms.txt

Use this file to discover all available pages before exploring further.

GrantMaster — Launch acceptance criteria

Launch target: July 1, 2026 · Product: GrantMaster — one operating system for an NGO’s full grant lifecycle.
What “launch-ready” means: all ten criteria below can be completed end-to-end on the Acme NGO fixture (or a real pilot tenant) within 72 hours of July 1, 2026. Each ties to a concrete user journey — not a feature checklist.
#What a user can doWhere it lives in the product
1A Grants Manager moves a won application to an active project in one confirm dialog — no re-entry of budget, reporting calendar, or compliance items./grant-control → “Set up project” button → HandoffConfirmDialog with prefilled budget lines + milestones + reporting frequency → Confirm.
2A Finance Lead opens any expense and, in one screen, sees its project, grant, budget line, approver chain, status, and the report it will flow into — every link clickable with the target record auto-opening./finance/expenses?expenseId=X auto-opens the detail modal. RelatedLifecyclePanel at the bottom links upstream (project → grant) and peers. Same pattern on project + grant detail.
3An Operations Director opens a single cockpit and sees truthful counts of pending approvals, upcoming report deadlines, active compliance alerts tied to specific grants, and at-risk budgets. Every count drills to the record, row-for-row./admin/overview — four flagship tiles: Approvals (with type drill-rows), Compliance alerts, At-risk budgets, Deadlines. Counts come from adminCockpitBuilders.ts, fed by live Firestore aggregates.
4A grantor with a tokenized link views the submitted report for their grant with all linked evidence documents, and acknowledges. The acknowledgement pings the grant manager’s inbox and cockpit badge.https://grantmaster-portal.web.app/<token> — read-only portal workspace. Report includes linked expense/journal/document IDs from the standalone reports collection.
5An Auditor traverses application → approvals → expenses → journals → documents → submitted report → acknowledgement for one grant, read-only. Write attempts denied at the Firestore rules layer./audit-dashboard — drilldown panel on each surface walks the chain. Read-only enforced by (a) role-based UI, (b) Firestore rules (launch-invariants.test.ts — 51/51 passing).
6Any state transition produces a visible signal to affected users — in-app toast if live, bell badge for the next session, email for critical transitions. No silent workflow state.eventNotificationSubscriber bridges EventBus events → notifications Firestore collection → NotificationContext → bell badge + NotificationCenter popover. Sonner toasts fire locally on approve/reject.
7A new tenant provisioned via SuperAdmin or the demo-tenant seeder has a populated surface on every launch-scope page — no dead empty containers.scripts/seed-demo-tenant.ts produces a fully-linked tenant namespace (projects, grants, expenses, journals, documents, reports, compliance alerts, portal tokens) in under a minute.
8Production deploys follow a documented runbook with a tested rollback, Firestore backups have been restored once on a throwaway project, Sentry captures errors from app + Cloud Functions with alerting, and core operational metrics are visible.docs/operations/runbooks/launch-deploy-runbook.md — pre-flight → staging → prod → rollback. Sentry wired at sentryBrowser.ts + functions/src/core/sentry.ts. Daily Firestore export at 03:00 UTC, 30d + 12m retention.
9Legal paperwork is live — privacy policy, terms of service, DPA template, sub-processor list, DPIA template — at grantmaster.dev/legal/*. A pilot NGO signs with their procurement team without a legal gap.Public routes /legal + /legal/:slug with six scaffolded documents. Cookie consent banner (GDPR-compliant UX) gates optional tracking. Sentry initialisation deferred until opt-in.
10Every PR merge passes the 5-role Playwright launch pack + Firestore rules tests + status-literal check + drilldown/reports/compliance E2E specs. Launch-critical regressions fail the merge, not prod.CI runs: launch-role-pack.spec.ts (5 role-scoped journeys), launch-invariants.test.ts (51 rules tests), check:status-literals, plus priority-specific probes. Non-gating launch-demo.spec.ts smokes the narrative walk.

The product in one paragraph

GrantMaster is the operating system an NGO runs its full grant lifecycle on — from discovering a Dutch RVO opportunity, through building an application and winning an award, to executing the project with journal + expense approvals, publishing reports to funders with evidence attached, and surviving an auditor’s traversal of the entire evidence chain. Every record is connected. Nothing requires re-entry. The funder sees what you want them to see through a secure portal. The auditor sees the unfiltered truth under read-only rules. And the solo founder running operations sees one cockpit with pending approvals, budget risk, and compliance alerts — every number drillable to the underlying record.

The stack (what we bet on)

  • Frontend — React 19, TypeScript, Vite 6, Tailwind CSS 4, shadcn/ui, React Query, tRPC
  • Backend — Firebase (Firestore + Cloud Functions 2nd gen + Storage + Auth), Postmark email, Google Gemini (AI)
  • Observability — Sentry (frontend + Node), Google Cloud Logging + Trace
  • Testing — Vitest (~250+ new tests this session series), Playwright (10+ launch-gate specs)
  • Data discipline — Zod at every write boundary, canonical status registry with 242 → 236 → 0 ratchet, Firestore rules locked to tenant-isolation invariants

What this page is NOT

This is not a feature catalogue. It’s an outcome-bar — each criterion is a user journey we commit to shipping, not a widget we built. If a criterion is green on July 1, that journey works for a real NGO team on real data.
Prepared for the GrantMaster launch, July 1, 2026. Maintained in docs/product/launch-acceptance-one-pager.md — run pandoc or your tool of choice to produce a PDF when sharing externally.