About
ProjectionLedger is a local-first desktop app for tax projections. It runs multi-year, multi-scenario federal 1040 projections for a client on the practitioner’s own machine, with math that ties out to the dollar and a “show the math” trace behind every figure. It exists so a preparer can sell and deliver planning work without trusting a black box or handing taxpayer data to a cloud service.
It is for CPAs, EAs, and tax preparers first, and it is not dumbed down.
- A federal 1040 engine for TY2025 and TY2026. Brackets, capital-gain stacking, Schedule SE, QBI with the wage and SSTB limits, AMT, NIIT, the child tax credit, and itemized versus standard with the SALT cap.
- The 2026 OBBBA provisions. Qualified tips, overtime, vehicle-loan interest, the senior deduction, and the non-itemizer charitable deduction.
- K-1 pass-through modeling. S corp and partnership box 1, guaranteed payments, SE earnings, per-entity §199A.
- The app today. Encrypted client files, instant preview, named scenarios side by side, a trace on every figure, and an advisor-workpaper PDF export.
- Six MCP tools, read and propose only. There is no accept tool. Humans accept in the UI.
Status: the engine milestone is complete. The app is an unreleased alpha, and I am its only user. The domain is registered and shows a placeholder. There is no state layer yet, and the external tie-out to commercial tax software has not been run. I will not call the math validated until it has.
Where it fits. TaxClaw prepares a return. Tax Prep Ledger proves a return’s workpapers. ProjectionLedger projects, and never files or produces a signable return. It shares no engine with TaxClaw; its engine grew out of the survivor tax planner I built for the AI Lab.
How I built it
Nineteen days, 69 commits, 86 numbered decisions, all sole-authored with Claude Code, starting 2026-08-14 from my own build kit.
- Two engines, one truth. The Python engine is the authority. The TypeScript port the UI calls is held to exact parity in cents.
- Rules as data. No tax constant lives in calculation code. Each year is a JSON file with a primary-source citation per figure. An unknown year throws instead of falling back.
- A boundary grid, not a vibe check. 532 TY2025 cases and 580 TY2026 cases are generated by the engine and reproduced byte for byte on every run, so drift cannot hide.
- The sidecar verifies everything. A frozen Python engine runs as a bounded child process. Nothing is saved or exported without it recomputing every stored result and trace.
- Agents cannot touch output. Proposals may only change namespaced inputs, labels, and notes. As the design doc puts it, an agent that can write the trace can make the workpaper agree with itself.
