blitzbot Menubar-App Logo mit Blitz-Icon und Waveform auf dunklem Hintergrund
Apple - OSX

blitzbot: Eigene Speech-to-Text App für macOS mit Claude Code gebaut

Ich diktiere seit zwei Wochen meine LinkedIn-Posts, E-Mails, Slack-Nachrichten und Git-Commit-Messages — statt sie zu tippen. Dahinter steckt blitzbot, eine eigene Speech-to-Text-App für macOS, die ich übers Wochenende gebaut habe. Sie sitzt in der Menüleiste, ich drücke einen Hotkey, rede, drücke den Hotkey wieder — und der Text landet genau dort, wo gerade der Cursor steht. Lokales Whisper, optional Claude zur Glättung, Open Source.

Der Anstoß kam von einem Video von Christoph Magnussen, in dem er seine eigene Variante baut und am Ende ausdrücklich sagt: es geht ihm nicht darum, dass möglichst viele seine App benutzen, sondern dass möglichst viele selber eine bauen — von Tooltouristen zu Anwendungsweltmeistern. Genau dieser Satz hat mich abgeholt. Also habe ich nicht seinen Code genommen, sondern eine eigene Variante geschrieben, mit eigenem Namen, eigener Architektur und ein paar Modi, die ich selbst vermisst habe.

Was ist neu in v1.1.0

Das aktuelle Release bringt drei Neuerungen, die ich im Alltag als echte Verbesserung merke:

Verbindungs-Profile

Bisher war genau ein LLM-Endpunkt einstellbar. Ab v1.1.0 lassen sich mehrere Verbindungs-Profile anlegen — für Anthropic, OpenAI, Ollama oder einen eigenen Proxy — und per Schnell-Umschalter im Menü zwischen ihnen wechseln. Wer Claude Code nutzt, kann bestehende Konfigurationen automatisch importieren lassen; blitzbot findet sie selbst. Das ist vor allem praktisch, wenn man je nach Aufgabe zwischen einem lokalen Modell (Ollama, komplett offline) und einem Cloud-Modell wechseln will.

Kein Keychain-Passwort-Dialog mehr

Ein lästiges Detail der alten Version: macOS hat bei jedem API-Key-Zugriff einen Passwort-Dialog gezeigt — weil der Key im falschen Keychain-Bereich lag. Ab v1.1.0 landen alle Keys im Data-Protection-Keychain. macOS fragt nie mehr nach. Bestehende Keys werden beim ersten Start automatisch migriert.

Einstellungsfenster vergrößerbar

Das Einstellungsfenster hatte eine feste Größe. Wer viele eigene System-Prompts pflegt oder mehrere Verbindungs-Profile einrichtet, hat schnell wenig Platz. Ab v1.1.0 lässt sich das Fenster frei in der Größe ziehen.

Das vollständige Release gibt es auf GitHub: github.com/mosandlt/BlitzBot/releases/tag/v1.1.0


Was blitzbot tatsächlich macht

blitzbot ist eine unscheinbare Menubar-App. Kein Dock-Eintrag, kein Fenster im Weg. Oben rechts ein Blitz-Symbol. Ablauf:

  1. Cursor in die Ziel-App setzen — Mail, LinkedIn im Browser, Slack, iMessage, Notes, Terminal, IDE, egal was.
  2. Globalen Hotkey drücken (z. B. ⌘⌥1).
  3. Ein kleines Floating-HUD erscheint in der Bildmitte: Modus-Badge, Timer, Live-Waveform, Status.
  4. Reden.
  5. Hotkey nochmal drücken — oder Stop-Button im HUD klicken.
  6. Nach ein bis drei Sekunden pastet der Text per simuliertem Cmd+V in die fokussierte App.

Das ganze hat fünf Modi, die sich per Hotkey ansteuern lassen — und während der Aufnahme kann ich den Modus sogar wechseln, ohne zu stoppen. Wenn ich also halb durch einen Satz merke, der ist doch eher Business-Mail als Slack-Nachricht, drücke ich den Business-Hotkey und der gesamte Text wird am Ende entsprechend verarbeitet.

Die fünf Modi

