A logbook for every coffee you brew.
Extraction Notes saves each brew to your device first and shows you what changed between cups.


Inside the logbook

Brew record: the setup and the cup it produced.
What it does
Log
Record as much as you want, from a score and a note to a full recipe with dose, grind, water and timed pours.
Compare and iterate
Save your next adjustment as a planned brew. After you brew it, put the two side by side and see which variables changed and whether the cup improved.
Works offline
Every entry saves to your device first and syncs when you reconnect. It's safe to log a brew with no signal without fearing data loss.
Share card
Your records stay private to your account. To show one to someone, export a brew or a coffee as a PNG card in one of three sizes.
How it’s built
Extraction Notes is an offline-first coffee logbook I designed and built end-to-end to develop my own palate as I explore the world of specialty coffee and help others do the same.
Up front, I decided that as a constraint, logging and search have to work with no signal. You might be logging on the train or need to check your notes on a bag while standing in a coffee shop. At the same time, you should be able to follow a recipe on your phone and write it up later on a laptop. The rest of the system design flows from there.
Writes are made on-device first. Every record is written to IndexDB, together with an entry in the sync queue. The sync engine then pushes versioned updates to Postgres in dependency order. On the pull-side, changes are retrieved by watermark, with conflicts resolved or left to the user when appropriate.
A small hand-written service worker keeps the app usable offline. Pages and route data are network first with a cached copy ready, while build assets are cache first. The decision to write the service worker from scratch rather than configure Workbox or Serwist came down to the fact that the hard part, caching Next.js route data safely for each account, required a custom implementation either way.
The browser syncs with Postgres directly through PostgREST with the user's token, where row-level security scopes every row to its owner. Next.js and Vercel handle sessions, validation, and rate limits when online. With no signal, logbook entries can still be written.
Why I Built Extraction Notes
This essay covers how getting into coffee became a logbook to help guide that journey.
“I couldn’t tell you why one was good and the other was bad.”
“Coffee gets better the more you pay attention to it, but paying attention shouldn’t detract from the experience of drinking it.”
Request demo access
Extraction Notes is invitation-only. Ask for access to look around, or to use it for your own coffee.
Designed and built by Andrew Leary. I read every request.




















