github CherryHQ/cherry-studio v2.1.7

3 hours ago

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

Full Changelog: v2.1.6...v2.1.7

Don't miss a new cherry-studio release

NewReleases is sending notifications on new releases.