Eigenes Werkzeug · Voice-to-Text → Sprach-Agent · lokal-first

Eine Taste.
Und ich spreche.

Murmel begann als mein selbst gebautes Wispr-Flow-Pendant für macOS: fn-Taste halten, sprechen, loslassen — der Text landet dort, wo der Cursor steht. Inzwischen ist mehr daraus geworden: „Hey Murmel" öffnet einen sprechenden Assistenten, der lokal denkt, meine eigenen Daten kennt und echte Werkzeuge bedient. Der Kern bleibt auf dem Mac, kein Abo — online geht es nur auf Ansage.

Die System-Galaxie → Bedienungsanleitung → Die Reise ↓
Swift 6.2 · 11.569 Zeilen · native macOS whisper.cpp · large-v3-turbo Ollama · qwen3:8b 106 Commits · seit 21.06.
Murmel läuft: das Menüleisten-Panel über dem Terminal, in dem es gebaut wurde
// Murmel live auf dem Mac — Panel in der Menüleiste, darunter das Terminal, in dem es entstand
Die Geschichte

Aus Ärger wurde eine App.

Heute hat es mich wirklich geärgert, dass ich für ein Diktier-Tool nochmal 15 € im Monat zahlen soll. Und dann kam der Gedanke: Ich habe ein Mikrofon. Ich habe Claude Code. Ich habe im Prinzip alles, was ich brauche.

Was ich brauche, muss ich auch selbst bauen können. Also habe ich angefangen — und fünf Stunden später lief eine fertige, funktionierende App. Komplett nativ auf macOS, kein Abo, kein fremder Server, mein Audio bleibt auf meinem Rechner.

Das ist für mich der Kern von Vibe Coding: nicht warten, bis es jemand baut. Klar werden, was man will — und es bauen.

„Was ich brauche, muss ich auch selbst bauen können.“
// 15 €/Monat gespart · 5 Stunden investiert · 1 eigene App
Die Reise

Vom Diktier-Tool zum Agenten — in 13 Tagen.

Murmel ist nicht als großes Projekt geplant worden. Es ist gewachsen — jede Scheibe gebaut, installiert, benutzt, dann die nächste. Das ist der komplette Flow:

21.06. · Tag 1

v0.1 in fünf Stunden

Aus dem Ärger über 15 €/Monat Abo wird eine App: fn halten → whisper.cpp → Politur → ⌘V. Acht KI-Agents bauen parallel, zwei echte Bugs werden systematisch gejagt.

22.06. · Streaming

Live-Vorschau & Feinschliff

Ein residenter whisper-server macht die Vorschau ~3× schneller — der Text läuft schon beim Sprechen mit. Dazu: Stil-Automatik je App, eigenes Wörterbuch, In-App-Ersteinrichtung.

23.06. · Stimme

Murmel spricht

Gesprächs-Modus auf der rechten ⌥-Taste: Frage sprechen, Antwort hören — mit lokaler Stimme. Notion wird als erste Wissens-Quelle angebunden.

24.06. · Wissen

Murmel liest meine Daten

Der lokale Wissens-Index füllt sich: 1.975 Dateien, 58.009 Text-Stücke — komplett auf dem Mac eingebettet, kein Byte in der Cloud.

30.06.–01.07. · Der Sprung

Der Agent-Leap

„Hey Murmel" wird zum Agenten: Tool-Calling (Termine, Timer, OCR, Dateien …), RAG-Rebuild mit Hybrid-Suche und Quellen-Zitaten über ~83.000 Chunks, eigenes Antwort-Fenster.

02.07. · Brücken

Fenster & Brücken

Chat-Fenster mit Markdown und Wort-für-Wort-Streaming, Bild-Werkzeug, n8n-Gateway als einzige Tür nach draußen — und der Telegram-Bot @murmel2go_bot geht online.

03.07. · Tempo

Stimme & Tempo

Seraphina wird Murmels Stimme, das Gespräch wird freihändig. Warm-up beim Start: erste Antwort in 5 s statt 38. Cloud-Wissensindex in Supabase, nachts um 04:30 frisch synchronisiert.

05.07. · Der nächste Horizont

Vom Agenten zum Business-Cockpit

