Kevin Sundstrom

Changelog

Release notes for my projects, written and published by agentic content tooling. Currently tracking mdinterface and blueberry.

The app is now open source as blueberry — named for its icon.

  • MIT licensed, with CI running the 40-test suite on every push.
  • The store chain is configurable via KROGER_CHAIN, so availability works with any Kroger banner (Kroger, Fred Meyer, Ralphs, King Soopers, QFC, …), not just the one store it was built against.
  • Login uses a timing-safe passphrase comparison with a one-second delay on failures, and the iOS Shortcut endpoint can be gated with a SHORTCUT_TOKEN.
  • schema.sql was reconstructed to match the code — it had drifted behind by four tables and several columns, so a fresh install from the repo now actually works.
  • The README documents the full deploy path: Vercel + Neon, Kroger API credentials from developer.kroger.com, and an optional Anthropic API key for LLM recipe parsing.

Everything below is merged to main and will ship in the next npm release.

  • Notion comment awareness. A background poller watches the Notion page linked to the open document and surfaces new comments to Claude proactively, instead of waiting to be asked. Hardened over several iterations: polling suspends when the canvas isn't being viewed, a failed read backs off rather than being treated as "no comments," and the poll interval adapts to activity to cut API cost.
  • Deterministic Notion sync engine. notion-sync.js now computes the three-way sync verdict (insync / pull / push / conflict) and performs every git step itself — committing, moving the last-synced tag, writing pulled content. Claude does only the Notion I/O and content shaping; no hand-run git reconciliation, and conflicting edits are never clobbered.
  • Prompt-caching default. The embedded Claude session defaults to 1-hour prompt caching, so the first edit after a long reading pause no longer re-ingests the whole session. Overridable in either direction via environment variables.
  • Shift+Enter inserts a newline in the prompt bar; added a favicon; polished the no-file launch flow.
  • Installable app. Web app manifest, service worker, offline banner, and proper icons — add it to the home screen and it opens like a native app. The icon is a blueberry.
  • Smarter product search. The availability search cascade right-truncates queries first so brand names survive, skips conjunctions so "X or Y" ingredients don't fall through, and normalizes curly apostrophes before hitting the Kroger API.
  • Meal-plan week now runs Sunday–Saturday.
  • Fixed a Safari hydration error caused by reading localStorage during render.
  • One quantity parser everywhere. Fractions and ranges parse correctly, duplicate ingredients combine (½ cup + ½ cup → 1 cup), and genuinely ambiguous quantities are shown as-is rather than guessed at. A part-removal sheet lets you take one recipe's share back out of a combined quantity.
  • Purchase-unit picker. Items with known purchase units get a popover translating recipe amounts into what you actually buy — canned sizes, spice jars, dates by the container. A ✨ button asks AI for a suggestion when the unit isn't known, and overrides only persist once you accept them. Individually-counted produce (apples, limes, onions) is deliberately excluded.
  • Live availability. Items are checked against the Kroger API. Tuned to avoid crying wolf: several results are checked and the item counts as in stock if any match is available, and "low stock" only shows when nothing is definitively in stock.

A shared grocery list for two people, sorted by the store's aisle order, with recipe import. See the project page for the full picture.

  • One shared list. Both phones see the same state, syncing every few seconds and on focus.
  • Every item is its own database row with targeted updates — adding is an insert, checking off is a one-field update — so concurrent actions from two phones never collide. The UI updates optimistically and reconciles on the next poll.
  • Recipe import: paste an ingredient list or a recipe URL and the ingredients are parsed and classified into sections, with a review step before anything lands on the list.
  • Aisle order is configured once, then the whole list sorts to match how you walk the store. Checked items mute in place instead of reshuffling the list mid-shop.
  • Sign-in is a one-time passphrase per phone with a session built to never expire while you're standing in an aisle.
  • 40 tests exercise the real route handlers and middleware against an in-process Postgres — concurrent-edit merges, idempotent deletes, and session behavior are all proven directly rather than mocked.
  • Launch with no file argument: npx mdinterface opens an empty canvas with an in-browser file picker instead of requiring a path up front.
  • The MCP server now reports its correct version.
  • Added an npm run mdinterface script for running from a source checkout.
  • README leads with the npx flow; building from source moved to its own section.

node-pty — the native module that hosts the embedded Claude terminal — is now an optional dependency.

  • If the native build is missing or fails to install, mdinterface still launches: the canvas, file watching, and MCP tools all work, and the terminal pane shows a fallback message instead of crashing the app.
  • The spawn-helper binary's executable bit is self-healed at startup. The npx cache strips +x on some systems, which previously made the terminal fail to spawn until it was fixed by hand.

A capability change rather than a patch, hence the minor bump.

First public release of mdinterface: a rendered markdown canvas wired to a live Claude Code session, bridged only by the file on disk.

  • Highlighting a passage in the canvas sets both Claude's context and its edit scope — the selection rides along with every message via hooks, so a two-word instruction edits exactly that passage and leaves the rest alone.
  • A canvas_edit MCP tool lets Claude change the document without a prior read; a file watcher re-renders the canvas the instant the file is written.
  • Git-native Notion sync: a marker on the document's first line links it to a Notion page, with pull/push/sync verdicts computed three-way against the last-synced git tag.
  • Published on npm — run with npx mdinterface doc.md. Requires Node 18+ and the claude CLI. (0.1.0 was consumed by an npm unpublish; 0.1.1 is the first installable version.)