Blog
Notes from building a tool that sits next to Claude Code and Codex all day.
- Codex vs Claude Code, from someone who wired into both I run both agents daily and built integrations against both of their extension systems. This comparison skips the benchmark reposts and covers what actually differs when you live in them: automation surface, session signals, workflow shape, and how to pick. 2026-08-15 · 5 min read
- Your DMG is notarized. The app inside it might not be. Signing, notarization, and stapling are three different things, and a ticket can be missing from four different places. How our release pipeline shipped a DMG whose inner app had no ticket, why that failure is invisible in your metrics, and the order of operations that fixed it. 2026-08-14 · 4 min read
- Your download count is lying to you Our first week showed 9 downloads and 1 install, which reads as a broken product. It was actually crawlers from OVH and AWS inflating the top of the funnel. How we classify bot traffic without an analytics SDK, and why the real fix was changing the denominator. 2026-08-13 · 5 min read
- Claude Code hook recipes: six configs worth stealing Beyond the finish notification: a permission-prompt alert, a turn journal, a guardrail for dangerous commands, auto-formatting after edits, a tests-must-pass gate, and forwarding to a local daemon. Complete configs, with the caveats that keep them from backfiring. 2026-08-12 · 4 min read
- localhost is not a security boundary Any web page your users visit can POST to their 127.0.0.1, no CORS preflight required. How we authenticate a local daemon with a token file, why denied requests still return 200, and two bugs we shipped anyway. 2026-08-11 · 5 min read
- Spaced repetition for programmers who quit Anki Developers are the ideal audience for spaced repetition and the worst audience for Anki. The problem is the contract, not the algorithm. Here is a guilt-free SRS design, with the actual scheduler we ship. 2026-08-11 · 5 min read
- Selling a desktop app with no accounts Unwait has no signup, no login, and no user database in the usual sense. Payment email is the identity, a license key is the credential, and lapsed users get a smaller app instead of a locked one. The design, and what real payments taught us that test mode did not. 2026-08-10 · 5 min read
- The invisible tar entries that broke our auto-updater macOS tar quietly stores extended attributes as ._ files, bsdtar hides them again on the way out, and a Rust tar parser turns them into real files that break your code signature. How our 0.1.6 update failed and the check that would have caught it. 2026-08-09 · 3 min read
- What Claude Code actually passes to your hooks Every Claude Code hook receives a JSON payload on stdin, and most example hooks throw it away. Here is the data contract for the events people actually wire up, and the things the payload cannot tell you. 2026-08-08 · 5 min read
- Building a macOS overlay that never steals focus Our overlay appears while you type in a terminal, so stealing a single keystroke kills the product. Here is the NSPanel setup that makes a window float without ever taking focus, in Tauri, with the traps we hit. 2026-08-07 · 4 min read
- How to get notified when Codex finishes Codex has a single notify hook in config.toml that runs a command when a turn ends. Here is the minimal setup, the JSON it passes as an argument, and the ways it is not like Claude Code hooks. 2026-08-06 · 4 min read
- Why your Claude Code hooks do nothing over SSH If you run Claude Code on a remote box, your hooks live on the wrong machine and anything they talk to is on the wrong localhost. Here is what actually breaks and the SSH config that fixes it. 2026-08-05 · 3 min read
- How to get notified when Claude Code finishes Claude Code has a Stop hook that fires the moment a turn ends. Here is the config for a macOS notification, a sound, and a version that works with several agents at once. 2026-08-04 · 3 min read