Downloads (v2.1.5)
| Platform | Architecture | Download |
|---|---|---|
| Windows | x64 | Installer · Portable |
| Windows | arm64 | Installer · Portable |
| macOS | Apple silicon (arm64) | DMG · ZIP |
| macOS | Intel (x64) | DMG · ZIP |
| Linux | x64 | AppImage · DEB · RPM |
| Linux | arm64 | AppImage · DEB · RPM |
Release Notes
Cherry Studio 2.1.5 - Remote Attachments, Channels, and Major Improvements
✨ New Features
- [Remote Access] Upload images and files to remote Agent sessions from your paired mobile device, with resumable transfers up to 1 GiB per file.
- [Channels] Add WeCom and DingTalk channels with QR setup, Agent conversations, streaming replies, notifications, and attachments.
- [MCP] Support MCP SDK v2 with interactive requests, validated forms, cancellation, and structured results across chat and agent runtimes.
- [Agent] Upgrade Pi runtime to 1.0 with native sandboxed Code Mode and MCP support. Action required: update custom Pi scripts to the native codemode API.
- [Doctor] System Doctor gains an AI analysis section that reads diagnostic reports and proposes bounded fixes you can apply and undo.
- [Device Connections] Improve mobile onboarding with platform-specific downloads, remembered progress, and automatic mobile previews.
- [Paintings] Minimize the prompt dock after generate, zoom generated images with the mouse wheel, and open the shared image viewer on click.
- [Models] Add Claude Haiku 5.5 support with reasoning controls, updated token limits, pricing, and Claude Code availability.
- [Composer] Highlight the MCP toolbar shortcut when MCP tools are enabled for the current chat or agent session.
- [Web Search] Add self-hosted Crawl4AI as a URL-fetch provider with configurable API Host and optional bearer token.
- [Windows] Use native caption buttons in main and detached windows while preserving custom title bars and theme adaptation.
- [Updates] Enable native differential downloads to reduce update size when a compatible cached installer is available.
- [File Preview] Improve document previews with touch zoom, resilient PowerPoint slides, and clearer size-limit fallbacks. Add WebView compatibility for mobile integration.
- [Archive] Restoring an agent now also restores its sessions, and archived task/topic rows show their owning agent or assistant.
🐛 Bug Fixes
- [Agent] Fix browser tool timeouts when switching sessions or closing tabs during an active task.
- [Agent] Fix tool-denial reasons being mistaken for tool output — now explicitly attributed as the user's words.
- [Chat] Fix mid-response failures discarding already-streamed content — now preserved alongside the error.
- [Chat] Fix context compression progress not appearing inside the assistant message.
- [Chat] Fix horizontal multi-model answers blocking upward scroll to earlier chat history.
- [ComfyUI] Fix workflows with randomize seed rendering the same image every run.
- [ComfyUI] Fix partner (API) nodes failing without the provider's API key — now sent correctly.
- [ComfyUI] Fix workflows being converted with wrong values or failing with no_prompt_node.
- [Notifications] Fix completion notifications to show the topic or session name and the final sentence.
- [Notifications] Clear the macOS Dock badge when all notification preferences are turned off.
- [Markdown] Stop linkifying single-segment slash runs (like
/jX_s) as file paths. - [WebView] Limit native user agent to Google sign-in, preserving cleaned UA for AI Studio and other requests.
- [Open Responses] Fix conversations failing when compatible gateways emit marked SSE keep-alive deltas.
- [Backup] Fix local backups failing when the destination is a Windows drive root.
- [Channels] Fix Channels settings rendering errors caused by malformed user IDs in saved WeChat credentials.
- [Tools] Fix custom command-line tools named constructor or toString being misclassified as built-in Code CLIs.
What's Changed
- fix(release-notes): reconcile final changes before generating notes by @DeJeune in #21227
- fix(comfyui): write the prompt into the branch an If/Else Switch selects by @LXD-8 in #21225
- hotfix(packaging): remove redundant release payloads by @DeJeune in #21229
- fix(release-backport): allow draft release discovery by @DeJeune in #21235
- docs(breaking-changes): remove reintroduced temporary notes by @DeJeune in #21239
- fix(api-gateway): exclude thoughts from the Gemini candidatesTokenCount by @yetuge in #21238
- hotfix(release): allow draft discovery before release builds by @DeJeune in #21240
- chore(release): sync v2.1.4 metadata by @kangfenmao in #21242
- fix(markdown-table): prevent file paths from collapsing columns by @DeJeune in #21246
- fix(channels): align uploaded files with composer attachments by @DeJeune in #21245
- fix(main-window): keep main window visible on Linux Wayland when raising it by @DeJeune in #21243
- fix(agent-right-pane): bound workspace tree depth and gate Files on any entry by @tommyzhang100504 in #21255
- fix(apiGateway): report reasoning-token breakdown in OpenAI-compatible adapter by @ggbdpq in #21275
- fix(deepseek-harness): accept relative and absolute Location in the 303 readiness probe by @ggbdpq in #21271
- fix(api-gateway): split cache reads and writes out of the Anthropic input_tokens by @yetuge in #21261
- fix(api-gateway): report cached prompt tokens in the Gemini usage by @yetuge in #21269
- fix(webview): block non-proxied WebRTC UDP by @HappyAny in #21274
- fix(apiGateway): report cache/reasoning usage breakdowns in Responses-compatible adapter by @ggbdpq in #21276
- fix(pi-runtime): classify destructive bash before the rtk rewrite by @kovsu in #21250
- fix(file): guard default-open against paths the OS cannot chdir into by @DeJeune in #21248
- fix(agent-session): persist background terminal receipts by @Dante-dan in #21270
- fix(agent-model-tiers): name the Claude Code alias slots and explain each one by @NatsUIJM in #21273
- fix(grok-cli): update proxy headers and reasoning compatibility by @DeJeune in #21277
- fix(provider-registry): route AiOnly models through the NewAPI adapter by @404-Page-Found in #21204
- fix(ui): make tooltip content inert to pointer events to break hover reopen loop by @ggbdpq in #21214
- fix(xlsx-preview): read only existing cells when parsing sparse rows by @kovsu in #21278
- fix(agent-edit): keep the Claude Code alias names off the runtimes that have no aliases by @NatsUIJM in #21279
- test(validation): include standalone package suites by @DeJeune in #21230
- refactor(validation): separate checks from explicit fixes by @DeJeune in #21231
- ci(validation): schedule affected jobs with required gates by @DeJeune in #21232
- ci(validation): report comparable CI performance metrics by @DeJeune in #21234
- ci(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #21247
- refactor(pi-runtime): adopt native Pi 1.0 Code Mode and MCP by @vaayne in #21297
- fix(windows): use a stable identity for tray icons by @lorenzozanee in #21294
- fix(binary-manager): surface managed Python execution failures by @lorenzozanee in #21300
- fix(xlsx-preview): stop ExcelJS from expanding declared ranges on load by @kovsu in #21289
- fix(image-export): preserve SVG HTML labels during rasterization by @DeJeune in #21304
- fix(provider-registry): declare Kimi fixed sampling on passthrough providers by @GeorgeDong32 in #20424
- fix(skills): return to the active tab when leaving the skill detail by @ggbdpq in #21298
- fix(comfyui): read and target a saved workflow the way ComfyUI does by @LXD-8 in #21228
- feat(wecom-channel): add QR setup and bot messaging by @DeJeune in #21174
- feat(dingtalk-channel): add QR setup and Stream messaging by @DeJeune in #21181
- feat(pi-runtime): enable pi-vcc by default by @vaayne in #21301
- fix(knowledge): run kb_read grep patterns through ripgrep by @kovsu in #21254
- fix(mcp): forward tool-result media to modality-capable models by @ggbdpq in #21308
- fix(selection-assistant): preserve fullscreen popup coverage on macOS by @lorenzozanee in #21309
- fix(mcp-settings): enable imported servers instead of probing them disabled by @kovsu in #21323
- fix(renderer-utils): remove exponential backtracking from README and image regexes by @kovsu in #21330
- feat(web-search): add self-hosted Crawl4AI URL fetching by @Dante-dan in #21334
- fix(tool-approval): require approval for skill installs in every runtime by @kovsu in #21353
- fix(node-proxy): honor bypass rules for effective request destinations by @dakjdakd in #21346
- fix(tool-approval): attribute a user's tool denial reason to the user by @tommyzhang100504 in #21252
- fix(webview): limit native user agent to Google sign-in by @HappyAny in #21369
- feat(composer): highlight MCP toolbar when tools are active by @SiinXu in #20766
- fix(chat-scroll): forward horizontal multi-model boundary wheels by @SiinXu in #20755
- feat(mcp-runtime): support MCP SDK v2 and interactive requests by @DeJeune in #17610
- chore: version packages by @github-actions[bot] in #21371
- fix(api-gateway): preserve assistant output text in Responses history by @dakjdakd in #21342
- fix(ai-runtime): advance agent context-usage ring via message_delta and fix post-turn pull race by @GeorgeDong32 in #21319
- feat(archive): restore agent sessions with their agent and show row ownership by @NatsUIJM in #21336
- fix(agent-workspace): open folders with the preferred editor by @SiinXu in #19993
- feat(device-connections): add mobile onboarding and preview carousel by @DeJeune in #21217
- fix(electron): prevent Chrome Web Store navigation crashes by @kangfenmao in #21374
- fix(openai-responses): accept output_item.added without arguments by @NatsUIJM in #21339
- fix(ai-sdk): preserve unspecified tool choice by @DeJeune in #21380
- fix(stream-manager): preserve streamed content on mid-response failures by @NatsUIJM in #21338
- chore(changesets): upgrade to v3 by @DeJeune in #21384
- feat(knowledge): surface document-processor progress and give the reading status its own label by @NatsUIJM in #21386
- fix(ai-sdk): expand type arrays into anyOf branches for Gemini by @ggbdpq in #21396
- refactor: remove maps that are filled but never read by @irontaek in #21363
- ci(release): unify publishing and GitCode artifact sync by @kangfenmao in #21019
- fix(file-processing): upgrade anydoc to 0.2.4 by @DeJeune in #21397
- feat(file-preview): add portable previews and WebView compatibility by @zhangjiadi225 in #21370
- feat(help-menu): move problem reporting below user guide by @kangfenmao in #21404
- chore(file-preview): enable npm publishing by @zhangjiadi225 in #21407
- chore: version packages by @github-actions[bot] in #21408
- feat(doctor): add AI analysis with a bounded doctor Agent by @DeJeune in #20967
- feat(claude-code): identify Cherry Studio in agent CLI User-Agent via CLAUDE_AGENT_SDK_CLIENT_APP by @Afaren in #21411
- fix(remote-access): pair devices on Linux desktops without a recognised key store by @DeJeune in #21414
- feat(provider-registry): support Claude Haiku 5.5 by @DeJeune in #21415
- fix(claude-code): recover macOS high-fd spawn failures by @SiinXu in #20445
- fix(backup): support Windows drive root destinations by @kangfenmao in #21398
- feat(window-controls): use Electron WCO for Linux custom title bar by @DeJeune in #21416
- fix(ai-sdk): omit non-msg_ Responses message ids on store:false replay by @SiinXu in #20762
- fix(telegram-channel): recover suspended inbound polling by @SiinXu in #21412
- fix(comfyui): redraw a seed the workflow set to randomize by @LXD-8 in #21381
- fix(comfyui): hand the provider's API key to partner nodes by @LXD-8 in #21382
- fix(agent-browser): preserve active browsers when switching sessions by @DeJeune in #21421
- fix(notifications): show conversation title and final sentence by @DeJeune in #21424
- feat(app-updater): enable native differential downloads by @DeJeune in #21433
- docs(testing): scope local PR validation to related test files by @DeJeune in #21440
- fix(chat-compaction): show progress inside assistant messages by @DeJeune in #21441
- feat(window-controls): use native Windows caption buttons by @DeJeune in #21448
- fix(open-responses): ignore marked keep-alive deltas by @SiinXu in #20039
- fix(wechat-channel): validate saved credential user IDs by @focus-zyw in #21451
- fix(code-cli): avoid inherited executable names by @focus-zyw in #21452
- fix(notification): clear macOS Dock badge when all notification prefs are off by @SiinXu in #20754
- feat(paintings): conveniently view generated images by @SiinXu in #20767
- fix(markdown): stop linkifying single-segment slash runs as file paths by @NatsUIJM in #21453
- feat(remote-access): support resumable Agent attachments by @DeJeune in #21399
- chore: version packages by @github-actions[bot] in #21455
- fix(release): backport #21459 to v2.1.5 by @kangfenmao in #21460
New Contributors
- @dakjdakd made their first contribution in #21346
- @irontaek made their first contribution in #21363
- @Afaren made their first contribution in #21411
- @focus-zyw made their first contribution in #21451
Full Changelog: v2.1.4...v2.1.5