Doc status: Latest (rolling). See Versions.
This roadmap is intentionally written as a phased plan with clear, reviewable deliverables. It covers both delivery work (apps + backend) and organisational readiness (governance, approvals, volunteers). Version tags represent documentation + interface snapshots, not marketing.
Phase 0 — Definition & invariants (v0.1.x)
Exit criteria
- Requirements are explicit: roles, join-by-invite, alert trigger, admin pause/ban/broadcast
- Data minimisation invariants are explicit: no exact addresses; avoid exact lat/lng where possible
- Authorization invariants are explicit: all privileged actions verified server-side
Artifacts
- Versioned docs snapshot (see
/v/<version>/) - API contract list (endpoints + auth header expectations)
Phase 1 — Accounts, approvals, and operational prerequisites (v0.2.0)
Scope (non-code, but blocking for release)
- Apple Developer account
- Enrol and verify organisation (or individual initially, if needed)
- Set up App Store Connect access roles
- Google / Android release readiness
- Create Play Console account
- Set up signing keys and release tracks
- Emergency / critical notifications approval
- iOS: request the appropriate entitlements/approval for loud/critical alerts (external process)
- Define a policy for when emergency alerts may be used (misuse controls)
- Business / NFP structure
- Decide and create the legal entity structure (NFP/charity/co-op as applicable)
- Basic governance: directors/owners, bank account, record-keeping
- Volunteer operations
- Roles, onboarding, code of conduct, access control (who gets admin rights)
- Basic moderation/incident-review workflow (even if manual)
- Publicity and partnerships
- Messaging and community outreach plan
- Identify local partners (council/community groups)
- Funding
- Identify grant opportunities and prepare an evidence/impact plan
Exit criteria
- Release accounts and approvals are in progress or obtained
- Governance/ownership and admin access model is defined
- A minimal volunteer onboarding plan exists
Phase 2 — MVP implementation (v0.3.0) ✅
Scope
- Sign-in (
@react-native-firebase/authnative SDK — Google Sign-In + Sign in with Apple) - Join group via invite code
- Register device for push notifications
- Trigger incident → push fan-out to group
- Encrypted incident payload for address package (on-device only): AES-256-GCM + ML-KEM-768 envelopes (optionally signed with ML-DSA-44)
- Admin: pause/ban member, broadcast
Integration checklist
- Wire up
@react-native-firebase/authnative SDK in:- Mobile (iOS/Android) — initializes via
google-services.json/GoogleService-Info.plist - Admin web (Cloudflare Zero Trust + Microsoft Entra ID SSO)
- Mobile (iOS/Android) — initializes via
- Configure Cloudflare Worker environment (prod):
- Firebase project id
- Service account JSON (secret)
- iOS critical alerts flag (only if approved)
- Deploy:
- Worker API via Wrangler
- Admin web (hosting choice; keep minimal)
- Docs via Cloudflare Pages (custom domain:
nwatch.incitat.io)
Exit criteria
- End-to-end flow works on iOS + Android (non-critical audio behavior acceptable)
- Server enforces membership + role checks for privileged endpoints
- Minimal PII stored (reviewed)
- No plaintext addresses stored or logged; address package decrypts only on recipient devices
Testing checklist (MVP)
- iOS: push receives reliably (foreground/background), expected alert tone/behavior
- Android: notification channel importance/sound set correctly
- Abuse checks: paused/banned user cannot trigger alerts
- Manager actions: create invite, ban/pause, broadcast
Phase 3 — Verification & hardening (v0.4.0)
Scope
- Contract tests for API endpoints
- Abuse controls (rate limiting + dedupe where relevant)
- Audit logging (server-side event trail)
Exit criteria
- Basic abuse scenarios tested and mitigated
- Operational logging sufficient for incident reviews
Phase 4 — Operational readiness (v0.5.0)
Scope
- Monitoring/alerting for API errors and push failures
- Runbooks (how to ban, revoke invites, respond to abuse)
- Staging environment parity (where practical)
Exit criteria
- On-call / maintenance burden is low and documented
- Clear rollback and incident response procedure exists
Phase 4 — Enhancements (v0.5.0+)
Candidate items (only if they don’t violate the minimal UX constraint)
- Multi-group membership
- Incident lifecycle (acknowledge/close) with strict permissions
- Admin audit log UI
- "Join a different group" in-app option
See the Feature Backlog for detailed specifications on each item.
Phase 5 — Licensing & payments (v0.6.0) ✅
Scope
- Stripe integration (REST API, no SDK) for group license subscriptions
- License types: paid (Stripe) and granted (super admin)
- License statuses: active, expired, revoked, trial
- Stripe Checkout flow (monthly / annual plans)
- Webhook processing: checkout.session.completed, invoice.payment_succeeded, invoice.payment_failed, customer.subscription.deleted
- License gate on incident triggering (402 if no active license)
- Payment records and notification log
Admin dashboard
- Group license status display
- Stripe checkout initiation (monthly/annual)
- Payment history per group
Super admin dashboard
- All licenses overview (with grant/revoke)
- All payments overview
- User role management (standard/manager/super_admin)
- All users and groups listing
Exit criteria
- End-to-end payment flow works (checkout → webhook → license activation)
- License enforcement blocks alerts for unlicensed groups
- Super admin can grant/revoke licenses manually
- Payment records stored for audit
Phase 6 — Critical Alerts & notification hardening (v0.7.0)
Scope
- iOS Critical Alerts entitlement: Apply to Apple for the Critical Alerts entitlement; update APNs payload to include
{ "sound": { "critical": 1, "volume": 1.0 } }once approved. Critical Alerts bypass DND, silent mode, and Focus. - Android alarm-priority channel: Create a dedicated notification channel with
IMPORTANCE_MAX,setBypassDnd(true), andfullScreenIntentto wake the device and play an alarm sound until acknowledged. - Alert persistence: Write alerts to local storage on receipt; display an "Active Alerts" list in the app; alerts remain until a manager resolves the incident from the admin dashboard.
- Incident lifecycle: Manager can resolve/clear an alert from the admin dashboard → push sent to group confirming resolution → app updates alert status.
- Admin audit log: Full audit trail in admin dashboard — super admin sees everything; managers see only their group(s).
Action items
- Submit Apple Critical Alerts entitlement request (external process)
- Add
ACCESS_NOTIFICATION_POLICYpermission + alarm channel config plugin for Android - Implement full-screen intent activity for Android alert display
- Implement in-app alert persistence (AsyncStorage or SQLite)
Add "Resolve Alert" endpoint + admin UI✅ Done —POST /v1/admin/groups/:gid/incidents/:iid/resolve+ Incident Detail modalBuild audit log page in admin dashboard (super admin vs manager scoping)✅ Done — Audit Log tab with role-scoped filtering + incident notes with visibility levels
Exit criteria
- Alerts sound at full volume and bypass DND/silent on both platforms
- Alerts persist in-app until manager resolves
- Admin audit log shows all relevant actions with role-based scoping
See the Feature Backlog for detailed specifications.

