Skip to content

nesquikm/duckmouth

Repository files navigation

Duckmouth

macOS speech-to-text app that lives in your menu bar. Record speech, transcribe it via any OpenAI-compatible API, optionally polish the result with an LLM, and get the text where you need it — clipboard, cursor, or both.

Built with Flutter & Dart using dev-process-toolkit — a spec-driven development workflow for Claude Code.

Main window — recording and transcription Settings — provider configuration

Transcription history In-app log viewer

Features

Speech-to-Text — Record from your mic and transcribe using OpenAI, Groq, or any compatible endpoint. Dynamic model discovery fetches available models automatically.

LLM Post-Processing — Optionally run transcriptions through an LLM to fix grammar, summarize, translate, reformat, or apply a custom prompt. Supports OpenAI, Groq, xAI (Grok), Google Gemini, and OpenRouter.

Smart Text Output — Copy to clipboard, paste at cursor via Accessibility API (with automatic fallback chain), or both. No clipboard clobbering.

Global Hotkeys — Push-to-talk or toggle mode with any key combo. Works system-wide.

Menu Bar — Sits in your menu bar with a status icon that changes while recording. Quick access to recent transcriptions without opening the full window.

Transcription History — Persistent list of past transcriptions with timestamps. Click to copy, swipe to delete.

Sound Feedback — Distinct sounds for recording start, stop, and transcription complete. Per-sound volume control with preview.

In-App Log Viewer — Built-in structured logging with real-time viewer, powered by the_logger and the_logger_viewer_widget. Filterable by level, logger name, and search text.

Auto-Save Settings — Changes persist immediately. No save button needed.

Supported Providers

Provider STT LLM Default Model
OpenAI yes yes whisper-1 / gpt-5.4-mini
Groq yes yes whisper-large-v3-turbo / llama-3.3-70b-versatile
xAI (Grok) -- yes grok-4-1-fast-non-reasoning
Google Gemini -- yes gemini-3-flash
OpenRouter -- yes openrouter/auto
Custom yes yes user-defined

Install

Homebrew (recommended)

brew tap nesquikm/duckmouth
brew install duckmouth

Manual (DMG)

Download the latest DMG from Releases, open it, and drag Duckmouth to Applications. Then strip the quarantine attribute (required for unsigned apps):

xattr -dr com.apple.quarantine /Applications/Duckmouth.app

Universal binary — works on both Apple Silicon (arm64) and Intel (x86_64).

Development

Prerequisites

Build & Run

# Install dependencies
fvm flutter pub get

# Run in debug mode
fvm flutter run -d macos

# Build release
fvm flutter build macos

# Build DMG for distribution
./scripts/build_dmg.sh

Test

fvm flutter test

Lint

fvm flutter analyze

Audio Formats

  • WAV (16kHz 16-bit mono) — maximum compatibility (default)
  • FLAC (16kHz mono)
  • AAC (32-64kbps) — smaller files
  • Opus (OGG)

Architecture

Feature-first structure with BLoC/Cubit state management and repository pattern:

lib/
├── app/              # App shell, routing, theme, menu bar
├── features/         # Feature modules
│   ├── recording/    # Audio capture
│   ├── transcription/# STT pipeline
│   ├── post_processing/ # LLM post-processing
│   ├── settings/     # Configuration UI & persistence
│   ├── history/      # Transcription history
│   └── hotkey/       # Global keyboard shortcuts
├── core/             # API clients, services, DI
└── main.dart

Built With

License

MIT

About

macOS speech-to-text app. Record, transcribe via OpenAI-compatible APIs, post-process with LLMs. Menu bar integration, global hotkeys, multi-provider support (OpenAI, Groq, xAI, Gemini, OpenRouter).

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages