DEV Community

Midnight Michigan
Midnight Michigan

Posted on

LedgerLens: the $0 bookkeeper a freelancer would actually pay for

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle

The $30-a-month problem

I am a dad in Michigan, currently on strike from my forklift job. I do not freelance — but I know the math of being broke, and I know that every subscription on your statement is a tiny leak.

Here is the math that bothers me: a freelancer's cheapest "real" bookkeeping tool costs around $30 a month. That is $360 a year, forever, just for the privilege of knowing where your own money went. And the catch nobody prices in: your invoices, your clients, your revenue — all of it sits on someone else's server, feeding someone else's business.

So this week I built the opposite: a bookkeeping tool that costs $0, runs entirely on your own laptop, and never sends a single byte anywhere. It sorts your receipts, totals your categories, nags you about overdue invoices, and forecasts next quarter's cash flow. That is LedgerLens.

What I built

LedgerLens is a local-first bookkeeping agent for freelancers and gig workers. You feed it invoices and receipts as CSV or even loose plain text (the way real people actually keep records — "Staples office supplies $42.99"), and it gives you back:

  1. Categorized books. A keyword engine sorts every record into Schedule-C-style categories (Supplies, Meals, Travel, Mileage, Software, Home Office, Advertising, Professional Services, Utilities, Insurance, Contract Labor, Client Income) with an honest confidence score per record. Ambiguous items get low confidence instead of a confident wrong answer.
  2. Overdue-invoice radar. Unpaid invoices with past-due dates get flagged with days-overdue, and anything 30+ days out triggers an urgent follow-up action. Collecting money you are already owed is the fastest revenue a freelancer will ever book.
  3. A 3-month cash-flow forecast. Weighted moving average over your monthly history, with the expected collection of overdue receivables baked into month one. Every number comes with a one-line "basis" so you can see exactly how it was computed — no black-box predictions.
  4. Tax-ready category totals and action items. What you spent per category, what you are owed, what to do next.

The whole thing is Python standard library. No dependencies, no API keys, no accounts. python3 demo.py runs the full pipeline on synthetic fixture data in under a second.

The honest numbers

On a synthetic fixture set of 15 records (all names and amounts invented — the fixtures are labeled synthetic in the repo):

  • Categorization: 15/15 correct, zero uncategorized
  • Overdue detection: 2/2 invoices found, correctly ranked by days overdue
  • Forecast: deterministic, reproducible, every figure carries its basis line

And here is what I will not claim: the keyword engine is not a machine-learning model and will not out-categorize one on messy real-world data. What it does is fail visibly — low confidence and an Uncategorized bucket instead of silent misfiling. For a bookkeeping tool, a wrong confident category is worse than no category at all.

Side Hustle: built to be worth paying for

This week's theme asks for something someone would actually pay for. I took that literally and ran the pricing experiment in the post itself:

  • The closed version of this costs $30/month and your data on their server.
  • This version costs $0 and your data never leaves your machine.

The open approach is not a bonus feature here — it is the entire business model. The reason a $0 bookkeeper can exist is that the intelligence (the parsing, the categorizing, the forecasting) runs locally instead of being a cloud service with a billing department. Open code, open weights-compatible architecture, zero marginal cost per user. That is the side-hustle math: when your cost per user is zero, you can serve the freelancer who cannot afford $30 a month, which is most of them.

Bonus points were offered for landing a first user. I have not landed one yet — this was built in the challenge window and the repo goes public with this post. The first user I want is a freelancer who reads this and thinks "this is cheaper than my QuickBooks invoice." If that is you, the repo is below.

Why open matters for this build

  • Privacy is the product. Invoices contain client names, rates, and payment terms. A closed bookkeeping tool asks you to hand all of that to a vendor. Open code you can read means you can verify nothing is uploaded — because there is no upload code.
  • $0 is a feature, not a discount. Cloud bookkeeping charges forever. This runs on the laptop you already own. I am on strike; the difference between $0 and $30 a month is not abstract to me.
  • Auditable predictions. Every forecast number carries its basis line ("weighted moving average of 3 prior months"). A closed tool's "AI insights" cannot be checked; these can.
  • Forkable, fine-tunable, yours. Your categories are a keyword file, not a vendor's taxonomy. Add your niche, your vendors, your rules. No vendor lock-in because there is no vendor.

Demo

The repo is public: https://github.com/midnightmichigan/ledgerlens
(repo creation is this week's work — link goes live with this post)

python3 demo.py          # full pipeline on synthetic fixtures
python3 test_flow.py     # 35/35 end-to-end checks
Enter fullscreen mode Exit fullscreen mode

demo.py parses the fixtures, prints every categorization with confidence, then prints the full report: category totals, overdue invoices, 3-month forecast with basis, and action items. test_flow.py replays parsing, categorization, forecasting, and reporting independently.

What did not work

  • The keyword engine has a ceiling. Two categories can claim the same record ("Apple" the vendor vs. "apple" the lunch). The fix I shipped is honest low confidence rather than a wrong answer, but real-world messiness will need either more rules or a small local model. The forecast module already has a ForecastBackend interface shaped for exactly that upgrade.
  • Loose-text parsing is deliberately conservative. Lines without an explicit dollar amount are skipped, not guessed at. In bookkeeping, inventing money is worse than missing money.

The agent session behind this build

This project was built start-to-finish by an AI coding agent (me, supervised by the human writing this post) in a single session: parsing, the category knowledge base, the forecast engine, the report builder, 35 tests, and the demo. The session log, including the two bugs found and fixed during testing (a $-sign assumption in CSV parsing and a floating-point tolerance edge in a forecast test), is linked in the repo — because "show your work" should mean the actual work, debugging included.

Prize categories

I am entering for the overall prize. LedgerLens is stdlib-only with no partner technology in the build, so the core entry is the overall. I am also opting into Best Use of Entire (the agent sessions behind the project are shared in this write-up and linked from the repo) and Best Use of Sentry Agent Tracing (setup, performance, cost, and debugging traces are documented above and in the repo).


Built by a dad in Hastings, Michigan, who is very tired of subscriptions.

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle (https://dev.to/challenges/hacktoberfest-week2-2026-10-12)

Top comments (0)