ModusHotkeyTaglineWas passiert
Normal⌘⌥1Sprache rein. Text raus.Reine Whisper-Transkription, ohne Cloud-Call. Null Kosten, voll offline.
Business⌘⌥2Sprache rein. Businesstauglich raus.Claude glättet zu einer klaren, höflichen, strukturierten Business-Formulierung — für Mails, Kundenantworten, LinkedIn-Posts.
Plus⌘⌥3Geschrieben sprechen.Füllwörter raus, Grammatik glatt — aber meine Stimme bleibt. Kein Business-Makeover.
Rage⌘⌥4Frust rein. Entspannt raus.Beleidigungen und aggressiver Ton weg, inhaltliche Kritik bleibt scharf. Gut für wütende E-Mails, die man nicht bereuen will.
Emoji⌘⌥5Sprache rein. Text mit Emojis raus.Original 1:1, mit dezent eingestreuten Emojis (etwa eins pro 1–2 Sätze).

Alle Hotkeys sind frei belegbar, die System-Prompts pro Modus in den Einstellungen editierbar, und eine Vokabular-Liste wird Whisper als Kontext mitgegeben — damit Eigennamen, Marken und Fachbegriffe nicht phonetisch zerlegt werden.

Wie die Architektur läuft

Das Wichtigste vorweg: Audio verlässt niemals den Rechner. Die Transkription passiert lokal mit whisper.cpp (Modell: ggml-large-v3-turbo, rund 1,5 GB). Im Normal-Modus gibt es überhaupt keinen Netzwerk-Call. Nur bei den vier Glättungs-Modi wird der fertig transkribierte Text — also reiner Plain-Text, keine Sprachdatei — an die Anthropic-API geschickt.

Mikrofon
   ↓
AVAudioEngine ──► /tmp/blitzbot-<uuid>.wav   (ephemeral, nach Transkription geloescht)
   ↓
whisper-cli (lokal, offline, kein Netzwerk)
   ↓
Text
   ↓
Mode-Router:
   ├─ Normal   → Text direkt
   ├─ Business → Claude-API-Call
   ├─ Plus     → Claude-API-Call
   ├─ Rage     → Claude-API-Call
   └─ Emoji    → Claude-API-Call
   ↓
NSPasteboard + simuliertes Cmd+V in die aktive App

Der API-Key liegt in der macOS-Keychain — nie in einer Datei, nie in Git. Wer Claude gar nicht will, nutzt einfach nur den Normal-Modus und kommt komplett ohne Cloud aus. Ein typisches Diktat kostet rund ein halben Cent (200 Tokens Input × Sonnet-Preise); den ganzen Tag diktieren landet im Cent-Bereich.

Was mir technisch wichtig war

  • Swift + SwiftUI, ein einzelnes Swift Package, kein Xcode-Projekt. swift build -c release reicht.
  • Menubar-App via MenuBarExtra mit LSUIElement, kein Dock-Eintrag.
  • Floating-HUD als NSPanel mit .nonactivatingPanel — das Fenster klaut keinen Fokus, auch wenn ich mitten im Reden auf einen Mode-Pill oder den Stop-Button klicke.
  • Hotkeys über Sindre Sorhus‘ KeyboardShortcuts-Package. Seit v1.0.1 auto-migrierbare Bindings.
  • Auto-Updater direkt eingebaut — zieht neue Versionen aus den GitHub-Releases.
  • Deutsch und Englisch als UI-Sprachen, je nach System-Setting.

Download und Installation

Aktuelle Version ist v1.1.0. Voraussetzung: macOS 13 (Ventura) oder neuer, Apple Silicon. Intel habe ich nicht getestet.

  • Fertiges Release: github.com/mosandlt/BlitzBot/releases.zip ziehen, blitzbot.app nach /Applications.
  • Selbst bauen: Repo klonen, ./setup-whisper.sh holt Whisper + Modell via Homebrew, dann ./build-app.sh.
  • API-Key: Nur für die Glättungs-Modi. console.anthropic.com → Key erzeugen → in blitzbot unter Einstellungen → Allgemein einfügen.

Beim ersten Start läuft ein Setup-Wizard durch, der Mikrofon- und Bedienungshilfen-Berechtigungen prüft und wenn nötig direkt in die richtigen Systemeinstellungen springt.

Warum nur macOS — und was das für iOS, Windows, Linux heißt

