FluidVoice

GitHub

Fastest and only macOS Dictation app with on-device STT and custom trained AI enhancement model. A local Wispr Flow alternative. ⭐ helps a ton :) Windows & iOS waitlist open. Linux soon.

RAW Doc

MACOS UI AUTOMATION BRANCH PLAN

macOS UI Automation Plan (Separate Branch)

Goal


Build reliable automated test coverage for FluidVoice native macOS UI behavior (overlay, prompt picker, mode switching, context behavior), without blocking release stabilization work.

Branch Strategy


- Branch name: B/macos-ui-automation
- Keep this work isolated from release branch changes.
- No schema/storage migrations in this branch unless explicitly required for testability.

Scope


- Add stable accessibility identifiers for key UI controls.
- Add macOS XCUITest smoke coverage for Dictate/Edit/Command interaction flows.
- Add deterministic app launch mode for UI tests (--ui-testing) to reduce flakiness.
- Add targeted logic tests for migration/state synchronization edge cases.

Out of Scope


- Per-prompt shortcut assignment.
- Product behavior redesign.
- Replacing rewrite internals in this phase.

Phase 1: Testability Hooks (Accessibility IDs)


Files likely to touch


- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/Views/BottomOverlayView.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/Views/NotchContentViews.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/UI/AISettingsView+AdvancedSettings.swift

IDs to add first


- Prompt chip button
- Prompt menu tab: Dictate
- Prompt menu tab: Edit
- Prompt list row (profile)
- Selected checkmark container
- Right-side mode label
- Context toggle (editor)
- Save button (editor)

Phase 2: UI Smoke Suite (XCUITest)


New target/files


- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidVoiceUITests/FluidVoiceUITests.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidVoiceUITests/PromptPickerSmokeTests.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidVoiceUITests/ModeSwitchSmokeTests.swift

Initial smoke tests


1. Prompt picker tab switch keeps chip/tab/checkmark aligned.
2. Dictate -> Edit live switch updates right-side label to Edit.
3. Edit -> Dictate live switch updates right-side label to Dictate.
4. Command mode entry/exit does not corrupt picker mode state.
5. Prompt selection persists after close/reopen of overlay.

Phase 3: Deterministic UI Test Runtime


Files likely to touch


- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/FluidApp.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/ContentView.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Sources/Fluid/Services/NotchOverlayManager.swift

Additions


- --ui-testing launch argument handling.
- Disable or stub fragile external dependencies in test mode where needed (network/transcription side effects).
- Keep prompt composition logic intact; only remove nondeterminism.

Phase 4: Logic/Concurrency Guard Tests


Files likely to touch


- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidTests/SettingsStorePromptMigrationTests.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidTests/PromptPickerStateSyncTests.swift
- /Users/barathwajanandan/Documents/mac_apps/FluidVoice/Tests/FluidTests/LiveModeSwitchTests.swift

Assertions


- Legacy write/rewrite prompt modes normalize to edit once.
- Normalized state does not re-write storage repeatedly.
- Live switch preserves context when already present.
- Processing guard blocks unsafe mode switch mutations.

CI / Execution


- Add UI smoke job (macOS runner) gated on target branch or label.
- Keep runtime short (<= 3-5 minutes).
- Fail fast on first critical smoke failure.

Performance and Low-Resource Principles


- Prefer small deterministic smoke tests over heavy end-to-end scripts.
- Avoid polling loops and long sleeps; use expectations with short timeouts.
- Reuse shared helpers to reduce startup overhead in tests.

Definition of Done


1. Accessibility IDs exist for all prompt-picker critical controls.
2. Smoke suite passes locally and in CI.
3. No regression to Dictate/Edit/Command user-facing labels.
4. Migration/state sync tests cover known release-risk edges.
5. Test docs include how to run locally.

Local Run Commands (to finalize when branch starts)


- Unit tests: xcodebuild test -project Fluid.xcodeproj -scheme Fluid -destination 'platform=macOS,arch=arm64' -only-testing:FluidTests
- UI tests: xcodebuild test -project Fluid.xcodeproj -scheme Fluid -destination 'platform=macOS,arch=arm64' -only-testing:FluidVoiceUITests

Notes


- Keep internal compatibility symbols (rewrite*) unchanged in this automation branch unless needed for explicit test seams.
- Revisit per-prompt shortcut assignment in a later dedicated branch.

---

CONTRIBUTING

Contributing to FluidVoice

Thanks for taking the time to improve FluidVoice. This repository keeps GitHub Issues focused on actionable work, and uses Discussions for questions, ideas, and early design conversations.

Start with Discussions

Start a GitHub Discussion first when you want to:

- Ask a support question.
- Propose a broad idea or feature.
- Explore a design direction.
- Report behavior that you are not sure is a FluidVoice bug.
- Ask whether a change would be accepted before writing code.

