Features, and how far the port has got

Mila on macOS is the baseline: every feature below is one of its own, and this page says how far OpenMila has got on Linux and on Windows. Version 1.9.5-beta.2+port.5, tracking Mila v1.9.5-beta.2.

At a glance

Headline capabilities. Mila on macOS is the baseline for every row.
CapabilityMila
macOS
OpenMila
Linux
OpenMila
Windows
Record mic / system / meetingbaselinedonewritten
Per-app audio capturebaselinedonewritten
Hebrew and English transcriptionbaselinedonewritten
GPU acceleration (Vulkan)baselinedonewritten
Speaker names (diarization)baselinedonewritten
Dictation hotkeysbaselinedonewritten
AI summaries and action itemsbaselinedonewritten
Local AI setup (Ollama)n/adonewritten
MCP server for AI toolsbaselinedonewritten
Auto-updatebaselinepartialpartial
Native installer / packagebaselinedonewritten

done is exercised on that system; partial works with a stated limit; written builds and passes in CI but has not run on a real Windows desktop yet; n/a is a port-only feature Mila does not have. Requirements are on the download page.

Every feature, in detail

One row per Mila feature, generated from docs/port/PARITY.md. Mila on macOS is the baseline in every row, stated once here rather than argued per row: this project does not build, test or ship Mila for macOS, so the honest reading of every row is "Mila does this, and here is how far each port has got". done needs evidence on that system: a test, CI, the headless self-test, or a run of the app. No Windows row says done, because nobody has run any of it on a Windows desktop yet. Where it falls short today lists the open items.

Recording and capture

Recording and capture
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
1 Microphone recording, device picker, pinned input, live input level baseline done
miniaudio, openmila-cli devices and record
written
same capture code, WASAPI backend
2 System audio from one chosen app baseline done
PipeWire links a capture stream to the chosen application's output (pw-record --target), with whole-system monitors still offered; verified with openmila-cli app-audio (3.07 s captured from one player, peak 0.78)
written
WASAPI process loopback binds a capture client to the chosen process tree, with the whole-system monitors still offered. It compiles in CI and nothing has run it: no Windows machine has been available to this port
3 Meeting mode: mic + app audio mixed to one mono 16 kHz WAV baseline done
Port/Recording/RecordingSession.swift, RecordingTests
written
4 Independent mic / app-audio toggles baseline done written
5 Pause and resume with the paused span absent from audio and timer baseline done
RecordingTests
written
6 Folder and meeting name chosen at record start baseline done written
7 Adaptive gain control for quiet mics baseline done
upstream's AdaptiveGainController, vDSP calls behind the Accelerate shim
written
8 Mic stall watchdog and app-audio restart with backoff baseline done
the session watches the frame count every second and restarts a capture that stops moving, with upstream's timeout and its backoff, and reports it when the device cannot be reopened. Upstream's policy types were not compiled off macOS at all before this (CaptureWatchdogTests)
done
the same code, one watchdog for both systems
9 Mic bring-up timeout with an error that names the device baseline done written
10 Refuse to transcribe an empty capture, duration read from the file baseline done written
11 AAC .m4a recordings baseline done
ffmpeg where it is installed, GStreamer otherwise, which a GNOME or KDE install almost always has. Proven by a round trip: WAV to AAC and back transcribes to the same sentence
partial
the same two routes are tried, but neither ships in the zip, so it depends on what the machine has
12 Configurable recordings directory baseline done
plain paths, no security-scoped bookmarks
written
13 Storage cap, respected by dictation baseline done
upstream code, unchanged
written
14 Auto-discard accidental clips baseline done
upstream code, unchanged
written
15 Sleep and screen-lock guard while recording baseline done
gnome-session-inhibit, systemd-inhibit fallback
written
SetThreadExecutionState
16 Crash-recovered WAV header repair baseline done
upstream WAVHeaderRepair, WAVHeaderRepairTests runs off macOS
written
17 Meeting detection (Zoom, Teams, Meet, Proton Meet) with prompts to start and stop baseline done
native apps come from /proc on every session. A meeting in a browser tab is found by window title, from X11 where a display answers and from the accessibility bus on a Wayland session, where the display protocol refuses by design. Verified live: the accessibility walk reads Wayland-native window titles on GNOME 26.04 with the desktop switch still off. Firefox and Chromium publish their windows only once accessibility is on (gsettings set org.gnome.desktop.interface toolkit-accessibility true), and the app says so rather than finding nothing quietly
written
process names via CreateToolhelp32Snapshot, window captions via EnumWindows; Windows places no Wayland-style restriction on reading them, so a tab meeting is detectable on every session. MeetingTitleTests covers the shared patterns on both systems
18 Live level meters and elapsed clock without re-rendering the app baseline done
RecordingMeters, observed by the leaf view only
written