Aus dem Assistenten wird ein System: die Architektur für ein eigenes, autarkes CRM steht — Datenkern, Offline-Härtung, und Kommunikation, die von selbst ins CRM fließt. Gerade im Bau.

01 Was es ist

Sprechen statt tippen — überall auf dem Mac.

Ich wollte im Terminal per Stimme schreiben, ohne ein Abo-Tool, dem mein Audio in die Cloud wandert. Also habe ich es selbst gebaut: eine kleine Menüleisten-App, die zuhört, solange ich eine Taste halte.

Das Gesprochene wird lokal von whisper.cpp transkribiert, optional von einem lokalen LLM (Ollama) aufgeräumt und per ⌘V ins aktive Fenster eingefügt — Terminal, Browser, Mail, egal.

Kein Byte Audio verlässt den Rechner. Standard ist „Roh": genau das gesprochene Wort, kein Modell, das dazwischenfunkt.

murmel · gesprochen → eingefügt
# ein Take, Deutsch + Englisch gemischt
you> „…sowohl prompten als auch colloquial, English as well, you should get everything.“
exakt so eingefügt — Code-Switching, Zeichensetzung, alles korrekt
02 Der Fluss

Vier Stationen, ein Knopfdruck — klick dich durch.

Von der gehaltenen Taste bis zum Text im Fenster. Tippe oder hover über eine Station.

murmel · station-detail
# Station 01 — Aufnahme, solange die Taste hält
hotkey> fn gedrückt → AVAudioEngine nimmt auf (16 kHz Mono)
globaler Push-to-talk via CGEventTap
# Station 02 — lokale Spracherkennung
whisper> large-v3-turbo --lang de
offline auf Apple Silicon, Deutsch + Englisch gemischt
# Station 03 — optionale KI-Politur
ollama> qwen2.5:3b # strikt: nur korrigieren, nie antworten
Stil-Modi (E-Mail / Code / Prompt) · Fallback auf Rohtext
# Station 04 — ins aktive Fenster
insert> ⌘V → Terminal · Browser · Mail · überall
Zwischenablage + synthetischer Tastendruck
03 Was es kann

Nicht nur Diktat — ein Werkzeug.

Über das reine Sprechen hinaus: alles, was ein Wispr-Flow-Workflow braucht — selbst gebaut, lokal.

push-to-talk

Taste halten

fn (oder rechte ⌥) halten = Aufnahme, loslassen = einfügen. Wie ein Walkie-Talkie.

privacy

100% lokal

Whisper läuft auf dem Mac. Kein Byte Audio geht ins Netz, keine laufenden Kosten.

stil-modi

Stil-Modi

Roh · E-Mail · Code-Kommentar · Claude-Prompt — die lokale Politur passt Ton & Form an.

wörterbuch

Eigenes Wörterbuch

Fachbegriffe und Namen korrekt geschrieben — pflegbar über eine eigene UI im Fenster.

„n acht n“ → n8n
verlauf

Diktat-Verlauf

Alle Diktate durchsuchbar (SQLite), per Klick erneut einfügen.

sprachbefehle

Sprachbefehle

„neue Zeile“, „Punkt“, „abbrechen“ werden als Aktion erkannt — nicht wörtlich getippt.

live · streaming

Live-Vorschau

Beim Sprechen läuft der Text fortlaufend in einem schwebenden Overlay mit — schnelles base-Modell, finale Einfügung akkurat mit large-v3-turbo.

übersetzer

Diktat-Übersetzer

Modi „→ Englisch“ / „→ Deutsch“: Deutsch sprechen, übersetzt eingefügt — lokal via Ollama/Qwen.

DE → EN, lokal
befehl

Befehl (Zwischenablage)

Text kopieren, Anweisung sprechen („mach förmlich“, „als Bullet-Liste“) — der kopierte Text wird umgewandelt.

assistent

Assistent & Zusammenfassen

Frage sprechen → Antwort eingefügt; oder langes Diktat → knappe Zusammenfassung. Mini-LLM direkt am Cursor.

auto-wörterbuch

KI-Wörterbuch-Vorschläge

Ollama findet aus dem Verlauf falsch gehörte Fachbegriffe und schlägt Korrektur-Paare vor — ein Klick übernimmt.