Feature ideas should usually begin in the Ideas discussion category. Maintainers may turn an accepted or prioritized discussion into a tracked issue.

Issues

Issues are for work that maintainers can triage and act on.

Use a bug issue only when you can provide:

- A clear description of the bug.
- Exact reproduction steps.
- Expected behavior and actual behavior.
- FluidVoice version, macOS version, and architecture.
- Logs, crash reports, screenshots, or recordings when relevant.

Feature issues show guidance to start with Discussions first, but this is advisory for now. Maintainers may still redirect broad or unclear feature ideas to Discussions during triage.

Incomplete bug reports may be labeled needs reproduction. If the missing reproduction details are not provided after 14 days, the issue may be closed.

Pull Requests

Pull requests should be tied to an accepted issue, Discussion, or roadmap item. Before opening a PR:

- Fill out every required section of the PR template.
- Select a type of change.
- Link the related issue or accepted Discussion.
- Describe how you tested the change.
- Attach screenshots or video for UI, UX, settings, onboarding, overlay, menu bar, or visual behavior changes.

If a PR has no UI or visual behavior changes, check the "No UI/visual changes" box in the template. The PR Policy workflow still requires screenshots or video when changed files touch visual surfaces.

PRs that do not follow the template will be blocked by the PR Policy check. If required information is still missing after 48 hours, the PR may be closed so maintainers can keep review queues focused.

Repository Settings

Maintainers should enable GitHub Discussions with these categories:

- Ideas
- Help
- General

Maintainers should require the existing build/test check and the PR Policy check before merging to main.

---

README

FluidVoice

<p align="center">
<a href="https://github.com/altic-dev/FluidVoice/stargazers"><img src="https://img.shields.io/github/stars/altic-dev/FluidVoice?style=social" alt="GitHub stars"/></a>
<a href="https://github.com/sponsors/altic-dev"><img src="https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-ea4aaa?logo=githubsponsors&logoColor=white" alt="Sponsor FluidVoice"/></a>
<a href="https://x.com/fluidvoiceapp"><img src="https://img.shields.io/badge/X-%40fluidvoiceapp-black?logo=x&logoColor=white" alt="X @fluidvoiceapp"/></a>
<br />
<a href="https://huggingface.co/nvidia/parakeet_realtime_eou_120m-v1"><img src="https://img.shields.io/badge/Models-Nemotron%20Speech%203.5%20%7C%20Parakeet%20Flash%20%7C%20Parakeet%20v3%20%26%20v2%20%7C%20Cohere%20%7C%20Apple%20Speech%20%7C%20Whisper-blue" alt="Supported Models"/></a>
<br /><br />
<a href="https://trendshift.io/repositories/16601?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-16601" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/16601" alt="altic-dev%2FFluidVoice | Trendshift" width="250" height="55"/></a>
</p>

Open source voice-to-text dictation app for macOS with on-device AI enhancement.

Install with Homebrew: brew install --cask fluidvoice

Manual download: latest release

NOTE

FluidVoice is on macOS today. iOS and Windows are on the way — join the waitlist to get notified when we launch: altic.dev/fluid/waitlist


IMPORTANT

This project is free and open source under GPLv3. If FluidVoice is useful to you, please star the repository — it helps visibility and keeps development going.

---

Support FluidVoice

If FluidVoice helps you, you can support continued development and future platform work for iOS and Windows on GitHub Sponsors.

---

What's New in 1.6.0

- Insanely fast Parakeet — rebuilt Parakeet implementation with pretty much zero delay between speaking and seeing words on screen
- Fluid Intelligence — fully local AI model for on-device dictation enhancement. No cloud, no API keys, no data leaving your Mac
- Better Theming — adaptive light/dark theme with a compact toolbar switcher
- Refreshed Onboarding — language-first voice engine setup, real dictation tryout, and AI enhancement setup in one clean pass

WARNING

Based on early feedback, Fluid Intelligence may cause you to unsubscribe from other dictation apps and save money. You've been warned.

Fluid Intelligence

FluidVoice is fully open source under GPLv3. Fluid Intelligence is a separate, privately maintained local AI runtime that powers advanced on-device dictation enhancement — smart formatting, context-aware capitalization, and post-processing — all running locally on your Mac.

The app works great on its own with any supported speech model and optional cloud AI providers. Fluid Intelligence adds a fully local, private AI layer for users who want on-device enhancement without sending data anywhere.

We're keeping Fluid Intelligence private for now so we can sustainably offer the core dictation experience for free. This may change in the future.

---

Fluid Intelligence Sneak Peek