Transcription

Transcription
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
19 On-device whisper.cpp, ivrit.ai large-v3 (Hebrew) and large-v3-turbo (English) baseline done
built with the Vulkan backend; a real GPU is used, a software Vulkan device is refused because it is slower than the CPU backend, and a machine with neither runs on the CPU. openmila-cli gpu reports what was found. Not yet measured on real GPU hardware
written
the same code, and CI installs the Vulkan SDK so the backend is compiled into the release zip. Never run on a Windows machine, with or without a GPU
20 CoreML / ANE encoder and its banner baseline not applicable
no ANE; .mlmodelc downloads skipped
not applicable
21 First-launch model download with progress and SHA-256 verification baseline done
verified by downloading both models
written
22 Model deletion frees the whole install and keeps the choice sane baseline done
upstream ModelManager
written
23 Recording language Hebrew or English, model routed per language baseline done written
24 Remote transcription on any OpenAI-compatible endpoint baseline done
upstream code with the port's SecretStore; exercised against scripts/mock-openai-transcription-server.py
written
25 Neural VAD (Silero) and hallucination reduction baseline done
TranscriptionCore as-is, weights bundled
written
26 Live transcription while recording, mic and app audio baseline done written
27 Live transcript editing, copy, mid-recording SRT export baseline done
Port/App/Sources/Views
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
28 Hardware gate for Live AI on weak machines baseline done
SystemCapabilities twin reads RAM and activeProcessorCount
written
29 Transcription queue with no stuck items after relaunch baseline done
upstream TranscriptionService
written
30 Re-transcribe a recording, speaker names re-attached baseline done written
31 Import and transcribe existing audio files baseline done
FileTranscriber twin; watched-folder import verified word for word
written
32 audio_ctx speed-up and beam search 5 baseline done
TranscriptionCore unchanged
written

Speakers

Speakers
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
33 Speaker diarization with pyannote, bundled Python runtime, torch on first enable baseline done
diarization/build-bundle-linux.sh, proven by openmila-selftest diarize (torch 2.2.2 installed at runtime, turns returned)
written
build-bundle-windows.ps1 builds the runtime in CI (run 35546341637, the first time it has ever been run). Nothing has loaded that runtime or diarized with it
34 Live speaker labels during recording baseline done
upstream LiveSpeakerDiarizer
written
35 A colour per speaker baseline done
port theme palette
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
36 Speaker directory: name, rename, merge, un-name, naming mid-recording baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
37 Cross-recording voice recognition, opt-in, deletable baseline done
upstream OfflineVoiceEmbedder, SpeakerProfileStore
written
38 Diarization toggle mid-recording takes effect immediately baseline done written

Dictation

