Skip to content

CCCC v0.4.51 Release Notes ​

CCCC v0.4.51 puts what you open to read in one place: workspace files, message attachments and Presentation slots open as tabs in one panel, where you can keep many, find one again and close several together. See One Panel for What You Open. DeepSeek members get a form for their API address, model and key; see DeepSeek Connection Settings.

It also closes several ways credentials could leak, described under Security: the clients listed there, a DeepSeek member's included, now reach a literal loopback address without a system proxy; when a DeepSeek turn fails, the key the member was started with is no longer saved where a gateway repeats it in full in its error; and skills installed from a direct HTTP(S) URL no longer keep its username, password, query string or fragment. See Before You Upgrade for what to replace.

With a Grok web model member, the daemon no longer rereads the whole Group history on every two-second check. Message text uses a proportional font, new messages that arrive behind a large view count as unread, and old SkillsMP search results that were never imported are no longer recommended. On phones and tablets PDFs scroll inside the page, and a choice in an agent's question can carry a note. This release covers the changes since v0.4.50.

Before You Upgrade ​

Before upgrading, let sends and recordings finish. Restore or discard waiting sends, then send or copy every unsent draft, restored ones included, and save unsaved edits in Files: all of these live only in the open page. Check whether a message already arrived before sending it again.

Upgrade the CCCC executable, restart the daemon and Web the way you usually launch them, and reload open CCCC pages. The standalone installer behind cccc update stops a running daemon and starts it again from the new version. Before a pip upgrade, run cccc daemon stop and close any foreground CCCC so pip can replace the executable, especially on Windows. A daemon left running keeps the previous version. Runtime history stays in CCCC_HOME.

  • If you use a system proxy: until now, if HTTP_PROXY, HTTPS_PROXY or ALL_PROXY was set and NO_PROXY did not exclude loopback, the requests listed under Security could reach the proxy with their credentials. The most sensitive is the Web admin token sent by the daemon and the CLI. If that applies to you, create a new Admin Access Token in Settings > This instance > Web Access, delete the old one, and replace any other credentials sent to a local MCP server, Mattermost, Codex Voice endpoint, Connect peer, skill URL or DeepSeek gateway.
  • If you installed a skill from a URL that contained a username, password or token, replace those credentials. Entries saved before this version stay as they are in state/capabilities/catalog.json; CCCC only leaves those parts out when it shows them.
  • If a browser used a CCCC preview package from 2026-10-31 to 2026-11-01, it may have saved Mono as its body font without your choosing it, and message text then stays monospace after the upgrade. Choose Sans under Body font in the appearance settings. Published versions did not save it that way, and a font you chose yourself stays as it was.
  • A stand-up rule that uses the built-in text gets the new wording. A custom stand-up text stays as it is.
  • If you use DeepSeek members: a member without a model of its own now asks for deepseek-flash instead of deepseek-v4-flash, unless DEEPSEEK_MODEL is set in its or the daemon's environment. DeepSeek's documentation serves both with its current Flash model for now. If a gateway needs its own model ID, enter it in the member's DeepSeek connection form.
  • If you connect Codex, Claude Code, Pi or OpenCode sessions: each keeps the CCCC tools it loaded, the old default send modes included, until its cccc MCP server is restarted or reloaded inside that application, as Upgrade an existing integration describes for each runtime.

One Panel for What You Open ​