<table>
<tr>
<td width="50%" align="center"><b>Email Template</b></td>
<td width="50%" align="center"><b>Flowers</b></td>
</tr>
<tr>
<td width="50%"><video src="https://github.com/user-attachments/assets/36747e9d-1ea3-4d27-8d38-eaacb6d57285" width="100%"></video></td>
<td width="50%"><video src="https://github.com/user-attachments/assets/5f6063ab-0506-4687-b825-c7bf4ab66ed6" width="100%"></video></td>
</tr>
<tr>
<td width="50%" align="center"><b>Change Time & Name</b></td>
<td width="50%" align="center"><b>Emoji</b></td>
</tr>
<tr>
<td width="50%"><video src="https://github.com/user-attachments/assets/6c7a7c4c-17a8-453d-8eff-1aa1fa9f6077" width="100%"></video></td>
<td width="50%"><video src="https://github.com/user-attachments/assets/04e00f3d-a602-448d-9bde-50b5e8f61ac6" width="100%"></video></td>
</tr>
<tr>
<td width="50%" align="center"><b>Hyphens & Numbers</b></td>
<td width="50%"></td>
</tr>
<tr>
<td width="50%"><video src="https://github.com/user-attachments/assets/47175f2b-9f06-452e-b892-42488e4ba536" width="100%"></video></td>
<td width="50%"></td>
</tr>
</table>

Demo

Command Mode — Take any action on your Mac using FluidVoice

https://github.com/user-attachments/assets/ffb47afd-1621-432a-bdca-baa4b8526301

Write Mode — Write or rewrite text in any text box in any app

https://github.com/user-attachments/assets/c57ef6d5-f0a1-4a3f-a121-637533442c24

---

Features

- Fluid Intelligence — on-device AI enhancement for smart formatting, context-aware capitalization, and post-processing, all running locally on your Mac with zero data leaving your machine
- Command Mode — control your Mac by voice: launch apps, run shortcuts, trigger system actions, and automate workflows without touching the keyboard
- Write Mode — write or rewrite text directly in any text field across any app. Select text and rewrite it, or dictate new content inline
- Live Preview — real-time transcription overlay with notch support, so you see words appear as you speak
- Multiple Speech Models — Nemotron Speech 3.5, Parakeet Flash, Parakeet TDT v3 & v2, Cohere Transcribe, Apple Speech, and Whisper. Pick the model that fits your language and latency needs
- AI Enhancement — optional post-processing via OpenAI, Groq, custom providers, or local Fluid Intelligence for cleaner, more accurate transcripts
- Audio History — optional local recording history with budget controls and ZIP export, so you can review past dictations without cloud storage
- Today-Usage Stats — daily usage tracking at a glance with a stats header card and toolbar pill
- Adaptive Theming — light/dark theme that follows your system, with a compact toolbar switcher
- Global Hotkey — instant voice capture from anywhere, no app switching needed
- Smart Typing — direct insertion into any app via accessibility APIs for reliable, app-independent text entry
- Menu Bar Integration — quick access, status, and settings from the menu bar
- Auto-Updates — seamless updates with an optional beta channel for early previews
- Per-App Configuration — assign different prompt sets to different apps, so your dictation adapts to whatever you're working in. Fully optional
- Notch-Aware Overlay — transcription overlay that fits cleanly around the MacBook notch, or use a standard overlay if your Mac doesn't have one
- Local-First — your voice and text never leave your machine unless you opt in to a cloud AI provider
- Fastest Parakeet on Mac — one of the fastest native implementations of Parakeet on macOS, with near-instant transcription and minimal latency
- Configurable Overlay — choose from pill-shaped to large overlay sizes to show live preview, or keep it minimal. Everything is optional
- Everything is Optional — AI enhancement, Fluid Intelligence, audio history, analytics, and beta builds are all opt-in. The core dictation experience works out of the box with zero configuration beyond permissions and a hotkey

---

Supported Models

| Model | Best for | Language support | Download size | Hardware |
| --- | --- | --- | --- | --- |
| Nemotron Speech 3.5 — Ultra Fast Low Latency | Streaming-capable multilingual dictation | ~40 languages | ~670 MB | Apple Silicon |
| Nemotron 3.5 Multilingual | Higher-accuracy multilingual dictation | ~40 languages | ~530 MB | Apple Silicon |
| Parakeet Flash (Beta) | Lowest-latency live English dictation | English | ~250 MB | Apple Silicon |
| Parakeet TDT v3 | Fast default multilingual dictation | 25 languages | ~500 MB | Apple Silicon |
| Parakeet TDT v2 | Fastest English-only dictation | English | ~500 MB | Apple Silicon |
| Cohere Transcribe | High-accuracy multilingual dictation | 14 languages | ~1.4 GB | Apple Silicon |
| Apple Speech | Zero-download native macOS speech | System languages | Built-in | Apple Silicon + Intel |
| Whisper Tiny / Base / Small / Medium / Large | Broad compatibility, including Intel Macs | 99 languages | ~75 MB to ~2.9 GB | Apple Silicon + Intel |

