Extraction NotesExtraction Notes

A logbook for every coffee you brew.

Extraction Notes saves each brew to your device first and shows you what changed between cups.

Extraction Notes Home screen showing two active coffees with the share of each bag left, recent brews, logbook totals, a taste signal, and an up-next coffee.
Extraction Notes Home screen on a phone showing an active coffee with the share of its bag left, and recent brews.

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.

The system in three layers. In the browser or installed PWA, the React UI writes each record and its queue entry to IndexedDB through Dexie in one transaction, and a sync engine, running in one tab at a time and retrying with backoff, drains the queue and applies pulls, talking to Postgres directly, scoped by row-level security. Page loads go through a service worker, network first for pages and route data and cache first for build assets and images. When online, page loads and Server Actions reach Next.js 16 on Vercel, which checks the session with Supabase Auth, writes to Postgres and uses Upstash Redis for rate limits.The system in three layers. In the browser or installed PWA, the React UI writes each record and its queue entry to IndexedDB through Dexie in one transaction, and a sync engine, running in one tab at a time and retrying with backoff, drains the queue and applies pulls, talking to Postgres directly, scoped by row-level security. Page loads go through a service worker, network first for pages and route data and cache first for build assets and images. When online, page loads and Server Actions reach Next.js 16 on Vercel, which checks the session with Supabase Auth, writes to Postgres and uses Upstash Redis for rate limits.

Share cards

An exported share card on a dark background for a brew of Gedeb Duna Hills, with its cup score of 9, tasting notes, brew specifications, timed recipe, taste ratings and result note.
Espresso
The same share card on a pale background, with the same brew record.
With Milk

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.”

Andrew Leary · 4 min read
Read the essay

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.

What would you like access for? Choose one or both.

Optional

I use these details only to decide on access and reply to you. See the Privacy Policy.