Files
cc-switch/docs/release-notes/v4.0.12-en.md
T

14 KiB

CC Switch v4.0.12

This release makes the "Apps" page a complete place to manage coding tools: install, update, uninstall and detect install conflicts. When the same tool is installed in several places, you can now choose to uninstall the extra one, so the conflict can be resolved inside CC Switch; before updating, the Node version is checked first, and when a new version needs a newer Node, an update button that is bound to fail is no longer shown; the newer Grok Build install layout can now be uninstalled too. There is also a new "Local" group for adding Ollama, LM Studio, llama.cpp and vLLM running on your own machine, plus presets for 14 cloud platforms including Ollama Cloud, Groq, Hugging Face and Vercel AI Gateway. Background scanning of session logs goes from every 60 seconds to every 10 minutes, which saves resources day to day; while the Usage page is open, it scans at the interval you choose, so new usage actually shows up sooner. The interface adds Turkish (community translation); when the system language isn't supported, first launch now uses English. It also fixes Skills restore from cloud sync never working again after failing once, and Claude Code getting an error after the reply had already finished when routed to a Responses upstream, among other issues. For everything new in 4.0, see the v4.0 release notes.


New

The "Apps" page now covers install, update, uninstall and install conflict detection. v4.0.11 added uninstall, and this release fills in the rest. When a tool is installed in several places, "Diagnose installs" lists each one and marks the "Default" one that the command line actually uses; uninstall now lets you pick any of them, so you keep the copy you want and resolve the conflict right in CC Switch. Before updating, the Node version is checked, so you are no longer offered updates that fail to install or don't run once installed.

Choose which installation to uninstall. The confirmation dialog used to offer only the installation currently in use, while users with several installations often wanted to remove a different one; with several installations and no way to tell which one was the default, uninstall simply failed. The dialog now lists every installation it finds, with its source, path, version and a "Default" tag: if only one can be uninstalled it is selected automatically, with two or more nothing is preselected, and ones that can't be uninstalled automatically show the reason and are disabled. Right before running, the path you picked is checked again, and nothing runs if it doesn't match the preview.

  • Grok Build's install layout from 0.2.112 onward (~/.grok/bin/grok-<version>) is now supported; it used to show "Cannot uninstall automatically". Uninstall removes all program files of that installation, deleting only files and no directories; config.toml and sessions are kept.
  • When uninstalling a tool installed with the official script, launcher links pointing to the same program (such as ~/.local/bin/grok) are removed too, so no broken command is left behind.
  • If you also have an official installation and ~/.grok/config.toml is set to update through npm, the npm copy will be reinstalled by grok update; the confirmation dialog points this out.
  • When uninstalling Hermes on Windows, the confirmation dialog warns that a running Python may be locked and leave files behind; if the uninstall command succeeds but the status check afterwards fails, it now shows "Uninstall command completed; check the result" instead of wrongly reporting that the uninstall failed.

Node version is checked before updating. OpenClaw 2026.9.3 and later require Node 24.16 or above, so updating on an older Node always failed, yet the "Apps" page kept showing the update button; npm packages without a check of their own were worse, since npm only prints a warning and installs anyway, and the tool then won't run. Now, when a new version is found, CC Switch first reads the Node version it requires and compares it with the Node that this installation actually uses. If the requirement isn't met, the row says Node must be upgraded first, no update button is shown, and "Update All" skips it too; the check runs once more right before updating. Version requirements it can't parse and failed lookups never block an update, and native, Homebrew, Bun and WSL installations are not checked at all.

