OpenCockpit

Changelog

Release notes pulled from GitHub Releases.

  1. v1.0.286

    Oct 19, 2026 · v1.0.286

    ✨ 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 /qa on 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.

    View on GitHub ↗
  2. v1.0.285

    Oct 13, 2026 · v1.0.285

    ✨ 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.

    View on GitHub ↗
  3. v1.0.284

    Oct 11, 2026 · v1.0.284

    🐛 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:443 and Origin: https://localhost:443 (as some reverse proxies send) were rejected as cross-origin. The default port is now ignored on both sides.

    View on GitHub ↗
  4. v1.0.283

    Oct 11, 2026 · v1.0.283

    📦 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

    /dl used 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-other no longer counts as inside /proj. Copying files also works on Windows again.
    • The whole IPv4-mapped 127.0.0.0/8 range 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.

    View on GitHub ↗
  5. v1.0.282

    Oct 9, 2026 · v1.0.282

    ✨ 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 from low to max, plus ultracode and ultrathink, and defaults to medium. 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.

    View on GitHub ↗
  6. v1.0.281

    Oct 1, 2026 · v1.0.281

    🐛 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.

    View on GitHub ↗
  7. v1.0.280

    Sep 30, 2026 · v1.0.280

    ✨ 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 to xhigh and max, and ultracode support. It defaults to medium effort 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, at low reasoning.

    ✨ New: /go keeps a decision log

    /go now 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. /ap is gone, since its decision log now lives in /go.

    /qa, /fx and /ex now produce fixed, skimmable documents. /qa writes a lean PRD, /fx a root-cause analysis with a cited evidence chain, and /ex an answer-first analysis. Follow-up rounds show only what changed. The /cr findings 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 /cr

    The feature-work quickstart now runs /cr before 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.

    View on GitHub ↗
  8. v1.0.279

    Sep 28, 2026 · v1.0.279

    ✨ 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-pty in 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 terminals
    

    Update 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: /cr restructured

    The built-in /cr prompt 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, and hard fans 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.

    View on GitHub ↗
  9. v1.0.278

    Sep 23, 2026 · v1.0.278

    ✨ 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 # Name heading 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_code preset. 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 medium effort — Claude Code's own default for it, and the one model in the lineup that does not default to high. It supports xhigh, ultracode and fast mode. GPT-6 Sol is the new default Codex model at medium, 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 now main / subagent in 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.md as the index — instead of a vector database. The /try demo, which failed to start after the cock alias removal, is fixed too, as is an install snippet on the site that still used the old name.

    View on GitHub ↗
  10. v1.0.277

    Sep 21, 2026 · v1.0.277

    ✨ 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/main used 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, since git diff never 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 @name out of the dispatch line once, server-side, and it travels with the payload that already answers which engine.

    An @bot line 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 containing bots/ cannot swallow every @bot line in the project. A delegation with no explicit engine also 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 / rm invalidates — 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 bare gpt-oss completed 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 \n inside the textarea and decoded on the way out, so storage, the API and the send path keep carrying real newlines.

    📦 Misc: The cock alias is gone

    cock is 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 server
    

    If you had cock in a script or an alias, switch it to cockpit — same 237-line implementation, now living in bin/cockpit.mjs. The lockfile carried a stale entry pointing at the deleted file, which would have left npm ci with 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.

    View on GitHub ↗