Releases
Every release, newest first. The same text is in CHANGELOG.md; each release is also on GitHub, where the tags are.
Jump to: 0.9.0 · 0.8.0 · 0.7.0 · 0.6.0 · 0.5.11 · 0.5.10 · 0.5.9 · 0.5.8 · 0.5.7 · 0.5.6 · 0.5.5 · 0.5.4 · 0.5.3 · 0.5.2 · 0.5.1 · 0.5.0 · 0.4.5 · 0.4.4 · 0.4.3 · 0.4.2 · 0.4.1 · 0.4.0 · 0.3.7 · 0.2.6 · 0.2.5 · 0.2.4 · 0.2.3 · 0.1.0
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.9.0, 2026-11-04
Removed
- All telemetry.
clyde telemetryand its first-run notice are gone, along with the usage counters (runs, provider errors, tuning, Bonnie features), the Cloudflare Worker inworker/, the website's visit counter (site/analytics.js) anddocs/telemetry.md. Clyde and the website no longer send anything about their use.
Added
clyde --acpreopens and forks sessions.session/loadreads a saved session, replays its user and assistant messages to the client and gives the model the history again;session/forkmakes a new session that starts as a copy of another and leaves the original alone. The ACP session id is now Clyde's own session id, so it still names the session after the process restarts. An id that is not a plain file name is refused.clyde --acpreports a missing key as "Authentication required". Switching to a model whose provider has no key now fails with that sign-in error (naming the provider) instead of "can't switch to", and the no-provider error starts the same way, so clients such as Sylvie can show theclyde loginhint.- A Docs tab on the website.
tools/build_docs.pyturns the repository's Markdown (the guide indocs/, the research notes, the security, contributing, governance and egress pages, and this changelog) into site pages with a sidebar and a search box that works offline in the browser, so nobody has to open GitHub to read them; a Releases page lists every version from this file. The pages are generated when the site is deployed (a change to any of those files redeploys it) and are not committed. Links between pages stay on the site; links to source files go to GitHub. The page text is escaped, never passed through as HTML. - A Report an issue page on the website: a form for a bug, a feature request, a documentation fix or a question that opens GitHub's new-issue page with the title, label, text, Clyde version and system filled in. Nothing is sent from the site and nothing is stored; the issue is submitted on GitHub, which needs a GitHub account. Security problems are pointed to the security policy instead.
- The site's visit counter names the docs pages
docs-<page>(docsfor the tab's front page), sodocs/features.htmlis not counted as the Features page.
Fixed
- An MLX model downloaded through oMLX is no longer lost when oMLX saves it somewhere Clyde doesn't look. oMLX downloads into its own first model folder, which isn't always one in
~/.omlx/settings.json(the oMLX app, Homebrew,--model-dir); the download said it was done and/evalran, but the model was then missing from/models, the model list and remove. After a download Clyde now asks the server where it put the model and adds that folder to oMLX's model folders, and a download oMLX reports as completed but doesn't serve is an error instead of a silent success./models localalso prints the folder the model went to. - "All in" no longer asks before every command that only looks at something outside the project (
ls,find,catof a path elsewhere): a search of the home folder had asked a dozen times in a row. It still asks before anything that changes or deletes outside the project, before a major move, and before a secret file is read. - A command that deletes or moves the environment Clyde itself runs from (for example
rm -rf ~/.local/share/uv/tools/clyde-cli) now says so in its question, with the folder named. Before, it read like any other command outside the project, and once it ran, the next lazy import failed withImportError: cannot import name 'refine' from 'src'and a traceback.
0.8.0, 2026-10-27
Security
- Clyde now requires certifi 2026.10.19 or later, the bundle of root certificates its HTTPS requests trust. That release drops the emSign ECC Root CA - G3 after eMudhra's weak-key incident; an older bundle kept trusting it, which left connections open to interception.
Added
/orchestrate <task>: Clyde lists the connected providers with the models each really offers, you pick the master, an optional advisor and the workers, Clyde briefs you with questions until the request is a spec, and the team runs. Each worker is its own agent on its own git worktree, all at the same time, with its own transcript, spend and approvals: a command asks you (a read-only one does not), edits inside the worktree are free, and nothing leaves it until you approve; then the changed files and achanges.patchland in~/.clyde/outbox/<run>/and the project is never touched. A local model (Ollama, oMLX) among the workers makes them run one at a time. Other agent CLIs are listed but cannot run yet. Live with two workers, an advisor and a master on gemini-3.5-flash-lite: 43 s, the advisor caught a real mismatch between a worker's file and the spec.clyde stationshows a run live from another terminal (who is doing what, spend, waiting approvals);station ls,station watchandstation approve|denylist runs, stream events and answer a worker's request. A run is plain files in~/.clyde/runs/<id>/(state, events, a spend ledger with an unpriced model counted as unpriced, approvals, each worker's transcript).clyde station web: the station in a browser, on localhost. It shows every active run: each team member as a card (model, whether it is Clyde's own loop or an agent CLI, what it is doing now, and the rule it runs under, such as "files only: no shell commands"), Clyde's own state, spend, the event feed (click a card to filter it), and each waiting approval with Allow and Deny buttons. The page follows the run live over a long poll and picks up runs that start after it opened. It reads the samesnapshot()as the terminal table, so it can't show what the run didn't record. Only the browser that opened the one-time link Clyde prints gets in (Host and Origin checks, an HttpOnly SameSite=Strict cookie, and an API token on every call, as Bonnie does), event text is shown as text and never parsed as markup, and it uses no outside scripts or fonts. Live: a run with a native worker, an aider worker and an aider advisor, with the shell command approved by clicking Allow in the page.- The advisor can be an agent CLI too: Claude Code (no tools at all, an empty folder, none of your own Claude settings) or aider (ask mode, which answers and never edits, no git, an empty folder). Its review goes to the master like any other, its own cost is in the ledger (live: Claude Code haiku $0.00076, aider on ministral-3b $0.00006), and if it fails the report says so and still comes. Only the master has to be a Clyde provider model.
- tmux panes for a run:
clyde station panes(or yes at the new "Open a tmux pane for each team member?" question in/orchestrate, shown only when tmux is installed) opens one window with the live station and a pane for the advisor and each worker, each streaming that member's recorded events (clyde station watch <run> --who <name>). Inside tmux it joins your session without taking focus; outside it makes a detached session and prints the attach command. The panes are views: closing them stops nothing, and they stay readable after the run ends. Without tmux nothing changes. - The web station is now a floating island in a night sky, seen from a corner. The front office (Clyde, Bonnie, the master and the advisor) is at its heart; each worker has a workshop on an arm of hallways, a new worker adds a workshop on the end of an arm and the island and the rock under it grow with the team; the speakeasy and the mail slot lie along the east hallway. Rooms have low glass walls, so every room can be seen into. The pictures (crew, furniture, floors, wall decorations, trees, sky) are generated pixel art, cut from sheets by
tools/slice_crew.py,tools/slice_env.pyandtools/build_env_art.py(see THIRD_PARTY.md). Furniture is the capability a member was given (read, write, shell, web, MCP, other), with counts of what it used, asked, was allowed, denied and failed, and it lights up when used. Crew walk only when something was recorded: a worker to the furniture for a tool it used, Clyde with a task or an approval request, Bonnie to collect a result; history is never replayed, and reduced motion makes them appear at the spot. The one exception is scenery: after 25 seconds in which nothing at all was recorded Clyde and Bonnie go to the bar together (a cigarette and a drink in their speech bubbles) and now and then look into a workshop; any record ends it after the leg they are on, and it never happens while an approval waits for you. At the bar a worker stands beside the orchestrator it has worked with most and leaves with them: the bond is read only from the recordedcheckhand-offs (Clyde taking a worker its task or an approval, Bonnie collecting its result), grows as score / (score + 6) so it never reaches 1 and one pair's number never moves because another's did, and a worker with no recorded hand-off gets no special place. Every crew member can be given a name of your own (the Rename button on its card): it shows on the island, in the lists and in the events, with the real id beside it on the card, and it is kept only in your browser, per run, so the record is never changed. While a run is working, the station's Add worker button asks Clyde for one more worker doing a task you write (up to 12 workers): the order is filed in the run (orders/), the run takes it, makes the worker's worktree and hands it the task through Clyde, and every step is recorded (ordered,check, ororder_refusedwith the reason)./orchestrateasks for a cost cap (USD, empty for none): the run stops like Ctrl-C once its priced spend reaches it, withcost_caprecorded, no review or report bought after that, and the cap shown beside the spend. Calls already under way finish first, and an unpriced model's spend cannot be counted. The Stop run button in the crew panel (after a confirm) stops every worker of a working run the way Ctrl-C does: the run recordsstop_requestedandstopping, waiting requests are turned down, nothing lands, the worktrees are removed and the run ends as stopped; new tasks and workers are refused while it stops. A worker never has more than its lead: what the lead is denied stays denied for it, and it cannot start workers of its own. The Task button on a worker's card gives a worker already on the team a task the same way: Clyde takes it the task, and the worker starts it when its current one is done, in the same worktree and conversation, and its summaries and last patch cover both. The top-left card lists six first steps (start a run, see a worker use a tool, answer a request, add a worker, give someone a name, land or discard a run), each ticked only by what the run recorded or a name you gave, kept ticked in your browser, and hidden once all are done or you hide it. A run records the tools each member was given (tools,constraint) and Clyde's and Bonnie's checks (check). Crew cards, approvals and events sit in a panel that hides and shows; the scene fills the window and zooms and pans. The server hands pictures only to the browser that opened the link, and only from its art folder. A Node test of the page's geometry proves that no walking path crosses furniture, that every hallway reaches a door and that the quiet-spell walks end in the bar. - Other agent CLIs as workers in
/orchestrate: Claude Code and aider, each in its own git worktree beside Clyde's own workers. A CLI can't stop and ask mid-task, so the files-only rule is kept by what it may use: Claude Code runs with--restricted, only Read, Edit, Write, Glob and Grep, and none of your own Claude settings or hooks; aider runs with no shell commands and no commits. A command the CLI tries anyway is refused by the CLI and shown as a failed call. Claude Code's models are its aliases (haiku, sonnet, opus); aider's are the models of your connected providers in litellm form, and it gets only the one API key its model needs, fromclyde loginand not from a stale export. The CLI's own cost report goes in the ledger (live: Claude Code haiku $0.0154, aider on ministral-3b $0.00005) and its raw output is kept in the run. Only a Clyde provider model can be master or advisor; a CLI without an adapter (codex, gemini, cursor) is listed with no model list instead of a made-up "default". - Ask the user the way Claude Code does: when the model uses AskUserQuestion, the REPL opens an arrow-key question with the header chip, each option's description, a row to answer in your own words, "Chat about this", Space to tick for multi-select, and the focused option's preview. Without a terminal the numbered prompt stays.
UserPromptSubmitandStophooks, in Claude Code's format. AUserPromptSubmithook adds context to the prompt (its stdout, orhookSpecificOutput.additionalContext) or blocks it; aStophook keeps the turn going until its check passes, giving up after 8 blocks in a row.- Permission rules gain
ask(always prompts, even for a read-only command or in auto-approve) and Claude Code's order: deny, then ask, then allow. A project's.clyde/settings.jsonrules apply too: its deny and ask rules at once, its allow rules once you trust that exact list. A tool denied by bare name (WebFetch,mcp__github__*) is no longer shown to the model. - After compaction, the 5 files the conversation most recently read or changed come back, re-read from disk; bigger ones as a path to read again. Asked a value from a file after a real compaction, ministral-8b answered 3 of 3, against 1 of 3 before.
- After compaction your own messages come back word for word, not only as the summary's wording of them: the newest ones that fit about 1,500 tokens, a long one keeping its start and end, oldest first, and a second compaction carries them on once. A model can drop or bend a constraint when it summarizes; what you typed is kept as typed.
- Files Clyde rewrites in place (
config.json, the settings files with permission rules, hooks and plugin state, saved sessions, Bonnie's automations and pins, the run files, the keys) are now written so a crash or a full disk cannot tear them: a temporary file is flushed to the disk, swapped in one step and the folder flushed too, so you get the old file or the new one, never half. The last good version of the JSON ones is kept beside them as<name>.prev, andconfig.json, automations and pins fall back to it if the file is cut off instead of starting from defaults. - Station fixes: a worker whose request you answered shows as working again instead of staying "waiting for approval" until its next recorded step; the crew panel's counts use the same rule as the header (they could disagree on a finished run); a plan holds at most 12 workers, as many as the station has places for at the bar; and on a phone the crew panel starts under the header instead of behind it.
/costnow shows how the prompt cache did, read from the session's traced requests: how many prompt tokens came from the cache, and each miss (tokens billed again at the full price because the cache expired while you were away or the start of the prompt changed) with what it cost extra and how long you had been away. Nothing is shown when tracing was off or the model reports no caching.Editcan change several places in one file in one call (edits, a list of old_string/new_string), instead of one call each. Every edit is matched against the file as it is, none may touch the same text as another, and all are made or none, with the error naming the edit that failed. A model that sendseditsas a JSON string or as a single object is repaired. The single old_string/new_string form works as before.- A tool output too long for the context was already cut to its start and end with the whole of it saved (
RetrieveContextreads it back a page at a time).RetrieveContextcan now also search it: passcontains(a literal text, any case, withlinesof context up to 5) and get the matching lines with their numbers, so a long log or a big search result is answered in one call instead of paging through it. - What comes back from outside is checked for text meant for the model: when a web page, a search result or an MCP tool's answer contains "ignore your previous instructions", a request to send the conversation away, or a request for the system prompt (the scanner's injection rules that already vet skills at load time), or text direction overrides, the result reaches the model with a notice in front that says it is data, not from you, and not to follow it, and the session trace records
injection_flag. It warns and never blocks, so a page that merely discusses prompt injection still reads, and files you read yourself are not checked.CLYDE_INJECTION_SCAN=offturns it off. - Bonnie's automations are now safe to run from more than one window: every change to
automations.jsonhappens under a lock the other windows respect (so two windows cannot lose each other's edits), and a due run is claimed in the same step that moves its next time on, so it fires once however many windows are open. What the scheduler decided and why (ran on schedule, ran because you pressed Run now, skipped because Bonnie was closed and it was hours late, created, paused, resumed, deleted) is appended toautomations.log(the last 500), shown on each automation as its last decision with a History button for the rest. - In the web station each workshop now turns two of its six pieces to show their back, one against the south wall and one against the east wall (which two depends on the workshop's number, so neighbours differ), using generated back-view pictures (
furn-*-back.png); the other four still stand against the north and west walls showing their front. A back picture is drawn as tall as the front one. Every room's south and east edges are low glass walls too, all along with the doorways left open, so every back stands against an actual wall. The front office shows its signing desk and cash register from behind on those edges, with a clerk's desk and two file shelves beside them; the post room has two more mail cabinets and the speakeasy a second counter, all turned their back to the camera. - Context cuts can be read back. When an instruction file, the README excerpt or git status is too long for the context prompt, the part left out used to be gone; now its full text is kept for 7 days in
~/.clyde/context_cache/and the cut ends with a reference the newRetrieveContexttool reads. Every repo measured had at least one such cut, the global CLAUDE.md among them. The reference is a hash of the text, so the prompt stays byte-identical turn to turn./contextadds a section table: tokens, whether each section changed since the last turn, where the provider's prompt cache stops, and the references. - Answer a permission prompt in your own words: a model reads only your reply and allows the action when it is a plain yes ("sure, go ahead", "dale"). Anything else, a no, a question or a yes with a condition, holds that action and reaches Clyde as your words at its next step. The check is capped at 15 s and fails closed. In Bonnie, type the answer while the card waits and press Steer. It comes from the Discord bridge that was not kept. Live on Qwen2.5-Coder-3B: 12 of 12 replies read right, 0.1 s each.
Changed
clyde stationshows every run that is still going, not only the newest, andapprove/denyanswer the oldest waiting request across them (or in the run you name). A run whose last event is over six hours old is treated as left over from a session that died.- Out of tool turns, the model says what is done, what remains and what to do next, instead of the bare "[Max tool turns reached]" (still the fallback).
clyde -pstill reports it as an error, "ran out of tool rounds". - Tool output is held to each tool's limit with its head and its tail, and the whole of it is a
RetrieveContextcall away (paged, 50,000 characters at a time). Before, nothing enforced the limit and Bash kept only the first 20,000 characters, so a long failing run lost the error at its end: asked why such a run failed, ministral-8b now answers 3 of 3, against 0 of 3. Bash's limit is 30,000 characters per stream. - The context prompt puts its stable sections first and Runtime Context and git status last, so one new file no longer empties the provider's prompt cache: on this repo 2,113 of 2,359 context tokens stay cached, against 0.
- Mistral's own model catalog decides each model's thinking levels, cached for 30 days, with the model families as the fallback offline.
- The tool-turn limit is configurable: a Tool turns row in
/settings(20, 40, 60 or 100; 20 as before) sets how many tool rounds one task may use, and a turn that reaches it now says so plainly — how many rounds it used, thatcontinuepicks up where it left off, and where the limit is raised — instead of the bare[Max tool turns reached].clyde -p --max-turnsis unchanged.
Fixed
- The in-house skill scanner passed skills it never read. It skipped any file whose full path contained
build,dist,vendororvenv, so a skill under abuild…plugin folder, or one named likedistill, came back SAFE with no findings: three BuildPartner skills that SkillSpector blocks were SAFE. It now skips only SkillSpector's tool folders (.git,node_modules,.venv…) below the skill. It also caughteval()/exec()only as a bare statement (x = eval(input())passed), missedrm -rf /…, and never read.mjs,.cjs,.jsx,.tsx,.bat,.cmd,.plor.luafiles. The LLM review now reads the flagged files, not only the rule ids. No skill SkillSpector blocked on the test corpus comes back SAFE, wherever it is installed. - Lines typed while a turn runs are no longer lost. The Esc watcher is the only reader of the keyboard during a turn and used to throw away everything but Esc, so the "queued input" never had anything to queue; it now keeps what you type, the REPL runs each line as the next turn, and a half-typed line (no Enter yet) starts the next prompt instead of being stranded. Arrow keys and other key sequences still don't count as text. In a real terminal session a request typed while the first was answering was answered after it.
/briefasked every question as if it were the first: the earlier answers never reached the model. It now sees them, always ends (after 10 questions the spec is written from what is known), and keeps itsREADYmarker out of the spec./harnesslisted model names it had made up (three Ollama models, the provider's name as its only model). It now lists what each connected provider really returns, and Ollama's installed models.- A second compaction no longer loses what the first one kept. The summarizer reads only the recent messages, so the previous summary and older requests dropped out of the new one; it now updates the previous summary and sees those requests. A decision made before two compactions was recalled 3 of 3 times, against 1 of 3 (the others made up a database).
- A stream that drops after printing part of an answer is continued from where it stopped, not retried from the top, which printed it twice.
clyde login mistralworks: the login command takes the provider name, as #65 announced.- Messages say "security scan", not SkillSpector, which the in-house scanner replaced.
mistral-vibe-cli-with-tools, the model behind Mistral Vibe's web search, is no longer offered in the model list.- Mistral models are handled the way Mistral Vibe handles them, and a little better. GLM on Mistral streams its reasoning as
thinkingfragments, which Clyde threw away: now they show as thinking while it works and go back with the earlier turns, so it keeps its plan across tool calls./thinkreaches Mistral asreasoning_effort: medium, small and magistral think onhighand stop onoff; GLM, which always thinks, takeslowforoff; ministral, codestral and large, which reject the field, get none. A reply cut off at the output limit is continued, not thrown away as Vibe does: Clyde quotes where it stopped and joins the two without doubling the cut line. A reply with no answer text is asked for again, up to 3 times, before the "no answer" notice. - A rate-limited request (HTTP 429) got the same backoff as any transient blip — 1, 2, 4 seconds — which a rate window always outlives, so every retry burned and the turn died with "retried 3×, still failing". A 429 without a
Retry-Afternow waits 5 seconds and doubles up to the same 30-second ceiling aRetry-Afteris capped at; providers that send the header were already fine.
0.7.0, 2026-10-22
Added
/refine: Clyde reviews the session and proposes up to three memory notes to add or drop, each backed by a quote from your own messages (checked, so a tool's output can't justify a note), asks before each, and logs it so/refine undoreverses the latest. An Auto-refine row in/settings(off, before compaction, every 10 or 25 turns) runs it on its own, adding notes only and printing each one. The idea comes from prime-agent's continual harness (MIT); this one is built on Clyde's memory notes./proxyand two rows in/settings(Network proxy, Company certificate): use the environment's proxy (the default), a proxy URL, or none, and add a company root certificate for networks that inspect TLS. They are applied at start through the standard variables, so MCP servers, the oMLX downloader and Bash commands take the same route. The certificate is added to the default roots, not put in their place./doctorshows both, without a proxy's password. SOCKS and stored proxy passwords aren't supported.clyde doctorand/doctorshow the update channel (latestfollows every commit on main,stabletagged releases) and the command that switches it. It used to show only in/settingsor aclyde update --checkthat reached GitHub./doctorchecks oMLX's native Metal kernels by asking the oMLX install itself. Without them GLM-5.2, MiniMax M3 and Qwen3.5 models fall back to much slower generic paths without a word; the line names the missing kernels and the command that builds them. Shown on Apple Silicon once oMLX is installed.
Fixed
- Reasoning off on Ollama's thinking-only models (
qwen3:4b, Qwen3 Thinking 2507): they reason whateverthinksays, and withthink: falseOllama stopped splitting the reasoning out, so it landed in the answer. Compaction summaries,/refineand any other no-reasoning request got prose instead of the answer. Clyde now reads the model's template and keeps that reasoning in the thinking channel; models that can turn it off still do. - With
HTTPS_PROXYset, Clyde sent its requests tolocalhost(Ollama, oMLX) to the proxy too, which a company proxy can't reach. They now always go direct. - WebFetch refused every URL behind a proxy on a private address (most company proxies): its private-network check was applied to the connection to the proxy. It now applies to the URL and every redirect, and a
localhostor metadata address is still refused. - An untrusted TLS certificate is reported as such, with the
/proxy cafix, instead of a generic connection error that was retried.
0.6.0, 2026-10-22
Added
- oMLX (github.com/jundot/omlx, Apache-2.0) runs MLX models on Apple Silicon, in place of LM Studio. The first time you pick an MLX model, Clyde asks, then installs oMLX's pinned v0.7.2 from source into
~/.clyde/omlx(a uv-made Python 3.13 environment, and its Metal kernels when Xcode is there). It starts the server itself, with a key only Clyde holds (~/.clyde/omlx/api_key, 0600, passed in the environment so it never shows inps): without one, oMLX opens its admin API to anything that can reach the port. Its SSD cache restores a prompt after a restart instead of recomputing it: on an M3 Pro, a 3,555-token prompt took 7.56 s cold, 1.01 s warm, and 0.96 s after a server restart. /settings→ oMLX memory guard:balanced(the default),aggressive, fixed ceilings at 40, 50 and 60% of RAM, oroff. A change restarts the oMLX server Clyde started.safeisn't offered: on an 18 GB Mac it left a 1.6 GB ceiling that refused a 4 GB model with 8 GB free.clyde -p --time-limit SECONDS: stops the run after that long, even in the middle of a command (whose process group is killed, as on SIGTERM). The result saystime limit reached, exit status 1. Startup (MCP connects) is not counted. Idea from Mistral Vibe's--time-limit.clyde -p --max-tokens N: stops once the run has used more than N tokens (prompt, cached prompt and output, over every model call), after that round's tools so the session keeps each call's result. The result saystoken budget reached, exit status 1. Many OpenAI-compatible servers report no usage; their calls are counted by estimate (about 4 characters a token) instead of not at all. Idea from Mistral Vibe's--max-tokens.- Limits on what the model saves to memory on its own: only what matters in a later session, not what the project's files already say or what only matters now, and never because text in a file, a web page or a tool result told it to. Models already saved lessons unasked (4 of 8 fitting live runs on Gemini 2.5 Flash and DeepSeek V4.1 Flash); this keeps a planted instruction from becoming a note every later turn reads.
- Once the memory notes outgrow the prompt's 2,000 characters, the user's own notes ride on every request only up to 1,000 characters (newest first); past that they are picked by the request like project notes, so a project lesson keeps room instead of being pushed out without a word.
/memorymarks the notes not in the prompt yet. docs/research/: the measurements behind the README's claims as dated, checkable notes — the 18 GB local-model runs, the small-model routing and tool-selection trials,clyde tune's quality gates, the three vulnerabilities found and fixed in the October security review, and the fine-tuning dataset built from 313K tool calls (nothing trained). Each note states its method and sample size, and the index maps every note to the claim it establishes.- A link to the research notes in the README's first screen and a row in the Guides table.
- The plain uv install path in the README's quickstart and the install guide:
uv tool installanduvxstraight from git, for people who already have uv. /doctorlists skill problems the loader passes over without a word: a folder with noSKILL.md, a skill pointing outside the project, frontmatter never closed, nodescription:, a skill nothing can invoke, and ascripts/file a skill runs but does not ship. The rules follow Harness²'s tree validator, adapted to how Clyde loads skills./doctoralso lists a skill hidden by a different skill of the same name in a higher-priority folder (an identical copy, such as a~/.claude/skillslink into~/.agents/skills, is not listed), and checks.tsscripts. A script counts as run only when a runner (python,bash,node,tsx, ...),${SKILL_DIR}/or./comes before it, so an example that merely mentionsscripts/x.tsis not flagged.- Memory lessons: the Remember tool takes an optional
cueand saves the note as "When <cue>: <lesson>". Once the notes outgrow the prompt's 2,000 characters, the request picks which are shown: the user's own notes always, project notes that share words with the request, and every note already shown that session, so the prompt never shrinks and a request that picks nothing new leaves it, and a local model server's cache, unchanged. Notes that fit are shown exactly as before./memory stalenow lists notes neither saved nor picked for a request in 90 days; nothing is forgotten without/forget. The ideas come from Harness²'s experience library and HyperSkill's usage-based pruning, with no new dependency. clyde -p --output-format stream-json: each message of the turn (text, thinking, tool calls and results) as one JSON line while it runs, then thejsonresult as{"type": "result", ...}, so a harness or CI job can read the whole trajectory, even of a run it had to stop.
Changed
/models localdownloads MLX models through oMLX's own downloader (into~/.omlx/models, Ctrl-C cancels it in oMLX too) and Hugging Face GGUF through Ollama only. oMLX models are listed even while its server is down.- Models you downloaded with LM Studio keep working: oMLX serves
~/.lmstudio/modelsin place, and a savedlmstudio:default model or/evalresult moves to itsomlx:name at start when exactly one folder matches.
Removed
- LM Studio support. It is closed source; Ollama (GGUF) and oMLX (MLX) cover what Clyde used it for.
Fixed
clyde -pstopped by SIGTERM (a cancelled CI job, a harness timeout) used to leave the command its Bash tool was running, and anything that command started, running on. It now stops them and still prints the result line ("error": "interrupted", exit 1).- Saving or forgetting a memory note no longer deletes what you wrote by hand in the file: a heading, a blank line or a paragraph that is not a
-note stays where it was. - SkillSpector now scans a skill reached through a symlink (
~/.claude/skillslinking into~/.agents/skills): it refuses a symlinked input, so every such skill used to fail its scan and load unscanned, even when the linked original was held back. A scan that writes no report now gives SkillSpector's own reason instead ofFileNotFoundError. - New or changed skills are scanned together at startup instead of one SkillSpector process each (about 1.7 s of every run is SkillSpector starting up), and content already judged, such as a link and its target, is not scanned again. A first launch with 95 skills went from about 5 minutes to 38 s, with the same verdict for every skill.
0.5.11, 2026-10-17
Changed
- A shell command that names a file or folder outside the project (an absolute path,
~,$HOMEor..; temp folders do not count) now asks, even a read-only one and even in all-in mode, and so does one that names.git/configor.git/hooks. This replaces what the sandbox used to enforce. - Read, Write, Edit, NotebookEdit, Glob, Grep and a Bash
cwdoutside the project now ask instead of being refused. A yes covers that file, or that folder and what is under it, for the rest of the session; a no does not. Headless-pstill denies (it cannot ask).
Removed
- The shell sandbox (macOS
sandbox-exec, Linuxbwrap), theunsandboxedoption on the Bash tool, thesandboxblock in~/.clyde/settings.json(now ignored) and the sandbox line in/doctor. Why: Apple has deprecatedsandbox-exec, so a future macOS release could remove it and break every shell command; Clyde should not depend on that. The guard is now the permission prompt alone, so a command you approve can write anywhere you can: read the command before you say yes. Hosted previews in Bonnie and the DuckDB data tool keep their own, unrelated isolation.
0.5.10, 2026-10-17
Added
CLYDE_SKILL_SCAN=closedholds back any skill, plugin, agent or MCP server whose SkillSpector scan failed, instead of loading it. The default is unchanged (a failed scan loads, so a broken scanner never locks anyone out), but it is no longer silent: each failure now says so once on stderr with the reason ("loaded WITHOUT a scan") and is recorded as ascan_failedtrace event.EGRESS.md, linked from the first screen of the README and from the privacy page: every way Clyde can use the network, what it sends, when, and how to turn it off (your model provider, the update check, telemetry, WebSearch and WebFetch, MCP servers, cloud review, SkillSpector's LLM review, local-model search, setup downloads). A test fails whenever the code names a host the document does not, and when the document promises an off switch the code never reads.GOVERNANCE.md(one maintainer today, how decisions are made, how releases happen, how to become a maintainer),SECURITY.md(report a vulnerability privately through GitHub, what counts, the known limits) and a pull request template, whichCONTRIBUTING.mdalready told contributors to fill in.
Changed
- When Edit lands a match that was not exact (it ignored trailing whitespace or indentation), it now says so: the result tells the model what was ignored and to check the patch, the one-line summary shows
matched loosely (ignored indentation), and the trace records anedit_loose_matchevent. An exact match is unchanged. - WebSearch now asks before each search, showing the whole query, the way WebFetch asks before each URL: whatever the model wrote goes to DuckDuckGo, and a key or a snippet of your code can ride in it. "Don't ask again" saves a
WebSearchallow rule. Inclyde -p, which cannot ask, a search is now denied unless that rule exists (permissions.allowin~/.clyde/settings.json) or you pass--mode all_in. Bonnie's own search box is unchanged, because you type that query yourself. - With the LM Studio provider, Clyde no longer downloads and runs LM Studio's installer (
curl ... | sh) on its own when the headless daemon is missing. The terminal UI asks first (default No); in an editor over ACP, inclyde -pand in Bonnie, where nobody can be asked, it stops with the command to run by hand. Before, that was the one download-and-run Clyde did without a yes.
Fixed
- A failed scan of an MCP server's tool list was cached as a verdict, so one scanner hiccup kept the result until the tool list changed. It is now not kept (as for skills), so the next connect scans again.
0.5.9, 2026-10-16
Changed
- ClydeCLI now runs on Python 3.12, 3.13 and 3.14 (it needed 3.14). Python 3.11 is not supported because SkillSpector, the bundled skill scanner, needs 3.12, and 3.15 waits for SkillSpector too. The one thing that needed 3.13 was the path-glob matcher for saved permission rules (
Edit(docs/**)-style rules usedPurePath.full_match, which would have raised on 3.12); it now falls back to an equivalent that is tested against the real one on every combination tried. A newTestsworkflow runs the whole suite on 3.12, 3.13 and 3.14. - Laya, the local model that spots a stuck cardShuffle turn, is now an optional extra (
clyde-cli[laya]) instead of a required dependency, because it pulls in PyTorch: a new install drops from about 790 MB to about 180 MB, and Laya adds about 640 MB of packages plus its 800 MB model.clyde setupoffers to add it (default No, never with--yes) and keeps your installed version;clyde updatekeeps Laya for anyone who already has it, so an update does not remove it. Without Laya everything else works and cardShuffle has no stuck check;/layaand/doctorsay "not installed" instead of treating it as a failure.
0.5.8, 2026-10-16
Added
- Over
--acp, editors also get the/settingstoggles (auto-save sessions, trace requests, terse replies, max history, context window, update channel) as options on the thread, and a change is saved to~/.clyde/config.jsonlike/settingsdoes. clyde tunecan apply the setting it recommends. With the Ollama app on a Mac it sets the variables and restarts the app. With only theollamacommand, it keeps the setting in~/.clyde/tune.jsonand startsollama servewith it whenever Clyde needs a server; if an Ollama is already running it asks before stopping it (throughbrew serviceswhen Homebrew runs it) and never touches a server on another machine. Elsewhere it prints the steps as before.- The website counts visits, anonymously:
site/analytics.jsrecords which page was opened, which tab, screenshot tab, copy button or outbound link was clicked, and where the visitor came from (github.com, a?ref=label such asgithub-readme,internal, ordirect). No cookie, no stored identifier; Do Not Track and Global Privacy Control switch it off, and the newprivacy.htmlhas a switch per browser and says what the site andclyde telemetrydo and don't record. It reports to the project's GoatCounter (dea6cat.goatcounter.com); it speaks GoatCounter's/count, andtools/telemetry_receiver.pynow serves it too (daily unique visitors from a hash that is never saved) with areportcommand. - A small local model is sent the tool a request names on its first turn, so it does not have to ask for it:
Rememberfor "remember that…",TodoWritefor a to-do list, plan mode,CronCreatefor reminders and schedules,AskUserQuestionfor "ask me" options,Datafor CSV and similar files,Mapfor the code map. On Qwen2.5-Coder 3B it picked the right tool in 30 of 35 trials, up from 1 of 35 when it had to find the tool itself. clyde telemetry: anonymous usage counters. On for a new install, with a notice the first time Clyde runs in a terminal; someone who already had Clyde is asked once (default No) and stays off unless they say yes; never switched on by itself in an editor, a script or CI.clyde telemetry offstops it and deletes the queue. Only counts, flags and words from fixed sets can be recorded (a prompt, a path, a model's name or an error message cannot),clyde telemetry showprints exactly what is queued and what the schema allows,offdeletes the queue, andCLYDE_TELEMETRY=offandDO_NOT_TRACK=1always win. Events go out in one batch, only while telemetry is on, to an https (or localhost) endpoint: by default a Cloudflare Worker (worker/) that re-checks every event against the same schema (worker/schema.jsonis generated fromsrc/telemetry.pyand a test keeps them equal), refuses a batch with one off-schema event, and stores only daily counters, never an event, an install id or an address.clyde telemetry endpointsends them elsewhere.tools/telemetry_receiver.pyis a reference receiver you can run yourself. Recorded after each agent run (with the built-in provider's name, or "custom" for a provider you added; a custom provider's name is never sent), on provider errors, onclyde tune, when Bonnie starts, and for each Bonnie action that succeeds (one word from a fixed list such asprompt,modeorautomation_run; a refused request or a page load is not counted, and nothing that was said is recorded).
Changed
- The list of tools a local model can load on request has no descriptions for a model of about 3.7 billion parameters or fewer, and keeps them for larger models and unknown sizes. With the descriptions, Qwen2.5-Coder 3B called the
Remembertool 1 time in 6 and answered "Remembered" without saving anything; without them 6 in 6, and across six tools its first-turn calls went from 39 of 60 to 50 of 60. Larger and hosted models read the descriptions and find tools better with them. Clyde takes the size from Ollama, or from the model's name. - A small local model's first request is smaller: about 1,880 tokens, down from about 3,070 in our test with a 3B model. The README excerpt is left out (the model can read it), and the sections of your own global
CLAUDE.mdthat are about a language your project does not use (a Dart section in a Python project) are left out. Your own model names the language of each section once; the answer is kept in~/.clyde/section_languages.json. When it cannot tell, or the project's languages are unknown, the section stays. A project's ownCLAUDE.mdis never filtered, and hosted models get the same prompt as before.
Fixed
- Clyde no longer asks Ollama for a context window that can starve the machine. The window used to fill about 75% of the RAM left after the model's weights; on an 18 GB Mac that gave
qwen3:4b68,608 tokens (9.4 GB of cache) and macOS restarted with a watchdog panic. The window now counts the memory that is free, keeps a 3 GB reserve, and holds weights plus cache under 35% of RAM, so the same model gets about 8,000 tokens on a busy machine and more on a free one. - A conversation that moves to Mistral after another provider wrote its history (
/model, or acardShufflecard) no longer carries tool call ids Mistral refuses. Its API takes only ids of exactly nine letters and digits, so any other id (toolu_…,call_…) is rewritten, the same way for a call and its result; other providers keep theirs. Covered by unit tests only: the Mistral key on this machine is rejected, so it was not run against Mistral. - A lone surrogate character in a message (half of an emoji, bytes decoded badly) no longer gets a conversation rejected. It used to leave as a
\ud83descape that NVIDIA's API refuses with HTTP 400, and because the text stayed in the history every later request failed too. Requests are now UTF-8 and such a character goes out as�. - A model that sends the same tool call again and again no longer burns the whole turn limit. After two identical calls with identical results, the third is refused with a note to change approach, and if it repeats once more the turn ends with a message. Calls whose result changes (polling a background task) and the polling tools are never counted. On Qwen2.5-Coder 3B asked to read a missing file, 12 identical calls became 2, and the model then looked for the file another way.
AskUserQuestion,TodoWriteandMapdescribe every field, nested ones included (what goes inquestionand what inheader, whatactiveFormis, which fields eachMapaction needs), because a small model fills a field in from its name alone. On Qwen2.5-Coder 3B,AskUserQuestioncalls with valid fields went from 0 of 10 to 10 of 10, andMapandTodoWritecalls that came back as tool errors from 16 of 20 to none.- The
Datatool says what to install when DuckDB is missing: the Python that lacks it and thepip installcommand, in place of a bareModuleNotFoundError. CronCreatetells a model how to write the schedule: the five fields in order, with*/10 * * * *for every 10 minutes and two more examples, and a rejected schedule comes back with a working example. On Qwen3 4B the right schedule went from 20 of 24 requests to 24 of 24.- A small model that calls a tool taking no arguments as
{"name": "EnterPlanMode", "arguments": {}}is no longer rejected every time: Clyde unwraps the call. - The editor's "Connect a provider" button now runs
clyde login. Zed adds the login argument to the agent's own--acpcommand, and--acpused to win, so the terminal showed the protocol server's banner and Zed kept waiting on "Authenticating to Clyde…".
0.5.7, 2026-10-15
Added
/models localshows its results as a table with titled columns: model, fit, format, size, tokens per second, pulls, quantization, number of download options, and the publisher the download comes from. A narrow terminal drops the right-hand columns instead of wrapping.- Choosing a model opens its page: downloads, likes, last update and license, the opening of its README, parameters, architecture, context length, and what it can do (tool use, vision, reasoning, read from the repo;
?when it can't tell). Below it, every download of that model as a table: each GGUF quantization and MLX build with its size, fit, estimated speed and quality, the recommended one marked, and options too large for your machine shown but not selectable. Other models by the same publisher end the list and open their own page. - Search results are named after the model they were made from (
mistralai/Ministral-3-14B-Reasoning-2512, downloaded vialmstudio-community) when the repo's card says so reliably, and repos of one model share a row. - The cost shown before a download is a table of labelled rows (download, when run, speed, quality, means).
- Replies from Ollama now record prefill, decode and load time in milliseconds in the trace (
prefill_ms,decode_ms,load_ms). tools/analyze_traces.py, a diagnostic script that is not part of Clyde: it reads trace files and reports prefill against decode, cold starts and prefill spikes.
Changed
/models locallists a model whose best download is 2-bit or lower after the usable ones, and says how many it moved. IQ quantizations (IQ2_M) now get a quality note like the others.- The Pylint check runs on Python 3.14 with the project installed and fails below a score of 9. It used to run on 3.8 to 3.10 and failed every time.
Fixed
/models localnow finds vision-language models and the repos of the catalog publishers (lmstudio-community,mlx-community). It asked only fortext-generation, which hid the official Ministral 3 and Gemma 4 repos.- A speculative-decoding file (
…-MTP-F16.gguf) or a drafter model could be offered as a tiny download of the model itself. They are now skipped. - For Ollama and LM Studio, a small local model's tool list only grows within a session. Before, it changed between prompts, so the server re-read the whole conversation each time (one change cost 55 seconds of prefill on a CPU).
0.5.6, 2026-10-14
Added
clyde --acpoffers a terminal login (clyde login) as its auth method and answersauthenticate, which the ACP Registry requires of listed agents. With no provider connected,session/newnow replies with the protocol's auth-required error instead of leaving the editor waiting.
Fixed
- Files you
@-mention in an editor (Zed) over--acpnow reach the model: it is told the path and line range and reads the file itself, so its permission and secret-file guards still apply. Before, mentions were dropped and the model saw only your text. clyde --acpno longer hangs the editor when a request makes Clyde exit (for example a model that can't be resolved): the editor gets an error reply.
0.5.5, 2026-10-14
Added
clyde acp install zedadds Clyde to Zed'ssettings.jsonas an external agent. It shows the change and asks first, keeps your comments and other settings, and saves a.clyde-bakcopy.- Over
--acp, editors get a model picker: Clyde lists the models of your connected providers (leaving out ones that failed/eval) and switches when you pick one.
0.5.4, 2026-10-14
Added
/models locallists models that run slower than about 15 tokens per second last and marks them(slow);CLYDE_MIN_TOKSchanges the floor.- Downloads through LM Studio warn first that tool use isn't confirmed for that model.
- Clyde asks for GPU offload: Ollama gets
num_gpuandlms loadgets--gpuwhen a GPU (Apple Silicon or NVIDIA) can hold all or part of the model. With no GPU, the runtime decides as before.
Fixed
/models localno longer offers models whose chat template can't call tools: the benchmark-rankedbestsource is now checked too.- A model that failed
/evalis hidden from/models localwhichever app runs it (Ollama, Hugging Face GGUF or LM Studio), and the match ignores case.
0.5.3, 2026-10-13
Fixed
/models localno longer crashes with a traceback when Hugging Face is slow: a read that times out or drops after connecting is now treated like any other failed lookup, so that source just lists nothing.
0.5.2, 2026-10-13
Changed
- When LM Studio already has a model loaded with a smaller context than Clyde would give it (its own default is 8192), Clyde asks once whether to reload it with the larger window. No reloads without a yes; a window you fix in
/settingsis applied without asking.
0.5.1, 2026-10-13
Added
/settings: one screen with Status, Config, Usage and Stats tabs. Config toggles auto-save, request tracing, terse replies, history length, the context window for local models and the update channel (type to search; most changes apply from the next start, the context window from your next message, and LM Studio reloads the loaded model with it). Usage shows the session's cost, tokens and cache hits per model, and what each plugin's skill list adds to every prompt. Stats draws a heatmap with streaks and favorite model (Overview) and tokens per day per model (Models), for all time, 30 or 7 days (r), from the request traces.
Fixed
- SkillSpector no longer rescans every launch: skills that share a name (one per plugin or folder) were overwriting each other's cached verdict, so each load scanned them again. The cache now keeps one verdict per folder, and approving a skill covers every folder with that name.
- Starting LM Studio from Clyde no longer opens the LM Studio app. Clyde starts the headless
llmsterdaemon (lms daemon up), installing it first when missing, and never falls back to launching the app.
0.5.0, 2026-10-13
Added
- Memory notes keep their save date (an invisible comment at the end of the line; notes written by hand are dated the next time the file is saved).
/memory stalelists notes older than 90 days, and a full memory file points to it.
Security
A source audit of the whole tool turned up 19 leads; each is fixed here with its own regression test (tests/security/).
- The MCP approval prompt for a project's
.mcp.jsonnow shows the real destination and the names of the environment variables an entry reads, and an entry with both acommandand aurlis refused. Before, it could be shown as a harmless command while theurlreceived headers expanded from your provider keys. - MCP tools that don't call themselves read-only, the generic
MCPtool andfile:or secret resource reads now ask before they run. Deny rules written formcp__server__toolalso stop the genericMCPtool and the resource tools, a project server can no longer take over a tool name your own server owns (a clash is reported), and your servers load first. - The post-edit lint no longer lets a model-chosen file name act as a
rufformypyoption, and only checks files inside the workspace. - Every
gitcall Clyde makes in the workspace now ignores repository-local code (core.fsmonitor, hooks); Write and Edit on.gitpaths ask even in all-in mode, and the shell sandbox can't write.git/configor.git/hooks. - The legacy Python Skill tool only runs modules inside the skills folder and asks first.
ExitPlanModeasks before leaving plan mode and only writes the session's plan file. - The read-only Bash check no longer accepts parameter expansions that can run code (
${x@P},${x:=...},$'...',$((...))), nortree -o/-R,rg --hostname-bin/-z,file -C,date -s. - The secret-read ask now recognises globs, braces, names after a
cd, secret folders,/proc/<pid>/environ, Clyde's own settings and OAuth files, andenv/printenv/export -p. Grep and Glob skip secret files and anything that resolves outside the workspace, and the Data tool refuses secret files, SQL that names one, and SQL that builds a file name at run time. SQLite files are opened by an encoded path. - A cloned repository's skills, README and instruction files (
CLAUDE.md,AGENTS.md) must resolve inside the repository and not be secrets, so a committed symlink can't pull~/.clyde/keys.jsoninto the model context. - Bonnie serves its page, and the API token inside it, only to the browser that opens the one-time link it prints; fetching
http://localhost:PORT/from another program or a model command gets a 403. - A plugin's enabled flag no longer outlives the plugin: installing resets it, and removing clears it first.
0.4.5, 2026-10-13
Fixed
- SkillSpector: a plugin with more than 30 skills is scanned in parallel chunks, so a big plugin (
ecc, 293 skills) finishes in about 90 s instead of timing out at 120 s. - SkillSpector: a scan that fails is remembered for a day instead of being repeated at every launch (
/skills scanretries at once), and the verdict cache is written atomically from the freshest copy so concurrent sessions don't overwrite each other.
0.4.4, 2026-10-12
Fixed
/evalno longer blames a local model for a load LM Studio refused for lack of memory. That error (HTTP 400, "insufficient system resources") was filed as "not available", saved as a permanent failure and left the model out of cardShuffle. It is now kept as a transient result that says to free some memory and run/evalagain.- A small local model's per-prompt tool set never saw your prompt: the helper that reads it matched only canonical turns, and the agent loop passes its own history, so every prompt looked empty and routing always gave the base set (Read, Grep, Glob, ToolSearch). Edit, Write, Bash and the web tools now arrive when the prompt asks for them, as designed.
Added
- A weak reply from a small local model (empty, a pretend tool call, leaked special tokens, or a short refusal saying it cannot reach files or run anything) can be checked by a connected cloud model. Clyde asks once per session, naming the model and what is sent; on yes the cloud model's correction replaces the local reply, labelled.
CLYDE_CLOUD_REVIEW=offturns it off, and hosted models' replies are never reviewed. The triggers are plain text checks: Laya's fit score was tried and dropped, since it flagged correct answers and passed wrong ones. - A small local model (LM Studio, or Ollama on this machine) is now told when to check code before presenting it: when it uses a library, API or version it is unsure of, it reads or greps the project and the installed package, runs it if it can, and only then looks up that version's documentation on the web. Hosted models are unchanged.
/pluginsis now a screen with three tabs. Installed lists each plugin with its state and what it adds, and Space turns one on or off (it applies the next time ClydeCLI starts). Errors collects bad manifests, start-up warnings, unreadable hooks or MCP files, and plugins SkillSpector holds back. Stats counts what the enabled plugins add. Left/Right switch tabs and Esc closes. Without a terminal it prints the plain list as before.
0.4.3, 2026-10-09
Fixed
- SkillSpector scans a plugin by the parts ClydeCLI loads (
skills/,hooks/,tools/,.mcp.json) instead of its whole folder. A big plugin such as caveman (1,600 files, 22 MB) overran the scan timeout and showed "scan failed: TimeoutExpired"; changes outside those parts no longer trigger a rescan.
0.4.2, 2026-10-09
Changed
- Plugin previews no longer print "commands/: not supported by ClydeCLI, skipped".
0.4.1, 2026-10-09
Fixed
- cardShuffle: a card that fails with "out of credits" (402) now benches every model on that provider for the hour, not only itself. Two cards on the same dry OpenRouter account used to be tried one after the other.
- cardShuffle: an answer full of leaked special tokens (
<|open|>…<|close|>) is treated as a failed card, like an empty one, and the next card is dealt, instead of showing the garbage as the answer.
0.4.0, 2026-10-09
Added
- A warning when you start with, or switch to, an LM Studio model that LM Studio says wasn't trained for tool use. Such a model tends to write a tool call as plain text instead of running it; the warning points to
/evalor/model. - LM Studio models are loaded by Clyde with a window sized to the memory budget (weights plus KV cache from the model's own config) and one slot, instead of LM Studio's default, which can be 34k tokens times 4 slots and swap an 18 GB Mac. A model you loaded yourself keeps your settings;
CLYDE_CONTEXT_TOKENSorCLYDE_MODEL_CONTEXT_<MODEL>override the window. - Small local models (Ollama on this machine, LM Studio) get only the tools the prompt asks for: Read, Grep and Glob always, Edit and Write for a change, Bash for running things, the web tools for a URL. The rest is one
ToolSearchaway, and a tool the model calls anyway still runs. Fewer tool definitions means a smaller prompt and fewer made-up tool calls.CLYDE_ALL_TOOLS=1sends everything. - On a local model, old tool results (long file dumps, command output) are cleared once the conversation passes half the window, keeping the newest four whole, instead of waiting for auto-compact at 80%. The model can read the file again.
0.3.7, 2026-10-09
Added
- The
bestgroup in/models localranks for coding when coding is among the uses you gave at setup (clyde tune), general otherwise. /models localranks models with whichllm (MIT), bundled as our forkdea6cat/whichLocalLLM: abestgroup of the top benchmark-ranked GGUF models that fit this machine, and adetailsline (quality, estimated speed range, license) in the download confirmation. The fork takes Clyde's memory budget and chip bandwidth instead of detecting the machine./models localsays what each quantization costs in quality in words (Q4_K_M (good balance),Q2_K (noticeable loss)), in the picker and the download summary.- The eval memory warning uses LM Studio's own estimate for the model (
lms load --estimate-only) instead of the file size plus a flat allowance. - The status line under the prompt shows free memory, swap in use, CPU and GPU load (red when the machine is strained), when the row has room.
/evalwarns, and defaults to no, when the largest local model in the run needs more than the memory free right now.
Fixed
- Ctrl-C during
/eval(or the eval offered after a download) now stops it cleanly, unloads the LM Studio model it loaded and says nothing was saved. It used to print "Interrupted" and leave the model in memory. - The eval offered after a download warns when the model needs more than the free memory (it would swap and lag the Mac) and defaults to no.
- Ctrl-C and timeouts in the Bash tool now end the command's own child processes too, not only the shell.
0.2.6, 2026-10-08
Added
/tune [--ask]in the REPL, the same asclyde tune. Typing it before showed an empty command list.
Fixed
- The note after a failed
/evalwas cut off mid-word ("…in its answe"); it now shows the whole reason.
0.2.5, 2026-10-08
Added
- A council now reads before it answers: each model gets read-only tools (the same "reading the table" mode as plan mode), up to 12 turns, so a question about your repo or a path no longer gets four blind guesses. Nothing can change files or ask for permission; a read that would ask (a secret file,
WebFetchwithout an allow rule) is refused.WebSearchworks. The council waits up to 4 minutes, and costs roughly four times the tokens of one model. /mapin the REPL:/maplists the repo's most connected symbols,/map <question>searches the code map, andupdate,explain X,affected Xandpath A Bdo what the Map tool does for the model. It was only reachable by the model before.
0.2.4, 2026-10-08
Fixed
- A council (
cardShuffle:<tier> council) no longer counts a tool call written as text (<tool_call>…) as an answer; tools are off in a council, and such a reply could win the ranking and show up as raw markup. - Start-up no longer leaves "SkillSpector is scanning…" lines or Laya's "Fetching 5 files" download bar on screen.
- After
clyde update, the start-up note no longer keeps saying a newer version is available: the update now clears the day-long cached check.
0.2.3, 2026-10-08
Changed
- Bonny is now Bonnie, everywhere: the command (
clyde luv bonnie, andbonnie luv clydefor the second command), the page, the site, the docs and the code. The old commands are gone, so usebonnie. Her saved look, projects, pins and automations move from~/.clyde/bonny/to~/.clyde/bonnie/the first time she starts, so nothing is lost. The Notify me choice is kept in the browser and starts off again once. The old site addressbonny.htmlforwards tobonnie.html.
Fixed
clyde updatecould say "up to date" for up to a minute after a push, and could stop working on a shared network. It asked GitHub's web API, which answers from a 60-second public cache and allows 60 requests an hour per IP address. It now reads the newest commit and release tag from git itself (git ls-remote), which is current at once and has no such limit; the web API is only the fallback when git is missing.- Bonnie's conversation now uses all the width from the side menu to the edge of the window instead of a narrow centred column; the message box and its heading stay centred.
- Bonnie now renders markdown tables (they showed as rows of pipes on one line), plus numbered and nested lists,
#/##/###heading levels, quotes, rules and italics.
Security
- Reading a secret now always asks, whichever tool does it:
cat ~/.ssh/id_rsa,cat ~/.clyde/keys.json,echo $OPENAI_API_KEYor agrep -rof your whole home folder ask like the Read tool already did (committed.env.examplefiles don't).WebFetchshows the whole URL in its prompt, not just the host. - A project's own tooling no longer runs before you've said yes. The check after an edit used to run the project's
.venv/bin/ruff,uv runtools and mypy before the permission prompt; now it uses only your ownruffunless the folder is listed undertrustedFoldersin~/.clyde/settings.json. The language-server tool asks once per project to start a server, unless the folder is trusted./checkis unchanged. WebFetchapplies its localhost/private-network rule to every redirect and to the address it actually connects to, so a public host can't bounce it into your network or rebind its DNS.- A file name with a newline in it can no longer inject headers into a Bonnie download.
- The plugin scan's LLM review gives up after 5 minutes (it was 30) and falls back to the static scan; a failed scan is never cached, and importing a plugin defaults to "no" unless its scan came back SAFE.
Added
- Bonnie has a Notify me toggle in the top bar: a browser notification when an answer is ready while her tab is in the background. It asks for permission once, names your question (never the answer), stays silent for a stopped turn, and is kept in the browser beside the permission.
- The site's home page shows the pair of spades, Clyde's and Bonnie's, as one mark (they ship in one install), and the hero says so. The two cut-outs follow the pointer in opposite directions.
- A Features page on the site (a new tab in the nav) holds everything beyond the basics, moved off the home page: the feature overview, the recorded sessions (model failover,
/eval, Laya) and a full section onclyde tune(what it asks, the settings it tries, the checks each must pass, measured results, and how to turn a setting on). The home page keeps the story and links to it. clyde tunefinds the best Ollama setup for how you use a local model without losing the quality you rely on. It asks what you use it for (coding, chat, research and fact-checking, long documents, quick answers), what matters most and how much RAM to keep free, then tries flash attention and aq8_0(or, for chat,q4_0) KV cache on throwaway servers: yours is never reconfigured, and it unloads a model you have loaded only after a yes. A setting is dropped if it uses more memory, runs slower than your priority allows, loses tool calling or a fact buried in a long prompt, or makes the model's answers drift from the baseline's. It prints how to apply the winner, or says to keep what you have.clyde setupand a model download offer it;clyde tune --askredoes the questions.clyde luv bonnienow opens athttp://localhost:8080and takes the port as an argument (clyde luv bonnie 7090;--portstill works). If 8080 is taken she moves to a free port and says so; a port you ask for must be free.- A second command,
bonnie:bonnie luv clyde [options]starts the terminal Clyde, the same asclyde [options]. clyde luv bonniestarts Bonnie, Clyde's luv accomplice, on localhost with her own persona. The local API queues prompts, steers or stops a running turn, lists and reopens sessions, shows permission cards and takes council votes; requests need a per-run token and a matching Host and Origin. Her page has a sessions sidebar, Search and Computer modes, a model and permissions picker, permission cards, queue / steer / stop and the council popup with votes. Search turns run a web search first and show a Sources list; a status line shows what a running turn is waiting on. Each answer has an action row (copy, export, rate, council, sources, try again), and sessions show when they were last used. Bonnie now uses the site's fonts, hairlines and corner-cut controls, and Customize changes her look: presets, seven colours, a background image (dim, blur, see-through panels), shape, font, greeting, custom CSS and a copyable theme code, saved in~/.clyde/bonnie/. Accessibility pass: a skip link, one page title, streamed text no longer read out chunk by chunk (progress and completion are announced instead), keyboard navigation for the answer menu and the Customize panel with focus returned on close, labelled controls, and a low-contrast warning when your colours are hard to read. Sessions in the sidebar can be deleted (moved to the archive, with Undo), and opening one is instant and always marked, including from a brand-new session. Sessions can be pinned to the top of the sidebar. Automations run a saved prompt on a schedule (every N minutes or hours, daily, or on chosen days) in the project they were made in, each run in its own session; they run only while Bonnie is open, skip runs missed while she was closed, and are read-only unless edits are allowed. The sidebar's project opens a folder chooser (browse, make a new folder, use it). On phones the message box is one row, with the model and permissions behind Options. Attachments: a paperclip, drag and drop and paste attach images and text files (up to six) to a message, with thumbnails in the thread and in reopened sessions; unsupported files are refused with a reason. Artifacts: a view of the files Clyde wrote or edited, with a sandboxed preview (pages, Markdown, images, code), download, show in folder, and a card in the chat when a file is written. Bonnie's Computer mode now always gives the model its tools (a short chatty request such as "make me a bakery page" used to take a tool-free shortcut and could not create a file). Bonnie has her own mark: Clyde's spade with>_beside a flipped spade with</>. Clyde's half follows the Spade colour, hers follows the text colour; the tab icon is the same pair.- A steer: text sent to a running turn is added as a user message before the model's next call (
RunControlinsrc/run_control.py, polled by the agent loop). ACP's stop uses the same interrupt. - cardShuffle council:
cardShuffle:<tier> council(for example/model cardShuffle:high-roller council) asks the tier's top four models the same question at once, tools off, and Laya picks the best answer./councilshows every answer with its score and/council up N//council down Nrecords a vote in~/.clyde/council_votes.jsonl(kept on your machine). Models that fail or miss the 90 s deadline are left out; without Laya the answers come back unranked.
Changed
- Clyde asks you to accept its licence before its first command: type
I accept(Enter alone declines, status 3). Saved in~/.clyde/license.json, so installs that update from an earlier version are asked on their next run, once.clyde license [accept]shows or records it;CLYDE_ACCEPT_LICENSE=1accepts one scripted run. Changing the terms (TERMS_VERSION) asks everyone again. - Licence: ClydeCLI is under the PolyForm Noncommercial License 1.0.0 (source-available; commercial use needs permission). Copies obtained before this change remain MIT.
Fixed
- Two sessions created in the same second got the same id, and the second silently overwrote the first when saved. A new session now takes the next free id (
..._2), counting archived sessions as taken too. WebSearchreturned no results at all: DuckDuckGo answered its plainly labelled request with an anti-bot page, and the tool reported that as an empty list. It now sends a browser User-Agent tohtml.duckduckgo.com, turns DuckDuckGo's redirect links into the real page URLs, and says so when the search engine blocks it instead of returning nothing.- A provider's
Retry-After(seconds or a date) is read: retries wait that long (up to 30 s); a longer ask skips the retries and cardShuffle benches the model for it instead of stalling the turn. - cardShuffle benches a model that hit a quota (429: 90 s, 402: 1 h) or answered nothing (10 min), so later turns do not deal it again straight away, for the provider's
Retry-Afterwhen it sent one. The idea comes from freellmapi's cooldowns. - cardShuffle deals the next model when the dealt one returns no answer text and no tool call (usage still recorded).
- The project snapshot no longer walks a huge start folder such as
~for minutes before the first request: one walk that skips ignored and hidden folders and stops after 1 s.
Added
- Memory notes between sessions:
/remember [project] TEXT,/memoryand/forget [project] N, and aRemembertool the model uses when you ask it to remember something (hold mode asks first, plan mode refuses). Notes are markdown at~/.clyde/memory.mdand~/.clyde/memory/projects/, never inside a repository, bounded (300 characters a note, 40 a file) and fenced as data in the prompt. The hand-written memory files (CLYDE.md,CLAUDE.md,AGENTS.md,GEMINI.md) are read exactly as before. clyde updateinstalls the exact commit or release tag it just checked (not whatevermainis a moment later), andinstall.shacceptsCLYDE_REF=<tag or commit>to pin an install; a ref with anything but letters, digits,.,-,_is refused before anything runs.- Update channels:
clyde update --channel latest|stable(saved asupdate_channel).latestfollowsmain;stablefollows the newestvX.Y.Ztag and never suggests a downgrade. The once-a-day check and its note follow the saved channel. clyde update [--check]updates Clyde the way it was installed. A once-a-day background check (cached in~/.clyde/update_check.json, off withCLYDE_NO_UPDATE_CHECK=1) adds one line at the next start when a newer version exists; nothing installs by itself.uninstall,updateanddoctorwork without accepting the licence, so you can always leave.clyde uninstall [--purge] [-y]removes Clyde with the tool that installed it (uv tool, pipx or pip) after a confirmation. Your settings, saved keys and sessions stay unless you add--purge, which refuses a data folder that is not clearly Clyde's. A source checkout is not touched.clyde doctor(and the top of/doctor) reports how Clyde was installed (uv tool, pipx, source checkout or pip, with the git commit when known), whether several programs answer toclydeon PATH, whether Claude Code is installed, and the licence status.- Saving a plan in a git repository adds
.clyde/plans/to that clone's.git/info/exclude(local; no tracked file changes), so plans never get committed. The README now has a Plans section, and lists/review,/status,/goal,/plan,clyde reviewandclyde sessions. It notes that a customplanFilePathis not reloaded and not excluded. - The plan you approve in plan mode now lives on disk per session (
.clyde/plans/<session>.md) and its head (goal, next step, one line per phase with its status) goes back into the system prompt every turn, fenced as data, so it survives/compactand--resume. Plan mode asks for a fixed shape (goal, next step, phases with a Status, decisions, errors) and rules: log errors, never repeat a failed action, update the status./planshows it,/plan done|start|pending Nsets a phase's status,/plan cleardeletes it,/statusshows the progress, and/goal planmakes "every phase is complete" the goal, which ends and clears itself when the last phase is done. Idea from planning-with-files (MIT). clyde sessions list|search WORDS|archive ID|unarchive ID: find old sessions of this folder by their text, and move ones you are done with out of/resume(tosessions/archive/; unarchive brings them back)./statusshows the model, mode, directory, session, goal, terse and token totals./goal [text|clear]sets a goal for the session that rides in the system prompt every turn (capped at 500 characters, in memory only)./reviewandclyde review: a read-only review of uncommitted changes (and the untracked files),commit SHA, orbase BRANCH. The diff is capped per file, smallest first, and anything left out is named.clyde reviewprints and exits (2 outside a repo).- The spinner now says what the turn is waiting for and runs a live timer through the whole wait, not only once the answer arrives:
Dealing… · 12s · waiting up to 30s for Laya to load, thenasking Laya how hard this is,waiting for provider:model,retry 2 of 3 in 2s: HTTP 503…,running Bash, andcompacting the conversation(which had no spinner before). - End-to-end tests (
tests/e2e, opt in withCLYDE_E2E=1): a realclydein a pseudo-terminal against a scripted fake model, in a throwaway HOME. /terse [on|off](a picker when bare): a built-interseoutput style that asks for shorter replies, saved and applied to new sessions. On a local Qwen2.5-Coder 3B it cut output tokens by about 55% and reply time by about a third on three prompts; answers stay correct but briefer. Off by default.- Lower per-request overhead: only 17 core tools (Bash, Read, Write, Edit, Glob, Grep, web, todo, Agent, Skill, plan mode...) are sent with every request; the other 39, MCP tools included, are listed by name in a short "More tools" section of the system prompt and loaded when the model calls
ToolSearch(or calls the tool by name). A first request in a Dart/Flutter project with an MCP server went from about 13.8k to 5.6k input tokens.CLYDE_ALL_TOOLS=1sends every tool as before. - The status line under the prompt shows the model in use in its right corner (
provider:model); with cardShuffle it readscardShuffle:house → provider:model, following the model the latest turn was dealt to. - Two new providers, both over their OpenAI-compatible endpoints: Cloudflare Workers AI (
cloudflare: an API token plus your account id, which/loginasks for and saves in settings.json) and Pollinations (pollinations: onesk_key). Each lists only tool-calling text models; Pollinations leaves out community models, which run on their owners' servers. - Every choose-one-from-a-list question is now an arrow-key picker (Up/Down, PageUp/PageDown, Home/End, type to filter, Enter to pick, Esc to cancel, the current choice marked ✔):
/login(provider, protocol, model),/modeland/models(same picker;/models alland/models refreshstill work),/models local,/skills(Enter runs the chosen skill),/resume,/rewindand the rejected-key menu. Without a terminal (pipes, ACP) they fall back to a numbered question. /models localoffers to install Ollama (Homebrew on macOS, ollama.com script on Linux) or LM Studio (Homebrew cask) when the chosen model needs one that isn't there, or to start Ollama when it isn't running. It shows the exact command and asks first (default no), then goes on with the download./purge [name]: delete local models (Ollama and LM Studio) from disk, all of them or only those whose name matches; lists what goes and the space freed, and asks first (default no).clyde --acp: Clyde as an Agent Client Protocol agent on stdio, so ACP editors (Zed, JetBrains through an adapter) can run it, with streamed replies, tool calls and permission asks- The footer after each reply shows the turn's tokens in and out, the estimated cost when the model is priced, and the provider's remaining quota when its responses carry rate-limit headers
/evalwarns in red when a model solves a smaller share of the hand than at its last grade- Custom providers can speak the Anthropic API (
/login-> custom asks for the protocol), which also covers a second Anthropic account under its own name $XDG_CONFIG_HOME/clydeis used when that variable is set and no~/.clydepredates it- Laya's difficulty score promotes itself into
cardShuffle:house: it's scored on every cardShuffle turn, and once shadow turns show the harder half (split at the median score) takes at least 1.5x and one more tool round than the easier half, with 10+ turns each, house starts harder requests on stronger cards./layashows the split and the verdict /login [provider]in the REPL: connect a provider or replace its key without leaving, then switch to its model- Custom providers:
clyde login//login->customadds any OpenAI-compatible API by name, base URL and key (saved under"providers"in settings.json); it then works like a built-in one clyde -p "<prompt>": one headless turn for scripts and CI; the answer on stdout, piped stdin added, permission asks denied and listed,--output-format json,--mode,--max-turns, exit status 0/1/2- Edit checkpoints and
/rewind: undo the model's file edits and/or the conversation back to before any message; saved per session, so they survive/resume - Shell sandbox: the model's commands run under macOS
sandbox-execor Linuxbwrapand write only to the project, temp and package caches;unsandboxed: truealways asks - Sub-agents: custom agent types from
.clyde/agents/or.claude/agents/(Claude Code format), background runs collected withTaskOutput(now able to wait) and cancelled withTaskStop, andTeamCreaterunning several members in parallel - Data tool: profile and read-only SQL over CSV, TSV, Parquet, JSON and SQLite, sandboxed DuckDB
- MCP over Streamable HTTP and HTTP+SSE (bare
urltries HTTP, then SSE), OAuth sign-in (/mcp login,clyde mcp login) and a project's.mcp.jsonbehind a yes per exact entry - cardShuffle: a model that deals each turn to an
/eval-ranked real model, with high-roller, house, free and small tiers, and fallback on errors, max tool turns and stuck loops /evalplays an 11-task graded hand after the tool-call check; strength ranks cardShuffle's deck/models local [ollama|hf|mlx]: find local models that fit this machine, rated relax / balance / hard, confirm their cost, and download through Ollama or LM Studio- Laya, bundled: local judgments that stop a looping cardShuffle turn;
/layalines them up with how turns ended - SkillSpector, bundled: scans skills, plugins, agents and MCP tool lists from other tools;
/skills scanand/skills allow - Pasting: Ctrl+V images, image paths become
[Image #N], long pastes fold to[Pasted text #N +X lines]; images reach every provider and survive/resume - Re-login: a rejected key offers re-entering it for the same provider, then retries the message
- Stdlib-only provider layer (no vendor SDKs): Anthropic, OpenAI, Google Gemini, OpenRouter, DeepSeek, Mistral, NVIDIA, Cerebras, GLM, MiniMax, Ollama (local, native
/api/chat) and Ollama Cloud provider:modelselection:clyde --model,/model,/models,clyde --list-models- Live model lists from each provider's API, cached for 60s
/think off|low|medium|high|on|defaultreasoning control, with streamed reasoning shown dimmed- Retries with backoff on 429/5xx/connection errors, and one-line readable provider errors
clyde logout <provider>; Ollama login suggests tool-capable models that fit your RAM- Initial context injection pipeline for workspace snapshot, git status, and
CLAUDE.md - Tests covering the new context system integration
EnterWorktreecreates a real git worktree on aworktree-<name>branch under.clyde/worktrees;ExitWorktreetakesaction: removeto delete it (git refuses if it has uncommitted changes)- Automatic compaction: before each turn, history at 80% or more of the model's context window is summarized the same way as
/compact;/contextshows the threshold Editaccepts anold_stringthat differs from the file only in trailing whitespace or indentation (re-indentingnew_string) when the match is unique; a miss shows the closest lines to re-copy (ported from 2B)/doctor: checks Python, dependencies, config, the key store (mode 600, no secrets shown), providers with keys, the current model, git, and workspace/permission settings/resumepicks a recent session of the current workspace;clyde -ccontinues the latest one andclyde --resume [id]opens the picker or loads a session by id/costreports input, output and cache tokens per model with an estimated $ total; prices live in the model catalog, local Ollama is $0 and unpriced models say "price unknown"- NotebookEdit replaces, inserts or deletes cells in
.ipynbfiles (by cell id orcell-N) - The Agent tool runs a real sub-agent on a fresh conversation with every tool except Agent, and returns only its final answer
- Cron jobs run: due jobs fire as a turn while the REPL is idle (5-field cron expressions, session-scoped, one-shot jobs removed after running)
- The LSP tool talks to a language server on PATH (pyright/pylsp, typescript-language-server, gopls, rust-analyzer, dart, clangd): definition, references, hover, symbols, call hierarchy
- The context prompt includes a README excerpt and the project's entry points, and loads
CLAUDE.local.mdfor personal project memory - PreToolUse / PostToolUse hooks: shell commands from
~/.clyde/settings.jsonrun around tool calls; exit 2 blocks the call or feeds stderr back to the model. Hooks can also live insettings.toml, use a shorthand, or be written in Gemini CLI, Cursor or Copilot CLI format, including their JSON deny/block replies install.sh(curl … | sh) installs uv andclyde, then runs the newclyde setuponboarding: connect a provider, import other agents' hooks after a yes, and putclydeon PATHclyde hooks importcopies hooks from Claude Code, Gemini CLI, Cursor and Copilot CLI settings- Skills in
~/.agents,~/.codex,~/.copilotand~/.geminiskill folders are loaded in place - MCP client (stdlib, stdio): servers from
mcpServersin~/.clyde/settings.jsonstart with the REPL, their tools are registered asmcp__<server>__<tool>, resources work through ListMcpResources / ReadMcpResource, and/mcpshows status - Code map and the Map tool: a map of the repo's symbols, calls and imports (built from the syntax tree with no LLM, via graphify) that any model can query for related symbols, paths between symbols, explanations and change impact. The map refreshes in the background into
.clyde/code-map/map.jsonwhenclydestarts in a git repo, the context prompt points the model at it, andclyde setupoffers to install the builder - Saved permission rules:
permissions.allow/denyin~/.clyde/settings.jsonwith Claude Code's syntax (Bash(git commit:*),Edit(docs/**),WebFetch(domain:…)), and a "don't ask again" answer at the prompt that saves one. WebFetch now asks per domain - Plugins:
clyde plugin install <dir|git-url>(plus list / enable / disable / remove) for bundles of tools, skills, hooks and MCP servers in Claude Code's layout, enabled only after a yes;/plugins clyde plugin import(andclyde setup) brings over plugins installed for Claude Code, Codex and Cursor, one yes per plugin; manifests in.codex-plugin/,.cursor-plugin/or the plugin root are read- Self-checks: after a Python edit, ruff (and mypy when configured) run on the file and only new problems go back to the model;
/checkruns ruff, mypy and pytest, viauv runwhen there is auv.lock - Tracing: per-session JSONL traces in
~/.clyde/traces/with secrets redacted,/debugfor the last turn andclyde --debugfor live output clyde mcp import(andclyde setup) brings over stdio MCP servers from Claude Code, Cursor, Gemini CLI, Codex and Copilot CLI after a yes/eval [filter]tests every listed model (or the ones matching the filter) with a real tool call and a round trip, and ranks them with latency and tokens per second. Results are saved to~/.clyde/model_evals.json;/modelsthen hides models with no tool calling or no access (credit and rate-limit failures stay listed),/models allshows everything and/models refreshre-fetches the lists- LM Studio as a local provider: when LM Studio is installed, its downloaded models show up in
/models(from its server, orlms lswhen the server is off), and the server is started withlms server startthe first time an LM Studio model is used - Esc cancels the running reply, tool call or command the same way Ctrl+C does; arrow keys and other escape sequences don't, and prompts that need the keyboard pause it
- Every message you send is shown with the machine time (5:47 PM), each reply ends with how long it took and when it finished ("♠ Shuffled for 2m 45s · 5:47 PM"), and each tool result shows its duration
- Modes on Shift+Tab, shown under the prompt:
♠ hold(asks before risky actions),♠ reading the table(plan mode, now enforced: changes are refused until the plan is presented) and♠♠ all in(no questions except major moves such as recursive deletes, pushes or hard resets)
Changed
- Hold mode now asks before every file change (Write, Edit, NotebookEdit), code files included, not just
.mdfiles; a saved allow rule or all-in mode skips the question, andclyde -pin hold denies them as it does other asks. - The status-line corner for cardShuffle drops the
cardShuffle:prefix before it cuts the tier name when the terminal is narrow (high-roller → nvidia:meta/muse-glimmer-30b, not…fle:high-roller → …). - Reading a secret file (
.env, keys,.ssh, credentials) asks first, even in all-in mode, as editing one already did; allow and deny rules now cover Read and Grep - Clyde's persona tells it not to open with agreement and to say when the user is wrong
- Images: models known not to read images get a warning on paste and the text only on send; images over 5 MB are shrunk (macOS
sips) instead of refused check_permissionsis an optional tool hook, no longer part of theToolprotocol- Memory files are now
CLYDE.mdandCLYDE.local.md(/initwrites these). Files made for other agents still load:CLAUDE.md,CLAUDE.local.md,AGENTS.md,GEMINI.md,.cursorrulesand.github/copilot-instructions.md, one per folder withCLYDE.mdfirst - API keys moved from base64 entries in
config.jsonto~/.clyde/keys.json(mode 600), with shell env vars taking precedence; old configs migrate automatically on first run - The agent loop uses one code path for every provider; conversation history (including reasoning and tool-call signatures) is re-expressed per provider on each request
- Compaction no longer calls a nonexistent
chat_async, and its summary context never starts on an orphaned tool result - Requires Python 3.14
- Skill frontmatter parsing now supports inline list syntax such as
arguments: [path] - README and contributor docs now prefer
uv-based setup instructions - Documentation now distinguishes provider-level streaming interfaces from the current turn-based CLI output
- Bash asks for approval before commands that are not clearly read-only; dangerous patterns are refused outright. Config asks before changing a setting
- Sessions are saved after every turn (honouring
session.auto_save); before, only/savesaved - OpenAI and Gemini usage no longer counts cached tokens twice
- The LSP tool takes Claude Code's
operation/filePath/line/characterinput instead of a raw method and params - Source modules are grouped by purpose (
src/agent/,src/startup/,src/output_styles/, token estimation undersrc/context_system/), andtests/mirrorssrc/; run unittest withpython -m unittest discover -s tests -t .
Removed
- The RemoteTrigger and REPL tools: stubs that only ever returned "not implemented"
Fixed
- A turn that ends with no answer text (a reasoning model that spends it all thinking, or hits its output limit) printed only the footer. It now says so, with the output-token count, and suggests asking again,
/think offor another model. - A command or skill typed by its exact name alone (
/cost,/doctor,/check, a skill like/hello) listed matching commands instead of running; only/name argsran it. It also made Enter in the/skillspicker do nothing useful. /model provider:namefor a model the provider does not list now warns instead of silently saving it as the default.- Skills whose
description: >(or|) block text spanned several lines showed just>: frontmatter block scalars are now read. - Pollinations out of credits: it answers with a normal chat message instead of an error, so Clyde showed the notice as the model's reply, kept it in the conversation, and
/evalcould mark the model as failing. It is now a❌ HTTP 402line with the top-up link, nothing is added to the conversation, and/evalcounts it as a transient failure. /login(andclyde logininside a session) ignored typing: the Esc watcher was still reading the keyboard while its prompts were open, so keystrokes never reached them./models localskips Hugging Face quants of base (not chat-tuned) models, such asQwen2.5-Coder-7Bnext to its-Instructsibling: they write tool calls as prose and ignore tool results, so they always failed/eval.- A tool call whose arguments repeat the call itself (
{'name': 'add_numbers', 'arguments': {...}}, as Qwen2.5-Coder GGUF sends through Ollama) is now unwrapped for every tool, not only the built-in ones, and/evalapplies the same repair, so such models are no longer marked as failing. /models localno longer lists models without tool calling: Hugging Face GGUF and MLX repos whose chat template never mentions tools are dropped, and models that already failed/evalhere are hidden (ollama.com's tool tag alone letcommand-r7bthrough).- A single trace file stops growing at 20 MB (with a
truncatedmarker), so a long session can't fill the disk - Laya never answered the first turns of a session, and never in
clyde -p: its 15 s cold load started with the turn that needed it. The first cardShuffle turn now waits for it, once, up to 30 s - A stalled cloud provider no longer holds a turn for 10 minutes: a stream that sends nothing for 180 s fails with "no response" (not retried; cardShuffle re-deals). Local servers keep 600 s
clyde -pno longer hangs when stdin is a pipe nobody closes (cron,sshwithout-n, CI)- MCP and OAuth requests send ClydeCLI's User-Agent; some servers' bot protection refused Python's
- SkillSpector's "CAUTION" with no findings now says the scan was partial, and why
/models localno longer offers embedding or reranker models, draft or F32 helper files, and sizes a quantization by its largest file/eval's hand found no dot-files (.env); provider errors no longer count as wrong answers- Plan mode was only a flag; tools could still edit files while it was on
/clear(and/reset,/new) clears the screen too and redraws the banner- The thinking spinner comes back after a permission or question prompt, and when a tool runs after streamed text; before, the rest of the turn ran with nothing on screen
- Bash results show the last line the command printed (or its error) after the exit code
- The permission prompt shows its y / a / n keys; they were printed as Rich markup and vanished, leaving only numbers
- OpenRouter
:batchvariants are no longer listed; they reject chat requests - LM Studio models use the context LM Studio actually loaded them with (
lms ps) for auto-compaction - The test suite runs against a temporary home instead of the real
~/.clydeand~/.claude ~/.claude/skillsno longer overrides a same-named skill in~/.clyde/skills/clearand/compactacted on the previous conversation after loading a session- Loading a corrupt session file no longer crashes the REPL
- An
Editwhosenew_stringdropped the final newline no longer merges the next line into it
0.1.0, 2026-04-01
Added
Core Features
- Multi-provider support for Anthropic, OpenAI, and GLM (Zhipu AI)
- Interactive REPL with prompt-toolkit integration
- Rich interactive terminal output
- Session persistence and management
- Configuration management with basic API key obfuscation
CLI Commands
clyde- Start the interactive REPLclyde login- Interactive API key configurationclyde config- View current configurationclyde --version- Show version information
Provider Implementations
- Anthropic Provider: Claude integration with chat + streaming interfaces
- OpenAI Provider: GPT integration with chat + streaming interfaces
- GLM Provider: GLM integration with chat + streaming interfaces
REPL Features
- Command history with persistent storage
- Auto-suggestions from history
- Slash commands:
/help,/exit,/clear,/save,/load,/multiline - Skill slash commands backed by
SKILL.md - Syntax highlighting with Rich library
- Tab completion and multi-line input support
Configuration System
- JSON-based configuration storage
- Base64-encoded API keys for basic obfuscation
- Provider-specific settings (API key, base URL, default model)
- Session auto-save option
Session Management
- Unique session ID generation
- Conversation history tracking
- Session save/load functionality
- Conversation clear operation
Code Quality
- Type hints for all public functions
- Abstract base class for provider implementations
- Data classes for structured data (ChatMessage, ChatResponse)
- Error handling and validation
Testing
- Unit tests for core components
- Integration tests for providers
- End-to-end tests for REPL functionality
- Test coverage for configuration management
Technical Details
Architecture
- Modular provider system with base abstraction
- Conversation management with message history
- Configuration management layer
- REPL engine with prompt-toolkit
Dependencies
anthropic>=0.18.0- Anthropic SDKopenai>=1.0.0- OpenAI SDKzhipuai>=2.0.0- Zhipu AI SDKprompt-toolkit>=3.0.0- Interactive REPLrich>=13.0.0- Terminal formattingpython-dotenv>=1.0.0- Environment variables
File Structure
src/
├── providers/ # LLM provider implementations
│ ├── base.py # Abstract base class
│ ├── anthropic_provider.py
│ ├── openai_provider.py
│ └── glm_provider.py
├── repl/ # Interactive REPL
│ └── core.py
├── agent/ # Session management
│ ├── session.py
│ └── conversation.py
├── config.py # Configuration management
└── cli.py # CLI commands
Known Limitations
- Context building is still in early MVP form and needs deeper project summarization
- Permission enforcement exists as a framework but is not fully integrated everywhere
/resume,/compact, and/doctorare not implemented yet- The current CLI uses turn-based output even though providers expose streaming interfaces
Migration Notes
This is the initial MVP release. No migration needed.
Future Roadmap
- [ ] Context enrichment and project-memory improvements
- [ ] Full permission integration
- [ ]
/resume,/compact,/doctor - [ ] Token usage and cost tracking
- [ ] MCP and plugin-system enhancements
Release Notes
v0.1.0 - MVP Release
This is the first public release of ClydeCLI, a complete reimplementation of Claude Code. This MVP includes:
- Full multi-provider support
- Interactive REPL
- Session management
- Configuration system
- Tool system and agent loop foundations
- Type-safe implementation
The focus was on building a solid foundation with clean architecture, comprehensive testing, and good developer experience. All core features are working and tested.
Special Thanks: This project is inspired by Claude Code and aims to provide an open-source alternative for learning and experimentation.
[0.9.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.9.0 [0.8.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.8.0 [0.7.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.7.0 [0.6.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.6.0 [0.5.11]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.11 [0.5.10]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.10 [0.5.9]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.9 [0.5.8]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.8 [0.5.7]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.7 [0.5.6]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.6 [0.5.5]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.5 [0.5.4]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.4 [0.5.3]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.3 [0.5.2]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.2 [0.5.1]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.1 [0.5.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.5.0 [0.4.5]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.5 [0.4.4]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.4 [0.4.3]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.3 [0.4.2]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.2 [0.4.1]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.1 [0.4.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.4.0 [0.3.7]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.3.7 [0.2.6]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.2.6 [0.2.5]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.2.5 [0.2.4]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.2.4 [0.2.3]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.2.3 [0.1.0]: https://github.com/dea6cat/ClydeCLI/releases/tag/v0.1.0