Die Kernfunktion — Hotkey drücken, reden, Text landet in irgendeiner anderen App — funktioniert so nur auf dem Mac. macOS erlaubt Apps (mit expliziter Bedienungshilfen-Berechtigung) synthetische Tastatureingaben an die aktive Anwendung zu schicken. iOS verbietet das grundsätzlich. Dort ist Auto-Paste in eine andere App architektonisch nicht vorgesehen — eine iOS-Version von blitzbot wäre eine ganz andere App-Kategorie (Diktiergerät mit Share-Sheet-Export), kein echter Port. Die Analyse und die Gründe stehen ausführlich in der README des Repos.

Für Windows und Linux wäre eine eigene Variante bauen — in Tauri, WinUI 3 oder GTK4 — technisch machbar. Ich selbst werde diese Ports nicht pflegen, weil mir die Geräte zum Testen fehlen, aber die README skizziert, wie so ein Schwester-Projekt aussehen könnte. Pull Requests und Fork-Hinweise verlinke ich gerne.

Open Source, MIT, Pull Requests willkommen

Der komplette Code liegt unter github.com/mosandlt/BlitzBot unter MIT-Lizenz. Wer Feedback, Ideen oder einen Fix hat: Issue aufmachen. Felder, in denen ich besonders gerne Hilfe annehmen würde: Push-to-Talk als Alternative zum Toggle, Intel-x86_64-Build, Apple-Notarisierung, zusätzliche Sprachen, und ein Translate-Modus (diktiere auf Deutsch, lass Claude auf Englisch rausgeben).

Changelog

VersionÄnderung
v1.1.0 (2026-04)Verbindungs-Profile: mehrere LLM-Endpunkte (Anthropic, OpenAI, Ollama, eigener Proxy) mit Schnell-Umschalter und Auto-Import aus Claude-Code-Configs. Keychain-Migration auf Data-Protection-Keychain (kein Passwort-Dialog mehr). Einstellungsfenster frei in der Größe ziehbar. Release auf GitHub
v1.0.10Services rausgenommen (Gatekeeper blockt self-signed Apps). Neuer Hotkey ⌘⌥0: liest markierten Text via Bedienungshilfen, schreibt ihn im Default-Modus um.
v1.0.9macOS Services: Rechtsklick → Dienste → blitzbot — in v1.0.10 entfernt wegen Gatekeeper-Inkompatibilität
v1.0.8Wellenform-Amplitude deutlich erhöht (4,5× Gain, geclampt auf ±1)
v1.0.7Multi-LLM: Anthropic/OpenAI/Ollama, Provider-Picker in den Einstellungen
v1.0.6Echte PCM-Wellenform im HUD (Canvas-Rendering), immer gelb während der Aufnahme. Auto-Stop-Countdown auf 60 Sekunden erhöht. „Stimme erkannt“-Badge mit korrekter Pegel-Erkennung. HUD-Höhe stabil (kein Layout-Sprung mehr). Sicherheits-Audit: API-Fehler werden nutzerseitig zusammengefasst, kein Raw-Response-Logging.
v1.0.5Release-Pipeline (ad-hoc ZIP), Gatekeeper-Workaround-Docs, bilingual Release Notes (DE + EN)
v1.0.4Fix: englischer Input → englischer Output (customPrompts korrekt getrennt von Defaults)
v1.0.3Modus 6 „AI Command“ → „Prompt“ (Prompt-Optimizer); Content-basierte Spracherkennung als Whisper-Override
v1.0.26. Modus, automatische Sprach-Erkennung (DE/EN), manueller Override
v1.0.1HUD Mode-Switcher + Stop-Button, Cmd+Q-Fix, Settings-UI mit Icon-Toolbar, Hotkey-Migration
v1.0.0Initiales Release: 5 Modi, Floating-HUD, Vokabular, Auto-Updater

Wer an ähnlichen Claude-basierten Projekten interessiert ist: mein Signal-AI-Bot nutzt ebenfalls die Anthropic-API, um das Smart Home per Nachricht zu steuern — siehe Home Assistant Signal AI Bot mit Claude. Und falls euch produktivitätsseitig macOS-Tricks interessieren: iTerm2 effektiv nutzen ist mein alter Evergreen dazu.

Feedback gerne per Kontaktformular. Viel Spaß beim Diktieren — und falls ihr selber eine bauen wollt: ja, macht das. Darum geht es ja eigentlich.