Dictation
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
39 Global hotkeys for English and Hebrew, configurable, conflict-checked baseline done
XGrabKey where an X display answers (including XWayland), the XDG GlobalShortcuts portal on a pure Wayland session. Both paths pick themselves and were exercised with openmila-cli hotkey; a key press through the portal still needs a human at a Wayland desktop to confirm
written
RegisterHotKey on a dedicated message thread
40 Dictation overlay pill with live text, level and busy state baseline done
app window; no layer-shell, so it is an ordinary always-on-top window
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
41 Paste at the cursor into the previous app, with clipboard fallback baseline done
xdotool or wtype where they are installed, the RemoteDesktop portal on a Wayland session once the user grants it (openmila-cli grant-typing, or the Settings button), and the clipboard with a notification otherwise. Dictation never waits on the consent dialog: without permission it falls back in 0.1 s
written
clipboard plus SendInput Ctrl+V
42 Dictations saved under History baseline done written

AI features

AI features
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
43 Providers: Claude, Cursor, Gemini CLIs and any OpenAI-compatible endpoint baseline done
real claude CLI produced a summary in 8 s
written
.cmd shims run through cmd /c
44 Managed Claude install with checksum and signature checks baseline done
as the platform allows - the linux-x64 manifest key and the published SHA-256 are verified before anything runs. There is no signature to check: Anthropic signs the macOS binary through Apple's notary service and ships the Linux one unsigned, so the port's SignatureVerifier fails closed rather than pretending to verify
partial
win32-x64 key, Authenticode verified with the signer's name checked; browser sign-in needs a real terminal until a ConPTY path replaces the POSIX pseudo-terminal
45 Suggested recording names baseline done written
46 Automatic summary after each recording, backfill, regenerate, .summary.txt baseline done written
47 Send to LLM with a custom prompt baseline done written
48 Live AI rolling summary and action items with a per-recording context box baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
49 AI output language, per-feature prompts with an undo stack baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
50 Every CLI invocation logged with credentials redacted baseline done
OpenMilaLogging redacts unless OPENMILA_LOG_PRIVATE=1
written

Library and UI

Library and UI
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
51 Sidebar: Home, All Transcriptions, folders with drag-and-drop, Dictations, watched folders, Recently Deleted baseline done
SwiftCrossUI + GTK4
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
52 Detail view: playback, click to seek, 0.5x-2x speed, transcript follows playback baseline done
speed goes through a WSOLA time stretcher, so pitch is preserved (StretchTests); the stretched audio also transcribes to the same words at 0.75x and 1.5x, which is the intelligibility check a frequency test cannot give
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
53 Post-recording popup and rename sheet with summary and action items baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
54 Right-click context menu on recordings baseline done
GTK GtkPopover via a button-3 gesture
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
55 Copy and share transcript with speaker labels, SRT export, timestamps baseline done written
core only
56 Hebrew RTL rendering per section baseline done
Pango handles bidi; direction decided per block by upstream's HebrewDetection
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
57 Hide recents toggle baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
58 Settings with all nine sections baseline done written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
59 "What's New" before an update baseline done
notes from the GitHub release body
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
60 Main menu commands and keyboard shortcuts baseline done
as the platform allows - every command has its keyboard shortcut in the app. There is no menu bar to put them in: GNOME removed the global menu, and a Mac-style menu bar is not a thing a Linux application can have. The shortcuts are listed in Settings instead
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it
61 Diagnostic report export, credentials redacted, logs attached baseline done
DiagnosticSnapshotProvider twin over the port's own log files
written
62 Sidebar material chrome baseline done
as the platform allows - layered translucent surfaces stand in for .regularMaterial. The blur behind them is the compositor's to give, and GTK 4 cannot ask for it; the look is close, not identical, and that is where it stops
written
the app builds on Windows with the WinUI backend (CI packages a zip); nothing has run it

Integrations

