Internal platform — built, not publicly launched
A multi-entity, double-entry general ledger that runs our own group's books — holding company, operating brands, consulting arm — with intercompany elimination on consolidated statements. It's built correctness-first: the database itself rejects a posting that doesn't balance. The full interface is built and runs internally for the group — it simply isn't publicly launched, so there's no link to share. We show the engineering; we never quote the data.
At a Glance
NUMERIC(20,4) — no floating point anywhere in the ledger.What It Is
The books we run on, built the way we'd build yours.
It's an internal platform, not a product for sale — one more piece of the portfolio we own and operate. It keeps the group's multi-entity books honest: separate legal entities, intercompany transactions eliminated on the consolidated view, every statement tracing back to balanced journal entries.
We reference it here because it's the clearest proof of a discipline we bring to anything that moves money. If you need a system where correctness isn't a hope but an enforced invariant — accounting, billing, reconciliation, ledgers of any kind — this is the standard we'd hold your build to.
The Stack
Audit it in sixty seconds.
What's built, layer by layer — major framework versions where they matter. We name what runs and keep schemas, security internals, and the data itself off the page — omission over invention is the whole point.
Next.js 16 with React Server Components, React 19, and Tailwind CSS 4. The full interface is built — twenty pages across the app — but it runs privately for the group and isn't publicly launched, so there's no link to share.
Server Actions handle writes; a request-proxy layer attaches the session and applies security headers on every request; a daily cron digest surfaces the review backlog and overdue periods over Resend email and Slack; an ETL importer ingests CSV and OFX with idempotent dedupe and a rules engine.
Drizzle ORM over PostgreSQL, seven migrations to date. Money is exact — decimal.js over
NUMERIC(20,4), never floats. Multi-entity double-entry with
intercompany elimination, built on a 118-account chart of accounts. PL/pgSQL
triggers physically reject an unbalanced posting at the database layer —
correctness enforced below the application, not just inside it.
React Server Components and Server Actions — not REST-first. A handful of route handlers cover report exports, authentication, and the cron digest; there's no public API surface, by design.
Auth.js v5 with OAuth sign-in via Google and Microsoft Entra ID (Microsoft 365). Access is internal only — the system isn't open to the public.
None. This is a general ledger, not a storefront — it records money, it doesn't collect it.
Claude (Haiku) proposes transaction categories through structured tool calls with prompt caching. The rule is fixed: AI proposes, a human approves, and the database triggers validate. The model is a suggestion engine — it never has the final word on a posting.
Hosted on Vercel; CI gates every change. The test suite runs against a throwaway Postgres with the real triggers installed, so the same invariants that guard production guard the tests. Digest and alert delivery run over Resend and Slack.
What a Technical Reviewer Will Notice
The parts that don't show up in a demo.
PL/pgSQL triggers reject an unbalanced journal entry at the storage layer. An application bug can't write books that don't balance — the database won't let it.
NUMERIC(20,4) with decimal.js arithmetic. No
floating-point rounding creeps into a balance sheet that has to reconcile to
the cent.
The 23 Vitest suites run on a throwaway Postgres with the production triggers loaded — the correctness rules are exercised, not mocked away.
Engineering, Never Data
We'll walk you through how it works. We'll never show you whose books it holds.
Because this ledger runs our own group's real accounts, the data stays private — always. What we can show a serious reviewer is the engineering: the schema approach, the trigger discipline that enforces balance, the exact-money design, and how the AI-proposes / human-approves / triggers-validate loop is wired. On request, we'll do a live walkthrough of the mechanics against scratch data. The books themselves are never on the table.