Workspace files, message attachments and Presentation slots now open as tabs in one resource panel. Files open from the Files tree, from a path in a message or from a link inside a document; attachments are images, videos, Markdown, text and PDF; a Presentation slot opens from the slot list or from a message that refers to it. Opening something that is already open selects its tab. The panel replaces the file editor over the messages, the full-window image, video and document preview, and the Presentation viewer docked beside the messages.

  • The panel sits in the right column, or over the message list with the message box still in reach; this browser remembers which. Maximize gives it the messages and the right column together. Collapsing it keeps its tabs, and the resource button in the Group header shows how many are open; on a phone, the menu does.
  • With many tabs, the strip scrolls sideways, also with the mouse wheel. All lists every tab with a filter by name, path or sender, followed by what you closed recently. Right-click a tab to close it, the others, those to its right or all of them. Several tabs closed at once come back together, from that list or from Undo in the notice that follows.
  • A file with unsaved edits asks before it closes: save, close without saving or keep it open. Renaming or moving a file or folder in Files takes its open tabs and unsaved edits along.
  • Switching between workspace text, Markdown or table tabs in a Group, each shown alone, returns to where you were reading. The eight images and four other attachments you looked at most recently stay loaded; an older one loads again, so a PDF's page or a video's position may start over. Switching Groups, or between the phone and desktop layouts, loads the panel again: tabs stay, reading positions do not.
  • Side by side puts two open tabs next to each other, for comparing two documents or two pictures; on a phone they are stacked. It starts with the tab you are reading and the one you read before it. Each side's header lists every open tab to show there instead, so one long document can also be read in two places; a tab picked from the strip, All or a message opens on the side you last used, and the divider drags. Both sides show their resource as it reads, workspace files with any unsaved edits; to edit a file, leave Side by side and its tab is shown alone.
  • While the panel covers the messages, they stay unread, and its collapse key, the same in every position, shows how many arrived. Show in messages on an attachment returns to the message it came with.
  • A Presentation slot has one viewer however many of its tabs are open. A slot's own tab takes the title of the slot's current card. Open in window in the viewer still shows it in a larger window. When a slot is published again with another address while its interactive page is open, CCCC asks before replacing that page, since someone may be working in it.
  • On a phone the panel is one full-screen surface, and Back returns to the messages, the Files tree or the Presentation slots. The phone header keeps its room for the Group title: the menu lists Resources with the number open, or offers to reopen what was closed last.

Tabs stay until you close them or reload the page. Git diffs from Changes still open over the messages, and enlarged message diagrams and previews opened from a link, such as an image on another site, still open over the page. Presentation slots now open in the panel even if you chose the window view before.

PDFs on Phones and Tablets ​

On a device whose main pointer is touch, such as a phone or tablet, a PDF from a message, a link to this CCCC, the workspace or a Presentation slot now opens in a reader inside the page: the pages scroll, fit the width and zoom with its keys. Before, an embedded PDF could show only part of its first page and not scroll, so it had to be opened in the browser. Browsers that report no built-in PDF viewer use the same reader; other desktop browsers keep their own viewer, and so does a Presentation PDF from another site.

  • The reader, PDF.js bundled with CCCC, cannot select or search text, use a PDF's links and forms or open a file that requires a password. A message attachment or workspace file keeps Download, and outside a Connect frame it can still open in its own browser tab; a Presentation slot's viewer offers Copy URL/path.
  • Older iOS versions, an iPad with a trackpad, which reports a fine pointer and keeps the browser's viewer, and real touch gestures have not been tried on devices yet.

A Note With Your Choice ​

When an agent asks you a question with options, you can add a few words to the option you choose: + Add a note (optional) beside Send answer opens a box, and the agent receives your choice and your words in one reply. Before, a remark meant choosing Other and repeating the option in words.

  • A blank note sends the choice alone. Other keeps its own box, and switching between them keeps what you wrote in each.
  • The reply reads Selected B: <option>, a blank line and Note: <your words>; the daemon records it as a version 2 answer. A daemon from before this release refuses it, and the card keeps your note.
  • The terminal interface still answers with an option or Other.

DeepSeek Connection Settings ​

