Skip to content

Spoken symbols, model loading state, and UX fixes - #29

Merged
andyhtran merged 7 commits into
mainfrom
ft-sc-update
Jun 22, 2026
Merged

andyhtran merged 7 commits into
mainfrom
ft-sc-update

Conversation

@andyhtran

Copy link
Copy Markdown
Owner

Summary

  • Spoken symbols expansion: add slash/pipe symbols, a supported-symbols list popover in settings, and a SpokenSymbolsCatalog that generates the list from live rules
  • Per-edge word boundaries: replacement processor now anchors \b independently on each edge of find, so c++ anchors left-only and space-padded rules anchor their word side
  • Model loading state machine: replace scattered isModelLoaded/isModelDownloading booleans with a ModelLoadState enum, generation-tagged preload tasks, and phased progress reporting (checking → downloading → preparing)
  • Pulsing processing icon: replace static SF Symbols for transcription/edit-mode with animated pulsing bars (orange for transcription, purple for edit-mode), driven by a 10fps frame timer
  • Fn key fixes: move stuck-state recovery before the re-entry guard so it actually fires; remove the hold-duration gate so press-and-hold-then-release toggles the same as a quick tap
  • Recording flow: toast on too-short recordings (<1s), capture actual file size and "auto" language in failed recording metadata
  • Paste reliability: remove the changeCount check in copyAndPaste that could silently skip the paste step
  • Launch popover: gate on isMenuBarVisibilityHintAvailable before scheduling, so it never fires after the hint is exhausted

Test plan

  • Verify pulsing bars appear during transcription and edit-mode, with distinct colors
  • Verify model loading shows phased progress (checking/downloading/preparing) and recovers from failure
  • Test spoken symbols: slash, pipe, back slash, hyphen all convert correctly
  • Open the spoken symbols list popover from format settings and verify it shows all categories
  • Verify Fn key tap and long-hold both toggle recording
  • Confirm too-short recording (<1s) shows a toast instead of silently discarding
  • Verify clipboard paste works reliably after transcription

🤖 Generated with Claude Code

andyhtran and others added 7 commits June 10, 2026 21:31
New replacement rules: "slash" (mid-sentence join and transcript-leading
slash-command forms), "back slash" split-compound variant, and bare
"pipe". The Spoken symbols toggle's hover InfoBadge is replaced with a
click-to-open popover listing every supported phrase, generated at
runtime from the live rules via SpokenSymbolsCatalog so the list can't
drift, plus the deliberate exclusions (dash, caret) with reasons.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Space-padded rules like "slash " previously fell back to literal
substring matching and could fire mid-word ("reopen", "bracketing").
Now each edge of a find gets \b independently when it's an ASCII word
character, so the word side stays anchored even when the other side is
punctuation or a space.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Transcription and edit-mode AI calls now show three pulsing bars
(orange/purple) driven by a 10fps timer, since no observed property
ticks while those calls run. Recording and pulsing states share a
common bar-drawing path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ings

The stuck-down recovery ran after the !isFnKeyDown guard, so the exact
case it existed for (macOS dropping the Fn keyUp) could never reach it.
Run it before the guard, drop the now-meaningless tap-duration branch on
keyUp, and show an error toast instead of silently discarding sub-1s
recordings.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Save real file size for failed recordings when audio still exists, record failed transcription language as auto instead of guessing English, and paste after a successful clipboard write without change-count gating.
Only auto-reveal the menu bar popover while the visibility hint is still eligible. Once the user dismisses the hint or it reaches the show limit, launches stay quiet while manual reopen/click behavior still works.
Track transcription model loading with an explicit observable state instead of inferring readiness from provider internals.

Report checking, download, preparation, ready, and failed states through the menu bar header, including Parakeet load progress and Whisper download/load progress. This prevents the header from staying on "Loading Model..." after a model is ready and makes load failures visible instead of leaving an indeterminate spinner.
@andyhtran
andyhtran merged commit ee3862a into main Jun 22, 2026
1 check passed
@andyhtran
andyhtran deleted the ft-sc-update branch June 22, 2026 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant