Skip to content

Add raycast-mimo-tts extension#28369

Merged
raycastbot merged 19 commits into
raycast:mainfrom
semantic-craft:ext/raycast-mimo-tts
Jun 19, 2026
Merged

Add raycast-mimo-tts extension#28369
raycastbot merged 19 commits into
raycast:mainfrom
semantic-craft:ext/raycast-mimo-tts

Conversation

@semantic-craft

@semantic-craft semantic-craft commented May 27, 2026

Copy link
Copy Markdown
Contributor

Description

A standalone Raycast extension for Xiaomi MiMo TTS — read selected or clipboard text aloud, and generate or clone voices, all without leaving Raycast.

This extension covers the full MiMo-V2.5-TTS series (three models exposed by Xiaomi's MiMo platform):

Model ID Used by What it does
mimo-v2.5-tts Quick Read · Read with Voice · Set Quick Read Voice · TTS Studio · Setup Voice Defaults Preset-voice synthesis (Chinese & English) with style controls.
mimo-v2.5-tts-voicedesign Design Voice Generates a custom voice from a 1–4 sentence text description. Supports optimize_text_preview (model auto-rewrites the sample text).
mimo-v2.5-tts-voiceclone Clone Voice Replicates the voice in an mp3/wav sample (≤10 MB after base64) and reads new text in that voice.
mimo-v2-tts optional, via Setup Voice Defaults Legacy MiMo-V2 voices.

Commands (9 total)

  • Quick Read (no-view) — Read selected or clipboard text with the default voice. Trigger again to stop. Chunks long passages at sentence/clause boundaries (4 KB max each) with look-ahead synthesis so the next chunk starts while the current one plays.
  • Read with Voice (view) — Browse voices and read with the chosen one.
  • Set Quick Read Voice (view) — Pick and preview the voice Quick Read uses.
  • TTS Studio (view) — Long-form composer with voice, speech rate, opening-style tags, emotion / rhythm / vocal-texture / expression tags, performance presets, and a free-form director prompt.
  • Design Voice (view) — Generate a custom voice from a description; optional auto-optimized sample text.
  • Clone Voice (view) — Pick an mp3/wav file, MiMo replicates it and reads new text.
  • Setup Voice Defaults (view) — Persist a per-session override layer on top of Raycast Preferences.
  • Stop Reading / Speed up Reading / Slow Down Reading (no-view) — Playback controls. Speed override (0.5×–2.0×, 0.25× steps) is global across commands.
  • Reading Status (menu-bar) — Now-playing status with playback / speed controls.

Getting an API key

Users need a MiMo Token Plan API key (starts with tp-). Sign up and create a key at https://platform.xiaomimimo.com/. Token Plan is currently limited-time free per Xiaomi's billing page. Pay-as-you-go sk- keys are NOT compatible with this extension's Token Plan endpoint; the preferences description and a runtime error guard both call this out.

Implementation notes

  • Single endpoint: https://token-plan-cn.xiaomimimo.com/v1/chat/completions (overridable via preferences).
  • Both v2.5 style-control surfaces from the official docs are implemented:
    • Natural-language controlrole: user content (style prompt / director prompt).
    • Audio-tag controlrole: assistant content prefix ((开心 温柔)… etc.).
  • Cross-command stop uses a tmpdir PID file (raycast-mimo-tts.pid / .stop) so this extension doesn't fight with my AI Voice Studio extension over afplay.
  • All errors surface as Raycast toasts with a "Copy Error Details" secondary action and, for credential errors, a "Setup Voice Defaults" / "Open API Key Preferences" primary action.

Provenance

Originally part of AI Voice Studio. This standalone version extracts the MiMo provider so users who only want MiMo TTS get a focused, smaller surface (no Qwen / MiniMax / OpenAI code paths).

Screencast

Three 2000×1250 screenshots are included under extensions/raycast-mimo-tts/metadata/:

  1. raycast-mimo-tts-1.png — Design Voice form (mimo-v2.5-tts-voicedesign).
  2. raycast-mimo-tts-2.png — Clone Voice form (mimo-v2.5-tts-voiceclone).
  3. raycast-mimo-tts-3.png — Read with Voice voice picker with preset voices.

Checklist

- docs: add Raycast Store screenshots
- feat: initial release of MiMo TTS Raycast extension
@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels May 27, 2026
@raycastbot

raycastbot commented May 27, 2026

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@semantic-craft
semantic-craft marked this pull request as ready for review May 27, 2026 13:11
@greptile-apps

greptile-apps Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces a standalone Raycast extension for Xiaomi MiMo TTS, extracted from the author's AI Voice Studio extension. It covers all three MiMo-V2.5-TTS model variants (preset voices, Voice Design, Voice Clone) across 11 commands including Quick Read, TTS Studio, a menu-bar status item, and playback-speed controls.

  • Architecture: Well-structured with a shared chunk-playback-engine for lookahead synthesis, a useAudioPlayer hook that correctly reads playerRef.current at unmount time, and a file-plus-LocalStorage dual-stop mechanism for cross-command coordination.
  • Most previously-flagged issues addressed: stale-ref cleanups in clone-voice/design-voice/read-with-voice, missing try/finally in provider-setup-form and playback-status, and the isPlaying/isLoading separation in TTS Studio are all present in this revision.
  • One remaining bug: handleReset in provider-setup-form.tsx omits setSelectedModel(fresh.model), leaving the model and voice dropdowns stale after a reset; a subsequent "Save Voice Defaults" click silently recreates the override that was just cleared.

Confidence Score: 4/5

Safe to merge after fixing the reset-then-save flow in provider-setup-form.tsx.

The only new defect is in handleReset inside provider-setup-form.tsx: after clearing overrides, selectedModel is not updated to the fresh model, so the dropdowns remain stale. A user who immediately clicks "Save Voice Defaults" after a reset re-creates the cleared override with the old model/voice pair, making the reset a no-op. The fix is a single setSelectedModel(fresh.model) call. Everything else — synthesis pipeline, playback control, chunking, stop coordination, and hook lifecycles — looks correct.

extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx — the handleReset callback needs setSelectedModel(fresh.model) after setSettings(fresh).

Important Files Changed

Filename Overview
extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx Setup Voice Defaults form — handleReset omits setSelectedModel(fresh.model), leaving the model/voice dropdowns stale and causing a subsequent save to re-create the cleared override.
extensions/raycast-mimo-tts/src/api/mimo-tts.ts Core synthesis API — request building, credential validation, timeout/abort handling, and options assembly are all correct.
extensions/raycast-mimo-tts/src/utils/audio-player.ts AudioPlayer — PID-file-based cross-command stop, PCM streaming, temp-file cleanup, and playback rate control look correct; uses execFileSync for the ps-check consistently.
extensions/raycast-mimo-tts/src/tts-studio.tsx TTS Studio — separate isPlaying state correctly keeps Stop Playback visible after first chunk, try/finally ensures spinner always clears.
extensions/raycast-mimo-tts/src/playback-status.tsx Menu-bar status — .catch(() => setState(null)) correctly prevents the loading spinner from sticking on a LocalStorage error.
extensions/raycast-mimo-tts/src/hooks/use-audio-player.ts New useAudioPlayer hook — cleanup reads playerRef.current at unmount time, fixing the stale-ref issue for clone-voice and design-voice.
extensions/raycast-mimo-tts/src/quick-read.tsx Quick Read — toggle-to-stop logic, chunked lookahead playback, and fresh-state checks all look correct.
extensions/raycast-mimo-tts/src/read-with-voice.tsx Read with Voice — cleanup now reads playerRef.current at unmount; buildOptionsAsync and all awaits are inside the try/finally block.
extensions/raycast-mimo-tts/src/utils/chunk-playback-engine.ts Generic chunk-playback loop with prefetch/cancel sequencing — stop-check hooks and prefetch cleanup in the finally block look correct.
extensions/raycast-mimo-tts/src/utils/provider-settings.ts Settings resolution (LocalStorage override → Raycast prefs → defaults) and normalization are correct.
extensions/raycast-mimo-tts/package.json Extension manifest — schema ref present, valid categories, macOS platform, correct preference types, single runtime dependency (@raycast/api) which is used throughout.
Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx:105-113
**`handleReset` leaves `selectedModel` stale, so submitting after reset re-saves the old model**

After clicking "Reset to Preferences", `setSelectedModel` is never called. The model `Form.Dropdown` is uncontrolled (`defaultValue` only), so the dropdown continues to display the pre-reset model. `selectedModel` also remains stale, meaning the voice dropdown continues to filter by the old model. If the user then clicks "Save Voice Defaults", `values.model` reflects the old model value and `saveMimoSettingsOverrides` immediately recreates the override that was just cleared — the reset is silently undone.

The fix is to add `setSelectedModel(fresh.model)` after `setSettings(fresh)`.

Reviews (17): Last reviewed commit: "Update CHANGELOG.md and optimise images" | Re-trigger Greptile

Comment thread extensions/raycast-mimo-tts/CHANGELOG.md Outdated
Comment thread extensions/raycast-mimo-tts/src/utils/audio-player.ts Outdated
Comment thread extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx Outdated
Comment thread extensions/raycast-mimo-tts/src/clone-voice.tsx Outdated
Comment thread extensions/raycast-mimo-tts/src/design-voice.tsx Outdated
Comment thread extensions/raycast-mimo-tts/src/read-with-voice.tsx Outdated
semantic-craft and others added 3 commits May 27, 2026 21:24
…e comment

Greptile flagged two non-blocking nits:
- getActiveModel() always returned DEFAULT_MODEL regardless of user settings
  and had no callers; getActiveModelAsync() is the correct API.
- chunk-playback-engine.ts header still referenced Qwen-TTS and OpenAI from
  the AI Voice Studio extension this code was ported from.

Note: Greptile also suggested "Speed up Reading" → "Speed Up Reading", but
Raycast's own title-case linter expects "up" lowercase (AP-style: <4 letter
words stay lowercase), so that one is intentionally not changed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread extensions/raycast-mimo-tts/src/read-with-voice.tsx
semantic-craft and others added 3 commits May 27, 2026 22:55
Greptile flagged that read-with-voice.tsx sets isLoading=true and the
playing-voice indicator BEFORE the try block, while only the try's finally
unsets them. If buildOptionsAsync (throws TTSApiError for unknown voices)
or setNowPlaying (can fail on LocalStorage error) throws, the command is
permanently stuck in the loading/playing-indicator state.

Move every step from showToast/setNowPlaying through playChunksWithLookahead
into the existing try/catch/finally so the finally always runs.

The same pattern existed in clone-voice.tsx and design-voice.tsx — showToast
ran before the try block, so a Toast failure would leave isLoading stuck.
Fixed both for consistency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile noted that toClonePayload reads the entire file into memory and
then runs the base64 size check. statSync already returns the raw byte
size; gate on that first (raw bytes <= MAX_SAMPLE_BYTES is a safe over-
estimate, since base64 inflates ~33 %), so accidentally picking a 50 MB
video doesn't pay the readFileSync allocation before being rejected. The
precise post-encode check below remains the authoritative gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Same race condition addressed in the AI Voice Studio extension. After
killing the recorded pid, unconditional removePidFile() can delete a
PID file written by a concurrent new Quick Read that started in the
brief window between the SIGTERM and the removal, leaving that new
session unstoppable through Stop Reading.

