Steno
macOS TUI for real-time speech-to-text transcription using Apple's Speech framework
Ask AI about Steno
Powered by Claude Β· Grounded in docs
I know everything about Steno. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Steno
A fast, private speech-to-text TUI for macOS.
Steno uses Apple's SpeechAnalyzer API (macOS 26) for real-time transcription that runs entirely on-device. No cloud services, no API keys, no rate limits.

Requirements
- macOS 26 (Tahoe) or later
- Apple Silicon (arm64)
- Microphone access
Install
Download (recommended)
Download the latest release from GitHub Releases:
# Download and extract
curl -LO https://github.com/jwulff/steno/releases/latest/download/steno-darwin-arm64.tar.gz
tar xzf steno-darwin-arm64.tar.gz
# Install to ~/.local/bin (make sure it's in your PATH)
mkdir -p ~/.local/bin
mv steno steno-daemon ~/.local/bin/
From source
Requires Swift 6.2+ and Go 1.24+.
git clone https://github.com/jwulff/steno.git
cd steno
make install # Builds, signs, and installs to ~/.local/bin
Usage
steno # Launch TUI β auto-starts the daemon
steno --mcp # Run as MCP stdio server (for Claude Desktop, etc.)
That's it. Running steno automatically starts the daemon in the background if it isn't already running. The daemon survives after you quit the TUI β it keeps recording and persisting transcripts to SQLite.
Controls
| Key | Action |
|---|---|
Space | Start/stop recording |
i | Cycle input devices |
a | Toggle system audio capture |
Tab | Switch panel focus (topics/transcript) |
j/k | Navigate topics |
Enter | Expand/collapse topic |
Up/Down | Scroll transcript |
q | Quit |
MCP Server
Steno includes a built-in MCP server for querying your transcript database from AI tools like Claude Desktop.
Add to your MCP client config:
{
"mcpServers": {
"steno": {
"command": "steno",
"args": ["--mcp"]
}
}
}
Available tools: get_overview, list_sessions, get_session, get_transcript, search.
Daemon Management
The daemon runs as a background process. You can also manage it independently:
steno-daemon run # Run daemon in foreground
steno-daemon status # Check if daemon is running
steno-daemon install # Install as launchd service (auto-start on login)
steno-daemon uninstall # Remove launchd service
How It Works
Steno uses the SpeechAnalyzer API introduced in macOS 26, which provides:
- On-device processing β your audio never leaves your Mac
- Low latency β real-time transcription as you speak
- High accuracy β 55% faster than Whisper Large V3 Turbo in Apple's benchmarks
Architecture
Steno is a two-process system: a Swift daemon handles audio capture and speech recognition, while a Go binary provides the TUI and MCP server.
βββββββββββββββββββ Unix socket ββββββββββββββββββββββββ
β steno ββββββ NDJSON commands βββββββββΊβ steno-daemon β
β (Go) ββββββ NDJSON events βββββββββββΊβ (Swift) β
β β β β
β - TUI display β β - Microphone captureβ
β - MCP server β SQLite (read-only) β - System audio β
β - Daemon mgmt ββββββββββββββββββββββββββββββββΊβ - SpeechAnalyzer β
β - Level meters β β - Topic extraction β
βββββββββββββββββββ β - Segment storage β
ββββββββββββββββββββββββ
steno(Go) β TUI + MCP server + daemon lifecycle management. Connects to the daemon via Unix socket, reads topics from SQLite.steno-daemon(Swift) β Captures mic + system audio via ScreenCaptureKit, runs SpeechAnalyzer/SpeechTranscriber, persists segments to SQLite (GRDB), extracts topics via on-device LLMs.
Project Structure
steno/
βββ daemon/ # Swift daemon (steno-daemon)
β βββ Package.swift
β βββ Sources/StenoDaemon/
β β βββ Audio/ # Mic + system audio capture
β β βββ Commands/ # CLI subcommands (run, status, install)
β β βββ Dispatch/ # Command dispatcher, event broadcaster
β β βββ Engine/ # Recording engine, speech recognizer
β β βββ Infrastructure/ # Paths, PID file, signal handling
β β βββ Models/ # Domain models
β β βββ Permissions/ # TCC permission checks
β β βββ Services/ # Summarization, topic extraction
β β βββ Socket/ # Unix socket server, NDJSON protocol
β β βββ Storage/ # SQLite via GRDB
β βββ Tests/StenoDaemonTests/
βββ cmd/steno/ # Go binary (steno)
β βββ go.mod
β βββ main.go # Entry point: --mcp flag dispatches mode
β βββ internal/
β βββ app/ # Bubbletea TUI model, messages, keybindings
β βββ daemon/ # Socket client, protocol types, lifecycle manager
β βββ db/ # SQLite read-only queries (shared by TUI + MCP)
β βββ mcp/ # MCP tool handlers
β βββ ui/ # Lipgloss styles
βββ schema/ # SQLite schema contract
Development
make build # Build daemon (release) + steno
make test # Run all test suites (daemon + steno)
make test-daemon # Daemon tests only (Swift)
make test-steno # Steno tests only (Go)
make run-daemon # Build, sign, and run daemon (debug)
make run-steno # Build and run TUI
make run-mcp # Build and run MCP server
make clean # Remove all build artifacts
make install # Install to ~/.local/bin (override with PREFIX=)
See CLAUDE.md for development conventions.
License
MIT
