github CherryHQ/cherry-studio v2.1.5

3 hours ago

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

Full Changelog: v2.1.4...v2.1.5

Don't miss a new cherry-studio release

NewReleases is sending notifications on new releases.