Downloads (v2.1.7)
| 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.7 - Voice, Cloud, and Model Updates
✨ New Features
- [Voice] Add Kokoro Chinese-English TTS with 103 voices for Windows x64, Linux and macOS, and Qwen3-TTS for Apple Silicon. Download models from Settings > Local Models before first use.
- [Voice] Show live audio spectra in speech playback and dictation controls. Restore the microphone after empty dictation.
- [Voice] Add local FunASR speech transcription on Windows, Linux and macOS.
- [Cherry Cloud] Add subscription plan and quota usage visibility to the Global edition, with limited-time-free and exhausted-quota descriptions for managed models.
- [Cherry Cloud] Add a compact anchored sidebar account menu. Avatar and nickname open Personal Information settings; Appearance and Login stay in the menu.
- [Cherry Cloud] Preserve login during temporary connection or refresh failures.
- [Automation] Orchestrate Browser and Computer Use through persistent JavaScript with clearer execution feedback.
- [Knowledge Base] Drag knowledge bases between groups and reorder groups; cycle item columns through ascending, descending and default ordering.
- [Image] Add GPT-Image-2 aspect ratio presets for 16:9, 9:16, 16:10, and 4K output.
- [Models] Add Gemini 4 Argon support with thinking levels and automatic long-output continuation.
- [Models] Add Muse Spark Open model recognition with multimodal capabilities and reasoning controls.
- [Search] Add DuckDuckGo as a free keyword web search provider. No API key required.
- [Tools] Tool results now preview image links and display clickable web links.
- [Errors] Show actionable error notifications with readable diagnoses, expandable details, and recovery actions for conversations, provider checks, and MCP failures.
- [Chat] Queued follow-up messages start collapsed. Click the header to expand or collapse.
- [Chat] Hover over conversations to see full name, activity time, and workspace details.
- [Notes] Search code-block languages by name.
🐛 Bug Fixes
- [Attachments] Fix unrecognized-extension text files (e.g., .lrmx) not being read as text.
- [OCR] Identify which OCR path failed when sending images to non-vision models, with guidance for each failure type.
- [Window] Fix main window closing on Windows/Linux hiding the window when the tray icon is unavailable, leaving no way to restore or quit.
- [Messages] Preserve disclosure state and follow streamed reasoning in message display.
- [Composer] Automatically follow prompt text direction; keep leading-dot file names; accept any file type on the agent surface.
- [Files] Add file context menu actions; align file links and icons with inline text.
- [MCP] Connect to remote MCP servers that reject the version probe with 5xx errors; confirm health before reconnects.
- [Models] Accept null Gemini model list pagination tokens; improve Gemini model discovery and metadata refresh.
- [Tray] Use a stable Windows tray GUID for portable installs.
- [Voice] Fixed read-aloud skipping text in code blocks and inline code.
- [Agents] Allow users to turn off onboarding by declining setup.
- [Translation] Keep idle dictation and copy buttons beside the input text without adding an extra toolbar row.
- [Computer Use] Fixed missing automation tool output for Claude agents and added structured accessibility-tree pagination to prevent oversized observations from being omitted.
- [Settings] Restore settings scrollbars and consistent layouts, clarify Computer Use permission actions, and fix clipped content, MCP tab order and unnecessary Usage heatmap overflow.
What's Changed
- fix(topic-purge): chunk permanent deletion in one transaction by @focus-zyw in #21494
- fix(message-reply-group): invalidate descendant context on deletion by @focus-zyw in #21492
- fix(knowledge-item): reconcile containers atomically on deletion by @focus-zyw in #21490
- chore(release): sync v2.1.6 metadata by @kangfenmao in #21495
- fix(shared): trim trailing whitespace/dots after 255-char truncation by @c020627 in #21501
- fix(file-import): derive URL extension from pathname by @focus-zyw in #21500
- feat(archive): add navigation actions to archive toasts by @ousugo in #21502
- fix(composer): fall back to clipboard image when pasting from Flatpak apps by @wellcoming in #21503
- feat(provider-registry): add LiteLLM provider by @misbahsy in #21511
- fix(gitcode-sync): use domestic Windows runner by @kangfenmao in #21509
- fix(orphan-sweep): preserve retained blobs with tmp-shaped extensions by @focus-zyw in #21499
- fix(directory-tree): clean up failed initialization by @focus-zyw in #21504
- fix(directory-tree): retain watcher fallback after missed rename by @focus-zyw in #21505
- fix(composer): automatically follow prompt text direction by @GuyvDev in #21463
- fix(markdown): render single-line $$ formulas with display-only LaTeX as display math by @404-Page-Found in #20813
- fix(dangling-cache): discard stale presence probes by @focus-zyw in #21510
- fix(directory-tree): discard stale pending additions by @focus-zyw in #21508
- fix(resource-list): animate rows moving after removal by @DeJeune in #21517
- fix(composer): clarify workspace resource search results by @DeJeune in #21516
- feat(provider-billing): add multipliers and daily rate schedules by @WhiteZeek in #21498
- chore: version packages by @github-actions[bot] in #21518
- fix(files): report real existence for the requested name in fileNameGuard by @HHHSL in #21522
- fix(assistant-relations): deduplicate linked IDs by @focus-zyw in #21470
- refactor(async-coordination): share task scheduling primitives by @DeJeune in #20512
- feat(provider-registry): prepare cross-platform npm package by @DeJeune in #21529
- chore: version packages by @github-actions[bot] in #21532
- fix(trash-purge): retain empty-all requests across restart by @focus-zyw in #21531
- fix(ci): stop publishing package Git tags by @kangfenmao in #21533
- fix(chat-markdown): render file paths without code wrappers by @DeJeune in #21521
- fix(image-preview): keep SVG previews sharp when zooming by @SiinXu in #21534
- chore: version packages by @github-actions[bot] in #21538
- fix(code-cli): normalize MiniMax Code icon size by @kangfenmao in #21483
- fix(agent-settings): compact reply language controls by @kangfenmao in #21481
- docs(readme): add mobile app link by @zhangjiadi225 in #21542
- feat(chat-files): add file context menu actions by @DeJeune in #21537
- fix(chat-files): align file links and icons with inline text by @DeJeune in #21544
- fix(files): skip inline rename submit while IME is composing by @mahirhir in #16582
- docs(gh-create-pr): remove mandatory PR body confirmation by @kangfenmao in #21550
- fix(cache-cleanup): bypass orphan sweep volume limits by @kangfenmao in #21551
- feat(remote-uploads): verify source checksums before publishing files by @DeJeune in #21527
- chore: version packages by @github-actions[bot] in #21562
- fix(download): strip trailing quote when parsing quoted Content-Disposition filename by @c020627 in #21536
- fix(file-manager): decouple shared mock from main-process types by @DeJeune in #21564
- feat(claude-code): download native runtime on demand by @kangfenmao in #21548
- fix(composer): accept any file type on the agent surface by @NatsUIJM in #20357
- ci(automation): remove PR update and issue tracker workflows by @kangfenmao in #21563
- refactor(lan-transfer): remove unused transfer feature by @DeJeune in #21570
- feat(heartbeat): configure per-agent execution timeout by @Dante-dan in #21558
- refactor(general-settings): organize settings into titled groups by @kangfenmao in #21568
- refactor(agent-runtime): replace DSH with Pi and migrate history by @kangfenmao in #21400
- fix(messages): sanitize message-derived title in export-as-image save dialog by @ggbdpq in #21220
- chore(codeowners): add DeJeune to file processing, knowledge and UI by @DeJeune in #21574
- feat(sessions): show conversation details in hover cards by @ousugo in #21573
- refactor(claude-code): use native AGENTS.md loading by @DeJeune in #21580
- chore(codeowners): remove eeee0717 from ownership rules by @eeee0717 in #21581
- fix(new-api): route image endpoints through the New API adapter by @pczhao1210 in #21547
- chore: version packages by @github-actions[bot] in #21589
- fix(main): treat a child directory named ..archive as inside its parent by @c020627 in #21587
- feat(list-search): support Chinese pinyin initials by @kangfenmao in #21592
- fix(mini-app): clean up unused WebViews on tab close by @404-Page-Found in #19535
- fix(mcp-filesystem): drop the platform-shaped default baseDir from the preset by @lianshuang-photo in #21605
- fix(thinking-block): render the reasoning panel's own scrollbar by @lianshuang-photo in #21604
- fix(composer): remove text cap and auto-fit input height by @DeJeune in #21595
- perf(model-settings): lazy-load optional panels by @lihuiyang1024 in #19872
- perf(markdown-editor): defer preview rendering by @DeJeune in #18942
- fix(rtk): accept rtk's exit-code-3 rewrites and log rewrite failures by @angri450 in #21583
- fix(agent-session): gate edit-and-resend on the session teardown state by @lianshuang-photo in #21619
- feat(tool-results): preview image URLs and render clickable links by @DeJeune in #21608
- feat(gemini): support Gemini 4 Argon in AI SDK runtime by @DeJeune in #21625
- chore: version packages by @github-actions[bot] in #21630
- test(claude-code): await installation cleanup before asserting by @DeJeune in #21631
- feat(composer): add collapsible queued messages by @ousugo in #21635
- fix(gemini): improve model discovery and refresh model metadata by @DeJeune in #21633
- fix(messages): preserve disclosure state and follow streamed reasoning by @ousugo in #21623
- chore: version packages by @github-actions[bot] in #21637
- feat(screenshot): add captures and optional text to chat drafts by @DeJeune in #21540
- fix(agent-lifecycle): compress archived system workspaces by @DeJeune in #21515
- fix(resource-list): suppress hover previews while context menus are open by @ousugo in #21638
- fix(tray): stable Windows tray GUID for portable installs by @404-Page-Found in #21485
- fix(auto-backup): postpone automatic backup while data writers are active by @404-Page-Found in #20916
- fix(model-settings): explain saved modality overrides by @Dante-dan in #21312
- feat(agent): mount ApiGatewayRequiredDialog at AppShell level (Fixes #18556) by @xxiaoxiong in #19709
- fix(oauth): clean up popup message listeners by @userInner in #19401
- perf(markdown): load the CodeMirror editor stack only when editing by @yzxcj797 in #19223
- feat(voice): add local speech runtime foundation by @AtomsH4 in #20746
- feat(voice): add shared renderer voice foundation by @AtomsH4 in #20858
- feat(voice): add local FunASR transcription runtime by @AtomsH4 in #20902
- feat(voice): add primary consumer integrations by @AtomsH4 in #21506
- feat(voice): add text and content consumer integrations by @AtomsH4 in #21049
- chore(pr-template): remove branch strategy notices by @kangfenmao in #21657
- chore: version packages by @github-actions[bot] in #21658
- perf(topic-rename): isolate row subscriptions by @ActiveSky in #19362
- fix(redaction): redact shared references at every occurrence in redactDeep by @c020627 in #21648
- fix(renderer): keep leading-dot file names when removing a file extension by @c020627 in #21649
- fix(provider): repair legacy order keys before preset seeding by @lorenzozanee in #21285
- feat(computer-use): add SDK permission settings by @DeJeune in #20718
- ci(validation): share setup for lightweight checks by @kangfenmao in #21656
- feat(voice-asr): accept canonical WAV input by @SiinXu in #21403
- fix(agent-identity): refresh persona and memory across runtime turns by @DeJeune in #21664
- fix(voice-runtime): report unsupported explicit transcription choices by @SiinXu in #21629
- fix(grok-cli): read x-grok-client-version from ~/.grok/version.json by @pppan2003 in #21652
- fix(data-api): accept the built-in Agent slug as a pin entity id by @lianshuang-photo in #21684
- docs(gh-pr-review): require existing module reuse checks by @DeJeune in #21691
- perf(files): hydrate only newly paginated entries by @userInner in #19380
- fix(funasr): accept canonical WAV input by @SiinXu in #21665
- fix(chat-flow): resolve the paused status label key in the message-flow node by @lianshuang-photo in #21685
- fix(binary-manager): keep BabelDOC's bitstring dependency below 5 by @lianshuang-photo in #21688
- fix(cherry-assistant): upgrade legacy stock instructions with a seeder by @SiinXu in #21666
- feat(cdp-settings): add local CDP controls and miniapp debugging indicator by @HappyAny in #21299
- feat(note-editor): search code block languages by @1lck in #21670
- fix(mcp-runtime): confirm health before bounded reconnects by @WhiteZeek in #21678
- fix(remote-access): refuse over-rate requests instead of ending the session by @lianshuang-photo in #21687
- chore: version packages by @github-actions[bot] in #21696
- test(pi): make the retired-session migration suite host-agnostic by @angri450 in #21694
- fix(notes): name icon controls for assistive tech by @SiinXu in #19512
- fix(work): keep pinned tasks in agent grouping by @Dante-dan in #20320
- test(provider-registry): guard DeepSeek V4 reasoning metadata by @ActiveSky in #19303
- style(pi-runtime): fix main CI fixture formatting by @DeJeune in #21703
- feat(web-search): add DuckDuckGo as free keyword search provider by @Shiina18 in #19389
- fix(rtk): survive slow wrappers — realistic probe budgets and failure-aware caching by @angri450 in #21689
- refactor(composer): drop the send shortcut from the input placeholder and name it on the send control by @NatsUIJM in #20277
- fix(azure): respect user-configured apiVersion in URL preview (#11691) by @xr843 in #15728
- fix(mcp-browser): prevent hidden media playback by @userInner in #19430
- fix(mcp-runtime): connect to remote MCP servers that reject the version probe with 5xx by @cherry-coding[bot] in #21709
- fix(huggingface): serve Agents over the router's Anthropic Messages API by @kennyzheng-builds in #19786
- fix(searxng-provider): keep search hits whose page content cannot be fetched by @kennyzheng-builds in #19618
- chore: version packages by @github-actions[bot] in #21714
- fix(composer): notify the quick panel once an IME composition ends by @kennyzheng-builds in #17926
- feat(local-voice): add downloadable Qwen3 TTS with independent voice selection by @DeJeune in #21713
- fix(chat): improve voice action icon sizing by @DeJeune in #21729
- fix(composer): keep a referenced name from closing the delimiter block early by @c020627 in #21727
- docs(claude): fix the mistyped Write Serialization anchor by @c020627 in #20436
- feat(error-toasts): add typed errors and recovery actions by @WhiteZeek in #21675
- chore: version packages by @github-actions[bot] in #21732
- fix(provider-import): allow editing custom provider names by @1lck in #21718
- feat(image-generation): add GPT-Image-2 aspect ratio presets by @1lck in #21715
- fix(selection-context-menu): preserve quoted math formulas by @1lck in #21712
- docs(api-gateway): explain purpose and startup controls by @1lck in #21722
- fix(pdf-translation): give the BabelDOC sidecar a Requests CA bundle by @lianshuang-photo in #21672
- fix(voice-settings): explain busy microphone tests by @DeJeune in #21735
- fix(ai-sdk): converge out-of-range DashScope Qwen temperature to 1.9 by @cherry-coding[bot] in #21734
- chore: version packages by @github-actions[bot] in #21733
- fix(agent-session): prepare the pi session workspace before runtime startup by @cherry-coding[bot] in #21740
- fix(main): collapse trailing-separator PATH spellings in dedupePathSegments by @c020627 in #21650
- refactor(electron-dev): merge PR testing into development skill by @DeJeune in #21748
- feat(local-voice): add Kokoro Chinese-English TTS by @DeJeune in #21742
- feat(user-account): add anchored sidebar account menu by @SiinXu in #20071
- feat(agent-model-selector): show cloud quota descriptions by @zhibisora in #19988
- fix(code-mate): enforce Cherry Cloud model boundary by @zhibisora in #20048
- fix(cherry-cloud): preserve login during recoverable request failures by @zhibisora in #20310
- feat(cherry-cloud): add global subscription usage by @zhibisora in #20841
- fix(design-tokens): let the input border composite against its surface by @kennyzheng-builds in #18052
- feat(automation-repl): orchestrate browser and computer tasks with persistent JavaScript by @DeJeune in #21704
- feat(voice-controls): add spectrum capsules for speech and dictation by @DeJeune in #21745
- feat(knowledge-base): add drag ordering and three-state sorting by @kangfenmao in #21290
- fix(local-model): complete Kokoro TTS test context by @DeJeune in #21755
- fix(nightly-build): split installer downloads and add summary by @kangfenmao in #21754
- fix(system-speech): enable standard coroutines on Windows by @DeJeune in #21759
- ci(sherpa-runtime): build and verify Windows ARM64 addon by @DeJeune in #21757
- fix(ai-core): repair restored tool result names by @Dante-dan in #20281
- chore: version packages by @github-actions[bot] in #21767
- fix(api-gateway): continue after reasoning+text assistant tails by @cherry-coding[bot] in #21765
- fix(pi-runtime): preserve Gemini custom fetch transport by @WhiteZeek in #21747
- fix(claude-code): disable total token reminders by default by @DeJeune in #21770
- fix(mac-signing): allow microphone capture in packaged apps by @DeJeune in #21771
- fix(e2e-regression): stabilize runs and support branch selection by @kangfenmao in #21758
- fix(provider): accept null Gemini model list pagination tokens by @WhiteZeek in #21752
- fix(main-window): quit on close when no tray icon exists by @cherry-coding[bot] in #21773
- ci(validation): reduce repeated work and speed up i18n checks by @kangfenmao in #21753
- fix(chat): content-sniff unrecognized-extension attachments by @cherry-coding[bot] in #21763
- feat(provider-registry): support Muse Spark Open by @ousugo in #21776
- chore: version packages by @github-actions[bot] in #21777
- fix(ai): identify the failed OCR path in the non-vision image error by @angri450 in #21690
- feat(local-voice): enable Kokoro and FunASR on Windows ARM64 by @DeJeune in #21779
- fix(release): backport #21799 to v2.1.7 by @kangfenmao in #21800
- fix(release): backport #21798 to v2.1.7 by @kangfenmao in #21803
- fix(release): backport #21825 to v2.1.7 by @kangfenmao in #21827
- fix(release): backport #21824 to v2.1.7 by @kangfenmao in #21828
- fix(release): restore v2.1.7 builder final newline by @DeJeune in #21831
- fix(release): backport #21794 to v2.1.7 by @kangfenmao in #21893
New Contributors
- @wellcoming made their first contribution in #21503
- @misbahsy made their first contribution in #21511
- @GuyvDev made their first contribution in #21463
- @mahirhir made their first contribution in #16582
- @pczhao1210 made their first contribution in #21547
- @pppan2003 made their first contribution in #21652
- @Shiina18 made their first contribution in #19389
Full Changelog: v2.1.6...v2.1.7