Jesus is Alive CMNV now employs multiple full-time staff, alongside part-time, intern and probationary roles. Leave has to be endorsed by a supervisor and approved by a pastor. Probationary clocks have to be watched. End-of-day reports have to be filed and reviewed. No off-the-shelf HR tool models a church that way — so we built one that does.
A church staff is still a workplace. Jesus is Alive CMNV now employs multiple full-time staff, alongside part-time, intern and probationary roles — and every one of them accrues leave, files reports and sits somewhere in an employment lifecycle that has to be tracked properly.
Generic HR software assumes a corporate shape: a manager, a department, an approval. A church does not work like that. Staff belong to ministries as well as departments. Leave is endorsed by a supervisor but approved by a pastor. And Philippine labour practice puts a probationary clock on every new hire — miss the regularization date and the decision effectively makes itself.
CMNV did not need a smaller version of enterprise HR software. They needed one built around their own rules.
A complete staff management system on React and Supabase, covering six areas behind one login:
The interesting engineering here was not the screens. It was encoding how CMNV actually operates.
Approvals are configurable, not hardcoded. Leave routes through a workflow engine — workflows, ordered steps and approver rules — rather than an if supervisor then approve branch. Adding the pastor as a second stage meant adding a step, not rewriting the approval logic. When the rules change, the system changes with them.
Late filing has a real consequence, and it is disclosed up front. Filing a vacation inside its notice period is allowed — but the staff member is warned in plain language before they commit, the credits are still deducted, and the day is recorded as an absence. The approver still makes the call; the system just refuses to let it be a surprise.
The day ends in Manila. Every date boundary — what counts as today's EOD report, whether a leave request was filed on time — is computed in Philippine time rather than the server's timezone. It is the kind of detail nobody notices until it silently marks a report late.
The system has five roles: Super Admin, Admin, Supervisor, Staff and a read-only Auditor. None of them are enforced by hiding buttons in the interface.
Access rules are written as row-level security policies in Postgres, so a staff member querying the database directly still cannot read a colleague's leave record or a task they were never involved in. The interface reflects permissions; the database enforces them. For a system holding medical-adjacent leave records and employment decisions about real people, that distinction matters.
Comments are never hard-deleted — they are soft-deleted so the audit record survives, and sensitive actions across staff, roles, supervisors and tasks are logged.
Chosen so a small team can keep maintaining it — boring where boring is a virtue, typed everywhere it matters, and with the security model pushed down into the database rather than bolted onto the interface.
React 19 on TanStack Start, server-rendered, with file-based type-safe routing through TanStack Router.
TypeScript end to end, including database types generated directly from the Postgres schema.
Supabase — Postgres, authentication, and row-level security policies. TanStack Query handles server state on the client.
PostgreSQL, evolved across 31 versioned migrations as the model grew from a flat staff list into departments, ministries and positions.
Tailwind CSS v4 with Radix UI primitives, plus Lucide icons and Recharts for the dashboard.
React Hook Form with Zod schemas, so validation rules are declared once and shared between the form and the request.
Vite and Bun, built by Nitro and deployed to Cloudflare.
The one deliberate constraint: business rules live in Postgres, not in React. Approval routing, leave-credit deduction, the Manila day boundary and every access rule are enforced in the database, so they hold no matter what talks to it.
The first commit landed on 16 August 2026. The system was in the client's hands by the 26th — ten days and 258 commits later, including 31 database migrations as the model matured from a flat staff list into departments, ministries and positions.
That pace was possible because the scope was disciplined. Task ticketing stops at a Kanban: no sprints, no epics, no story points. The staff profile carries a biometric ID field that nothing writes to yet, reserved for the attendance import that comes later. Building only what the church actually needed is what left room to get the rules right.
The portal is deployed and the CMNV staff are working in it. Because it went live this week, we are not putting invented numbers on this page — we would rather come back and publish what actually changed once the team has run a full leave and reporting cycle through it.
What we can say is what it replaced: leave, reporting, tasks, staff records and probationary tracking had no single home. They do now, with an approval trail and an audit log behind each of them.
Off-the-shelf software makes you bend your process into its shape. We build internal systems around the way your organisation already works — churches and ministries included.
Book a Strategy Call →