A tidier "Apps" page. Uninstall moves from the red button on each row into the "…" menu at the end of the row. The header and the rows now share the same column widths, so the version column lines up; while versions are being read and updates are being found or checked, the header and columns no longer shift left and right (#8293). The note on hidden apps is reworded to be clearer: they are only hidden from view, providers, MCP and other settings are all kept, and the app's own config files are not changed.

Local inference servers: Ollama, LM Studio, llama.cpp, vLLM. When adding a provider there is a new "Local" group, placed after "Cloud providers", with presets that connect to inference servers on your machine. The default addresses use each server's default port (Ollama 11434, LM Studio 1234, llama.cpp 9931, vLLM 8000), and port 8080, used by older llama.cpp, Homebrew and Docker, is offered as an alternative address. These servers don't check keys by default, so the presets fill in the placeholder value each project's docs use. Before use, start the server and download a model; you can replace the preset's default model with one you have locally, or click "Fetch Models" to read the list from the server; the context window is whatever length you set when starting the server.

  • Claude Code and Codex connect directly to the local server's Anthropic Messages and Responses APIs, and Claude Desktop connects through routing; OpenCode, OpenClaw, Hermes and Pi get presets depending on which built-in providers each already has (anything an app already ships is not added again).
  • Requests to local addresses (localhost, 127.0.0.1 and so on) no longer go through the proxy set in CC Switch or the system proxy. Previously, with a proxy set, routing, speed tests and model fetching sent their requests into the proxy and couldn't reach the local server.

Presets: Added Ollama Cloud, Baseten, Meta Model API, DeepInfra, Vercel AI Gateway, Nebius Token Factory, Groq, SambaNova, DigitalOcean, Hugging Face, Microsoft Foundry, Fireworks AI, Mistral AI and Cloudflare AI Gateway; OpenCode adds SiliconFlow China and SiliconFlow International (#4500); StreamLake adds a Codex preset, and all StreamLake presets now use the public KAT-Coder endpoint, so you no longer need to create your own endpoint ID.

Improvements

Session log scanning: lighter in the background, more timely on the Usage page. Previously, whether or not anything needed it, session logs were scanned in the background every 60 seconds, so with CC Switch left open for a long time, that disk reading and CPU use kept adding up; meanwhile the Usage page's "Auto-refresh interval" only re-queried the database, so session usage still waited for those 60 seconds, and choosing 5 seconds didn't help (#8301). The setting is now called "Session log scan interval": opening the Usage page scans immediately, the window becoming visible again triggers another scan, and after that it scans at the interval you choose (5, 10, 30 or 60 seconds, 60 by default); the background scan now runs every 10 minutes only as a fallback, which noticeably cuts background usage. The "Off" option is gone, and the setting is hidden when "Scan session logs automatically" is turned off. Usage that goes through routing was always recorded in real time and is not affected.

The provider search box no longer covers or pushes cards. The search box used to float above the list, covering the edit and more-actions buttons on the first card (#8100). It now sits at the far right of the row above the cards: the mode row for Claude Code, Codex, Gemini CLI and Grok Build, and the "Added" heading row for other apps. Opening search neither covers the cards nor pushes them down.

Interface language. Turkish is added, translated by the community; text that isn't translated yet shows in English (#8208). On first launch, if the system language isn't one the interface supports (German, French, Korean and so on), the interface and tray use English instead of defaulting to Simplified Chinese; a language you have already chosen is not affected.

Fixes

  • Once Skills restore from cloud sync failed, it could never succeed again (#8153). On Windows, if a file was in use (os error 5) while downloading from cloud sync, a skills.bak was left behind, and every later restore failed while dealing with it. Restore now copies the cloud Skills in full into a separate directory and swaps it in as a whole, no longer reusing skills.bak; if both the swap and the rollback fail, the original full copy is kept and the error tells you where it is.
  • When Claude Code was routed to an OpenAI Responses upstream, an error arrived after the reply had already finished (#8138). If the upstream closed the connection only after sending the completion event, CC Switch sent an extra stream error after the normal end, and the client could treat a complete reply as failed. Connection errors after the end are no longer forwarded.
  • Clicking the current page in the sidebar again from the MCP, prompt or pricing editor dropped the "unsaved changes" protection (#7900). It used to show a discard-changes confirmation; after you confirmed, the editor stayed open, but leaving the page afterwards no longer warned you and the changes were simply lost. Clicking the current page now does nothing.
  • When the upstream returned an empty error body, the error message ended with a lone colon (#6910), which made it look as if CC Switch had swallowed the upstream's explanation. It now says explicitly that the upstream returned no error content.
  • Speed in Pi session history always showed "—" (#8278). Pi session imports always recorded the duration as 0; the duration is now estimated from each reply's request start time and write time, so eligible records can show an estimated speed.
  • When the Pi config directory pointed into WSL, every write first tried system calls that WSL doesn't support (#8245). Enabling Skills and saving AGENTS.md now go straight to a method that works on WSL paths; in Auto mode, Skills are synced by copying instead, and if you manually chose symlinks you still get a clear error.
  • On Windows, after a restart from an auto-update, reading the model lists bundled with OpenCode and Codex could still fail to find the tool (#8262). v4.0.11 fixed install and update; this release applies the restored PATH to these two places as well, and variable references in PATH such as %PNPM_HOME% are expanded using the user and system environment variables.

Upgrade Notes

The database schema is unchanged, still at 20.

  • When the Usage page isn't open, session logs are scanned in the background every 10 minutes (previously every 60 seconds), so usage that doesn't go through routing can take up to 10 minutes to show up in the stats; opening the Usage page scans immediately. If you had chosen "Off", it becomes 60 seconds.
  • Pi speed estimates only apply to records imported after the upgrade; records that were already imported still show "—".
  • The new presets and the StreamLake changes only affect newly added providers; StreamLake providers you have already added keep using their original endpoint ID.
  • When you pick a local preset for Claude Desktop, the form clears the key, so fill in the placeholder value by hand: ollama for Ollama, lmstudio for LM Studio, no-key for llama.cpp and dummy for vLLM; if you set a key when starting the server, enter that instead.

Thanks

Thanks to @funkpopo (session scan interval on the Usage page, column alignment on the "Apps" page, uninstall feedback and Windows PATH follow-ups, and Pi session speed estimates), @xue-ding-e (failed Skills restores, the stream error after a Responses reply finished, and the search box covering cards), @alkank (Turkish interface and tray), @AristurtleHu (writes when the Pi config directory is in WSL), @Owlbay (unsaved-changes protection), @loulanyue (empty upstream error content), @xwil1 (OpenCode SiliconFlow presets) and @Lingbou (Windows CI test timeout) for their contributions.

Thanks to @HessianZ, @bubblevv, @JimMoen, @chufeng and @Wikian233 for reporting issues, providing reproduction details and suggesting fixes.

For the full technical details, see the CHANGELOG.