Parakeet TDT v3 Languages

Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Russian, Slovak, Slovenian, Spanish, Swedish, and Ukrainian.

Parakeet TDT v2 Languages

English.

Cohere Transcribe Languages

English, French, German, Italian, Spanish, Portuguese, Greek, Dutch, Polish, Mandarin, Japanese, Korean, Vietnamese, and Arabic.

Apple Speech Languages

System language support depends on the macOS speech recognition languages available on your machine.

Whisper Language Support

Whisper supports up to 99 languages, depending on the model size you choose.

---

Quick Start

1. Install with Homebrew:

bash
brew install --cask fluidvoice

Or download the latest release.

2. Grant permissions — FluidVoice will ask for microphone and accessibility access. Both are required for dictation and typing into other apps.

3. Set your hotkey — pick a global hotkey in settings that triggers voice capture from anywhere.

4. Go through onboarding — choose your voice model based on your language and latency needs. Models range from zero-download Apple Speech to high-accuracy Nemotron and Whisper.

5. (Optional) Enable Fluid Intelligence — download the local AI model during onboarding for on-device dictation enhancement. Everything runs locally, no data leaves your Mac.

6. (Optional) Bring your own AI provider — add an OpenAI, Groq, or custom provider API key for cloud-based enhancement. Keys are stored securely in macOS Keychain. Select "Always allow" for key access.

7. (Optional) Opt in to beta buildsSettings → Automatic Updates → Beta Releases for early access to new features.

---

Requirements

- macOS 15.0 (Sequoia) or later
- Apple Silicon Mac for all models
- Intel Macs supported via Whisper models (from 1.5.1+)
- ~1 GB disk space for a voice model
- ~3.5 GB disk space for the Fluid Intelligence model (optional)
- Microphone access
- Accessibility permissions for typing

---

Building from Source

bash
git clone https://github.com/altic-dev/FluidVoice.git
cd FluidVoice
open Fluid.xcodeproj

Build and run in Xcode. All dependencies are managed via Swift Package Manager.

Run a signed Debug build using the script:

bash
./build.sh

The signed build is written to DerivedData/Build/Products/Debug/FluidVoice Debug.app.
Keep launching that product after each rebuild so macOS can preserve its Accessibility
authorization.

For CI or contributors who do not have a signing identity, use the explicit unsigned
fallback:

bash
./build.sh unsigned

Unsigned builds are tied to a specific executable version and may require Accessibility
permission to be removed and granted again after rebuilding.

---

Contributing

Contributions are welcome! Please create an issue first to discuss major changes before submitting a pull request.

Development Setup

1. Clone and open in Xcode as above.
2. Signing: FluidVoice → Signing & Capabilities → Automatically manage signing → pick your Team (Personal Team is fine). If you have certificates for multiple teams, select one without changing the project by running FLUIDVOICE_DEVELOPMENT_TEAM=YOUR_TEAM_ID ./build.sh.
3. Build and run — SPM handles dependencies.
4. (Optional) Pre-commit hook to prevent accidental team ID commits:

bash
cp scripts/check-team-id.sh .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

Pull Request Guidelines

- One feature or fix per PR — keep changes focused and atomic
- Create an issue first so work is trackable before review
- Discuss non-trivial changes before opening a PR
- Follow the PR template
- Test thoroughly on your machine
- Never commit personal team IDs or API keys
- Check git diff before committing

---

Run Integration Tests

bash
xcodebuild test -project Fluid.xcodeproj -scheme Fluid -destination 'platform=macOS'

CI uses unsigned builds:

bash
xcodebuild test -project Fluid.xcodeproj -scheme Fluid -destination 'platform=macOS' CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO

---

Privacy & Analytics

FluidVoice is local-first. Your voice, audio, and transcribed text never leave your machine unless you explicitly opt in to a cloud AI provider.

What's Collected (Opt-In)

Anonymous analytics are enabled by default to track app health and feature usage. You can disable at any time from Settings → Share Anonymous Analytics.

Collected:

- App version, build, macOS version
- Low-cardinality feature/config flags (e.g. app mode, major settings)
- Approximate usage ranges (not exact values)
- High-level success/error outcomes

Not Collected:

- Voice, raw audio, or transcribed text
- Selected text, prompts, or AI responses
- Terminal commands, window titles, file paths, clipboard, or typed content
- Any personal or private information

---

Community

Join our Discord: https://discord.gg/VUPHaKSvYV

Follow development on X: @fluidvoiceapp

---

License

From 2026-02-23 onward, this project is licensed under the GNU General Public License, Version 3.0 (GPLv3).

Versions published before this date were licensed under Apache License 2.0.

---