Changelog
Release notes pulled from GitHub Releases.
v1.0.286
Oct 19, 2026 · v1.0.286View on GitHub ↗✨ New: Hour and day schedules, with a start time
The Once and Interval presets for scheduled tasks now include hour- and day-level options, and the custom input takes an amount plus a minute / hour / day unit. The task list shows durations in the largest whole unit ("Every 6 hours", "Once (in 1 day)") instead of raw minutes.
Interval tasks can take an optional start time and now fire on a fixed grid: start time + k × interval. Before, the next run was "last run end + interval", so a long run pushed every later run back. Now the schedule no longer drifts, and missed slots are skipped instead of replayed.
🐛 Fix: Send to AI while Claude is running
v1.0.285 let the composer send into a live Claude run, but the other ways of sending to the AI stayed disabled for the whole run. These are send to AI from code, diffs, Markdown and HTML previews, comments and explain. They now go through too, and are blocked only when a send really cannot be delivered.
🐛 Fix: Images in a message sent during a run
Images in a message sent to a running session reached the model but did not appear in the bubble until the run ended. They now show right away, in every tab viewing the session. A message with only images, and no text, now shows up as well.
🐛 Fix: Bold and italic next to Chinese punctuation
Text like
**为什么要问:**同名showed its asterisks literally, because Markdown would not close emphasis right after a full-width punctuation mark. It now renders as bold in chat, plan cards, Explorer previews and the file viewer.🌐 Site: Three ways to use /dl
A new blog post covers three uses of
/dl: a second-engine review with--wait, handing off a sub-task with/qaon the next line, and a release watch that runs in the background.📦 Misc: Engine updates
Claude Agent SDK 0.3.303 (Claude Code 2.1.303) and Codex 0.163.0.
v1.0.285
Oct 13, 2026 · v1.0.285View on GitHub ↗✨ New: Talk to Claude while it is still running
Until now, a Claude run took no more input once it had started. The composer was disabled and a second send was rejected. If the agent stayed alive waiting on background tasks (such as a Monitor), the only way to answer it was to press Stop, which also killed those tasks.
The composer now stays enabled while a Claude run is live, and sending goes straight into the running session. If the agent is mid-turn, your message is picked up at its next tool call. If it is idle on background tasks, it starts a new turn right away. The model's reply to a mid-turn message opens a fresh bubble, and messages sent this way remain in the history after a reload.
✨ New: Suggested next prompt
After each Claude turn, the composer placeholder shows a predicted next prompt. Press Tab on an empty input to accept it into the box. Nothing is sent until you press Enter. The suggestion clears when you send.
📦 Misc: Engine updates
Claude Agent SDK 0.3.296 (Claude Code 2.1.296) and Codex 0.162.1.
v1.0.284
Oct 11, 2026 · v1.0.284View on GitHub ↗🐛 Fix: Windows state files and single-instance boot
v1.0.283 made state files replace atomically, but on Windows a rename over a file that something is reading fails, and Cockpit fell straight back to an in-place write — so readers could still see a half-written file. The rename now retries briefly, and never collides with reads inside Cockpit itself. The same retry protects taking over a stale
server.lock, which on Windows could crash the boot.🐛 Fix: Host header with a default port
Requests with
Host: localhost:443andOrigin: https://localhost:443(as some reverse proxies send) were rejected as cross-origin. The default port is now ignored on both sides.v1.0.283
Oct 11, 2026 · v1.0.283View on GitHub ↗📦 Misc: Tech Plan Review and LAN sharing are gone
The review pages, the Share Review toggle and the LAN share server (port + 1000) have been removed. Cockpit no longer opens a second port. The old review doc URLs on opencockpit.dev now redirect to the Changes docs.
✨ New:
/dl --wait/dlused to be fire-and-forget only. With--wait, the calling agent waits for the delegated session to finish and gets its result back in the same turn. The wait keeps going across Bash tool timeouts. Without the flag, nothing changes./dl --wait <task>Delegated sessions open with a link back to the session that started them, and that link is now a clickable chip in the user turn. Click it to jump to the parent session.
🐛 Fix: Output styles are followed more reliably
A selected output style was added to the end of the system prompt as bare text, so a skill's output template or any other format instruction closer to the reply could override it. It is now a dedicated "Output style" section that covers every reply, skill turns included, and Claude, Codex and the built-in agents all get the same section.
🐛 Fix: Stop, then send again
When you pressed Stop and sent a new message right away, a second engine could start on the same session while the first was still exiting. Both then wrote the same transcript. A new send now waits up to 10s for the previous run to exit. Deleting a turn also waits for the session to finish writing, so it can no longer drop lines appended while it ran.
🐛 Fix: Scheduled tasks
Scheduled tasks now run at most once. If Cockpit is killed while a one-off task is running, the task is marked Interrupted on the next start and its prompt is not sent again. The list shows Running now while a task is in flight. A run's result is no longer lost when you edit the task or trigger it by hand during the run, and marking tasks read or reordering them is no longer reverted after a run.
🐛 Fix: State files and single-instance boot
- State files (settings, projects, terminal history, …) are now replaced atomically, so a crash mid-write can no longer leave a corrupt file. Writes to the same file can no longer interleave and lose an update.
- Terminal bubbles for fast commands no longer get stuck in "running" until a restart.
- Two Cockpits started at the same moment on one data dir no longer both boot. Exactly one wins the lock.
- Rerunning a console command (including a double-click) stops the previous process first, instead of leaving it running where the UI can no longer reach it.
🐛 Fix: Security hardening
- Credential files (DeepSeek / Kimi / GLM / Ollama API keys, Web Push key) are now owner-only (
0600). Existing files are tightened at startup. - The Web Push private key has moved out of
settings.json, which is sent to the browser, into its own file. Existing push subscriptions keep working. - Server-side git and system tool calls no longer go through a shell, so file and branch names are never parsed as shell syntax.
- Path checks now compare whole path segments, so a sibling directory such as
/proj-otherno longer counts as inside/proj. Copying files also works on Windows again. - The whole IPv4-mapped
127.0.0.0/8range is now treated as loopback.
🐛 Fix: Snapshot history survives a missing project folder
Snapshot cleanup used to delete a project's entire snapshot history as soon as its folder was missing, for example on an unmounted drive or after a rename. Snapshots now expire by age only.
v1.0.282
Oct 9, 2026 · v1.0.282View on GitHub ↗✨ New: Claude Haiku 5.5
Claude Haiku 5.5 (
claude-haiku-5-5) is in the Claude model picker above Haiku 4.5. It supports effort fromlowtomax, plus ultracode and ultrathink, and defaults tomedium. It costs $0.10 / $0.50 per MTok with cache reads at $0.01. Prompts over 100K tokens bill at 5x, and Token Stats only tracks totals per model, so the cost it shows for Haiku 5.5 is a lower bound.Engine pins: Claude Agent SDK 0.3.285 → 0.3.293 (Claude Code 2.1.293), Codex 0.159.2 → 0.161.0.
v1.0.281
Oct 1, 2026 · v1.0.281View on GitHub ↗🐛 Fix: Comments button only lights up when there is something to read
The comments button next to the chat input used to be tinted all the time. It now uses the same muted color as the notes button until the project has at least one code comment, and picks up the tint as soon as one is added. Deleting the last comment mutes it again.
📚 Docs: Running the agent on any model
The engines page now opens with a direct answer to "how do I use Claude Code with another LLM". A new section compares overriding Claude Code's environment or putting a gateway in front of it with picking an engine per tab, and covers what the Built-in Agent gives up.
🌐 Site: Two new posts and a sharper headline
Two new blog posts: Claude Code with GLM, Kimi and DeepSeek — No Env Vars, and a side-by-side comparison of a terminal CLI workflow with the OpenCockpit workbench, including when to pick which. Page titles, the homepage lead, the social card and the footer now say "Open Claude Code GUI for any LLM".
📦 Misc: npm description and README
The npm description, keywords and README headings now use the same any-LLM wording as the website.
v1.0.280
Sep 30, 2026 · v1.0.280View on GitHub ↗✨ New: Every running terminal, from the sidebar
Terminals now outlive Cockpit restarts, which made a dev server left running in another project easy to lose track of. A Terminals row under Scheduled Tasks in the sidebar shows how many commands are live and opens a board grouped by project. Clicking a row switches to that project, swipes to Console and selects the bubble; each row can also stop its process. A stopped command stays in its bubble as finished, the same as stopping it from the bubble itself.
✨ New: Claude Sonnet 5.5 and GPT-6.1 Sol
Claude Sonnet 5.5 (
claude-sonnet-5-5) is in the Claude model picker, with effort up toxhighandmax, and ultracode support. It defaults tomediumeffort and costs $2 / $10 per MTok. Opus 5.5 stays the Claude default.GPT-6.1 Sol (
gpt-6.1-sol) is codex's new default and is now Cockpit's default Codex model, atlowreasoning.✨ New:
/gokeeps a decision log/gonow works from the agreed spec. It verifies each slice by running it, retries a failing slice at most three times before marking it blocked, and stops only for choices that are costly to undo. Every decision the spec did not cover is logged as one line to~/.cockpit/skills/go/notes/<project>-<feature>.md, linked from the recap. The notes are cleaned up after 30 days without changes./apis gone, since its decision log now lives in/go./qa,/fxand/exnow produce fixed, skimmable documents./qawrites a lean PRD,/fxa root-cause analysis with a cited evidence chain, and/exan answer-first analysis. Follow-up rounds show only what changed. The/crfindings index now renders as a list instead of one run-on paragraph.✨ New: Baseline shifts hidden in the per-call diff list
A turn that starts with a branch switch used to open the per-call diff viewer on a 200-file call made of other people's commits. Those leading baseline-scale calls are now hidden, as the aggregate view already did. A banner says how many were hidden and shows them again in place.
🐛 Fix: Terminal reruns and first-frame size
Rerunning a dev server that took longer than 200ms to exit could leave the new run marked finished with no output, because the old run's late exit was routed to it. Each run now has its own session. A new PTY also used to miss the bubble's first resize and start at 120×30, so the zsh right prompt wrapped and stray
%lines appeared. It now opens at the bubble's actual size.This update leaves the pty-host untouched, so terminals that are already running survive it.
🐛 Fix: Scheduled tasks under concurrent writes
A read that landed during a scheduled-task status write saw an empty file and failed with "not valid JSON, refusing to overwrite it". This broke the task panel, and at boot it left no timers armed until the next restart. Reads now take the same file lock as writes.
📚 Docs: Quickstart ends with
/crThe feature-work quickstart now runs
/crbefore the manual review in Explorer, and the built-in skill count is down to 12.Engine pins: Claude Agent SDK 0.3.283 → 0.3.285, Codex 0.158.0 → 0.159.2.
v1.0.279
Sep 28, 2026 · v1.0.279View on GitHub ↗✨ New: Terminals survive a Cockpit restart
Terminal commands used to be children of the server, so every update or restart killed them — a dev server started in a Console bubble died with each
npm i -g @surething/cockpit. They now run in a separate pty-host process (cockpit-ptyin your process list), which the server talks to over a local socket. On boot the server adopts the sessions that are still running, together with the output they printed while it was down; commands that ended in the meantime come back with their real exit code. Both PTY and pipe mode are hosted.cockpit stop # shuts the pty-host down too — this ends your terminalsUpdate and restart leave the host alone. The one exception is a release that changes the host's own code: the new server then replaces the old host, which ends the terminals it was running. The host exits by itself once it has no sessions and no clients.
Terminal output is also persisted more reliably. Finished PTY bubbles used to come back blank after a refresh, and they now keep their output. Deleting a bubble or clearing a tab removes its output file, and orphaned output files are swept at startup.
\r-only progress bars in pipe mode no longer grow without bound.An Ollama server started from the UI survives restarts too. It used to be killed along with the server's other child processes on every stop, update or restart.
✨ New: An in-page folder picker
Open Folder used to show an OS dialog launched from the background server process. Each platform broke it differently: macOS 26 would not bring it to the foreground, so paste never reached it; on Windows it opened behind the browser; and on Linux under ssh or systemd there was no display to show it on. Opened from another device, it appeared on the server's screen. The picker now lives in the project browser. It has an address bar with completion: type or paste a path, Tab/Enter goes into a directory, Cmd/Ctrl+Enter opens it, Backspace goes up and Esc returns to the project list. Git repos and hidden directories are marked.
🐛 Fix: Wide tables no longer flip the view
When a horizontal scroll reached the edge of a wide table, the rest of the swipe, momentum included, passed through and switched panels. A swipe now belongs to whichever pane it started over, until the wheel goes quiet. The trade-off is that a swipe over a code or diff pane with long unwrapped lines no longer switches views or dismisses the diff column. Use the top bar or the diff's ✕ instead.
🐛 Fix: Independent-task turns no longer hide the history
While an independent (no-history) turn was running, opening that session in another tab could replace the whole transcript with the single in-flight turn. The view then jumped to the top once the turn finished. Readers now see the stashed history and the running turn together.
🐛 Fix: Long quick instructions stay on one line
In the quick-instructions editor, a long instruction used to wrap and look like several separate records. Each instruction now stays on one line and scrolls horizontally, and the editor can be resized again.
📚 Docs:
/crrestructuredThe built-in
/crprompt now spells out how the review runs. The main session dispatches independent reviewers and assembles the report, but never reviews anything itself. By default there are two reviewers, one static and one dynamic; tiny diffs get a single reviewer, andhardfans out one reviewer per slice. Each finding carries a severity and an origin (introduced, activated or pre-existing), and the report has a fixed format.Engine pins: Claude Agent SDK 0.3.280 → 0.3.283, Codex 0.156.1 → 0.158.0.
v1.0.278
Sep 23, 2026 · v1.0.278View on GitHub ↗✨ New: Output styles
A global library of named output styles, picked per session from a new toolbar picker. Styles are edited in one textarea — a
# Nameheading per style, the body underneath taken verbatim — and stored in~/.cockpit/output-styles.json. None is the default and injects nothing.The session stores only the style id; the text is resolved on every dispatch. An edit therefore reaches the next turn of every session using that style, and a scheduled task reads its session's selection at fire time rather than when it was scheduled.
Each engine receives it in its own place: appended to Claude Code's system prompt, sent as developer instructions to Codex (reconciled on resume, since Codex ignores that parameter there), and added as a final section for the built-in agent loop. An unchanged style renders byte-identical, so Claude's prompt cache still hits after a switch back.
This also fixes Claude sessions that had been running without Claude Code's system prompt: when no system prompt was given, the Agent SDK sent an empty custom prompt instead of the
claude_codepreset. The preset is now always passed.✨ New: Claude Opus 5.5 and GPT-6 Sol / Luna
Claude Opus 5.5 is the new default Claude model, at
mediumeffort — Claude Code's own default for it, and the one model in the lineup that does not default tohigh. It supports xhigh, ultracode and fast mode. GPT-6 Sol is the new default Codex model atmedium, with GPT-6 Luna alongside it; labels, effort sets and defaults come from the catalog Codex ships.Both pickers are trimmed to the current lineups. Claude drops Opus 4.8, 4.7, 4.6, Sonnet 4.6 and Fable 5, keeping Opus 5 as a fallback; Codex drops GPT-5.6-Terra and GPT-5.6-Luna, keeping GPT-5.6-Sol. A session pinned to a removed model keeps running on it, and its picker now shows the model's name (
Claude Opus 4.8) rather than the raw id.The 200K / 1M context toggle is gone. Every model left in the picker runs a native 1M window, so it was offering a choice that changed nothing.
Engine pins: Claude Agent SDK 0.3.278 → 0.3.280, Codex 0.155.1 → 0.156.1.
✨ New: Markdown preview in history diffs
The history tab's compare mode and commit detail now offer Preview on Markdown files, opening the interactive preview on the "after" content — with comments and send-to-AI. ESC closes only the preview.
🐛 Fix: Git status in worktrees, JSON preview in compare mode
A commit made inside a git worktree only rewrites the branch ref in the main repository's
.git, which the watcher did not look at — so the Changes tab stayed stale until something else refreshed it. It now follows the worktree's common git dir.In compare mode, the Readable button for JSON files did nothing until you switched to the status tab. It now opens the preview directly.
🐛 Fix: Command tags no longer change with the UI language
Resolved command tags read
[主会话·qa]next to[subagent·cr]for a Chinese UI, and scheduled tasks fell back to English regardless. The tag is model-facing metadata, not UI copy, so it is nowmain/subagentin every language.🌐 Site: Long-term memory is just a directory
A new blog post, in English and Chinese, on why Bots keep memory as a plain directory the model explores like a codebase — with
BOT.mdas the index — instead of a vector database. The/trydemo, which failed to start after thecockalias removal, is fixed too, as is an install snippet on the site that still used the old name.v1.0.277
Sep 21, 2026 · v1.0.277View on GitHub ↗✨ New: Read a whole turn as one diff
The chat diff viewer only ever answered "what did this tool call do". Reading a turn meant clicking through every call and summing the overlaps by eye. An aggregate toggle now collapses the range into a single diff, built over the shadow snapshot repo from the first call's parent to the newest one.
It is a net diff, and that is the point: a file edited five times appears once, and a file created then deleted inside the range does not appear at all. The count therefore drops — 41 per-call entries can be 12 distinct files — so the header labels the aggregate rather than letting that read as lost data.
A turn that opens with
git checkout -b x origin/mainused to start the range on a call that rewrote 200 files and 17k lines of other people's commits. Nothing in a snapshot says "this was a branch switch", so size stands in for intent: oversized leading calls are left out of the starting point. That is a guess, so it is never silent — the meta bar states how many calls were dropped and toggles them back in.Two interaction changes ride along, both about closing the viewer. The header controls move to the left, macOS-window style, since the pointer already lives over the left half of the diff and a ✕ in the far corner charged a full-width trip for the most common action. And the diff column can now be swiped right to dismiss: the gesture draws itself, the column trailing the swipe at half its travel before flying out or springing back.
✨ New: Branch compare counts work you have not committed yet
The history tab's branch compare ran
git diff <base> HEAD, so a branch whose work was still in the working tree rendered "no changed files" while a pile of fresh edits sat on disk. Between that view and the status tab, nothing answered "what did this branch change in total" — the question an agent-driven session asks most.The HEAD pill in the compare header is now a two-segment scope switch:
- worktree — committed + staged + unstaged + untracked (the new default)
- head — committed work only, the GitHub "Files changed" diff
Untracked files are merged in from
git status, sincegit diffnever reports them. Both modes now anchor the old side at the merge base; the previous two-dot spelling reported commits made on the base branch since branching as if this branch had reverted them. A project opened at a subdirectory of its repo also read working-tree paths against the wrong root and returned an empty diff.✨ New: A Bot session says so, wherever it is listed
A Bot session used to be indistinguishable from one a person opened. The mark now rides on chrome that already exists rather than adding a glyph: the number chip keeps its number and changes shape — a robot head, masked over the same status wash — and the running line gets a badge. Detection reads the
@nameout of the dispatch line once, server-side, and it travels with the payload that already answers which engine.An
@botline sent from a session that is already sitting in that Bot's directory now runs in place instead of spawning a child. Delegating exists to give a Bot a session whose files are its own; a session that already has that bought a cold start and a second transcript and nothing else. Matching is exact after realpath, so a subdirectory of the Bot does not match and a repo root containingbots/cannot swallow every@botline in the project. A delegation with no explicitenginealso inherits the engine of the session that asked for it.🐛 Fix: Ollama runs the model your machine actually has
Ollama ids are whatever the machine pulled, so any id baked into the source is a guess that
ollama pull/rminvalidates — and one delegation could produce three separate 404s from Cockpit rather than from the model. Model resolution now happens against the machine: the request's own model (a baregpt-osscompleted to its one installed tag), else the model this session already ran on, else the model the last run used, else the catalog's first entry. An empty or unreachable catalog is now an error naming the server URL and the fix, raised before the run starts rather than landing in a transcript you then throw away.A new ollama chat opens on the model last used instead of on "Select model", and the picker and the engine read the same resolver, so they cannot answer the question differently.
🐛 Fix: A scheduled task follows its fresh session immediately
When a task's resume target is gone it starts a fresh session, and that session's id used to be written back only after the run finished, and only on the success path. So for the whole turn the task pointed at a session that no longer exists — the board opened an empty transcript while the real one streamed under another id — and a run that timed out left the dead id on disk, which is self-reinforcing: the next round starts yet another from-scratch session, and a from-scratch run is the one most likely to fail again. The task now binds on the id the engine announces seconds in. The per-run deadline also rises to 60 minutes; it is a runaway guard, not a latency budget.
🐛 Fix: Quick instructions can span several lines
The outline editor's record separator is the line break, so a multi-line instruction had no way to spell itself — and the round trip was already lossy, silently tearing such an instruction in two on the next save. Real newlines are now encoded as a literal
\ninside the textarea and decoded on the way out, so storage, the API and the send path keep carrying real newlines.📦 Misc: The
cockalias is gonecockis an English profanity, which makes the short alias awkward in shell history, CI logs, documentation and talks. Cockpit ships a single name now:cockpit # production server cockpit-dev # dev serverIf you had
cockin a script or an alias, switch it tocockpit— same 237-line implementation, now living inbin/cockpit.mjs. The lockfile carried a stale entry pointing at the deleted file, which would have leftnpm ciwith a dangling symlink.Engine pins move with this release too: Claude Agent SDK 0.3.268 → 0.3.278, Codex 0.154.0 → 0.155.1.