Overhaul desktop app: browser capture, redesign, i18n, audit fixes #7
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/redesign-i18n-audit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
A broad overhaul of the Voice Typer desktop app, spanning the FFmpeg→browser-capture migration plus this round's audit fixes, frontend redesign, model-handling changes, and a new internationalization layer.
Audio / runtime
Audit fixes
forced.sha256catalog seam.languageIdReady/languageIdSizeMbfields), so a larger un-downloaded detector no longer makes a downloaded model read as uncached.Frontend redesign
components/ui/layer as canonical Radix shadcn/ui; removed Base UI and Phosphor.Model handling
large-v2(non-quant).Internationalization (English + German)
: typeof en, so key parity is enforced at compile time (256 keys).use-voice-typerhook error messages, and the main-process tray menu (rebuilt on locale change).Validation
bun run typecheck,bun run lint,bun run test(30 pass),bun run knip, andbun run buildall pass. Renderer smoke-tested in a browser: English + German render with no leaked keys and no runtime errors.Notes
format:checkfails on pre-existing files from the browser-capture migration (never run through oxfmt); every file touched in this round is oxfmt-clean. A repo-widebun run formatcan be a separate follow-up.kReview review
Verdict: 1 Low
Overall risk is low; the visible diff mainly changes renderer UI plumbing, with one persistence mismatch in the new locale layer.
1 lower-severity or low-confidence finding(s)
Low (1)
ui/src/i18n/index.tsx:50The renderer can start in the wrong language when the persisted app setting and browser storage disagree, for example after
settings.localewas saved asdebutlocalStorageis empty or stillen. The new provider initializes only fromgetInitialLocale()and is mounted above the app without any later sync from the fetchedsettings.locale, so the settings selector can show one locale while the renderer strings use another until the user changes it again.Suggested fix: Use localStorage/navigator only as a bootstrap fallback, then call
setLocale(status.settings.locale)when the initial status/settings load completes, or pass the persisted locale intoLocaleProviderso it stays aligned withsettings.locale.Excluded as generated or vendored (not reviewed):
bun.lock,ui/bun.lock.Reviewed by kReview at
4e7f6b7c9f. This comment is conservative and based only on the PR diff, metadata, and supplied repository context.Est. cost ~$4.75 total (797.5k in / 28.8k out) · this run ~$1.63 (272.3k in / 10.6k out) / gpt-5.5.
Verdict: 1 Low
Inline findings for
4e7f6b7c9fare anchored below; the review summary comment has the full report.@ -0,0 +47,4 @@const LocaleContext = createContext<LocaleContextValue | null>(null);export function LocaleProvider({ children }: { children: ReactNode }) {const [locale, setLocaleState] = useState<AppLocale>(getInitialLocale);Low: Sync renderer locale from persisted settings
The renderer can start in the wrong language when the persisted app setting and browser storage disagree, for example after
settings.localewas saved asdebutlocalStorageis empty or stillen. The new provider initializes only fromgetInitialLocale()and is mounted above the app without any later sync from the fetchedsettings.locale, so the settings selector can show one locale while the renderer strings use another until the user changes it again.Suggested fix: Use localStorage/navigator only as a bootstrap fallback, then call
setLocale(status.settings.locale)when the initial status/settings load completes, or pass the persisted locale intoLocaleProviderso it stays aligned withsettings.locale.