jnl - Mein Terminal-Journal und Blog-Tool
Ich lebe im Terminal. Mein Editor ist Neovim, mein Window-Manager ist tmux, und wenn ich etwas notieren will, möchte ich keinen Browser öffnen oder eine Electron-App starten. Also habe ich jnl gebaut - ein Bash-basiertes Tool, das Journaling, eine Wissensdatenbank, Meeting-Notizen, Todos, Lesezeichen und Blog-Publishing unter einem einzigen CLI vereint.
Warum selbst bauen?
Ăśber die Jahre habe ich verschiedene Tools ausprobiert: Notion, Obsidian, diverse Blog-CMS-Plattformen. Das Problem war immer dasselbe:
- Zu viel Overhead: Ich will einen Gedanken festhalten, keine App starten.
- Vendor Lock-in: Proprietäre Formate, Cloud-Zwang, kaum Exportmöglichkeiten.
- Kein CLI-first-Ansatz: Die meisten Tools sind fĂĽr Mausschubser gebaut.
jnl speichert alles als reines Markdown in einem konfigurierbaren Verzeichnis (bei mir iCloud-synchronisiert). Keine Datenbank, kein proprietäres Format. Die Dateien sind mit jedem Editor lesbar und voll versionierbar.
Was jnl kann
Tägliches Journal
jnl journal edit today
jnl journal edit yesterday
jnl journal edit 2026-01-15
jnl journal list 2026 01
Ein Befehl und der Editor öffnet sich. Die Datei wird automatisch unter journal/2026/02/23.md abgelegt. Kein Nachdenken über Dateinamen oder Ordnerstrukturen.
KI-gestĂĽtztes Journal-Interview
Das Highlight: jnl journal talk startet einen interaktiven Dialog mit einem lokalen LLM (Ollama). Das Modell stellt einfühlsame Fragen wie ein Interviewer — "Was hat dich heute beschäftigt?", "Wie hast du dich dabei gefühlt?" — und fasst das Gespräch als strukturierten Journal-Eintrag zusammen.
Was das besonders macht:
- Komplett lokal: Läuft über Ollama, keine Cloud, keine Daten verlassen den Rechner.
- Kontextbewusst: Liest Einträge der letzten 7 Tage und kann darauf Bezug nehmen.
- Intelligente Erkennung: Wenn fĂĽr heute schon ein Eintrag existiert, fragt es, ob erweitert werden soll.
- Konfigurierbares Modell: Standard ist
gemma3:27b, änderbar überJNL_TALK_MODEL.
Wissensdatenbank (Info)
jnl info edit bash-snippets
jnl info edit networking/wireguard-setup
jnl info search "iptables"
Hierarchisch organisierte Markdown-Dateien. Perfekt für all die Notizen, die man als Sysadmin und Entwickler so ansammelt — Konfigurations-Snippets, Checklisten, How-tos.
Meeting-Notizen
jnl minutes edit "Sprint Review Woche 08"
jnl minutes list 2026 02
Automatisch datiert und durchsuchbar.
Todos und Lesezeichen
jnl todo edit
jnl bookmark add
jnl bookmark open # fzf-Auswahl, öffnet im Browser
Einfache Markdown-Dateien. Lesezeichen verwenden open (macOS) oder xdg-open (Linux), um direkt aus dem Terminal zu öffnen.
Volltextsuche mit fzf + ripgrep
jnl search "kubernetes"
Das ist vielleicht das Feature, das ich am meisten benutze. jnl search kombiniert ripgrep zum Suchen mit fzf zur interaktiven Auswahl — inklusive Live-Vorschau jedes Treffers. Enter drücken und der Editor öffnet sich an der exakten Zeile.
Alternativ bietet jnl <typ> choose eine fzf-basierte Auswahl innerhalb eines bestimmten Typs.
Blog-Publishing: Vom Terminal live schalten
Hier wird es richtig interessant. jnl blog ist ein vollwertiger Blog-Publishing-Client, der ĂĽber REST-API mit meinem Blog-Backend (jblog2) kommuniziert.
Der Workflow
jnl blog new mein-artikel # GefĂĽhrte Erstellung
jnl blog edit mein-artikel de # Deutschen Text schreiben
jnl blog edit mein-artikel en # Englischen Text schreiben
jnl blog tag mein-artikel add java # Tags setzen
jnl blog cat mein-artikel morphium # Kategorie setzen
jnl blog validate mein-artikel # Pre-flight-Check
jnl blog submit mein-artikel # Push + DRAFT
jnl blog preview mein-artikel --remote # Vorschau im Browser
jnl blog approve mein-artikel # Sofort LIVE
Oder mit Zeitplanung:
jnl blog approve mein-artikel --at "2026-03-01 10:00"
Intelligenter Sync
Jeder Blog-Eintrag hat eine .sync.json mit SHA384-Prüfsummen. Beim Push werden nur geänderte Dateien übertragen. jnl blog status zeigt auf einen Blick, welche Einträge synchronisiert sind, welche lokale Änderungen haben und wo Konflikte bestehen.
Offline-First
Alle Änderungen passieren zuerst lokal. Kein Internet? Kein Problem. Schreiben, bearbeiten, Metadaten setzen — alles funktioniert offline. Sobald die Verbindung wieder da ist, synchronisiert jnl blog push alles.
Kategorie-Validierung
Frisch eingebaut: jnl blog cat list zeigt alle verfügbaren Kategorien. Und wenn man eine unbekannte Kategorie setzt, warnt das Tool und fragt nach Bestätigung. Klingt trivial, hat mir aber gerade erst einen kaputten Blog-Artikel erspart.
Benutzerverwaltung
jnl blog user list
jnl blog user create alice --role BLOGGER --email alice@example.com
jnl blog user reset-password alice
Und für Notfälle: jnl blog user bootstrap-reset admin --break-glass — ein Notfall-Reset, der direkt über SSH und mongosh einen Admin-Benutzer erstellt oder zurücksetzt. Hoffentlich nie nötig, aber wenn die Datenbank mal Probleme macht, ist man froh, dass es existiert.
Multi-Umgebungs-Support
jnl env list
jnl env homelab # Ins Homelab wechseln
jnl env live # Zur Produktion wechseln
Ich betreibe ein Homelab zum Testen und eine Produktionsinstanz. jnl env wechselt zwischen Umgebungen — inklusive separater Token-Caches und Keychain-Einträge. Kein versehentliches Publizieren auf der falschen Instanz.
Der Tech-Stack
jnl ist bewusst minimalistisch:
- Bash für den gesamten Kern — kein Compile-Schritt, keine Runtime-Abhängigkeit.
- jq fĂĽr JSON-Verarbeitung (Metadaten, API-Antworten).
- fzf fĂĽr interaktive Auswahl.
- ripgrep fĂĽr Volltextsuche.
- curl fĂĽr REST-API-Kommunikation.
- Swift fĂĽr das
jnl-talk-Feature (Ollama-Integration). - macOS Keychain / Umgebungsvariablen fĂĽr Secrets.
Self-Update ist ein einfaches git pull. Kein Paketmanager, kein Build-System.
Was mir daran gefällt
Geschwindigkeit: jnl journal edit today ist schneller, als jede GUI-App starten kann.
Transparenz: Alles ist Klartext. Ich kann meine Notizen mit grep durchsuchen, mit git versionieren, mit rsync sichern. Kein Vendor Lock-in.
Erweiterbarkeit: Eine neue Funktion ist eine Bash-Funktion in einer .sh-Datei. Kein Framework, kein Plugin-System, einfach Code.
Offline-first: Ich schreibe im Zug, im Flugzeug, im Keller. Alles funktioniert, Sync passiert, wenn es Internet gibt.
Ein Tool für alles: Journal, Wiki, Blog, Lesezeichen, Todos — ein einziger Befehl, ein einheitliches Interface.
Fazit
jnl ist kein Produkt und kein poliertes Open-Source-Projekt. Es ist mein persönliches Tool, über Jahre gewachsen, an meinen Workflow angepasst. Aber genau das macht es so effektiv: Es tut exakt das, was ich brauche, nicht mehr und nicht weniger.
Wenn du auch im Terminal lebst und ein ähnliches Tool suchst — vielleicht dient es als Inspiration. Die Grundidee ist einfach: Reines Markdown, ein guter Editor und ein bisschen Bash-Kleber drum herum. Mehr braucht man nicht.