Live — free, open source coming
Analytical Ledger
A multi-entity, double-entry general ledger we built to run 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. Now it's free for anyone — real accounting, correct to the cent, every entity in one place and yours to keep. Free to use, funded by donations, with the source opening soon. This page is the engineering underneath; the product itself lives at analyticalledger.com.
At a Glance
NUMERIC(20,4) — no floating point anywhere in the ledger.What It Is
The books we run on — now free for you to run yours.
We built it to keep our own group's multi-entity books honest: separate legal entities, intercompany transactions eliminated on the consolidated view, every statement tracing back to balanced journal entries. It worked well enough on our books that we opened it up — it's free to use, funded by donations, with the source opening soon.
It's also 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 — twenty pages across the app, free to use, with its home at analyticalledger.com. Self-host it with an embedded Postgres, or run it in your own cloud on Vercel and Neon.
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 sprawling public API surface to secure, by design.
Auth.js v5 with OAuth sign-in via Google and Microsoft Entra ID (Microsoft 365). Each deployment is yours — you run it, you own the accounts and the data.
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 systems that protect correctness.
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.
Your Data Is Yours
Our books stay ours. Yours stay yours. No vendor can lock either of us out.
The same design that keeps our own group's accounts private keeps yours private too: you run your own deployment, so the data never passes through us. Self-host it with an embedded Postgres, or run it in your own cloud on Vercel and Neon — either way it's your data on your infrastructure, and you can export to CSV and QBO anytime. The engineering is what we'll always show: the schema approach, the trigger discipline that enforces balance, the exact-money design, and the AI-proposes / human-approves / triggers-validate loop. Whose numbers sit inside any given deployment is never ours to put on the table.