aus Verlauf gelernt
„Okay, das wird jetzt ein längerer Test für meine neue Murmel-App … sowohl prompten als auch colloquial, English as well, you should get everything.“
// ein Take · Deutsch + Englisch gemischt · 1:1 eingefügt
Hey Murmel · Der Agent

Zwei Worte — und aus Diktat wird Handlung.

Sage ich mitten im Diktat „Hey Murmel", öffnet sich ein eigenes Chat-Fenster: Markdown-Antworten, Streaming Wort für Wort, Weiterfragen per Mikro-Button. Dahinter arbeitet qwen3:8b lokal — und ruft echte Werkzeuge auf, statt nur zu reden.

hey murmel · tool-calling, lokal
you> „Hey Murmel, erinnere mich morgen um 9 an den Anruf mit der Bank"
 Absicht erkannt: erinnerung_anlegen  (deutscher Datums-Parser: „morgen um 9")
 Apple Erinnerungen: ✓ angelegt  # via AppleScript, ohne Cloud
murmel> Erledigt — morgen, 09:00: „Anruf mit der Bank".
termine · erinnerungen

Kalender & Aufgaben

Termine lesen, Erinnerungen anlegen — „morgen", „Freitag", „in 20 Minuten" werden verstanden.

exakt

Rechnen · Timer · Wecker

Exakter Parser statt LLM-Raten. Timer laufen als echte macOS-Benachrichtigungen.

sehen

Screenshot → OCR

Apple Vision liest den Bildschirm in den Chat. Auch angehängte PDFs und Bilder werden gelesen.

system

Apps & Dateien öffnen

„Öffne Terminal" · „öffne die Rechnung von gestern" — 14+ Apps per Zuruf, Spotlight-Suche inklusive.

gedächtnis

Zwischenablage & Terminal

Durchsucht den Kopier-Verlauf — und beantwortet „was haben wir im Terminal besprochen?".

ausgabe-wege

Als E-Mail, WhatsApp, Datei

Antworten app-bewusst formatiert weitergeben: RTF für Mail, *fett* für Messenger, Markdown als Datei.

opt-in · online

Bilder auf Zuruf

„Erstelle ein Bild von …" → gpt-image-2, PNG nach ~/Documents/Murmel. Nur mit eigenem Key, nur wenn gewollt.

opt-in · gateway

n8n auslösen

EIN Webhook als Brücke für alles Externe — Notion-Notizen, Workflows. Offline? Murmel arbeitet lokal weiter.

geerdet

Erfindet nichts

Harte Regel gegen Halluzination: Relevanz-Schwelle im RAG, isoliertes Gedächtnis pro Sitzung, Persona kennt ihre echten Fähigkeiten.

Gespräch & Stimme

Einmal die Taste halten — dann freihändig reden.

Rechte ⌥-Taste einmal halten, Frage sprechen — und danach hört Murmel nach jeder Antwort automatisch weiter zu. Eine Sprechpause beendet die Frage, ein „danke, das war's" beendet das Gespräch.

Damit sich das nach Gespräch anfühlt statt nach Warteschleife: Der erste Satz erklingt, während der Rest noch entsteht, die nächste Sprachausgabe wird vorbereitet, während die aktuelle spricht — und kleine Füll-Laute („Mhm.") überbrücken die Denk-Sekunde.

Die Stimme: „Seraphina", eine neuronale Stimme via edge-tts — die bewusste Lokal-first-Ausnahme, online und jederzeit abschaltbar. Ohne Netz übernimmt automatisch die beste installierte System-Stimme: Das Gespräch funktioniert komplett offline.

„Füller sofort, erster Satz nach zwei, drei Sekunden — und die erste Frage nach dem Start antwortet in 5 Sekunden statt 38.“
// Latenz-Programm 03.07. · Warm-up beim Start · Satz-Stream · TTS-Prefetch — gemessen, nicht geraten
RAG · Das Gedächtnis

Frag deine eigenen Daten — mit Quellen-Zitat.

Murmel beantwortet nicht nur aus dem Allgemeinwissen des Modells, sondern aus meinen eigenen Dateien und Diktaten~83.000 Text-Stücke, lokal indexiert. Seit dem Agent-Leap sucht eine Hybrid-Suche (Volltext + Vektor), und jede Antwort nennt ihre Quelle: Datei · Abschnitt. Komplett auf dem Mac.

was ist das

RAG, einfach erklärt

Retrieval-Augmented Generation = „erst nachschlagen, dann antworten". Statt nur aus dem Training zu raten, holt Murmel die passenden Stellen aus deinen Daten und gibt sie dem Modell als Kontext mit.

hybrid-suche

Volltext + Vektor, fusioniert

SQLite FTS5 (BM25) findet exakte Begriffe, die Vektor-Suche findet Bedeutung — Reciprocal Rank Fusion kombiniert beides. Ein Eval-Harness misst die Treffer-Qualität.

100% lokal

Kein Byte in die Cloud

Embeddings via nomic-embed-text (lokal in Ollama), Index in SQLite, Antwort via Qwen. Privat, offline, 0 € — auch deine Daten bleiben bei dir.

so läuft eine wissens-anfrage
you> „Hey Murmel, was steht in meiner LinkedIn-Strategie zu Hooks?"
  1. Volltext-Suche FTS5/BM25 + Vektor-Suche nomic-embed  (parallel, lokal)
  2. Reciprocal Rank Fusion → die besten Stellen aus ~83.000 Chunks
  3. qwen3:8b antwortet MIT diesem Kontext — über Relevanz-Schwelle geerdet
 Antwort mit Quellen-Zitat: „linkedin-campaign-playbook.md · Hooks"
Murmel to go · Telegram

Unterwegs? Murmel steckt in der Hosentasche.

Der Mac bleibt zu Hause — Murmel nicht. Der Telegram-Bot @murmel2go_bot ist Murmels Cloud-Ableger, gebaut aus n8n-Workflows: Er antwortet nur mir, versteht Sprachnachrichten, erstellt Bilder auf Zuruf und kennt meine Notizen — über einen eigenen Cloud-Index in Supabase, aus Notion gespiegelt, den ein Nacht-Workflow um 04:30 frisch hält. Die 83.000 lokalen Chunks bleiben auf dem Mac — nur Notion geht in die Cloud.

voice → text → antwort

Sprachnachricht genügt

Voice schicken → das Transkript kommt sofort als eigene Nachricht, die Antwort folgt. In der Cloud übernimmt whisper-1 das Hören und gpt-5-mini das Denken.

bild: …

Bilder im Chat

„Erstelle ein Bild von …" — der Bot beauftragt selbst gpt-image-2 und schickt das Foto zurück. Er verspricht nur, was er wirklich kann.

wissen · nachts synchron

Cloud-Wissensindex

Supabase-Tabelle murmel_wissen mit deutscher Volltextsuche. Jede Nacht um 04:30 wandern die 100 jüngsten Notion-Seiten hinein — Bericht per Telegram inklusive.

„Lokal-first, online-optional: Auf dem Mac denkt Qwen — kein Byte verlässt den Rechner. Unterwegs zählt Erreichbarkeit, also darf dort die Cloud ran. Beides ist eine bewusste Entscheidung, kein Zufall.“
// der Architektur-Leitsatz · jede Online-Verbindung ist opt-in und abschaltbar
Wohin es geht · Der nächste Sprung

Vom Assistenten zum eigenen Business-Cockpit.

Murmel hört, denkt und handelt schon. Der nächste Schritt — gerade im Bau — ist der größte: mein ganzes Business per Stimme steuern. Ein eigenes CRM, das ich weder von HubSpot noch von Salesforce mieten muss. Kontakte, Notizen, Angebote, Rechnungen — autark, lokal, meins.

Die Idee ist dieselbe wie am ersten Tag, nur eine Nummer größer: Was ich brauche, baue ich mir selbst — auch das CRM. Kein Abo, keine fremde Cloud, in der meine Kundendaten liegen.

Das Elegante daran: Es ist kein zweites Programm. Aus dem „Hey Murmel"-Fenster wird ein Zuhause — reden, ins CRM springen, einen Kontakt öffnen, eine Notiz anlegen. Dieselben Werkzeuge, die Murmel heute schon per Stimme bedient, bekommen eine Arbeitsfläche.

Wenige Grundbausteine, viele Kompositionen: Ein Datenkern trägt die Objekte — Kontakt, Nachricht, Aufgabe, Termin, Notiz, Beleg, Produkt. CRM, Posteingang und Meetings sind nur Brillen auf denselben Kern.

„Was ich brauche, muss ich auch selbst bauen können — auch mein CRM.“
// autark · lokal-first · kein HubSpot, kein Salesforce
das herz

Ein Datenkern

Erstklassige Objekte — Kontakt, Nachricht, Aufgabe, Termin, Beleg, Produkt — plus ein Ereignis-Log, das jede Berührung zur Timeline verbindet.

alles fliesst rein

Kommunikation im CRM

Jede Mail und WhatsApp landet automatisch beim richtigen Kontakt — der Verlauf schreibt sich von selbst, statt in fremden Postfächern zu versickern.

offline-perfekt

Lokal ist die Wahrheit

Die Arbeits-Datenbank liegt auf dem Mac — lesen geht immer, auch ohne Netz. Notion bleibt der Business-Ledger, im Hintergrund gespiegelt.

von überall

Fernzugriff vom Handy

Solange der Laptop offen ist: per Telegram Vollzugriff auf den lokalen Agenten — jede Schreib-Aktion mit Bestätigung.

katalog

Meine Produkte

Deine-Business-Page und die weiteren Angebote als Produkt-Katalog — daraus setzen sich Angebote, Rechnungen und der wiederkehrende Umsatz zusammen.

ein tor · geloggt

Kontrolliert schreiben

Jede Änderung läuft durch ein einziges Tor: Vorschau → Bestätigung → Audit-Log. Dadurch immer nachvollziehbar, was Murmel getan hat.

„Nicht ein CRM als Feature — ein System. Erfassen, verstehen, im Kern ablegen, handeln. CRM, Posteingang und Meetings sind nur Ansichten auf denselben Kern.“
// die Architektur · Rückgrat einmal bauen, Ansichten beliebig davorsetzen
Interaktive System-Karte

Worauf hat Murmel Zugriff?

Die ganze Architektur als begehbare 3D-Galaxie: links der Membran alles, was auf dem Mac bleibt — rechts alles, was nur auf Ansage online geht. 28 Bausteine, jede Verbindung eine Entscheidung. Mit Auto-Tour.

Galaxie betreten →
Auf Apple gebaut

Kein Electron. Echtes macOS.

Keine Cross-Platform-Abkürzung, keine Web-View in einem App-Mantel. Murmel ist eine native Swift-App und spricht direkt mit den Frameworks von macOS — jede Schicht selbst gesetzt. Genau das macht sie schnell, leichtgewichtig und systemtief.

ui

SwiftUI · MenuBarExtra

Lebt als Icon in der Menüleiste — kein Dock, kein Fenster im Weg. Reines SwiftUI.

audio

AVFoundation

AVAudioEngine nimmt das Mikrofon in Echtzeit ab und wandelt auf 16 kHz Mono — genau, was Whisper braucht.

hotkey

CoreGraphics · CGEventTap

Ein systemweiter Event-Tap erkennt das Halten der fn-Taste — überall, nicht nur in einem Fenster.

rechte

Accessibility API

AXIsProcessTrusted prüft das Bedienungshilfen-Recht, das Hotkey & Einfügen erst ermöglicht.

einfügen

AppKit · NSPasteboard

Ergebnis in die Zwischenablage, dann ein synthetisches ⌘V via CGEvent ins aktive Fenster.

daten

SQLite3

Der Diktat-Verlauf liegt lokal in einer SQLite-Datenbank — durchsuchbar, persistent.

autostart

ServiceManagement

SMAppService registriert Murmel sauber als Login-Item — startet still beim Anmelden mit.

build

SPM · codesign

Gebaut mit dem Swift Package Manager, signiert mit eigener stabiler Identität — kein Xcode-Projekt nötig.

Der KI-Stack — lokal

Der Kern denkt auf dem Mac.

Hören, Denken, Erinnern — alles lokal. Hier ist genau, was unter der Haube arbeitet, und warum ich es so gewählt habe.

spracherkennung · ~1,5 GB

whisper.cpp · large-v3-turbo

Was: OpenAIs Whisper-Spracherkennung, als hochoptimiertes C++ (whisper.cpp) lokal auf Apple Silicon. Modell large-v3-turbo (~1,5 GB) in ~/.murmel/models.
Warum: exzellentes Deutsch, schnell, offline — erkennt sogar Deutsch + Englisch im selben Satz.

llm-runtime

Ollama

Was: ein schlanker lokaler Server, der Open-Source-Sprachmodelle auf dem eigenen Rechner ausführt — quasi „Docker für LLMs". Per Homebrew installiert, lauscht lokal auf 127.0.0.1:11434.
Warum: macht ein lokales LLM über eine einfache HTTP-API nutzbar — kein API-Key, keine Cloud, keine Kosten.

drei modelle · arbeitsteilung

Die Qwen-Familie + Embeddings

qwen3:8b ist das Agent-Hirn: Gespräch, Tool-Calling, Wissens-Antworten — mit Warm-up beim Start (erste Frage in 5 s statt 38). qwen2.5:3b bleibt die schnelle Diktat-Politur. nomic-embed-text baut die Vektoren für die Wissens-Suche. Alle drei laufen in Ollama, alle drei lokal.

Unterm Strich: einmalig ein paar GB Modelle lokal laden — danach läuft der Kern offline und dauerhaft kostenlos, und kein Wort verlässt den Rechner. Online-Extras (Stimme, Bilder, Telegram) bleiben opt-in.

04 Wie es gebaut wurde

8 Agents parallel — und zwei Bugs systematisch gejagt.

Erst Gerüst und feste Protokoll-Verträge, dann acht KI-Agents gleichzeitig (je eine Komponente). Bauen ist das eine — zum Laufen bringen das andere. Zwei echte Bugs, per Logging an jeder Pipeline-Stufe gefunden:

bug 01 · signatur ↔ rechte

Recht verschwand bei jedem Build

macOS bindet das Bedienungshilfen-Recht an die Code-Signatur. Ad-hoc-Signaturen ändern bei jedem Build den Hash → Recht „stirbt“. Fix: stabile selbst-signierte Identität.

bug 02 · halluzination

Die KI antwortete statt zu tippen

Das kleine Politur-Modell kippte die Wörterbuch-Liste in den Text und antwortete wie ein Chatbot. Fix: strikter System-Prompt + Halluzinations-Schutz + Standard „Roh“.

methode

Messen, nicht raten

Ein Datei-Log an jeder Stufe (Hotkey → Aufnahme → Whisper → Politur → Einfügen) zeigte präzise, wo es bricht. Root Cause vor Fix.

05 Was es beweist

Ich nutze KI nicht nur — ich baue mir eigene Software.

Eine native macOS-App ohne Code-Hintergrund, end-to-end: Audio, Spracherkennung, lokales LLM, Agent-Werkzeuge, RAG, globaler Hotkey, Datenbank, Code-Signierung — und ein Cloud-Ableger aus n8n-Workflows. Geplant, orchestriert, debuggt und ausgeliefert. In 13 Tagen vom Diktat-Tool zum Agenten.

Murmel fertig: Panel in der Menüleiste über der Session, in der es gebaut wurde
// Fertig — oben Murmel in der Menüleiste (Live-Vorschau, Modi, Verlauf), darunter das Terminal, in dem es Stück für Stück entstand
Native Engineering

macOS in der Tiefe

Swift, CGEventTap-Hotkey, AVAudioEngine, SQLite, Subprozess-Orchestrierung, eigene Code-Signatur.

Systematisches Debugging

Root Cause vor Fix

Signatur↔TCC und LLM-Halluzination sauber isoliert — per Evidenz an jeder Stufe, nicht durch Raten.

Architektur-Haltung

Lokal-first, online-optional

Jede Cloud-Verbindung ist eine bewusste, abschaltbare Entscheidung — Setup-Scripts, Selbsttest, eigene Signatur. Die Sorte Tool, die ein Solutions Engineer auch beim Kunden baut.

11.569
Zeilen Swift · 61 Dateien
106
Commits · 13 Tage
0 €
laufende Kosten · Kern 100% lokal