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.
For most of Booky's life, the backend trusted whoever the app said was logged in — fine until it isn't. This chapter closed that gap end to end. Every server request now carries a signed identity that Booky verifies before it touches a single row; the app can no longer simply claim to be you. Your receipt images and uploaded files became strictly one-owner — a stranger holding a link can't pull them, run OCR on them, or delete them. Behind the scenes, the machinery that was never meant to face the outside world got sealed off, and same-amount transfers in different currencies stopped quietly matching each other. None of it changes what you see; all of it changes who's allowed to see it. It's the least glamorous kind of work, and exactly the kind that lets you stop thinking about it.
When the model behind receipt OCR vanished out from under production one night, scanning went dark. The fix wasn't a swap — it was a three-tier fallback chain: if the primary reader is down, Booky quietly drops to the next, and then to an on-device reader, before it ever tells you it can't read a receipt.
The budget started this stretch as a fairly rigid thing — pick your 50/30/20, colour inside the lines, get told off when you don't. Six weeks turned it into something with a point of view. You can now carve your own spending groups instead of living inside three fixed buckets. Booky can read your last few months and propose a budget that actually looks like your life, instead of a blank slate. Subscriptions get quietly reserved off the top so they stop ambushing you. And the hard ceilings finally came down: the target ratio became a reference line you can measure yourself against, and the groups became folders you organise, not walls you slam into. The budget stopped nagging and started advising.
For weeks Booky on a phone was Booky-on-a-desktop, shrunk. This chapter rebuilt it into something you'd actually reach for one-handed on the couch. Lists run edge to edge the way a native app does; accounts became a deck of cards you swipe through; whole cards became tappable instead of hunting for a tiny link; a bottom bar showed up where your thumb already lives. The Budget page — the densest screen in the product — reached full parity with the desktop instead of dumping you back to a browser. And dark mode, which had been quietly broken on mobile, finally looked like someone designed it on purpose. Booky never shipped to an app store, but somewhere in this week it started feeling like it had.
Most finance apps end the month with a silent number. Booky grew a monthly wrap-up that reads the room. Come in under budget and it celebrates with you; come in over and it doesn't scold — it sits with you and points at what's worth looking at next month. A small health badge now rides on the dashboard all month, so the verdict isn't a surprise on the 30th. It's the first thing in Booky that isn't really about the money — it's about how you feel walking away from it.
The spending donut used to be a picture you looked at. Now it's something you dig into — tap the vague "Others" wedge or the "Uncategorized" slice and it opens onto the actual transactions underneath, and a parent category unfolds into child chips you can peel off one at a time.
Subscriptions moved from a flat list to a timeline you can read forward — what's charged when, what's coming next. And the "upcoming bill" card on the dashboard became a door: tap it and you land right where that subscription lives.
Matching a receipt to a bank line used to be a one-shot guess. Now editing a transaction re-runs the match behind it — mis-read a date on a receipt, correct it, and the pairing quietly re-settles. And a class of bugs where a confirmed merge would swallow a linked transfer got closed for good.
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.
The entire charting layer was swapped from one library to another with nothing on screen allowed to flinch — same charts, new foundation, zero visual regressions.
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.