Skip to content

Model Management

thefourCraft edited this page Jun 21, 2026 · 1 revision

Model Management

All three on-device models share one install/manage pattern, so users learn it once.

Manager classes (mirrors of each other)

Manager Model Location
WhisperModelManager Whisper (STT) …/WhisperModels/
KokoroModelManager Kokoro (TTS) …/TTSModels/
LocalLLMModelManager Gemma (LLM) …/LLMModels/

Each is an @MainActor singleton exposing isInstalled, isDownloading, downloadProgress, download(), delete(), and a prewarmIfNeeded() that loads the model in the background on launch.

All models live under ~/Library/Application Support/com.arcusis.zerm/, outside the .app bundle — so they survive app updates and reinstalls.

Download UX

stateDiagram-v2
    [*] --> NotInstalled
    NotInstalled --> Downloading: Download
    Downloading --> Installed: complete
    Downloading --> NotInstalled: cancel / fail
    Installed --> NotInstalled: Delete
    Installed --> Warm: prewarmIfNeeded()
Loading

LocalLLMModelCardView is a single reusable SwiftUI card (download / progress % / installed / delete) used by both the AI Models screen and Read Aloud settings. The voice and Whisper cards follow the same shape.

Where each is configured

  • Whisper — AI Models / transcription model picker.
  • Kokoro — Read Aloud settings → voice provider = Kokoro → download card.
  • Gemma — Read Aloud settings (Smart reading) and AI Models screen (provider = On-Device). Both use the same shared model.

Swapping models

The LLM bridge reads each GGUF's built-in chat template, so advanced users can drop in other instruct models. Cloud providers remain available per task for users who prefer them.

See: The Three-Model Platform · On-Device LLM

Clone this wiki locally