removePidFileIfMatch(pid) was added exactly for this race; switch the
post-kill cleanup to use it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread extensions/raycast-mimo-tts/src/tts-studio.tsx
Comment thread extensions/raycast-mimo-tts/src/playback-status.tsx
…error

TTS Studio used isLoading both for the spinner and to gate the Stop
Playback action. onFirstAudioReady sets isLoading=false once the first
chunk starts playing, which removed Stop from the panel for the rest of
a multi-chunk reading. Introduce an independent isPlaying state that is
true from submission to the finally block, and gate Stop on that.

playback-status.tsx (menu bar) loaded its state via Promise.all without
a .catch(). A single transient LocalStorage / preferences rejection
left state=undefined and isLoading=true until the next refresh tick,
which would just throw again. Coerce to state=null on rejection so the
menu bar falls back to the idle UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx
semantic-craft and others added 3 commits May 27, 2026 23:43
Greptile flagged that the form's load() effect ran setIsLoading(false)
unconditionally after Promise.all, so a transient LocalStorage rejection
would leave isLoading true forever. Wrap the resolve+set in try/finally
so isLoading is cleared on either success or rejection.

Greptile also (again) suggested renaming "Speed up Reading" to
"Speed Up Reading". That suggestion is wrong: Raycast's own `ray lint`
rule uses AP-style title case which keeps short words (<4 letters)
lowercase; running lint with "Speed Up Reading" produces an error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile noted that the PCM path's afplay process had asymmetric handlers:
the close handler resets currentPid and calls removePidFileIfMatch, but
the error handler did neither. After an afplay error, the PID file
remained stale and currentPid still held the dead pid until the next
stopPlayback / cleanup. In that window, a Stop Reading from another
command would find the dead pid via ps, fail the afplay-comm check,
silently delete the PID file, and report "Nothing was playing" — even
though playback just errored a moment earlier.

Mirror the close-handler cleanup in the error handler so the dead
process always releases its PID record on either exit path. The
non-PCM path already does this; only the PCM error handler was missing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile noted that read-with-voice.tsx had two action titles reading
"Open Api Key Preferences" while provider-setup-form.tsx already used
the correctly-cased "Open API Key Preferences" (with an
@raycast/prefer-title-case eslint-disable comment, since the Raycast
title-case rule otherwise rewrites "API" to "Api").

Apply the same eslint-disable + "API" pattern to all four remaining
occurrences in read-with-voice.tsx (2) and select-voice.tsx (2).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx
semantic-craft and others added 3 commits May 28, 2026 00:25
Greptile flagged that the model Form.Dropdown was uncontrolled
(defaultValue only) while the voice list filtered by settings.model from
React state. settings.model only updates after handleSubmit saves, so
changing the model in the dropdown left the voice list filtered by the
previously-saved model. A user switching mimo-v2.5-tts to mimo-v2-tts
would still see v2.5-only voices and could pick an incompatible pair.

Add a selectedModel state, wire it to the dropdown's onChange, seed it
from the loaded settings, and use it in the voice-list filter and
voicesForModel useMemo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile noted that MimoAudioFormat was typed "wav" | "pcm16" while
DEFAULT_AUDIO_FORMAT is hard-coded "wav" and nothing in this extension
ever sets pcm16 at runtime. The PCM streaming methods on AudioPlayer
are dormant scaffolding inherited from AI Voice Studio (which uses
pcm16 for the Qwen-TTS realtime path) and are not called from any code
path here.

Narrow the type to "wav" so the contract is honest; left a code comment
pointing at the inheritance so future maintainers know the dormant
infrastructure is intentional rather than oversight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@semantic-craft

Copy link
Copy Markdown
Contributor Author

Follow-up update for MiMo voice defaults:

  • Replaced region-dependent mimo_default with explicit English default Chloe for MiMo V2.5.
  • Kept the documented English voices (Mia, Chloe, Milo, Dean) first in Preferences, Setup Voice Defaults, TTS Studio, Read with Voice, and Set Quick Read Voice.
  • Legacy mimo_default/unknown stored values now normalize to the current model's explicit English default; mimo-v2-tts still falls back to its legacy English voice.
  • Updated the Store PR branch with a normal commit on top of the existing ext/raycast-mimo-tts branch after ray publish hit a non-fast-forward push rejection.

Validation: npm run build, npx @raycast/api@latest lint, npx tsc --noEmit, git diff --check, and local dev rebuild in raycast-mimo-tts.

@semantic-craft

Copy link
Copy Markdown
Contributor Author

Addressed the manifest title-case nit by changing the command title to "Speed Up Reading". Updated Store branch commit: 9f966b0. Validation: npm run build, npx @raycast/api@latest lint, npx tsc --noEmit.

- Introduce `assembleTTSOptions` to consolidate option construction
- Remove redundant option building code in `mimo-tts.ts`
- Refactor `clone-voice.tsx` to use `useSynthesisForm` hook
- Improve readability by modularizing core emotion tags
- Update dependencies and configuration settings
@socket-security

Copy link
Copy Markdown

Dependency limit exceeded — report not shown.

This pull request scan exceeded the 10,000-dependency limit applied to this scan, so the results are incomplete and may be inaccurate. To avoid reporting false positives, Socket has not posted a report.

Upgrade your plan to raise the dependency limit and get complete reports, or view the partial scan in the dashboard.

Socket is always free for open source. If this is a non-commercial open source project, contact us to request a free Team account.

@0xdhrv 0xdhrv self-assigned this Jun 19, 2026

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, approved ✅

@raycastbot
raycastbot merged commit a740106 into raycast:main Jun 19, 2026
3 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Published to the Raycast Store:
https://raycast.com/xianwei_zhang/raycast-mimo-tts

@raycastbot

Copy link
Copy Markdown
Collaborator

🎉 🎉 🎉

We've rewarded your Raycast account with some credits. You will soon be able to exchange them for some swag.

Comment on lines +105 to +113
await showToast({ style: Toast.Style.Success, title: "Voice defaults reset" });
}, []);

