Deduplication was a one-time recovery
The measured duplicate pair occupied 13% of the pack. Retirement solved the immediate volume problem while keeping the older block in the library and search.
A product-and-engineering account of a local-first project context hub: who it serves, what crosses the network boundary, what an AI may write, and what changed only after the system met real work.
Spool is for people carrying several long-lived workstreams across tools that do not share memory: researchers, graduate students, developers, and people building something alone. The common cost is not “taking notes.” It is having to reconstruct the same project for every new AI conversation — which paper matters, which decision already failed, and what changed since last week.
The product sets a deliberately narrow target: re-entering a project should cost one paste, not an archaeological dig through chats, mail, tabs, and half-remembered decisions. It sits upstream of document tools. A project is a quiet, append-only log, not a collaborative canvas or a replacement for Notion.
Research boundary. The first version was built by dogfooding against the developer’s own multi-project workload. That produced useful reversals, but it is not external user research; validation with other users remains a post-release step.
Three verbs form one loop. None of them needs a model in the critical path.
The desktop interface, MCP server, and CLI engine slot are three local surfaces around one source of truth. The diagram separates “runs on your machine” from “belongs to the Spool process” so the network claim can be inspected rather than inferred.
spool-ai subprocess each contact a provider. Spool’s own process
makes no HTTP request and listens on no network port; it has no HTTP client compiled into it at all. The
API engine is the one route that holds a key, it is off until you turn it on, and the key lives in the
system Keychain rather than in Spool’s settings file.The GUI and capture overlay communicate with the Rust/Tauri core locally. That core owns one
SQLite database. Running spool --mcp exposes the same library over stdio to an AI
client; the CLI engine slot instead starts Claude Code, Codex CLI, or Gemini CLI as a separate
process. Gemini supports Weekly Review and draft goals, but not Follow Up. The API engine is the
third route and the newest: it starts spool-ai, a small binary shipped inside the app that
takes one JSON request on stdin, makes one HTTPS call, and writes one JSON envelope back. It refuses
plain http://, and the key reaches it only through stdin — never through the command line,
where any process on the machine could read it. All three routes preserve the same distinction:
what Spool does locally, and what another process does on the network.
Reading and writing are separate permissions. Content leaves the machine only inside a program the user installed and authorised; the program that crosses the network is named at each path.
| Path | What can cross | Network client |
|---|---|---|
| MCP client | What the client explicitly reads from the local stdio server | The external AI client |
| CLI engine action | The project blocks required by the chosen action | Claude Code, Codex CLI, or Gemini CLI; Gemini excludes Follow Up |
| Anything else | Nothing | None |
On macOS, Spool ships directly as a Developer ID–signed, Apple-notarised disk image. The Mac App Store is not the distribution path because sandboxing conflicts with the system-wide capture gesture. The application and the disk image are checked separately: users download the wrapper, so a notarised application inside an unnotarised disk image is not enough. The Windows installer is produced by CI and ships unsigned in this first release — a certificate is a recurring cost against an unproven platform, and pretending otherwise on the download page would be worse than SmartScreen's warning.
Release evidence
89ebaceb-f883-4b1c-a6eb-86392769d132 Acceptedf7a15d9a-737d-4132-a54e-578d9f41fd7f Accepted84625dbSpool_0.4.0_aarch64.dmg933b9a7fb10a25f72cbd922c7c0a1d89fe02ef83b6a3885fba0dc0ec08b7df54accepted · source=Notarized Developer ID · both artifactsSource: Case Study Ledger §1.2, captured 2026-08-08.
Inspect the release and its assets on GitHub. The website’s stable download URL points to the fixed-name copy published alongside the versioned artifact.
The case-study ledger records commands and source evidence for every public figure. Two measurements changed product priorities rather than merely describing the finished system.
The measured duplicate pair occupied 13% of the pack. Retirement solved the immediate volume problem while keeping the older block in the library and search.
From one plain-language request, an external client created a project and filed 11 blocks averaging 970 characters. It recovered from 2 errors without help, then used the pack tool to check its work.
A separate live web-search run cost approximately $0.45 and exposed failures that mocks and prompt inspection had not revealed.
The useful unit in a postmortem is not the patch; it is the guard that remains.
A development build met a newer live schema and took an unconditional rebuild path. Recovery carved 33 blocks from SQLite free pages, but project titles were gone. The durable changes were fail-closed migrations, a named migration registry with cross-language version checks, automatic pre-migration snapshots, isolated on-device builds, and a rule that first-run seed data is reachable only from an empty database.
Follow-up findings required a source URL, yet 2 of 3 proposals omitted it because the model placed links in its closing message. The prompt was made field-specific; the next measured run produced links in 5 of 5 proposals. The standing rule is now simple: text in a prompt is not a behaviour until a real run proves it.
A state selector allocated a new array on each call and triggered an infinite render. Nothing in the automated suite opened a packaged window. Release verification now includes looking at the isolated signed build; visual health is no longer inferred from compilation.
There is no placeholder video. The interactive browser demo walks through the capture → project → pack loop; the screenshots above are from the current isolated desktop build.
Spool is designed and built by Ocean (KIM-ocean-HZ). Source, roadmap, and the full product constitution are on GitHub; reproducible public figures live in the Case Study Ledger.