Voxt is a macOS menu bar voice input and translation app written in Swift with an Xcode project at Voxt.xcodeproj.
- Main app sources live under
Voxt/. - Tests live under
VoxtTests/, with shared helpers inVoxtTests/TestSupport/. - User-facing docs live under
docs/. - Local build products, derived data, and scratch references live under
build/andtmp/; avoid editing or reviewing generated files there. - The root
.codex/directory is local workflow state and is gitignored.
Use the shared Voxt scheme.
xcodebuild -list -project Voxt.xcodeproj
xcodebuild build -project Voxt.xcodeproj -scheme Voxt -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO
xcodebuild test -project Voxt.xcodeproj -scheme Voxt -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NOFor focused test runs, prefer -only-testing:VoxtTests/TestClassName or -only-testing:VoxtTests/TestClassName/testMethodName.
CI runs tests with explicit SwiftPM cache paths and CODE_SIGNING_ALLOWED=NO; mirror .github/workflows/tests.yml when reproducing CI package resolution issues.
Shared signing defaults are in Config/Signing.shared.xcconfig.
For local signing, copy Config/Signing.local.xcconfig.example to Config/Signing.local.xcconfig; the local file is gitignored. Do not commit personal signing settings.
- Follow existing Swift style in nearby files.
- Keep UI work consistent with the existing SwiftUI/AppKit split under
Voxt/UI,Voxt/Settings, andVoxt/App. - Prefer existing managers, stores, and support types before adding new abstractions.
- Keep tests deterministic by using
UserDefaultssuites and temporary directories fromVoxtTests/TestSupportwhere applicable. - Do not modify audio fixtures in
VoxtTests/Fixtures/Audio/unless the task explicitly requires fixture changes.
Swift package dependencies are resolved through the Xcode project. Notable packages include WhisperKit, MLXAudio, mlx-swift, mlx-swift-lm, Sparkle, SwiftSoup, and PermissionFlow. The MLX Audio dependency policy is documented in docs/MLXAudioDependency.md.
Release automation is in .github/workflows/release.yml. Stable release tasks may also use the local voxt-release skill under .codex/skills/voxt-release/.