Repository navigation
CCCC 0.4.51
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_PROXYor
ALL_PROXYwas set andNO_PROXYdid 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 instate/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
fordeepseek-flashinstead ofdeepseek-v4-flash, unlessDEEPSEEK_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 itscccc
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 andNote: <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_URLandDEEPSEEK_MODEL
from the environment it starts with (its own environment settings first, then
the daemon's), and otherwisehttps://api.deepseek.comanddeepseek-flash.
The model field also suggestsdeepseek-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/completionsis 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 throughcccc_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_sendrefusespathsand points topath, 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.