Skip to content

Live — free, open source coming

Analytical Ledger logo

Analytical Ledger

correctness, enforced.

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

118
Account chart-of-accounts library, structured for multi-entity consolidation.
PostgreSQL
Exact-decimal money on NUMERIC(20,4) — no floating point anywhere in the ledger.
23
Vitest suites that run against a real, trigger-enforced Postgres — not mocks.

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.

Front end

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.

Middleware & services

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.

Back end & data

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.

API paradigms

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.

Authentication

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.

Payments & commerce

None. This is a general ledger, not a storefront — it records money, it doesn't collect it.

AI & agentic layer

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.

Delivery & testing

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.

Invariant in the database

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.

Exact money, no floats

NUMERIC(20,4) with decimal.js arithmetic. No floating-point rounding creeps into a balance sheet that has to reconcile to the cent.

Tested against real triggers

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.

Use It, or Build On It

Want a system that can't
get the math wrong?

Analytical Ledger is free — go run your own books on it. And it's the same discipline we'd bring to anything you need built around money: tell us what you're trying to ship, and we'll hold it to this standard.