DeepSeek members now have a DeepSeek connection form, both when you add one and in its Runtime settings: the API address (Host), the model and the API key. The values go into the member's write-only private environment like other private values. A saved value is marked Configured and never shown again, a blank field keeps it, and Save & Restart applies a change. A Runtime Profile saved from the form carries the same values.

  • Without a saved value, a member uses DEEPSEEK_BASE_URL and DEEPSEEK_MODEL from the environment it starts with (its own environment settings first, then the daemon's), and otherwise https://api.deepseek.com and deepseek-flash. The model field also suggests deepseek-v4-pro, and a gateway can use its own model ID. Use default removes the member's saved address or model.
  • An address ending in /chat/completions is turned into its base URL, and a key pasted with spaces or a newline around it is trimmed.
  • A missing key, or an authentication failure CCCC recognizes (such as DeepSeek rejecting the key), stops the member's DeepSeek process and pauses automatic delivery until you start or restart the member. Its pending messages stay and are tried again after a successful start.
  • A custom gateway must support DeepSeek's streaming Chat Completions and tool calls; being called OpenAI-compatible is not enough.

Security ​

System Proxies and Loopback Addresses ​

These requests no longer use a system proxy when their configured address is a literal loopback address (127.0.0.0/8, [::1] or localhost): the daemon's and the CLI's calls to the local Web, and calls to an external MCP server, Mattermost, Codex Voice, a Connect peer or a skill URL on this machine. Before, a proxy without a loopback exclusion in NO_PROXY could receive them and their credentials, such as the Web admin token.

  • A hostname that only resolves to loopback through DNS still follows your proxy settings.
  • The daemon's and the CLI's calls to the local Web no longer follow redirects. Codex Voice and skill URL downloads still do, keeping the proxy choice made for the first address.
  • The account client's exception for plain HTTP on a local development server now also accepts [::1] and IPv4-mapped loopback addresses.

DeepSeek on This Machine and Saved Errors ​

A DeepSeek member whose API address is a literal loopback address now reaches it without a system proxy. CCCC turns on Node's built-in proxy support for the DeepSeek process unless NODE_USE_ENV_PROXY is set, so on a Node version that has it, with HTTP_PROXY or HTTPS_PROXY set (in either case) and no loopback exclusion in NO_PROXY, a request to a gateway on this machine, API key included, could go through the proxy. CCCC now adds that host to the NO_PROXY list the process actually uses, keeping the list's other entries; a list of * already bypasses every proxy, and other addresses keep your proxy settings.

When a DeepSeek turn fails, each private value the member was started with, and a DEEPSEEK_API_KEY taken from the daemon's environment, is replaced by [redacted] wherever it appears in full before the error is saved. Before, a gateway that repeated the key in its error message could have it saved in the member's run records and in the Group's history. The rest of the error is kept, so the reason can usually still be read. Errors saved before this version stay as they were. An address or model saved in the connection form is a private value too, so it also shows as [redacted] there.

Skill Source URL Privacy ​

Installing a skill from a URL used to save that URL as given. A username and password, or a token in the query string or fragment, ended up in the capability catalog. Agents in other Groups could see it through capability search, and download errors could repeat the URL.

For a direct HTTP(S) skill URL, CCCC still downloads from the URL as given, but the saved source fields, the returned target and download errors leave out its username, password, query string and fragment. A secret in the URL's path is not removed, and the downloaded skill text is kept as it is. The capability overview and search do the same for skills installed before, without rewriting the stored records. Local paths, other URL schemes and MCP toolpack sources are unchanged. Because the shown source no longer carries those parts, installing again from it may fail where the original URL needed them; keep the original URL if you need it.

Less Repeated History Reading for Grok Web Model Members ​

While a Grok web model member was waiting for work, the Web asked the daemon every two seconds whether anything was due, and each time the daemon first read the Group's whole history from the oldest archive. With a long history, this kept costing CPU while nothing was waiting to be delivered. The daemon now keeps a small summary of unconfirmed deliveries and reads only what was added since the last check. It rebuilds the summary after history is archived or replaced, and after a restart. This affected every version since 0.4.45.

Proportional Message Text ​

Message text, reply quotes and the sender's insight now use a proportional font by default: IBM Plex Sans, which ships with CCCC (about 130 KB), with Chinese and Japanese in your system's fonts. Message headers, controls and code stay in the monospace font. Body font in the appearance settings now offers Sans, Mono and Pixel; a font you chose before stays as it was. Markdown no longer adds backticks around inline code, or quotation marks around a quote that the text does not contain.

Unread Counts Behind Large Views ​

Messages from other participants that arrive while something covers the chat now count as unread: the resource panel docked over the messages or maximized, a full-screen diagram preview, or a large window such as Settings, Search or Context. On a phone this includes dialogs that fill the screen.

Old Skill Search Results ​

Capability search no longer recommends results saved from the retired SkillsMP remote search unless they were imported: such a record's stored name and contents could come from different results. Nothing is deleted. Existing bindings keep working, a record can still be used by its ID, and the Capability Center and the member and profile pickers mark it Unverified old search result with an explanation. To rely on one, import it again from a trusted original source. capability_overview rows gain legacy_search_unverified and sync_state.

The Capability Center and the pickers also describe CCCC's built-in capabilities in English, Chinese and Japanese.

Stand-up and Team Review ​

The built-in stand-up text now asks the foreman to mark a question that needs a deeper look as Review: in a related optimization task, or in a new planned one, and to suggest a team review rather than run one. The team review text asks it to handle those questions and keep the task open until they are settled. From a message addressed only to the foreman, both texts now let it share what you authorized and the team's work needs, in its own words, and leave out the message's ID unless you agreed. A peer asked to run the team review may likewise pass the foreman what you authorized from a message addressed only to that peer; before, the review text left such content to you. These are instructions to the model, not checks CCCC enforces.

Other Changes ​

  • A message whose only Markdown is simple bold text now shows the bold instead of the asterisks.
  • Help and the Automation editor no longer say that an idle Group stops all automation. Only the built-in stand-up's scheduled runs pause.
  • The page buttons in the terminal view's header are the same size as the other header buttons when you use a mouse; on a touch screen they keep the larger size.
  • The Terminal history button and panel on each member's terminal are removed. To look back, scroll the Runtime's own terminal; a runtime that redraws its screen in place may keep no earlier output there. Agents can still read retained terminal output through cccc_terminal, within what the Group's terminal visibility allows.
  • The member editor drops several explanatory lines under its fields.
  • An agent that sends you a file or a new message without choosing a mode now uses Send for you, since you have no Inbox. Where the omitted mode used to be Mail, such a message was rejected. Choosing Mail for you is still refused.
  • In a connected Codex, Claude Code, Pi or OpenCode session, a file sent to another agent without a mode now requests prompt delivery, like a new message, instead of being left as Mail. Managed members keep Mail as their default between agents. cccc_file_send refuses paths and points to path, which already takes up to 10 files as one message.
  • If CCCC is updated while a page stays open and the page then fails to load one of its parts, it no longer reloads itself while it holds unsaved workspace edits, an unsent message or an operation still in progress, such as a message being sent or a voice recording. The PDF reader and voice input show their own error instead, so you can save first. Text typed into a question's card, and an answer still being sent from it, are not counted.

Validation Scope ​

Release preparation ran the Rust workspace tests and static checks, the CI test profile, the Web tests and static checks, and repository checks in isolated homes. A release candidate built before the last change, which touched only how the Web selects a workspace file's tab, has the same Rust source as the final package; the checks below that name it ran on that candidate.

The resource panel was walked on a packaged build of it, served by its own Web in an isolated instance with headless Chrome: 43 steps through tabs, All, closing and Undo, the unsaved-edit prompt, renames with unsaved edits, reading positions, maximize and unread counts, Changes, Presentation tabs and the window round trip, and phone flows, with no page errors. A second check opened a slot's shared page, kept it until the user confirmed a newer card, and refused a client with the old card. Side by side, which came after that build, was walked in headless Chrome on the Web source and again on the final package's own Web: 23 checks at desktop and phone widths, with no page errors. On the final package's own Web, workspace Markdown files were opened one after another from paths in a message, the Files tree, the path box and a diff's Open file, also with file reads slowed to 700 ms; the latest chosen resource stayed in front each time, including an image chosen while a file was still being read, with no page errors. The phone header and menu were checked at 390, 360 and 320 pixels in Chinese, English and Japanese.

The PDF reader ran in Chrome's touch emulation, including scrolling by touch, and Presentation slots chose it only for their own PDFs. On the final package's own Web, 13 checks of the places PDFs open from and 9 of Presentation slots passed with no page errors, and the reader's character maps, fonts and WASM were served byte for byte as built. When the reader's code threw or could not be downloaded there while a workspace draft was open, the page did not reload, the chat stayed, and the draft stayed word for word and could still be edited; without a draft, each failure reloaded the page once and the chat came back, and a normal PDF still drew its pages.

On the final package's daemon, an answer with a note kept the note exactly as written, spaces and line breaks included, and the reply read the Selected line, a blank line and the Note: line. The same answer sent again with the same client ID returned the same event, a changed note was refused as an idempotency conflict, an answer under a new client ID to a closed request was refused as closed, and a version 1 answer still worked.

In an isolated browser with fixture messages, 12 messages that arrived behind a full-screen image counted 12 unread, where the code before this change counted 5 or 6. The proportional font was compared in an isolated Chrome in English, Chinese and Japanese, light and dark, at desktop, 390 and 320 pixels, with saved Mono and Pixel choices.

With a Grok web model member whose webhook could be woken, a pair of isolated runs on one 30 MiB fictional ledger (40,276 synthetic messages) compared the release candidate with the published 0.4.50 binary. After each run settled a synthetic old delivery claim through its natural polling, and after a 10-second warm-up, the process that runs the Web and the daemon together used 0.325% of one core over 120 seconds of idle polling on the candidate, against 2.904% on 0.4.50; resident memory grew by 0.4 MiB in each, to 130.6 MiB and 125.9 MiB. This is one short pair on fictional data, and the two versions also differ in other code.

The DeepSeek changes were checked on the release candidate with a fake ACP program and a fake gateway, in a private network with isolated homes, through Node 24's own fetch. Requests to a gateway on a literal loopback address never reached a stand-in proxy, while a member whose gateway was not a loopback address attempted a CONNECT tunnel through that proxy. A key rejected in DeepSeek's 401 wording was tried once; in the two seconds watched after a new key was saved without a start, nothing was sent, and after an explicit start both waiting messages were each accepted once. An ordinary 503 was tried four times, and after the saved key changed under a running member, the old key showed only as [redacted] in the run records and in the Group's history. The connection form was walked on the final package's own Web in headless Chrome at desktop width and 390 pixels with no page errors.

On the release candidate, in a private network with a proxy set and NO_PROXY either empty or already excluding loopback, the daemon's and the CLI's calls to a stand-in local Web reached it once each with a fictional admin token, and the stand-in proxy received nothing. A skill was installed from a direct HTTP URL that held a fictional username, password, query string and fragment. The download used the credentials and the query, and the returned target, the saved catalog, the installing Group's overview and another Group's capability search showed none of the four, while the record could still be found.

The final package's own binary reported 0.4.51, its archive carried the same binary and README, and its own Web served this version's assets, the PDF reader's included.

This is not complete live acceptance. No request reached a real DeepSeek API or gateway, and no real provider process ran on either package. Real phones, Safari, Firefox, and native Windows and macOS were not tried, and font rendering on Windows was not checked.

Thanks to waterbang for the DeepSeek connection settings and the simpler member editor, to chriscoveries for removing duplicated code in the search and Inbox dialogs and the IM adapters, and to everyone who tested and reported issues.

Full source comparison

Released under the Apache-2.0 License.