Integrations
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
63 iPhone Voice Memos sync baseline done
as watched folders - the same start-date and destination rules over any synced directory (iCloud discovery is macOS-only); inotify watcher, per-folder toggles
written
ReadDirectoryChangesW
64 .milaconfig one-click team setup baseline done
the packages declare application/x-milaconfig with a *.milaconfig glob and refresh the MIME database on install and removal, so a double-click opens OpenMila; update-mime-database accepts the definition
partial
the app reads a path from argv; the installer has no file association yet
65 Obsidian export and vault git sync baseline done
git from PATH
written
66 MCP server with the consent gate baseline done
openmila-mcp through Claude Code: refused with consent off, listed recordings with it on
written
builds and ships in the Windows zip; nothing has run it there
67 Self-hosted server docs baseline done
docs/self-hosted-server, docs/openmila/REMOTE_SERVER.md
done
same docs

Updates, permissions, system

Updates, permissions, system
#FeatureMila
macOS
OpenMila
Linux
OpenMila
Windows
68 Auto-update with a beta channel and a pre-release guard baseline done
for the AppImage - the check, the beta channel and the pre-release guard, plus an install step that verifies the published SHA-256 and replaces the running AppImage (SelfUpdateTests); a .deb install is sent to the release page, since that belongs to the package manager
partial
the check works; the zip has no self-install
69 Permission prompts for microphone, screen recording, accessibility baseline not applicable
no per-app permission gates; PipeWire and portal dialogs appear where the session requires them
not applicable
the microphone privacy setting is the OS's own
70 Keychain storage for API keys baseline done
the desktop keyring through libsecret (GNOME Keyring, KWallet, KeePassXC), with 0600 files where no Secret Service answers (SecretServiceStoreTests)
written
DPAPI
71 Privacy-safe logging baseline done written
72 Stable code signing so permissions survive updates baseline not applicable not applicable

Where it falls short today

On Linux

  • Meeting detection misses browser meetings on a pure Wayland session. Native applications come from /proc on every session, and a meeting in a browser tab is read from the window title, which only X11 and XWayland expose. A Wayland client cannot see another client's windows by design, so there is nothing to read.
  • The Wayland global-shortcut path has not been confirmed by a human. The XDG GlobalShortcuts portal is wired and picks itself where no X display answers, and it was exercised with openmila-cli hotkey, but an actual key press at a Wayland desktop is still unwitnessed.
  • Vulkan has never been timed. The backend is compiled in and the probe is tested, but the development machine has no GPU, so no transcription has been measured on one.
  • The managed Claude install verifies a checksum, and there is no signature to verify. Anthropic notarises the macOS binary through Apple and ships the Linux one unsigned, so the port's verifier fails closed rather than pretending.
  • No menu bar on GNOME. GNOME removed the global menu and a Mac-style menu bar is not something a Linux application can have, so every command keeps its keyboard shortcut and Settings lists them.
  • Sidebar chrome has no blur. The blur behind a translucent surface is the compositor's to give and GTK 4 cannot ask for it. Layered translucent surfaces get close, and that is where it stops.
  • No Neural Engine, so no CoreML encoder. There is no equivalent to ask for.

On Windows

  • Nothing has been run on a real desktop. Everything marked written builds and ships, and that is all that can be claimed.
  • Compact .m4a recordings depend on the machine. ffmpeg and GStreamer are both tried, and neither ships in the zip, so whether you get .m4a or WAV depends on what is already installed.
  • The portable zip has no self-install. The update check works; installing the update is a fresh download.
  • Managed Claude sign-in needs a real terminal. Authenticode is verified with the signer's name checked, but browser sign-in waits on a ConPTY path replacing the POSIX pseudo-terminal.
  • No file association for .milaconfig. The app reads a path from its arguments; the installer has no association to register.

Which Mila release this matches

OpenMila is measured against one upstream tag at a time. It currently tracks Mila v1.9.5-beta.2 (2026-09-17), with v1.9.4 (2026-09-10), the latest upstream stable, kept as the archived build used for side-by-side comparison. Earlier releases from v1.8.8 onwards are folded into the tables above.

Each OpenMila version is a port of one Mila version, named <mila version>+port.<n>. Features, models and engine pins track upstream: the port adds platform code, not features. See the changelog.