Thread lightly.
Spin up a thread. Keep what matters. Bobbin forgets the rest.
Bobbin is a small macOS menu bar client for the useful tasks that do not need to live forever in your main agent history. Open a thread, ask Codex, then get back to what you were doing.
Download the notarized Bobbin DMG, open it, and drag Bobbin to Applications. Bobbin requires macOS 14 or later and a locally installed Codex CLI.
Start in one click. Open Bobbin from the menu bar and begin a focused Codex thread without changing workspaces.
Let the small stuff fade. Unsaved threads become quieter with age and are deleted after seven days.
Keep what matters. Save a useful thread and it moves to the Saved section, exempt from automatic cleanup.
Each thread keeps its own controls:
| Control | What it changes |
|---|---|
| Model | Pick from the Codex models available to your account. |
| Reasoning | Set the effort to match a quick question or a harder piece of work. |
| Trust | Choose Auto review, Allow all, or Deny all for this thread. |
| System prompt | Edit the autosaved instructions inherited by new threads. |
| Folder | Point the thread at the workspace it should work in. |
Review modes map to the app-server like this:
Auto reviewis the default. It usesapprovalPolicy: on-request,approvalsReviewer: auto_review, and theworkspace-writesandbox.Allow allusesapprovalPolicy: neverand thedanger-full-accesssandbox.Deny allusesapprovalPolicy: neverand theworkspace-writesandbox. Approval requests are never routed to the review subagent.
- Runs
codex app-server --stdiowith an isolatedCODEX_HOME. - Keeps its conversations separate from the normal Codex and Claude Code histories.
- Uses ChatGPT device-code authentication by default.
- Asks before using an
OPENAI_API_KEYfound in the process or launch-agent environment. - Removes
OPENAI_API_KEYfrom the app-server environment until you explicitly opt in. - Defaults new threads to
gpt-5.6-lunawithxhighreasoning. - Supports multiple disposable threads, sorted by recent conversation time.
- Uses a template menu bar icon that adapts to light and dark menu bars.
Demo mode provides deterministic content for product screenshots and safe UI walkthroughs.
Launch with --demo-mode or BOBBIN_DEMO_MODE=1. Bobbin uses a throwaway directory under the system temporary directory and removes it on termination. It does not start codex app-server.
To show specific content, pass --demo-data /path/to/state.json or set BOBBIN_DEMO_DATA. This also enables demo mode. The file uses Bobbin's normal state.json format, so there is no second fixture schema to maintain.
Runtime data lives under ~/Library/Application Support/Bobbin/. Nothing there holds an API key, but two independent sets of conversation data accumulate: Bobbin's own state.json and Codex's isolated home under CodexHome/.
state.jsoncontains threads and the full text of every user and assistant message.CodexHome/auth.jsoncontains Codex credentials.CodexHome/sessions/*.jsonlcontains full conversation rollouts.CodexHome/logs_2.sqlitecontains Codex logs.CodexHome/memories/is a git repository containingMEMORY.md,raw_memories.md, and rollout summaries.CodexHome/state_5.sqlitecontains Codex state.CodexHome/models_cache.jsoncontains Codex's model cache.
The seven-day cleanup calls thread/delete and drops the thread from state.json. It does not clear CodexHome/logs_*.sqlite or CodexHome/memories/, so conversation traces continue to accumulate there.
Bobbin requires macOS 14 or later and a Codex CLI at one of the supported local install paths.
swift build
swift test
./scripts/build-app.sh /path/to/output-directoryThe packaging script creates an ad-hoc signed Bobbin.app. Pushing a vX.Y.Z tag runs .github/workflows/release.yml, which tests, builds a universal app, signs it with Developer ID, notarizes its ZIP and DMG with Apple, signs the Sparkle update, and publishes the GitHub Release. The tag must match CFBundleShortVersionString, and CFBundleVersion must be a positive, monotonically increasing build number.
The release workflow uses a manually approved release environment restricted to main and v* tags. It requires these environment secrets: BUILD_CERTIFICATE_BASE64, P12_PASSWORD, APPLE_ID, NOTARY_PASSWORD, and SPARKLE_ED_PRIVATE_KEY. Existing tags can be released through Run workflow by supplying the tag. scripts/release.sh remains available as the local fallback and uses the same packaging and verification path.
Release builds use Sparkle to check the signed appcast.xml attached to the latest GitHub Release once per day. The Settings menu also provides Check for Updates… for an immediate check.
The Bobbin mark is generated from one geometry source. Sources/BobbinIcon/MarkSpec.swift drives the app icon, menu bar template glyph, SVG export, and preview sheet, so there is no hand-maintained raster to drift out of step.
swift run bobbin-icon iconset build/AppIcon.iconset
swift run bobbin-icon template build/menubar
swift run bobbin-icon svg Resources/Icon/BobbinMark.svg
swift run bobbin-icon preview build/icon-preview.pngbuild-app.sh regenerates AppIcon.icns for every package. It fails unless the bundle declares CFBundleIconFile, contains a non-empty icon with a 1024 px representation, and passes a strict signature check. Generated .iconset and .icns files are not committed.
Protocol implementation follows the official Codex App Server documentation and is verified against bindings generated by the installed Codex CLI.

