Repository navigation
Releases: bbesner/pocket-code
Release list
1.94.0 / build 187
Pin and unpin in one click. Every conversation in the list now has a pin beside its ⋯ button: faint gray on an unpinned conversation (click it to pin) and orange on a pinned one (click it to unpin); clicking the pin does not open the conversation. Pin conversation is now the first choice in Conversation options. The row's separate pin mark is gone (the button shows the state). Frontend only: no server, data or settings migration. Requested by Damon.
1.93.0 / build 186
Finding a secret and answering the Vault is easier: newest-first list with search and a New mark, links that open one secret, a one-sentence request with an orange Allow once and Deny, notification body tap opens the request, a failed notification Allow says why. Requested by Damon. PR #224.
1.92.0 / build 185
Requested by Brad: a measurement of four weeks of his Claude Code use found that long conversations, not the models' own writing, used most of his plan (65% of the cost came from requests made after a conversation passed 200K tokens), and that subagents ran on the same model as the conversation that started them. He asked for a context limit and a subagent policy in Pocket itself, for every agent, with a choice of how and when to compact. This release is phase 1 of the spec.
- Policy.
context-policy.mjschecks and readscontextPolicy(compaction.modeagent|limit,compaction.limit50K–1M;workers.modeldefault|tier-down;workers.effort) and turns it into each engine's launch options. The default changes nothing, and saving the default storesnull. - Claude Code.
spawnRunneraddsenvto--settings:CLAUDE_CODE_AUTO_COMPACT_WINDOW,CLAUDE_CODE_SUBAGENT_MODEL(opusunder Fable or Mythos,sonnetunder Opus) andCLAUDE_CODE_SUBAGENT_EFFORT.--settingsoutranks~/.claude/settings.jsonenv; this was verified on 2.1.316 (a 150K window in/context, and a subagent on Sonnet 5.5 at low effort while settings.json saidopus). The leader is the turn's model, then Pocket's default, then the CLI's. Runner markers recordpolicyKey, and a reused process whose policy changed is replaced (context policy changed) unless it is running background jobs. - Codex.
thread/start,thread/resumeandthread/forkcarryconfig:model_auto_compact_token_limit(85% of the limit),agents.default_subagent_model(the newest GPT Sol under GPT Astra,codexNewestSol) andagents.default_subagent_reasoning_effort. The leader is the turn's model, elseconfig.toml'smodel(codexDefaultModel). A session opened with another policy is reopened. This was verified on 0.166.0: a sub-agent with no model rangpt-6.1-solatlow. - Engines. The
contextPolicyfeature is true for Claude and Codex and false for OpenRouter: OpenCode's compaction has no token limit, so that comes in phase 2. - Settings. Agents & instance → Context and subagents: Compact conversations, Subagent model, Subagent effort, and a note saying which agents it applies to. Saving restarts idle processes.
- Tests:
context-policy.test.mjs(defaults, tiers, launch options, validation; over HTTP, the settings round trip, the Claude--settingsenv before and after a change, a Fable leader, a Codex default leader fromconfig.toml, and clearing).fake-clauderecordssettingsEnv, andfake-codexrecords each thread'sconfigandmodel.
1.91.1 / build 184
Inbox Watch set up with Codex uses the newest models: the judge runs the newest GPT Sol the installed Codex lists (GPT-6.1 Sol today), and reading mail the newest GPT Luna. A Codex too old for GPT-6.1 Sol keeps GPT-6 Sol. Watchers already set up keep their models. See CHANGELOG.md.
1.91.0 / build 184
Only the newest model versions are shown, and new ones appear by themselves. Codex lists GPT-6.1 Sol instead of GPT-6 Sol, and Default says GPT-6.1 Sol. Claude lists the newest Fable, Opus, Sonnet and Haiku. A conversation, saved prompt or Pocket default that names an older version runs the newest one. Pocket reads Anthropic's model list daily with Claude Code's sign-in, so a new Claude model joins the menu without a Pocket update. See CHANGELOG.md.
1.90.0
Inbox Watch learns from what you put on your list, and no longer says you added something a Gmail filter labelled. An email that arrives already carrying the Pocket Inbox label (because one of your Gmail filters adds it) now reads Your Gmail filter put this on your list, not You added this. When you label an email yourself, the watcher notes what it had done with it (ignored it, kept it for the digest, skipped it as routine) and turns that into a short rule, as narrow as the examples allow: one email teaches it about that sender and topic, several of a kind teach it the kind. Not useful works the same way in the other direction, and the rules it has learned are merged, widened or dropped as you go on. They sit at the end of your rules under Learned from your choices, where you can edit or delete any of them, and the quick first pass now reads the whole rules file. Reported by Brad.
1.89.2 / build 183
Switching Claude accounts no longer makes you wait or start over. A message you send to a conversation whose background job (a build, a watcher) still holds the earlier sign-in now waits in its queue and sends by itself, on the new account, as soon as the job finishes. Stop background jobs and send now beside it skips the wait, and the Queue shows what it is waiting for. Reported by Brad.
See CHANGELOG.md for details.
1.89.1 / build 182
Switching Claude accounts no longer leaves a conversation stuck. When you sign in with another account, a conversation with a background job still running (a test run, a watcher) keeps the earlier sign-in so the job is not cut off, and Pocket refused your messages there until the job ended, which for a watcher could be never. The Not sent card now names the job and offers Stop background jobs and send, which ends the job and continues the conversation on the new account. And Retry same message now really asks again: a refused message used to get the same refusal back without checking, even after the reason had gone. Reported by Brad.
See CHANGELOG.md for details.
1.89.0 / build 181
Casey's second review: 24 fixes and six security advisories (GHSA-7x69-vwp4-vmqq, GHSA-m899-2j2c-4m7f, GHSA-rwg5-2r2c-c2mh, GHSA-pcmm-3r32-jg6p, GHSA-vvfj-fq67-gmr3, GHSA-j8pf-7jw9-g68r). New optional setting POCKET_TRUSTED_PROXY=1 for tunnel installs without Cloudflare Access. Details: CHANGELOG.md 1.89.0.
1.88.1 / build 180
Reported by Brad: sessions with reply cards waiting (the "Phone agents tunnel probe failures" and Douglas Immler Inbox Watch alerts) were not in the Attention tab.
- Response ready survives the CLI's exit write. When its process exits, the Claude CLI appends untimestamped bookkeeping lines (
cost-state,last-prompt, sometimesai-title,atis-latch,mode) to the transcript. Pocket closes a process afterPOCKET_IDLE_CLOSE_MS(one hour) or, underPOCKET_MAX_PROCESSES(8), as soon as another conversation starts: at 15:29 a burst of Inbox Watch alerts closeddf09b31411 s ande7774d1f25 s after their replies.sessionStatedropped any outcome older than the transcript's mtime by more than 5 s, and the watcher flagged the write as Activity elsewhere, so an unopened reply became Recent and left Attention. Every message line carries atimestamp; bookkeeping lines carry none.quietSinceOwnednow asksforeignTurns(the check runner reuse already trusts) whether any user or assistant line follows our last turn's recorded size, cached per mtime; if none, the outcome stands and the watcher ignores the write. A turn from a terminal or code-server still replaces it. - Migration: none. Outcomes in
session-meta.jsonthat were hidden this way come back: on this install 492 rows return to Response ready, 11 of them unread and in the list (Oct 24 onward), which show in Attention once; Mark all reviewed clears them. - Tests:
test/fake-claude.mjsappendscost-state/last-promptwhen its input closes, like the CLI.test/review-fixes.test.mjscloses a finished session through the process cap, moves its mtime a minute on, and expects Response ready in the list and the conversation (not Activity elsewhere), then a terminal user line ends it; fails on 1.88.0 withobserved.test/session-state.test.mjscoversquietSince.