macOS desktop app for offline voice transcription using Whisper AI. Built with Tauri v2 (Rust backend) and React 19 (TypeScript frontend). Features system-wide hotkey recording, automatic text insertion at cursor, and local model management.
# Development
pnpm dev # Frontend only (Vite)
pnpm tauri dev # Full Tauri app (frontend + Rust)
# Quality checks (run before commits)
pnpm lint # ESLint
pnpm typecheck # TypeScript compiler
pnpm test # Vitest frontend tests
pnpm test:backend # Rust tests (cd src-tauri && cargo test)
pnpm quality-gate # All checks in one script
# Build
pnpm build # Frontend build
pnpm tauri build # Native .app bundlesrc/ # React frontend
├── components/ # UI components
│ ├── ui/ # shadcn/ui primitives
│ ├── tabs/ # Tab panel components
│ └── sections/ # Page sections
├── contexts/ # React context providers
├── hooks/ # Custom React hooks
├── lib/ # Shared utilities
├── utils/ # Helper functions
├── services/ # External service integrations
├── state/ # State management (Zustand)
└── test/ # Integration tests
src-tauri/src/ # Rust backend
├── commands/ # Tauri command handlers
├── audio/ # CoreAudio recording
├── whisper/ # Transcription engine
├── ai/ # AI model management
├── parakeet/ # Parakeet sidecar integration
├── state/ # Backend state management
├── utils/ # Rust utilities
└── tests/ # Rust unit tests
- Framework: React 19 with function components + hooks
- Styling: Tailwind CSS v4; use
@/*path alias for imports - Components: shadcn/ui in
src/components/ui/; extend, don't modify - State: React hooks + Zustand + Tauri events
- Types: Strict TypeScript; avoid
any - Tests: Vitest + React Testing Library; test user behavior, not implementation
- Language: Rust 2021 edition
- Framework: Tauri v2 with async commands
- Modules: Commands in
commands/; domain logic in dedicated modules - Style: Run
cargo fmtandcargo clippybefore commits - Tests: Unit tests in
tests/directory; use#[tokio::test]for async
- Frontend calls backend via
invoke()from@tauri-apps/api - Backend emits events via
app.emit()orwindow.emit() - Event coordination handled by
EventCoordinatorclass
- Commits: Conventional Commits (
feat:,fix:,docs:,refactor:) - Pre-commit: Run
pnpm quality-gateor individual checks - Branches: Feature branches off
main - Never push without explicit user instruction
git status # Always check first
git diff # Review changes
git add -A && git commit -m "feat: description"- macOS only: Parakeet models use Apple Neural Engine; Whisper uses Metal GPU
- Path alias: Use
@/not./src/for imports (e.g.,@/components/ui/button) - NSPanel focus: Pill window uses NSPanel to avoid focus stealing; test carefully
- Clipboard: Text insertion preserves user clipboard; restored after 500ms
- Model preloading: Models preload on startup; don't assume instant availability
- Tauri capabilities: Permission changes require edits in
src-tauri/capabilities/ - Large lib.rs: Main Rust entry point at 96KB; navigate via module imports
- Sidecar builds: Parakeet Swift sidecar built via
build.rsduringtauri build
src-tauri/src/lib.rs— Main Rust entry, command registrationsrc-tauri/src/commands/— All Tauri command implementationssrc/hooks/— React hooks for Tauri integrationsrc/components/tabs/— Main UI tab componentssrc-tauri/capabilities/— Tauri permission definitions
agent-docs/ARCHITECTURE.md— Detailed architecture diagramsagent-docs/EVENT-FLOW-ANALYSIS.md— Event system documentationCLAUDE.md— Coding assistant guidelinesREADME.md— Product overview