← Project list

Kitsch Labs · Shipped Desktop Product

Mora

Mora is Kitsch Labs' shipped desktop dictation product. Speak from a global shortcut, let it clean up the sentence, and insert the result at the active cursor. Version 0.1.0 is available for macOS and Windows.

Role
Kitsch Labs · Desktop, realtime STT API, and cross-repository integration
Technologies
Tauri 2 · React · Rust · FastAPI · WebSocket · Soniox

Actual product

See it in action

The first demo shows the complete interaction: start recording from a shortcut, finish the session, and insert the transcript into the app currently in use.

01

Dictate directly into the current app

Starts recording over Codex with Fn, then inserts the finalized Korean transcript once at the existing cursor position.

Fn push-to-talk · transcript finalization · focused-field insertion
02

Mora desktop home and settings

Shows usage, the Fn shortcut, input microphone, dictation language, writing controls, and personalization entry points in one home view.

Mora desktop home showing usage, the Fn shortcut, microphone, and dictation settings
Mora Desktop home
Repository Mermaid architecture from the Kitsch STT client through FastAPI, Soniox realtime WebSocket, and Flow Supabase
KitschLabs/kitsch-tts-api · docs/10_architecture.md (Mermaid)Rendered directly from the repository's Speech to Text runtime diagram.
01

Context

Mora is not a separate chat window that requires copying a transcript. It starts recording from a global shortcut in any app and returns the result to the current cursor. Microphone permission, global shortcuts, focused-field insertion, and an overlay that does not steal focus are as important as transcription accuracy.

Desktop, Flow Web, and the shared Kitsch Voice API live in separate repositories and data boundaries. The realtime STT path needed to connect Flow JWTs, a dedicated Supabase entitlement, and transcript storage without breaking existing Kitsch authentication and usage accounting.

02

Engineering

A Rust session controller in the Tauri 2 desktop app owns the global shortcut, microphone capture, 24 kHz mono PCM normalization, and text insertion. React renders a non-focus-stealing overlay and settings UI, while the streaming client connects to FastAPI WebSocket with a short-lived Flow JWT.

The FastAPI STT runtime selects Flow or Kitsch service paths from a verified product context before opening a Soniox Realtime WebSocket. It keeps one logical session ID across planned transport rollover and distinguishes finalized segments from terminal completion. Raw audio is not stored, and disconnected gaps are not replayed.

My contribution

  • Implemented desktop audio capture, authenticated WebSocket streaming, rollover, and terminal transcript assembly.
  • Connected Flow realtime STT orchestration, its dedicated repository, session close, and transcript persistence in FastAPI.
  • Designed the authentication boundary so Flow and Kitsch data paths are selected only after validating issuer and product context.
  • Added lifecycle regression tests across desktop and API repositories for Stop and rollover races, disconnects, and provider errors.

Key technical decisions

Select the product path only after authentication

The database is not selected from a client-provided tenant or unverified issuer. Signature, issuer, audience, and session claims produce a typed product context that selects the Flow repository and entitlement.

Separate segment completion from session completion

Rollover segments accumulate with terminal=false. Text is inserted once only after server-side close produces terminal=true. A Stop during rollover reconnects with the same logical session and sends the terminal commit.

Do not recreate disconnected audio

Replaying a gap can duplicate transcripts and distort usage. The client sends bounded PCM, drops disconnected intervals, and does not store raw audio by default.

03

Validation

Deterministic desktop tests cover bounded audio delivery, PCM normalization, same-session rollover, disconnected-gap drops, terminal completion, and cancellation. API tests cover Flow and Kitsch authentication isolation, entitlement checkpoints, transcript persistence, provider cleanup, and idempotent session close.

The macOS demo verifies the Fn recording overlay and focused-field insertion, and v0.1.0 installers are publicly available for macOS and Windows. Provider performance is not yet supported by enough production evidence, so no performance metric is presented here.

Verified results

  • Connected the full user flow from a global shortcut to one finalized insertion at the existing cursor position.
  • Preserved regression tests that distinguish rollover, normal completion, disconnect, and cancellation across desktop and API code.
  • Published the product website and v0.1.0 installers for macOS and Windows, completing the user-facing release path.

Failures and changes

  • Closing the audio source too early could skip stream finalization and lose the last result. Transport completion and terminal transcript completion were separated so the client waits for the terminal event.
  • A Stop racing with planned rollover could leave only an intermediate segment. Reconnecting under the same logical session and sending a terminal commit ensures the combined transcript is finalized once.

Next steps

  • Repeat microphone-permission, shortcut-conflict, focused-field insertion, and secure-storage tests on physical Windows hardware, then harden the automatic update path.
  • Exercise packet loss, JWT expiry, provider timeout, and entitlement exhaustion end to end in an isolated environment, with operational signals for duplicate or missing transcripts after reconnect.