return (
<Form
isLoading={isLoading}
navigationTitle="Setup MiMo Voice Defaults"
actions={
<ActionPanel>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 handleReset leaves selectedModel stale, so submitting after reset re-saves the old model

After clicking "Reset to Preferences", setSelectedModel is never called. The model Form.Dropdown is uncontrolled (defaultValue only), so the dropdown continues to display the pre-reset model. selectedModel also remains stale, meaning the voice dropdown continues to filter by the old model. If the user then clicks "Save Voice Defaults", values.model reflects the old model value and saveMimoSettingsOverrides immediately recreates the override that was just cleared — the reset is silently undone.

The fix is to add setSelectedModel(fresh.model) after setSettings(fresh).

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast-mimo-tts/src/components/provider-setup-form.tsx
Line: 105-113

Comment:
**`handleReset` leaves `selectedModel` stale, so submitting after reset re-saves the old model**

After clicking "Reset to Preferences", `setSelectedModel` is never called. The model `Form.Dropdown` is uncontrolled (`defaultValue` only), so the dropdown continues to display the pre-reset model. `selectedModel` also remains stale, meaning the voice dropdown continues to filter by the old model. If the user then clicks "Save Voice Defaults", `values.model` reflects the old model value and `saveMimoSettingsOverrides` immediately recreates the override that was just cleared — the reset is silently undone.

The fix is to add `setSelectedModel(fresh.model)` after `setSettings(fresh)`.

How can I resolve this? If you propose a fix, please make it concise.

@semantic-craft
semantic-craft deleted the ext/raycast-mimo-tts branch June 19, 2026 14:14
0xdhrv added a commit that referenced this pull request Jun 22, 2026
* Add raycast-mimo-tts extension

- docs: add Raycast Store screenshots
- feat: initial release of MiMo TTS Raycast extension

* docs: rewrite README with global-developer hero, V2.5 pricing news, capability claims

* fix: address Greptile review P2s

* fix: cleanup the live AudioPlayer at unmount, not the captured one

* fix: remove dead getActiveModel sync helper and fix stale chunk-engine comment

Greptile flagged two non-blocking nits:
- getActiveModel() always returned DEFAULT_MODEL regardless of user settings
  and had no callers; getActiveModelAsync() is the correct API.
- chunk-playback-engine.ts header still referenced Qwen-TTS and OpenAI from
  the AI Voice Studio extension this code was ported from.

Note: Greptile also suggested "Speed up Reading" → "Speed Up Reading", but
Raycast's own title-case linter expects "up" lowercase (AP-style: <4 letter
words stay lowercase), so that one is intentionally not changed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: ensure setIsLoading(false) runs on any setup failure

Greptile flagged that read-with-voice.tsx sets isLoading=true and the
playing-voice indicator BEFORE the try block, while only the try's finally
unsets them. If buildOptionsAsync (throws TTSApiError for unknown voices)
or setNowPlaying (can fail on LocalStorage error) throws, the command is
permanently stuck in the loading/playing-indicator state.

Move every step from showToast/setNowPlaying through playChunksWithLookahead
into the existing try/catch/finally so the finally always runs.

The same pattern existed in clone-voice.tsx and design-voice.tsx — showToast
ran before the try block, so a Toast failure would leave isLoading stuck.
Fixed both for consistency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: early-reject oversized clone samples before reading into memory

Greptile noted that toClonePayload reads the entire file into memory and
then runs the base64 size check. statSync already returns the raw byte
size; gate on that first (raw bytes <= MAX_SAMPLE_BYTES is a safe over-
estimate, since base64 inflates ~33 %), so accidentally picking a 50 MB
video doesn't pay the readFileSync allocation before being rejected. The
precise post-encode check below remains the authoritative gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: avoid clobbering a concurrent Quick Read's pid file on stop

Same race condition addressed in the AI Voice Studio extension. After
killing the recorded pid, unconditional removePidFile() can delete a
PID file written by a concurrent new Quick Read that started in the
brief window between the SIGTERM and the removal, leaving that new
session unstoppable through Stop Reading.

removePidFileIfMatch(pid) was added exactly for this race; switch the
post-kill cleanup to use it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: keep Stop available after first chunk, recover menu bar on load error

TTS Studio used isLoading both for the spinner and to gate the Stop
Playback action. onFirstAudioReady sets isLoading=false once the first
chunk starts playing, which removed Stop from the panel for the rest of
a multi-chunk reading. Introduce an independent isPlaying state that is
true from submission to the finally block, and gate Stop on that.

playback-status.tsx (menu bar) loaded its state via Promise.all without
a .catch(). A single transient LocalStorage / preferences rejection
left state=undefined and isLoading=true until the next refresh tick,
which would just throw again. Coerce to state=null on rejection so the
menu bar falls back to the idle UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: clear loading state in provider-setup-form on LocalStorage failure

Greptile flagged that the form's load() effect ran setIsLoading(false)
unconditionally after Promise.all, so a transient LocalStorage rejection
would leave isLoading true forever. Wrap the resolve+set in try/finally
so isLoading is cleared on either success or rejection.

Greptile also (again) suggested renaming "Speed up Reading" to
"Speed Up Reading". That suggestion is wrong: Raycast's own `ray lint`
rule uses AP-style title case which keeps short words (<4 letters)
lowercase; running lint with "Speed Up Reading" produces an error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: reset currentPid and pid file when PCM playback errors

Greptile noted that the PCM path's afplay process had asymmetric handlers:
the close handler resets currentPid and calls removePidFileIfMatch, but
the error handler did neither. After an afplay error, the PID file
remained stale and currentPid still held the dead pid until the next
stopPlayback / cleanup. In that window, a Stop Reading from another
command would find the dead pid via ps, fail the afplay-comm check,
silently delete the PID file, and report "Nothing was playing" — even
though playback just errored a moment earlier.

Mirror the close-handler cleanup in the error handler so the dead
process always releases its PID record on either exit path. The
non-PCM path already does this; only the PCM error handler was missing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: capitalize "API" as an acronym in user-facing action titles

Greptile noted that read-with-voice.tsx had two action titles reading
"Open Api Key Preferences" while provider-setup-form.tsx already used
the correctly-cased "Open API Key Preferences" (with an
@raycast/prefer-title-case eslint-disable comment, since the Raycast
title-case rule otherwise rewrites "API" to "Api").

Apply the same eslint-disable + "API" pattern to all four remaining
occurrences in read-with-voice.tsx (2) and select-voice.tsx (2).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: refresh voice list when model is changed in the setup form

Greptile flagged that the model Form.Dropdown was uncontrolled
(defaultValue only) while the voice list filtered by settings.model from
React state. settings.model only updates after handleSubmit saves, so
changing the model in the dropdown left the voice list filtered by the
previously-saved model. A user switching mimo-v2.5-tts to mimo-v2-tts
would still see v2.5-only voices and could pick an incompatible pair.

Add a selectedModel state, wire it to the dropdown's onChange, seed it
from the loaded settings, and use it in the voice-list filter and
voicesForModel useMemo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: narrow MimoAudioFormat to "wav" — the only format we emit

Greptile noted that MimoAudioFormat was typed "wav" | "pcm16" while
DEFAULT_AUDIO_FORMAT is hard-coded "wav" and nothing in this extension
ever sets pcm16 at runtime. The PCM streaming methods on AudioPlayer
are dormant scaffolding inherited from AI Voice Studio (which uses
pcm16 for the Qwen-TTS realtime path) and are not called from any code
path here.

Narrow the type to "wav" so the contract is honest; left a code comment
pointing at the inheritance so future maintainers know the dormant
infrastructure is intentional rather than oversight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update MiMo English voice defaults

* fix: title-case speed command

* fix: dedupe default voice option

* refactor(api): extract functions for TTS option building

- Introduce `assembleTTSOptions` to consolidate option construction
- Remove redundant option building code in `mimo-tts.ts`
- Refactor `clone-voice.tsx` to use `useSynthesisForm` hook
- Improve readability by modularizing core emotion tags
- Update dependencies and configuration settings

* Update CHANGELOG.md and optimise images

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Semantic Craft <14216877+semantic-craft@users.noreply.github.com>
Co-authored-by: Dhruv Suthar <git@dhrv.pw>
Co-authored-by: raycastbot <bot@raycast.com>
raycastbot added a commit that referenced this pull request Jun 23, 2026
* Update scheduler extension

- Switch scheduler config to ESM and use createdAt for misses
- build: bump npm dependencies
- Update CODEOWNERs (b4acf91)
- Add the-matrix extension (#28886)
- Update CODEOWNERs (5c15f45)
- feat: consolidate osint-toolkit into osint-web-check (#27640)
- Update ente-auth extension (#28930)
- Update CODEOWNERs (a2ebd3e)
- Add cortisol-meter extension (#28351)
- Vietnamese Calendar: 1.3.6 (#28924)
- [Tempo] Enable to set the estimate remaining duration on worklogs (#28928)
- Update CODEOWNERs (dff73f7)
- Add sanity-icons extension (#28259)
- Update CODEOWNERs (9f1f104)
- Add JSON to GCF Converter extension (#28877)
- Warp: Scope Open Directory search to configurable root folders (#28860)
- Orion: fix Search Tabs showing no open tabs (#28911)
- [Visual Studio Code] Revert: Open Windows projects through editor URLs (#28913)
- Update CODEOWNERs (585bd9b)
- Add read-my-screen extension (#27208)
- fix(spotify-player): fix stale seek position in menu bar skip/back actions (#28882)
- Update CODEOWNERs (8d430b4)
- [Color Picker] Fix oversized and clipped Color Wheel preview (#28888)
- fix(todoist): guard against empty sync response arrays (#28881)
- Update tasklink extension (#28898)
- fix(grafana): use encodeURIComponent for Explore link panes parameter (#28883)
- Update raycast-mimo-tts extension (#28894)
- World Cup: limit menu bar dropdown to a day window around today (#28895)
- [iTerm] Fix profile parsing for plists with Infinity floats (#28865)
- fix(nextcloud): use correct URL format for opening files (#28869)
- Update CODEOWNERs (a740106)
- Add raycast-mimo-tts extension (#28369)
- Update CODEOWNERs (9f11843)
- Add kobbe extension (#27829)
- fix(windsurf): support Devin app name after rename (#28868)
- Update CODEOWNERs (86c17ea)
- Add macos-appearance-changer extension (#26310)
- Update CODEOWNERs (2581155)
- Update todoist extension (#28690)
- Add Jellypod to MCP registry (#28853)
- Update gitea extension (#28786)
- Update CODEOWNERs (6408e76)
- Add saasflow extension (#27867)
- Update CODEOWNERs (5e9d319)
- Update ultrahuman-insights extension (#28854)
- Update CODEOWNERs (02fc338)
- feat(ibm-bob): fork cursor-recent-projects extension for IBM Bob (#28494)
- Update android extension (#28867)
- Update CODEOWNERs (d6ded90)
- Update Try extension (#28872)
- Update CODEOWNERs (9020c9d)
- Add move-cursor-next-display extension (#27984)
- Update CODEOWNERs (7def584)
- Add dida365(ticktick for China) extension (#28276)
- Update CODEOWNERs (ea6b73f)
- Update opencode-sessions extension (#28800)
- Update CODEOWNERs (1c52058)
- Add Ultrahuman Insights extension (#27907)
- toggl-track: Add sum of duration of the running entry\'s project to menu bar (#28843)
- Update Vim Leader Key (#28842)
- Update translate extension (#28831)
- Update qbittorrent (#28844)
- Update linear extension (#28677)
- Update world-cup extension (#28829)
- Update CODEOWNERs (3efd692)
- Add asafamos-accessibility-scanner extension (#28600)
- Update CODEOWNERs (e993d92)
- feat(devin): add support for Devin Desktop editor (#28719)
- [Toggl Track] Add Quickstart New Timer command (#28757)
- Update CODEOWNERs (03453d9)
- Fuzzy File Search: add -d/-f directives for directory and file search (#28794)
- Add Slack thread reader tool (#28816)
- [Visual Studio Code] Open Windows projects through editor URLs (#28072)
- Update CODEOWNERs (c7845a5)
- Update empty-screenshots extension (#27064)
- Update advanced-replace extension (#28815)
- Update CODEOWNERs (3ca64cf)
- World Cup: add menu bar and live score commands (#28810)
- Update CODEOWNERs (750458b)
- Add stefan.imbesi to package.json contributors (#28819)
- Update CODEOWNERs (bce9019)
- Add txtodo extension (#28335)
- Update CODEOWNERs (c3b4130)
- Add mach-triage extension (#28324)
- Update slurm extension (#28803)
- Update CODEOWNERs (431ab51)
- Update wordreference extension (#28694)
- Add Olostep entry to built-in registries (#28667)
- Update Quarantine Manager: multi-target selection with one admin prompt (#28806)
- Update skills extension (#28795)
- Update CODEOWNERs (e81a076)
- fix(iterm): Load profiles when entire prefs plist cannot convert as JSON (#28723)
- Fix discogs extension data display issues (#28760)
- [GitLab] Reduce MR list detail memory usage (#28767)
- Update CODEOWNERs (4289a97)
- [Crypto Price] Add multi-source failover (fixes broken CryptoCompare default) (#28796)
- [Apple Reminders] Tighten optional reminder tool fields (#28772)
- Add OptionsAhoy to MCP Registry (#28744)
- Update CODEOWNERs (f4923fc)
- Update opencode-sessions extension (#28338)
- Update CODEOWNERs (f92001b)
- Update spotify-player extension (#28282)
- Update CODEOWNERs (40d0480)
- Update raycast-store-updates extension (#28774)
- [Agent Usage] Respect CLAUDE_CONFIG_DIR for credentials (#28785)
- Update raycast-ollama extension (#28791)
- Remo: note editing, AI Extension, and performance (#28787)
- Update CODEOWNERs (4608149)
- Cursor: Add Show Active Workspaces command (#26260)
- chore: update scheme to support for raycast beta (#28576)
- Add "Open File URL from Clipboard" command to figma-files extension (#28709)
- ado-search: customisable work item state order (#28784)
- Update CODEOWNERs (fe041b6)
- Update leitnerbox extension (#28646)
- style: run prettier (#28783)
- Update CODEOWNERs (a1768ed)
- Add Commit Streak extension (#26537)
- [Music] Fix album search by artist (#28781)
- [HTTP Status Codes] Fix section label overflow (#28779)
- ado-search: add Windows support (#28782)
- Update CODEOWNERs (dd741ba)
- Add India Toolkit - GST Calculator, IFSC Lookup, Pincode Lookup (#28291)
- Update anytype extension (#28762)
- Update CODEOWNERs (ebd0f10)
- [Monocle] Add commands for app v3.5.1 (#28215)
- Update crypto-price extension (#28592)
- [1Password] Reduce memory usage for large item lists (#28055)
- [amphetamine] Forget "Until Time" dates (#28734)
- Update nixpkgs-search extension (#28773)
- [Apple Mail] Escape compose AppleScript strings (#28776)
- Update lotus-mtg-companion extension (#28404)
- Update CODEOWNERs (f27053d)
- Trello: open boards/cards in desktop app on Windows + add Default Open Target preference (#28392)
- Update CODEOWNERs (8a0c111)
- Update microsoft-teams extension (#28388)
- Improve Kalshi market discovery and detail views (#28687)
- Fix Windows Terminal SSH profile launch (#28193)
- Update quick-git extension (#28770)
- Update list-by-fullforms extension (#28755)
- [Copy Notion Markdown Link] Fix URL validation for notion.com domain (#28741)
- [Slack] Fix Set Status deep link erroring on raw emoji (#28728)
- Update CODEOWNERs (de55001)
- Add raycast-anime extension (#28281)
- Update word4you extension (#28722)
- Update CODEOWNERs (0fe7238)
- Add raycall extension (#28280)
- Update CODEOWNERs (9b3476d)
- Add list-by-fullforms extension (#28267)
- fix(todoist): omit empty paid task fields (#27991)
- Update CODEOWNERs (1880cc4)
- Add sleevy extension (#28262)
- Add configurable search engine for Dia (#28176)
- Update CODEOWNERs (5410ca5)
- Add is-it-alive extension (#28256)
- Update CODEOWNERs (af51692)
- Add slurm extension (#28235)
- Update CODEOWNERs (a829a55)
- Update microsoft-office extension (#28575)
- Update CODEOWNERs (e784fd3)
- Add figa extension (#28228)
- Update Agent Ecosystem Map branding (#28704)
- Update lockdock extension (#28701)
- Update CODEOWNERs (5844f39)
- Update fingertip extension (#28707)
- myip: remove unused ip dependency (clears CVE-2024-29415) (#28705)
- Update CODEOWNERs (b17804f)
- Add Simple Draw extension (#27905)
- Add OS dropdown to issue template and platform label support (#28136)
- Update CODEOWNERs (928ed51)
- Add rut-generator extension (#28211)
- Update CODEOWNERs (3364b7a)
- Update wordreference extension (#28633)
- Update Sublime extension to use new v3 endpoints (#28383)
- Update whmcs-client-search extension (#28686)
- Update stock-tracker extension (#28658)
- Update CODEOWNERs (bb29163)
- Add Cobalt Finance extension (#28151)
- Fix UniRate API key signup link (#28663)
- Update CODEOWNERs (81746b1)
- Add TaskTick extension (#27758)
- Update CODEOWNERs (6d37893)
- [Apple Mail] Manually set type of mailbox (#28254)
- Update Quarantine Manager: single command with bulk select (#28685)
- Update CODEOWNERs (66872ff)
- Add shopify-shop extension (#23803)
- fix(linear): move Set Priority shortcut off the Copy Issue ID slot (#28553)
- Update CODEOWNERs (e4b5cc5)
- Add kofa extension (#28207)
- Update CODEOWNERs (5ac4dd0)
- [Messages] Add Pagination, Fix Email Contacts, and Async Issues (#28174)
- Update 42-api extension (#28557)
- Update CODEOWNERs (dffff42)
- Update winget extension (#28191)
- Update CODEOWNERs (fa42227)
- Add tabbit extension (#28178)
- Update CODEOWNERs (6fdfd58)
- Add cloudflare-images extension (#27859)
- [ccusage] Fix usage-limits rate-limit freeze (#28672)
- Update CODEOWNERs (ae4c57d)
- Geforce NOW launcher (#28098)
- Update CODEOWNERs (b7305b5)
- Add greptile extension (#28650)
- Update dev-servers extension (#28673)
- Update no-more-caffeine(Fix blank caffeine amount on initial open) (#28671)
- [Slack] Add deep link arguments to Set Status (#28669)
- Update CODEOWNERs (8cdca41)
- Update linear extension: Add label count preference value (#28623)
- Update CODEOWNERs (8b77f1a)
- Add blackr extension (#27716)
- Update WindowSizer extension (#28652)
- Update CODEOWNERs (808fa2b)
- Add betterstack-utils extension (#27987)
- Update CODEOWNERs (69964cd)
- Add spokenly extension (#28036)
- Fix metadata image validation for Raycast v2 screenshots (#28651)
- Update CODEOWNERs (655dfef)
- Add quick airdrop extension (#28629)
- [Skills] Resolve skill contents for skills in subdirectories (#28648)
- Update CODEOWNERs (99c0c30)
- feat(large-type): Add Show Selected Text command (#28627)
- fix(superwhisper): apply recordingDir preference to copy/paste commands (#28635)
- fix(superwhisper): paginate history loading to prevent memory crash (#28634)
- feat: update e18e replacement data (#28589)
- Update universal-inbox extension (#28621)
- Rename `Brand.dev` extension to `Context.dev` (#28644)
- Update quarantine-manager extension (#28620)
- Update `MXroute` extension - add Action to remove domain (#28625)
- Update CODEOWNERs (48a5db0)
- Add subscription-manager extension (#28138)
- Update vocabuilder extension (#28569)
- Update CODEOWNERs (9a96442)
- Add daytona extension (#27900)
- Update CODEOWNERs (743367d)
- Add bookface extension (#28614)
- Update CODEOWNERs (e51f39d)
- [Apple Notes] Fix Rendering, Async, and Keyboard Shortcut Issues (#28143)
- Update CODEOWNERs (f41092f)
- Update zed-recent-projects extension (#28562)
- Update tokentrack extension (#28596)
- feat(heyclaude): add discovery commands (#28605)
- [QR Code Generator] Fix "[object Object]" error and add color, icons, link shortening & UTM  (#28599)
- Update CODEOWNERs (b4898b4)
- [Jellyfin] Add windows support (#28595)
- Update raycast-zoxide extension (#28603)
- Update tokentrack extension (#28579)
- [Skills] Add copy skill contents action (#28584)
- Update CODEOWNERs (c371d5c)
- [Coffee] Fix typo in Caffeinate While command description (#28585)
- [Skills] Add icons to skill confirmation dialogs (#28581)
- Update CODEOWNERs (8281529)
- Add yandex-telemost extension (#27899)
- Update CODEOWNERs (49dc7f7)
- Update mail extension (#28566)
- Update CODEOWNERs (e054e70)
- Add wipet extension (#28058)
- Update CODEOWNERs (15db1d6)
- (zen) 🐛 migrate workspace storage from SQLite to zen-sessions.jsonlz4 (#28047)
- Update CODEOWNERs (3783224)
- Add tokentrack extension (#27871)
- Update CODEOWNERs (6f7ff80)
- Add imgbed-uploader extension (#28042)
- Misc: Update some dependencies (#28573)
- GIF Search: add direct Browse Favorite GIFs and Browse Recent GIFs commands (#28564)
- Update CODEOWNERs (c0c2cd6)
- [Karakeep] Fix bookmark preview image rendering (#28543)
- [Visual Studio Code] Resolve Code installs in user Applications (#28003)
- [Tempo] Add autoFocus on time spent field (#28570)
- Update gram extension (#28563)
- Update CODEOWNERs (c120188)
- Add temporal extension (#27980)
- Update CODEOWNERs (95a2ab8)
- Update video-downloader extension (#28534)
- Update gram extension (#28527)
- Update `Porkbun` extension - new command to retrieve account balance (#28551)
- Update CODEOWNERs (6c98335)
- ado-search: add My Work Items command (#28544)
- [Word Search] Respect Use Selection preference (#28011)
- Update CODEOWNERs (c0c656a)
- [blip-raycast] Add Windows cross-platform support (#28540)
- Fix Skills update actions for global installs (#28542)
- Update CODEOWNERs (51e9892)
- Add gitea extension (#27930)
- Update CODEOWNERs (af5b11b)
- Add busycal extension (#26520)
- Improve GIF conversion in yafw (fix palette, add quality/fps/speed/loop) (#28532)
- Update CODEOWNERs (9aadb73)
- Allow Metube on Raycast for Windows (#28531)
- things: restore Cmd-Return to Mark as Completed on list rows (#28533)
- Update moneytree extension (#28526)
- Chore(deps): bump openssl in /extensions/lunaris/rust (#28525)
- Update moneytree extension (#28516)
- Memo: Fix axios vulnerability (#28522)
- Update CODEOWNERs (410c3ac)
- Update betterdisplay extension (#28421)
- Update habitica-todos extension (#28045)
- Update CODEOWNERs (07c5527)
- [Display Placer] Fix auto-close after preset loading (#28415)
- Update CODEOWNERs (ca7725d)
- Add Soaring Symbols extensions (#27890)
- Update moneytree extension (#28513)
- Update CODEOWNERs (cb5b870)
- Add EPUB download actions to Anna\'s Archive (#28374)
- Update CODEOWNERs (f9f335c)
- Slack: Update message history to fallback to attachment text (#28509)
- Add VC Deal Flow Signal MCP server to model-context-protocol-registry (#28376)
- Update CODEOWNERs (54c0a6f)
- Update another-boring-piece extension (#28091)
- Update CODEOWNERs (1487e76)
- [Search Router] Make query argument optional to support fallback search (#28474)
- Update CODEOWNERs (85ae365)
- Add wojak-picker extension (#27015)
- [Tempo] Allow setting start and end time of worklogs (#28500)
- Update CODEOWNERs (6174922)
- Add arcane-wallpaper extension (#28451)
- [ccusage] Tolerate sessions with no activity date (#28502)
- [WordReference Dictionary Translation] Handle WordReference HTTP errors (#28418)
- Fix Pivot preset editor heap spike (#28495)
- Fix shell quoting issues in GitHub Actions workflows
- Fix issue-bot workflow condition expression
- Update CODEOWNERs (f0a7688)
- Add Nibit extension (#27805)
- Update CODEOWNERs (ea516e2)
- Add lockdock extension (#27768)
- Handle Forked Extensions git index locks (#28187)
- [ccusage] Add monochrome menu bar icon option (#27996)
- chore: update stale duration (#28491)
- Add GitHub Actions workflow for metadata image validation (#27714)
- Update CODEOWNERs (998911f)
- Update gif-search extension (#28251)
- feat(ibm-bob): add support for IBM Bob editor (#28488)
- Update CODEOWNERs (8c4e881)
- [Coffee] Fix menu bar icon refresh after caffeination changes (#28469)
- Update visual-studio-code extension (#28477)
- Update producthunt extension (#28476)
- Update CODEOWNERs (8e5e124)
- feat(skills): add Default Agents preference (#28378)
- Update whois extension (#28475)
- klack: polish stats header and tighten changelog (#28472)
- Update CODEOWNERs (675c6e6)
- Add gist-rocket extension (#28188)
- Ext/game scout (#28439)
- Update leetcode extension (#28432)
- Update CODEOWNERs (1084892)
- [Obsidian Tasks] Add Quick Add Task command (#27785)
- Update joey-vocab extension (#28465)
- Update vocabuilder extension (#28283)
- Update Plexus: Windows + WSL support, detect all localhost web servers (#28459)
- Update producthunt extension (#28445)
- Update dev-servers extension (#28419)
- [Hue] Bug fixes and improvements (#28412)
- Update CODEOWNERs (0de1764)
- Update my-ip extension (#27283)
- Update CODEOWNERs (6e640eb)
- Add Harness Control Plane extension (#27231)
- Update CODEOWNERs (a1c8fc5)
- Add Pivot extension (#27753)
- fix(clip): handle history errors gracefully in URL shortener (#28458)
- Update phare.io logo (#28453)
- [Team Time] Use Hong Kong and Macau ISO codes for their own flags (#28425)
- Update CODEOWNERs (2b56dcb)
- Add chinese-converter extension (#27610)
- Update CODEOWNERs (7b42404)
- [Tiktoken] Add o200k_base tokenizer support (#28402)
- Update CODEOWNERs (829677d)
- Add Mouse Jiggle extension (#27745)
- [Port Manager] Fix lsof process leaks (#28222)
- feat(granola): prefix exports with sortable date (#28394)
- Keep Bitwarden session active after sync failures (#28150)
- Fix 2FA link URL validation (#28158)
- Update GitHub extension Raycast SDK (#28185)
- Docs: update for the new API release
- [Quit Applications] Handle app discovery timeouts (#28012)
- [Google Chrome] Reset stale profile selection (#28015)
- Fix Copy Path for VS Code active files (#28145)
- Update unsplash extension (#28379)
- Fix JWT Decoder React peer versions (#28022)
- [Todoist] Reduce Menu Bar Tasks sync size (#28005)
- [Toggle Desktop Visibility] Fix Tahoe icon toggling (#28009)
- [Spotify Player] Guard podcast episode navigation (#28063)
- [Jira Search] Surface issue search auth errors (#28053)
- Support Antigravity IDE 2.0 paths (#28152)
- Fix Messages chat list memory usage (#28156)
- [Warp] Add Tab Config support (#28165)
- [Finder File Actions] Add custom names for pinned folders (#28164)
- Update prompt stash extension (#28382)
- [DevUtils] Handle missing app installs (#28170)
- [Sentry] Guard issue details without stack frames (#28056)
- [Espanso] Reduce Search Matches memory usage (#28004)
- [Kill Process] Prevent background refresh timeout errors (#28010)
- [Hide Files] Fix path handling for visibility toggles (#28008)
- Add Edit in iTerm open behavior (#28161)
- [cmux] Improve workspace search metadata (#28163)
- [Terminal Finder] Improve cmux socket error (#28013)
- Add task snooze actions to Reclaim (#28173)
- Add Helium support to Browser History (#28180)
- Fix iMessage Time Sensitive code detection (#28183)
- Update apfel extension (#28375)
- Update vercast extension (#28370)
- Update GetNote Extention (#28361)
- Update CODEOWNERs (6c5db01)
- [Slack] Fix slack:// deep links on Windows (#28367)
- Update CODEOWNERs (230c5e5)
- Add notaday extension (#27625)
- Update CODEOWNERs (f4392b7)
- Add discussite extension (#27486)
- [Audio Device] Restore enforce command notifications (#28017)
- chore: add readme (#28364)
- Update awork extension (#28337)
- Update lastfm extension (#28350)
- Update CODEOWNERs (5e7e76e)
- Add vn-textify extension (#27524)
- Update CODEOWNERs (be6be9b)
- Add minimax-tts extension (#27316)
- Update CODEOWNERs (3a9bc77)
- Add gemini-tts extension (#27612)
- Update CODEOWNERs (aba109c)
- Add terminal-image-paste extension (#27678)
- [Brand Icons] Add support for Raycast beta versions (#28355)
- [Bitwarden] Update CLI version to 2026.4.2 (#28358)
- Update raycast-ollama extension (#28320)
- Update CODEOWNERs (d1f86f0)
- Add utc-workbench extension (#27152)
- Update CODEOWNERs (5c36813)
- Add pinwork extension (#27684)
- Fix useState crash in Withings Sync (sync-to-garmin command) (#28344)
- Update CODEOWNERs (89a6e9e)
- Update dev-servers extension (#28348)
- Granola: Auto-refresh expired tokens and improve error logging (v2.1.4) (#28345)
- Update installed-extensions extension (#28336)
- feat(croc-transfer): add Croc Transfer extension (#27692)
- Update CODEOWNERs (06e4f52)
- Add Bilibili Search extension (#28239)
- Update aws extension (#28252)
- Update dev-servers extension (#28339)
- test (#28334)
- revert test (#28333)
- Update CODEOWNERs (1bff991)
- Update font converter extension (#28305)
- google-chrome-profiles: fix silent failure via detached osascript spawn, fix bookmark crash (#27615)
- test (#28331)
- [Figma] Updated linter (#28329)
- Update CODEOWNERs (f9befa6)
- Zipic: rename, AI Extension, and unified presets (#27650)
- Update CODEOWNERs (64365c1)
- feat: add extension e18e Module Replacements (#27636)
- Update wp-bones extension (#28316)
- Update world-cup extension (#28323)
- Update CODEOWNERs (3f50c6f)
- Add mail-finder extension (#27101)
- Update CODEOWNERs (6337166)
- [Cloudflare] - Improve View Workers command (#28313)
- Update CODEOWNERs (191a3e1)
- Update hakuna extension (#27790)
- Update CODEOWNERs (425388d)
- Apple Developer Docs: filter search history by current query (#28302)
- Update CODEOWNERs (77c3c71)
- Add heyclaude extension (#27505)
- Update git extension (#28205)
- Update dev-servers extension (#28304)
- Update CODEOWNERs (a98c877)
- Fix VSCode Windows recent projects & CLI, WSL, Icon, Shortcut (#27634)
- [GitLab] Add option to hide archived projects in menu bar (#27970)
- Claude/fix figma search extension vi2 cu (#27976)
- [FileZilla] Add support for FileZilla Pro (Mac App Store) (#28268)
- Update CODEOWNERs (26e2007)
- [JetBrains Toolbox Recent Projects] Show current git branch next to projects (#27961)
- Update CODEOWNERs (3193c67)
- Update amphetamine extension (#27701)
- gather: support Gather V2 alongside V1 (#27724)
- Fix VS Code shared storage lookup (#28025)
- Update CODEOWNERs (0d56f75)
- [ccusage] Adopt v20: schema fix and new features (#28299)
- [Open With App] Fix default selection on Raycast 2 (#28295)
- Update list-keyboard-maestro-macros extension (#27893)
- [Things] Add detail view for to-dos (#28298)
- [Git Repos] Reduce scan memory usage (#28054)
- Update another-boring-piece extension (#28208)
- Update CODEOWNERs (f760ec5)
- Update readwise-reader extension (#28264)
- Update CODEOWNERs (c7315aa)
- Add linkace-search extension (#28245)
- Update leafcast extension (#28261)
- Update roblox extension (#28257)
- Buildkite: Build graph view and unblock steps (#28051)
- Update CODEOWNERs (0678565)
- [Windows Terminal] Add Quake Window preference & Fix Administrator issues (#28197)
- [Google Workspace] Guard Drive file list responses (#28061)
- Update CODEOWNERs (2c0fb24)
- Add tablepro extension (#27587)
- Update scheduler extension (#28241)
- Update CODEOWNERs (03dba5d)
- Add copy flight number action (#28249)
- Update CODEOWNERs (d6f0216)
- Add history to word-search (#27575)
- Add Node types and refresh scheduler lockfile
- [Safari] Clarify history permission errors (#28018)
- Update calibre-library extension (#28074)
- set RefreshStatus on all command calls
- fix(scheduler): add missing code changes
- fix: add missing BACKGROUND_REFRESH_STATUS to STORAGE_KEYS
- Pull contributions
- feat: add background refresh status alert to scheduled command form
- Document Raycast 2.0 draft fix
- Fix Raycast drafts for scheduled command creation
- Refresh scheduler lockfile for updated lint stack
- Refactor scheduler configuration UI

* chore(deps): update dependencies in scheduler package
- Downgrade @raycast/api to ^1.104.9 for compatibility issues
- Update cronstrue to ^3.21.0 for new features

* style(scheduler): remove trailing newline in eslint.config.js
- Trim unnecessary whitespace to conform to style guidelines
- Ensure consistent file formatting across the project

* chore(scheduler): update @raycast/api dependency
- Bump version to ^1.104.18 for improved API stability

* Update CHANGELOG.md

---------

Co-authored-by: Charles Symons <dev@realitymanagement.com>
Co-authored-by: Dhruv Suthar <git@dhrv.pw>
Co-authored-by: raycastbot <bot@raycast.com>
almatkai pushed a commit to almatkai/raymes-extensions that referenced this pull request Jul 13, 2026
* Add raycast-mimo-tts extension

- docs: add Raycast Store screenshots
- feat: initial release of MiMo TTS Raycast extension

* docs: rewrite README with global-developer hero, V2.5 pricing news, capability claims

* fix: address Greptile review P2s

* fix: cleanup the live AudioPlayer at unmount, not the captured one

* fix: remove dead getActiveModel sync helper and fix stale chunk-engine comment

Greptile flagged two non-blocking nits:
- getActiveModel() always returned DEFAULT_MODEL regardless of user settings
  and had no callers; getActiveModelAsync() is the correct API.
- chunk-playback-engine.ts header still referenced Qwen-TTS and OpenAI from
  the AI Voice Studio extension this code was ported from.

Note: Greptile also suggested "Speed up Reading" → "Speed Up Reading", but
Raycast's own title-case linter expects "up" lowercase (AP-style: <4 letter
words stay lowercase), so that one is intentionally not changed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: ensure setIsLoading(false) runs on any setup failure

Greptile flagged that read-with-voice.tsx sets isLoading=true and the
playing-voice indicator BEFORE the try block, while only the try's finally
unsets them. If buildOptionsAsync (throws TTSApiError for unknown voices)
or setNowPlaying (can fail on LocalStorage error) throws, the command is
permanently stuck in the loading/playing-indicator state.

Move every step from showToast/setNowPlaying through playChunksWithLookahead
into the existing try/catch/finally so the finally always runs.

The same pattern existed in clone-voice.tsx and design-voice.tsx — showToast
ran before the try block, so a Toast failure would leave isLoading stuck.
Fixed both for consistency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: early-reject oversized clone samples before reading into memory

Greptile noted that toClonePayload reads the entire file into memory and
then runs the base64 size check. statSync already returns the raw byte
size; gate on that first (raw bytes <= MAX_SAMPLE_BYTES is a safe over-
estimate, since base64 inflates ~33 %), so accidentally picking a 50 MB
video doesn't pay the readFileSync allocation before being rejected. The
precise post-encode check below remains the authoritative gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: avoid clobbering a concurrent Quick Read's pid file on stop

Same race condition addressed in the AI Voice Studio extension. After
killing the recorded pid, unconditional removePidFile() can delete a
PID file written by a concurrent new Quick Read that started in the
brief window between the SIGTERM and the removal, leaving that new
session unstoppable through Stop Reading.

removePidFileIfMatch(pid) was added exactly for this race; switch the
post-kill cleanup to use it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: keep Stop available after first chunk, recover menu bar on load error

TTS Studio used isLoading both for the spinner and to gate the Stop
Playback action. onFirstAudioReady sets isLoading=false once the first
chunk starts playing, which removed Stop from the panel for the rest of
a multi-chunk reading. Introduce an independent isPlaying state that is
true from submission to the finally block, and gate Stop on that.

playback-status.tsx (menu bar) loaded its state via Promise.all without
a .catch(). A single transient LocalStorage / preferences rejection
left state=undefined and isLoading=true until the next refresh tick,
which would just throw again. Coerce to state=null on rejection so the
menu bar falls back to the idle UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: clear loading state in provider-setup-form on LocalStorage failure

Greptile flagged that the form's load() effect ran setIsLoading(false)
unconditionally after Promise.all, so a transient LocalStorage rejection
would leave isLoading true forever. Wrap the resolve+set in try/finally
so isLoading is cleared on either success or rejection.

Greptile also (again) suggested renaming "Speed up Reading" to
"Speed Up Reading". That suggestion is wrong: Raycast's own `ray lint`
rule uses AP-style title case which keeps short words (<4 letters)
lowercase; running lint with "Speed Up Reading" produces an error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: reset currentPid and pid file when PCM playback errors

Greptile noted that the PCM path's afplay process had asymmetric handlers:
the close handler resets currentPid and calls removePidFileIfMatch, but
the error handler did neither. After an afplay error, the PID file
remained stale and currentPid still held the dead pid until the next
stopPlayback / cleanup. In that window, a Stop Reading from another
command would find the dead pid via ps, fail the afplay-comm check,
silently delete the PID file, and report "Nothing was playing" — even
though playback just errored a moment earlier.

Mirror the close-handler cleanup in the error handler so the dead
process always releases its PID record on either exit path. The
non-PCM path already does this; only the PCM error handler was missing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: capitalize "API" as an acronym in user-facing action titles

Greptile noted that read-with-voice.tsx had two action titles reading
"Open Api Key Preferences" while provider-setup-form.tsx already used
the correctly-cased "Open API Key Preferences" (with an
@raycast/prefer-title-case eslint-disable comment, since the Raycast
title-case rule otherwise rewrites "API" to "Api").

Apply the same eslint-disable + "API" pattern to all four remaining
occurrences in read-with-voice.tsx (2) and select-voice.tsx (2).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: refresh voice list when model is changed in the setup form

Greptile flagged that the model Form.Dropdown was uncontrolled
(defaultValue only) while the voice list filtered by settings.model from
React state. settings.model only updates after handleSubmit saves, so
changing the model in the dropdown left the voice list filtered by the
previously-saved model. A user switching mimo-v2.5-tts to mimo-v2-tts
would still see v2.5-only voices and could pick an incompatible pair.

Add a selectedModel state, wire it to the dropdown's onChange, seed it
from the loaded settings, and use it in the voice-list filter and
voicesForModel useMemo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: narrow MimoAudioFormat to "wav" — the only format we emit

Greptile noted that MimoAudioFormat was typed "wav" | "pcm16" while
DEFAULT_AUDIO_FORMAT is hard-coded "wav" and nothing in this extension
ever sets pcm16 at runtime. The PCM streaming methods on AudioPlayer
are dormant scaffolding inherited from AI Voice Studio (which uses
pcm16 for the Qwen-TTS realtime path) and are not called from any code
path here.

Narrow the type to "wav" so the contract is honest; left a code comment
pointing at the inheritance so future maintainers know the dormant
infrastructure is intentional rather than oversight.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Update MiMo English voice defaults

* fix: title-case speed command

* fix: dedupe default voice option

* refactor(api): extract functions for TTS option building

- Introduce `assembleTTSOptions` to consolidate option construction
- Remove redundant option building code in `mimo-tts.ts`
- Refactor `clone-voice.tsx` to use `useSynthesisForm` hook
- Improve readability by modularizing core emotion tags
- Update dependencies and configuration settings

* Update CHANGELOG.md and optimise images

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Semantic Craft <14216877+semantic-craft@users.noreply.github.com>
Co-authored-by: Dhruv Suthar <git@dhrv.pw>
Co-authored-by: raycastbot <bot@raycast.com>
almatkai pushed a commit to almatkai/raymes-extensions that referenced this pull request Jul 13, 2026
* Update scheduler extension

- Switch scheduler config to ESM and use createdAt for misses
- build: bump npm dependencies
- Update CODEOWNERs (b4acf91)
- Add the-matrix extension (raycast#28886)
- Update CODEOWNERs (5c15f45)
- feat: consolidate osint-toolkit into osint-web-check (raycast#27640)
- Update ente-auth extension (raycast#28930)
- Update CODEOWNERs (a2ebd3e)
- Add cortisol-meter extension (raycast#28351)
- Vietnamese Calendar: 1.3.6 (raycast#28924)
- [Tempo] Enable to set the estimate remaining duration on worklogs (raycast#28928)
- Update CODEOWNERs (dff73f7)
- Add sanity-icons extension (raycast#28259)
- Update CODEOWNERs (9f1f104)
- Add JSON to GCF Converter extension (raycast#28877)
- Warp: Scope Open Directory search to configurable root folders (raycast#28860)
- Orion: fix Search Tabs showing no open tabs (raycast#28911)
- [Visual Studio Code] Revert: Open Windows projects through editor URLs (raycast#28913)
- Update CODEOWNERs (585bd9b)
- Add read-my-screen extension (raycast#27208)
- fix(spotify-player): fix stale seek position in menu bar skip/back actions (raycast#28882)
- Update CODEOWNERs (8d430b4)
- [Color Picker] Fix oversized and clipped Color Wheel preview (raycast#28888)
- fix(todoist): guard against empty sync response arrays (raycast#28881)
- Update tasklink extension (raycast#28898)
- fix(grafana): use encodeURIComponent for Explore link panes parameter (raycast#28883)
- Update raycast-mimo-tts extension (raycast#28894)
- World Cup: limit menu bar dropdown to a day window around today (raycast#28895)
- [iTerm] Fix profile parsing for plists with Infinity floats (raycast#28865)
- fix(nextcloud): use correct URL format for opening files (raycast#28869)
- Update CODEOWNERs (a740106)
- Add raycast-mimo-tts extension (raycast#28369)
- Update CODEOWNERs (9f11843)
- Add kobbe extension (raycast#27829)
- fix(windsurf): support Devin app name after rename (raycast#28868)
- Update CODEOWNERs (86c17ea)
- Add macos-appearance-changer extension (raycast#26310)
- Update CODEOWNERs (2581155)
- Update todoist extension (raycast#28690)
- Add Jellypod to MCP registry (raycast#28853)
- Update gitea extension (raycast#28786)
- Update CODEOWNERs (6408e76)
- Add saasflow extension (raycast#27867)
- Update CODEOWNERs (5e9d319)
- Update ultrahuman-insights extension (raycast#28854)
- Update CODEOWNERs (02fc338)
- feat(ibm-bob): fork cursor-recent-projects extension for IBM Bob (raycast#28494)
- Update android extension (raycast#28867)
- Update CODEOWNERs (d6ded90)
- Update Try extension (raycast#28872)
- Update CODEOWNERs (9020c9d)
- Add move-cursor-next-display extension (raycast#27984)
- Update CODEOWNERs (7def584)
- Add dida365(ticktick for China) extension (raycast#28276)
- Update CODEOWNERs (ea6b73f)
- Update opencode-sessions extension (raycast#28800)
- Update CODEOWNERs (1c52058)
- Add Ultrahuman Insights extension (raycast#27907)
- toggl-track: Add sum of duration of the running entry\'s project to menu bar (raycast#28843)
- Update Vim Leader Key (raycast#28842)
- Update translate extension (raycast#28831)
- Update qbittorrent (raycast#28844)
- Update linear extension (raycast#28677)
- Update world-cup extension (raycast#28829)
- Update CODEOWNERs (3efd692)
- Add asafamos-accessibility-scanner extension (raycast#28600)
- Update CODEOWNERs (e993d92)
- feat(devin): add support for Devin Desktop editor (raycast#28719)
- [Toggl Track] Add Quickstart New Timer command (raycast#28757)
- Update CODEOWNERs (03453d9)
- Fuzzy File Search: add -d/-f directives for directory and file search (raycast#28794)
- Add Slack thread reader tool (raycast#28816)
- [Visual Studio Code] Open Windows projects through editor URLs (raycast#28072)
- Update CODEOWNERs (c7845a5)
- Update empty-screenshots extension (raycast#27064)
- Update advanced-replace extension (raycast#28815)
- Update CODEOWNERs (3ca64cf)
- World Cup: add menu bar and live score commands (raycast#28810)
- Update CODEOWNERs (750458b)
- Add stefan.imbesi to package.json contributors (raycast#28819)
- Update CODEOWNERs (bce9019)
- Add txtodo extension (raycast#28335)
- Update CODEOWNERs (c3b4130)
- Add mach-triage extension (raycast#28324)
- Update slurm extension (raycast#28803)
- Update CODEOWNERs (431ab51)
- Update wordreference extension (raycast#28694)
- Add Olostep entry to built-in registries (raycast#28667)
- Update Quarantine Manager: multi-target selection with one admin prompt (raycast#28806)
- Update skills extension (raycast#28795)
- Update CODEOWNERs (e81a076)
- fix(iterm): Load profiles when entire prefs plist cannot convert as JSON (raycast#28723)
- Fix discogs extension data display issues (raycast#28760)
- [GitLab] Reduce MR list detail memory usage (raycast#28767)
- Update CODEOWNERs (4289a97)
- [Crypto Price] Add multi-source failover (fixes broken CryptoCompare default) (raycast#28796)
- [Apple Reminders] Tighten optional reminder tool fields (raycast#28772)
- Add OptionsAhoy to MCP Registry (raycast#28744)
- Update CODEOWNERs (f4923fc)
- Update opencode-sessions extension (raycast#28338)
- Update CODEOWNERs (f92001b)
- Update spotify-player extension (raycast#28282)
- Update CODEOWNERs (40d0480)
- Update raycast-store-updates extension (raycast#28774)
- [Agent Usage] Respect CLAUDE_CONFIG_DIR for credentials (raycast#28785)
- Update raycast-ollama extension (raycast#28791)
- Remo: note editing, AI Extension, and performance (raycast#28787)
- Update CODEOWNERs (4608149)
- Cursor: Add Show Active Workspaces command (raycast#26260)
- chore: update scheme to support for raycast beta (raycast#28576)
- Add "Open File URL from Clipboard" command to figma-files extension (raycast#28709)
- ado-search: customisable work item state order (raycast#28784)
- Update CODEOWNERs (fe041b6)
- Update leitnerbox extension (raycast#28646)
- style: run prettier (raycast#28783)
- Update CODEOWNERs (a1768ed)
- Add Commit Streak extension (raycast#26537)
- [Music] Fix album search by artist (raycast#28781)
- [HTTP Status Codes] Fix section label overflow (raycast#28779)
- ado-search: add Windows support (raycast#28782)
- Update CODEOWNERs (dd741ba)
- Add India Toolkit - GST Calculator, IFSC Lookup, Pincode Lookup (raycast#28291)
- Update anytype extension (raycast#28762)
- Update CODEOWNERs (ebd0f10)
- [Monocle] Add commands for app v3.5.1 (raycast#28215)
- Update crypto-price extension (raycast#28592)
- [1Password] Reduce memory usage for large item lists (raycast#28055)
- [amphetamine] Forget "Until Time" dates (raycast#28734)
- Update nixpkgs-search extension (raycast#28773)
- [Apple Mail] Escape compose AppleScript strings (raycast#28776)
- Update lotus-mtg-companion extension (raycast#28404)
- Update CODEOWNERs (f27053d)
- Trello: open boards/cards in desktop app on Windows + add Default Open Target preference (raycast#28392)
- Update CODEOWNERs (8a0c111)
- Update microsoft-teams extension (raycast#28388)
- Improve Kalshi market discovery and detail views (raycast#28687)
- Fix Windows Terminal SSH profile launch (raycast#28193)
- Update quick-git extension (raycast#28770)
- Update list-by-fullforms extension (raycast#28755)
- [Copy Notion Markdown Link] Fix URL validation for notion.com domain (raycast#28741)
- [Slack] Fix Set Status deep link erroring on raw emoji (raycast#28728)
- Update CODEOWNERs (de55001)
- Add raycast-anime extension (raycast#28281)
- Update word4you extension (raycast#28722)
- Update CODEOWNERs (0fe7238)
- Add raycall extension (raycast#28280)
- Update CODEOWNERs (9b3476d)
- Add list-by-fullforms extension (raycast#28267)
- fix(todoist): omit empty paid task fields (raycast#27991)
- Update CODEOWNERs (1880cc4)
- Add sleevy extension (raycast#28262)
- Add configurable search engine for Dia (raycast#28176)
- Update CODEOWNERs (5410ca5)
- Add is-it-alive extension (raycast#28256)
- Update CODEOWNERs (af51692)
- Add slurm extension (raycast#28235)
- Update CODEOWNERs (a829a55)
- Update microsoft-office extension (raycast#28575)
- Update CODEOWNERs (e784fd3)
- Add figa extension (raycast#28228)
- Update Agent Ecosystem Map branding (raycast#28704)
- Update lockdock extension (raycast#28701)
- Update CODEOWNERs (5844f39)
- Update fingertip extension (raycast#28707)
- myip: remove unused ip dependency (clears CVE-2024-29415) (raycast#28705)
- Update CODEOWNERs (b17804f)
- Add Simple Draw extension (raycast#27905)
- Add OS dropdown to issue template and platform label support (raycast#28136)
- Update CODEOWNERs (928ed51)
- Add rut-generator extension (raycast#28211)
- Update CODEOWNERs (3364b7a)
- Update wordreference extension (raycast#28633)
- Update Sublime extension to use new v3 endpoints (raycast#28383)
- Update whmcs-client-search extension (raycast#28686)
- Update stock-tracker extension (raycast#28658)
- Update CODEOWNERs (bb29163)
- Add Cobalt Finance extension (raycast#28151)
- Fix UniRate API key signup link (raycast#28663)
- Update CODEOWNERs (81746b1)
- Add TaskTick extension (raycast#27758)
- Update CODEOWNERs (6d37893)
- [Apple Mail] Manually set type of mailbox (raycast#28254)
- Update Quarantine Manager: single command with bulk select (raycast#28685)
- Update CODEOWNERs (66872ff)
- Add shopify-shop extension (raycast#23803)
- fix(linear): move Set Priority shortcut off the Copy Issue ID slot (raycast#28553)
- Update CODEOWNERs (e4b5cc5)
- Add kofa extension (raycast#28207)
- Update CODEOWNERs (5ac4dd0)
- [Messages] Add Pagination, Fix Email Contacts, and Async Issues (raycast#28174)
- Update 42-api extension (raycast#28557)
- Update CODEOWNERs (dffff42)
- Update winget extension (raycast#28191)
- Update CODEOWNERs (fa42227)
- Add tabbit extension (raycast#28178)
- Update CODEOWNERs (6fdfd58)
- Add cloudflare-images extension (raycast#27859)
- [ccusage] Fix usage-limits rate-limit freeze (raycast#28672)
- Update CODEOWNERs (ae4c57d)
- Geforce NOW launcher (raycast#28098)
- Update CODEOWNERs (b7305b5)
- Add greptile extension (raycast#28650)
- Update dev-servers extension (raycast#28673)
- Update no-more-caffeine(Fix blank caffeine amount on initial open) (raycast#28671)
- [Slack] Add deep link arguments to Set Status (raycast#28669)
- Update CODEOWNERs (8cdca41)
- Update linear extension: Add label count preference value (raycast#28623)
- Update CODEOWNERs (8b77f1a)
- Add blackr extension (raycast#27716)
- Update WindowSizer extension (raycast#28652)
- Update CODEOWNERs (808fa2b)
- Add betterstack-utils extension (raycast#27987)
- Update CODEOWNERs (69964cd)
- Add spokenly extension (raycast#28036)
- Fix metadata image validation for Raycast v2 screenshots (raycast#28651)
- Update CODEOWNERs (655dfef)
- Add quick airdrop extension (raycast#28629)
- [Skills] Resolve skill contents for skills in subdirectories (raycast#28648)
- Update CODEOWNERs (99c0c30)
- feat(large-type): Add Show Selected Text command (raycast#28627)
- fix(superwhisper): apply recordingDir preference to copy/paste commands (raycast#28635)
- fix(superwhisper): paginate history loading to prevent memory crash (raycast#28634)
- feat: update e18e replacement data (raycast#28589)
- Update universal-inbox extension (raycast#28621)
- Rename `Brand.dev` extension to `Context.dev` (raycast#28644)
- Update quarantine-manager extension (raycast#28620)
- Update `MXroute` extension - add Action to remove domain (raycast#28625)
- Update CODEOWNERs (48a5db0)
- Add subscription-manager extension (raycast#28138)
- Update vocabuilder extension (raycast#28569)
- Update CODEOWNERs (9a96442)
- Add daytona extension (raycast#27900)
- Update CODEOWNERs (743367d)
- Add bookface extension (raycast#28614)
- Update CODEOWNERs (e51f39d)
- [Apple Notes] Fix Rendering, Async, and Keyboard Shortcut Issues (raycast#28143)
- Update CODEOWNERs (f41092f)
- Update zed-recent-projects extension (raycast#28562)
- Update tokentrack extension (raycast#28596)
- feat(heyclaude): add discovery commands (raycast#28605)
- [QR Code Generator] Fix "[object Object]" error and add color, icons, link shortening & UTM  (raycast#28599)
- Update CODEOWNERs (b4898b4)
- [Jellyfin] Add windows support (raycast#28595)
- Update raycast-zoxide extension (raycast#28603)
- Update tokentrack extension (raycast#28579)
- [Skills] Add copy skill contents action (raycast#28584)
- Update CODEOWNERs (c371d5c)
- [Coffee] Fix typo in Caffeinate While command description (raycast#28585)
- [Skills] Add icons to skill confirmation dialogs (raycast#28581)
- Update CODEOWNERs (8281529)
- Add yandex-telemost extension (raycast#27899)
- Update CODEOWNERs (49dc7f7)
- Update mail extension (raycast#28566)
- Update CODEOWNERs (e054e70)
- Add wipet extension (raycast#28058)
- Update CODEOWNERs (15db1d6)
- (zen) 🐛 migrate workspace storage from SQLite to zen-sessions.jsonlz4 (raycast#28047)
- Update CODEOWNERs (3783224)
- Add tokentrack extension (raycast#27871)
- Update CODEOWNERs (6f7ff80)
- Add imgbed-uploader extension (raycast#28042)
- Misc: Update some dependencies (raycast#28573)
- GIF Search: add direct Browse Favorite GIFs and Browse Recent GIFs commands (raycast#28564)
- Update CODEOWNERs (c0c2cd6)
- [Karakeep] Fix bookmark preview image rendering (raycast#28543)
- [Visual Studio Code] Resolve Code installs in user Applications (raycast#28003)
- [Tempo] Add autoFocus on time spent field (raycast#28570)
- Update gram extension (raycast#28563)
- Update CODEOWNERs (c120188)
- Add temporal extension (raycast#27980)
- Update CODEOWNERs (95a2ab8)
- Update video-downloader extension (raycast#28534)
- Update gram extension (raycast#28527)
- Update `Porkbun` extension - new command to retrieve account balance (raycast#28551)
- Update CODEOWNERs (6c98335)
- ado-search: add My Work Items command (raycast#28544)
- [Word Search] Respect Use Selection preference (raycast#28011)
- Update CODEOWNERs (c0c656a)
- [blip-raycast] Add Windows cross-platform support (raycast#28540)
- Fix Skills update actions for global installs (raycast#28542)
- Update CODEOWNERs (51e9892)
- Add gitea extension (raycast#27930)
- Update CODEOWNERs (af5b11b)
- Add busycal extension (raycast#26520)
- Improve GIF conversion in yafw (fix palette, add quality/fps/speed/loop) (raycast#28532)
- Update CODEOWNERs (9aadb73)
- Allow Metube on Raycast for Windows (raycast#28531)
- things: restore Cmd-Return to Mark as Completed on list rows (raycast#28533)
- Update moneytree extension (raycast#28526)
- Chore(deps): bump openssl in /extensions/lunaris/rust (raycast#28525)
- Update moneytree extension (raycast#28516)
- Memo: Fix axios vulnerability (raycast#28522)
- Update CODEOWNERs (410c3ac)
- Update betterdisplay extension (raycast#28421)
- Update habitica-todos extension (raycast#28045)
- Update CODEOWNERs (07c5527)
- [Display Placer] Fix auto-close after preset loading (raycast#28415)
- Update CODEOWNERs (ca7725d)
- Add Soaring Symbols extensions (raycast#27890)
- Update moneytree extension (raycast#28513)
- Update CODEOWNERs (cb5b870)
- Add EPUB download actions to Anna\'s Archive (raycast#28374)
- Update CODEOWNERs (f9f335c)
- Slack: Update message history to fallback to attachment text (raycast#28509)
- Add VC Deal Flow Signal MCP server to model-context-protocol-registry (raycast#28376)
- Update CODEOWNERs (54c0a6f)
- Update another-boring-piece extension (raycast#28091)
- Update CODEOWNERs (1487e76)
- [Search Router] Make query argument optional to support fallback search (raycast#28474)
- Update CODEOWNERs (85ae365)
- Add wojak-picker extension (raycast#27015)
- [Tempo] Allow setting start and end time of worklogs (raycast#28500)
- Update CODEOWNERs (6174922)
- Add arcane-wallpaper extension (raycast#28451)
- [ccusage] Tolerate sessions with no activity date (raycast#28502)
- [WordReference Dictionary Translation] Handle WordReference HTTP errors (raycast#28418)
- Fix Pivot preset editor heap spike (raycast#28495)
- Fix shell quoting issues in GitHub Actions workflows
- Fix issue-bot workflow condition expression
- Update CODEOWNERs (f0a7688)
- Add Nibit extension (raycast#27805)
- Update CODEOWNERs (ea516e2)
- Add lockdock extension (raycast#27768)
- Handle Forked Extensions git index locks (raycast#28187)
- [ccusage] Add monochrome menu bar icon option (raycast#27996)
- chore: update stale duration (raycast#28491)
- Add GitHub Actions workflow for metadata image validation (raycast#27714)
- Update CODEOWNERs (998911f)
- Update gif-search extension (raycast#28251)
- feat(ibm-bob): add support for IBM Bob editor (raycast#28488)
- Update CODEOWNERs (8c4e881)
- [Coffee] Fix menu bar icon refresh after caffeination changes (raycast#28469)
- Update visual-studio-code extension (raycast#28477)
- Update producthunt extension (raycast#28476)
- Update CODEOWNERs (8e5e124)
- feat(skills): add Default Agents preference (raycast#28378)
- Update whois extension (raycast#28475)
- klack: polish stats header and tighten changelog (raycast#28472)
- Update CODEOWNERs (675c6e6)
- Add gist-rocket extension (raycast#28188)
- Ext/game scout (raycast#28439)
- Update leetcode extension (raycast#28432)
- Update CODEOWNERs (1084892)
- [Obsidian Tasks] Add Quick Add Task command (raycast#27785)
- Update joey-vocab extension (raycast#28465)
- Update vocabuilder extension (raycast#28283)
- Update Plexus: Windows + WSL support, detect all localhost web servers (raycast#28459)
- Update producthunt extension (raycast#28445)
- Update dev-servers extension (raycast#28419)
- [Hue] Bug fixes and improvements (raycast#28412)
- Update CODEOWNERs (0de1764)
- Update my-ip extension (raycast#27283)
- Update CODEOWNERs (6e640eb)
- Add Harness Control Plane extension (raycast#27231)
- Update CODEOWNERs (a1c8fc5)
- Add Pivot extension (raycast#27753)
- fix(clip): handle history errors gracefully in URL shortener (raycast#28458)
- Update phare.io logo (raycast#28453)
- [Team Time] Use Hong Kong and Macau ISO codes for their own flags (raycast#28425)
- Update CODEOWNERs (2b56dcb)
- Add chinese-converter extension (raycast#27610)
- Update CODEOWNERs (7b42404)
- [Tiktoken] Add o200k_base tokenizer support (raycast#28402)
- Update CODEOWNERs (829677d)
- Add Mouse Jiggle extension (raycast#27745)
- [Port Manager] Fix lsof process leaks (raycast#28222)
- feat(granola): prefix exports with sortable date (raycast#28394)
- Keep Bitwarden session active after sync failures (raycast#28150)
- Fix 2FA link URL validation (raycast#28158)
- Update GitHub extension Raycast SDK (raycast#28185)
- Docs: update for the new API release
- [Quit Applications] Handle app discovery timeouts (raycast#28012)
- [Google Chrome] Reset stale profile selection (raycast#28015)
- Fix Copy Path for VS Code active files (raycast#28145)
- Update unsplash extension (raycast#28379)
- Fix JWT Decoder React peer versions (raycast#28022)
- [Todoist] Reduce Menu Bar Tasks sync size (raycast#28005)
- [Toggle Desktop Visibility] Fix Tahoe icon toggling (raycast#28009)
- [Spotify Player] Guard podcast episode navigation (raycast#28063)
- [Jira Search] Surface issue search auth errors (raycast#28053)
- Support Antigravity IDE 2.0 paths (raycast#28152)
- Fix Messages chat list memory usage (raycast#28156)
- [Warp] Add Tab Config support (raycast#28165)
- [Finder File Actions] Add custom names for pinned folders (raycast#28164)
- Update prompt stash extension (raycast#28382)
- [DevUtils] Handle missing app installs (raycast#28170)
- [Sentry] Guard issue details without stack frames (raycast#28056)
- [Espanso] Reduce Search Matches memory usage (raycast#28004)
- [Kill Process] Prevent background refresh timeout errors (raycast#28010)
- [Hide Files] Fix path handling for visibility toggles (raycast#28008)
- Add Edit in iTerm open behavior (raycast#28161)
- [cmux] Improve workspace search metadata (raycast#28163)
- [Terminal Finder] Improve cmux socket error (raycast#28013)
- Add task snooze actions to Reclaim (raycast#28173)
- Add Helium support to Browser History (raycast#28180)
- Fix iMessage Time Sensitive code detection (raycast#28183)
- Update apfel extension (raycast#28375)
- Update vercast extension (raycast#28370)
- Update GetNote Extention (raycast#28361)
- Update CODEOWNERs (6c5db01)
- [Slack] Fix slack:// deep links on Windows (raycast#28367)
- Update CODEOWNERs (230c5e5)
- Add notaday extension (raycast#27625)
- Update CODEOWNERs (f4392b7)
- Add discussite extension (raycast#27486)
- [Audio Device] Restore enforce command notifications (raycast#28017)
- chore: add readme (raycast#28364)
- Update awork extension (raycast#28337)
- Update lastfm extension (raycast#28350)
- Update CODEOWNERs (5e7e76e)
- Add vn-textify extension (raycast#27524)
- Update CODEOWNERs (be6be9b)
- Add minimax-tts extension (raycast#27316)
- Update CODEOWNERs (3a9bc77)
- Add gemini-tts extension (raycast#27612)
- Update CODEOWNERs (aba109c)
- Add terminal-image-paste extension (raycast#27678)
- [Brand Icons] Add support for Raycast beta versions (raycast#28355)
- [Bitwarden] Update CLI version to 2026.4.2 (raycast#28358)
- Update raycast-ollama extension (raycast#28320)
- Update CODEOWNERs (d1f86f0)
- Add utc-workbench extension (raycast#27152)
- Update CODEOWNERs (5c36813)
- Add pinwork extension (raycast#27684)
- Fix useState crash in Withings Sync (sync-to-garmin command) (raycast#28344)
- Update CODEOWNERs (89a6e9e)
- Update dev-servers extension (raycast#28348)
- Granola: Auto-refresh expired tokens and improve error logging (v2.1.4) (raycast#28345)
- Update installed-extensions extension (raycast#28336)
- feat(croc-transfer): add Croc Transfer extension (raycast#27692)
- Update CODEOWNERs (06e4f52)
- Add Bilibili Search extension (raycast#28239)
- Update aws extension (raycast#28252)
- Update dev-servers extension (raycast#28339)
- test (raycast#28334)
- revert test (raycast#28333)
- Update CODEOWNERs (1bff991)
- Update font converter extension (raycast#28305)
- google-chrome-profiles: fix silent failure via detached osascript spawn, fix bookmark crash (raycast#27615)
- test (raycast#28331)
- [Figma] Updated linter (raycast#28329)
- Update CODEOWNERs (f9befa6)
- Zipic: rename, AI Extension, and unified presets (raycast#27650)
- Update CODEOWNERs (64365c1)
- feat: add extension e18e Module Replacements (raycast#27636)
- Update wp-bones extension (raycast#28316)
- Update world-cup extension (raycast#28323)
- Update CODEOWNERs (3f50c6f)
- Add mail-finder extension (raycast#27101)
- Update CODEOWNERs (6337166)
- [Cloudflare] - Improve View Workers command (raycast#28313)
- Update CODEOWNERs (191a3e1)
- Update hakuna extension (raycast#27790)
- Update CODEOWNERs (425388d)
- Apple Developer Docs: filter search history by current query (raycast#28302)
- Update CODEOWNERs (77c3c71)
- Add heyclaude extension (raycast#27505)
- Update git extension (raycast#28205)
- Update dev-servers extension (raycast#28304)
- Update CODEOWNERs (a98c877)
- Fix VSCode Windows recent projects & CLI, WSL, Icon, Shortcut (raycast#27634)
- [GitLab] Add option to hide archived projects in menu bar (raycast#27970)
- Claude/fix figma search extension vi2 cu (raycast#27976)
- [FileZilla] Add support for FileZilla Pro (Mac App Store) (raycast#28268)
- Update CODEOWNERs (26e2007)
- [JetBrains Toolbox Recent Projects] Show current git branch next to projects (raycast#27961)
- Update CODEOWNERs (3193c67)
- Update amphetamine extension (raycast#27701)
- gather: support Gather V2 alongside V1 (raycast#27724)
- Fix VS Code shared storage lookup (raycast#28025)
- Update CODEOWNERs (0d56f75)
- [ccusage] Adopt v20: schema fix and new features (raycast#28299)
- [Open With App] Fix default selection on Raycast 2 (raycast#28295)
- Update list-keyboard-maestro-macros extension (raycast#27893)
- [Things] Add detail view for to-dos (raycast#28298)
- [Git Repos] Reduce scan memory usage (raycast#28054)
- Update another-boring-piece extension (raycast#28208)
- Update CODEOWNERs (f760ec5)
- Update readwise-reader extension (raycast#28264)
- Update CODEOWNERs (c7315aa)
- Add linkace-search extension (raycast#28245)
- Update leafcast extension (raycast#28261)
- Update roblox extension (raycast#28257)
- Buildkite: Build graph view and unblock steps (raycast#28051)
- Update CODEOWNERs (0678565)
- [Windows Terminal] Add Quake Window preference & Fix Administrator issues (raycast#28197)
- [Google Workspace] Guard Drive file list responses (raycast#28061)
- Update CODEOWNERs (2c0fb24)
- Add tablepro extension (raycast#27587)
- Update scheduler extension (raycast#28241)
- Update CODEOWNERs (03dba5d)
- Add copy flight number action (raycast#28249)
- Update CODEOWNERs (d6f0216)
- Add history to word-search (raycast#27575)
- Add Node types and refresh scheduler lockfile
- [Safari] Clarify history permission errors (raycast#28018)
- Update calibre-library extension (raycast#28074)
- set RefreshStatus on all command calls
- fix(scheduler): add missing code changes
- fix: add missing BACKGROUND_REFRESH_STATUS to STORAGE_KEYS
- Pull contributions
- feat: add background refresh status alert to scheduled command form
- Document Raycast 2.0 draft fix
- Fix Raycast drafts for scheduled command creation
- Refresh scheduler lockfile for updated lint stack
- Refactor scheduler configuration UI

* chore(deps): update dependencies in scheduler package
- Downgrade @raycast/api to ^1.104.9 for compatibility issues
- Update cronstrue to ^3.21.0 for new features

* style(scheduler): remove trailing newline in eslint.config.js
- Trim unnecessary whitespace to conform to style guidelines
- Ensure consistent file formatting across the project

* chore(scheduler): update @raycast/api dependency
- Bump version to ^1.104.18 for improved API stability

* Update CHANGELOG.md

---------

Co-authored-by: Charles Symons <dev@realitymanagement.com>
Co-authored-by: Dhruv Suthar <git@dhrv.pw>
Co-authored-by: raycastbot <bot@raycast.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants