Snap receipts and screenshots as you spend. Booky keeps business and personal expenses sorted so filing is a few taps, not a weekend.
Snap a receipt, and it sorts itself. Here's the 30-second tour.
No credit card. No spam. Just a heads-up when it's ready.
Build log
The actual commits behind the product — pivots, reverts, and Jill's third rewrite of the codebase. Newest at the top.
A month after Budget grew its 50/30/20 backbone on May 10, the answer side of the page was still mostly numbers in a list — useful, but not the kind of thing that catches your eye on a Sunday evening. Two weeks of #582 work fixed that. A sub-category diagnostic layer breaks down where each Needs / Wants / Savings group is actually going. Overspending categories get surfaced in calmer, recognisable colours instead of alarm reds. A pacing bar shows where you are vs where you should be at this point in the month. A burn-up chart plots cumulative spend against the on-pace line so you can see if you're trending toward over- or underspend. A stacked macro trend chart shows three months of Needs / Wants / Savings layered on top of each other. The Top Categories card moves from a concentric ring (hard to read at a glance) to a clean horizontal leaderboard infographic. The donut on the budget detail page gets consolidated and typography quietly upgraded all the way through. The page stopped being a worksheet and started being a story about your month.
Nine days of design-system work underneath the UI — a token SSOT, ~100 sites swept onto a small typography role set, radius / shadow / motion / z-index token families, an oklch + zinc colour engine, and reusable shapes (EmptyState, PageHeader, StatusPill, StatValue, FieldLabel, Logo, chart legend, dropdowns) each consolidated into one source of truth. Nothing functionally moves; the surface stops looking like the product of three rewrites.
The blog post cards used to render Booky's marker as a generic placeholder. This commit drops in a real B icon (drawn from scratch — no source asset existed) so a Booky post is recognisable at a glance.
Booky lived its first six weeks as a free experiment — receipts in, transactions out, no money changing hands. This commit puts its first real plans up where the world can see them: they appear on the pricing card right next to Meander's, share the same monthly/yearly toggle, the same 14-day trial. The card itself grew the bones to hold two products' plans at once — same UI, two services. Up to today the only product in the family with a subscribe button was Meander; from here on, Booky has its own — and Jill's third rewrite of the codebase stops being just a free experiment.
One day of tightening every edge where Booky's matching brain had been making decisions without telling you. Duplicate detection stops hard-blocking and asks first. Reverse reconciliation comes back — you can merge a pending hit into a settled one, the way it used to before it broke. Split-orphan children get folded back to their parent so they stop showing up as ghosts. Amount input gets a single source of truth across every form. None of it visible at a glance — and that's the point.
From this commit on, the page does double duty: hit it normally and you see the plans; deep-link with ?tab=topup and you land straight on the credit-pack picker. Same surface, two paths.
A day of iteration on Booky's upgrade page in preparation for plans going live: the Meander honest-proration dialog gets ported across, the free plan CTA stops pretending to be clickable, and a back-to-Booky link iterates four times in one afternoon until it sits where you'd expect.
No single big feature, just a deliberate sweep across the parts of Booky you talk to most: plan tiers settle on Basic / Pro / Premium with a shared paid-tier helper, the cryptic "Keywords" surface becomes Automations (because that's what they actually do), and account fields stop saying things like "Type" or "Account" and start saying "Starting Balance", "Paid from", "Bank Account". A handful of categories-modal polish and a shadcn Tabs migration round out the day.
All the quiet judgement Booky does behind the scenes — spotting duplicates, linking transfers, matching pending receipts, guessing categories — used to live only inside the website. This week it moved into Booky itself, so the same brain can answer for the Android version (and anywhere else Booky shows up next). The first 207-case test suite landed the same day to make sure nothing went sideways during the lift.
Budget used to be a flat list of categories answering "how much did this cost?" — useful, but not the question that changes how you spend. This week it grew a shape: you anchor a monthly income at the top, every category falls into Needs / Wants / Savings (the classic 50/30/20), and the page asks the better question — are you spending the way you said you would?
Booky catches up with the cross-product legal refresh — its own /terms and /privacy now live.
A stretch of days where no big feature shipped but a lot of small things stopped feeling rough — softer surfaces, lighter borders, calmer warnings (the old amber gives way to a new Ghost Orange), a friendlier Analysis chart with a zoom picker, plus a handful of papercuts cleaned up along the way. Booky starts breathing the same air everywhere.
Sign in with Google on the web meant to land in Android? The web now hands you back already signed in, instead of stranding you in a browser. First piece of plumbing for the Android version.
Until this commit, every date in Booky was reasoned in UTC under the hood. For Jill and Beer in Australia — eleven hours ahead — that meant a coffee bought after midnight kept landing on yesterday's books, and subscription renewals fired on a clock that wasn't theirs. This commit closes the gap, for everyone — not just AU. The first time you open Booky now, it auto-detects where you are, the timezone falls into place, and the matching currency snaps in alongside it (both overridable from a combined "Region & Currency" panel). Four phases shipped on a single day to make this hold everywhere — and Booky's dates finally line up with your wall calendar, wherever it's hanging.
Picking All / Income / Expense at the top of the Analysis page now updates the chart and the cashflow numbers too — before this, the filter only changed the table below.
Bottom nav extracted into a single source so the four main pages stay consistent, the Profile page rebuilt from scratch with sectioned settings, sub-pages get back buttons, and a slide-up filter sheet replaces the desktop sidebar on History. Using Booky on a phone stops feeling like a port and starts feeling native.
Up to this commit, snapping a receipt sent the photo straight into OCR. If your shot was crooked, the model either choked or quietly mis-read a number — and the only way to find out was to check the resulting transaction. From here on, every OCR entry point goes through a preview dialog first: the image lands in front of you, auto-rotated upright if it was sideways, and you get a chance to spin it manually before anything is read. It turns OCR from a one-shot guess into a conversation — Booky asks "is this what you meant?" before it commits.
Multi-receipt batch upload lands. Before, you scanned one receipt at a time; now drop a whole stack and Booky processes them together.
Up until now, Booky lived inside its own browser tab. You logged in, you scanned receipts, you saw your transactions — all from one place. From this commit on, Booky speaks. The Android client gets a way in. Mate gets a way in. The first time a photo travelled through Mate and came back as a real transaction, in the right account, with the right category, the loop closed: it wasn't just Booky sharing a login with the rest of the family any more — it was Booky becoming addressable, the way Moltfi and Meander already were. Joined the ecosystem properly.
Two big things in the same commit. The third architectural rewrite of the codebase — Jill cleaned the patterns up once more, separated containers from presentation, tightened the types. And buried in the same diff: receipt OCR. Snap a photo, get a structured transaction back. Worth pausing on the OCR side. Jill is a web designer by trade, not a coder. Building OCR used to be a serious programmer's job. She did it herself, with AI filling in the parts she didn't know. Neither of us quite believed it shipped on the same Friday as a structural rewrite.
First time Booky existed at a URL anyone could open. Up until this point it ran on Jill's laptop and our dev server, full stop. The first deploy didn't go smoothly — the first build broke on a dependency conflict and getting it green took an extra round of fiddling. The day after, another small commit just to re-trigger the deploy with the right git author. Deploys are like that. The thing that mattered was: there was a URL, the URL worked, and the site lived on the internet.
The multi-currency story finally lines up. Daily exchange rates pulled in automatically, so totals across currencies actually mean something.
First real data-lifecycle feature. Implies trust in undo, not just trust in delete.
Booky stops being something only Jill could log into. From this commit on, every record knows whose record it is, every action knows whose account it's running for, and the front door checks your subscription with everydays.tools before letting you in. Single-user prototype on day one; multi-tenant SaaS on this day. Same product, different shape underneath.
Bills don't pay themselves and people forget. Tracking them as data, not as memory.
Two big moves the same day. The single-file backend monster, where everything had piled up early on, gets carved into one file per concern — accounts, categories, budgets, the rest. Then the Python service that had been sitting alongside it as a parallel backend gets deleted in one sweep. From this commit on, Booky has one backend instead of two, written in one language instead of two. The polyglot phase ends here.
react-virtuoso, reverted, shipped batch mutations insteadSame afternoon, three commits: a WIP adding react-virtuoso, a revert with the message "unstable", and finally a fresh approach using useTransition + optimistic UI for the same scrolling problem. Shiny library lost. React primitives won. No extra dep.
When you import a bank CSV, you might already have entered some of those transactions manually. Reconcile finds the matches by amount/date/description and asks you: same one? merge or skip? Without this, every import creates duplicates. With it, manual + automatic entry can finally coexist.
The bet: this is a real product, not a notebook. Time to commit to a frontend stack.
A simple expense tracker on top, and underneath, a small Python helper that pulled transactions out of PDF bank statements. The PDF obsession was there before almost anything else. That obsession is still the spine of the product today — most banks here don't give Jill clean exports, just statements. Booky was born to deal with that.