

The problem
In most NGOs the activity, the field report that proves it happened, the expense it caused and the budget line it was charged to live in four different places — a spreadsheet, a WhatsApp group, a paper form and an email thread. Approvals leave no record, field staff work where the signal drops, and every donor report is rebuilt by hand from whatever can be found.
My approach
I built one spine rather than a pile of modules: grant → project → budget lines → activity → field report (offline) → supervisor review → M&E validation → indicator results, and alongside it expense request → approval chain → payment → budget position → donor report pack. It is deliberately not an ERP, a payroll engine or a donor CRM. A new organisation registers and gets starter departments, budget categories, approval policies and a report template, so the core workflow runs on the first day.
How it's built
- A Next.js 16 modular monolith (App Router, Server Actions) on PostgreSQL with Drizzle — each area owns its queries, actions and business rules, and the pages stay thin.
- Multi-tenant from the start: every query is scoped by organisation, and project-scoped roles see only their own projects — enforced in server actions and API routes, not just hidden in the interface.
- Field reports work offline: saved on the device first and synced with an idempotent client id, so a retry on a bad connection never files the same report twice.
- Configurable approval policies by amount band, request type, grant and department; nobody approves their own request, and approval is never mistaken for payment.
- Built-in mail: each person connects their own mailbox over IMAP/SMTP, kept live with IMAP IDLE and pushed to the browser over Server-Sent Events, with credentials encrypted (AES-256-GCM) and any email filed against a grant, project or request.
- An append-only audit log with before-and-after snapshots, and every export recorded.
Highlights
- One record from plan to proof: a validated field report feeds the indicator results automatically, and an approved expense moves the budget line's live position.
- Reported, reviewed and validated figures are kept separate, so a donor can see which numbers M&E has signed off.
- Present mode turns live figures into board-meeting slides whose titles state the takeaway — no deck to build.
- A per-grant donor report pack: the award, financial summary, results against targets, delivery and evidence for any period.