Info
Datum: 24. 02. 2026 um 20:00:00
Schlagworte:
logged in
ADMIN
jnl - My Terminal Journal and Blog Tool
I live in the terminal. My editor is Neovim, my window manager is tmux, and when I want to jot something down, I don't want to open a browser or launch an Electron app. So I built jnl - a Bash-based tool that combines journaling, a knowledge base, meeting notes, todos, bookmarks, and blog publishing under a single CLI.
Why Build It Myself?
Over the years I've tried various tools: Notion, Obsidian, different blog CMS platforms. The problem was always the same:
- Too much overhead: I want to capture a thought, not launch an app.
- Vendor lock-in: Proprietary formats, cloud requirements, barely any export options.
- No CLI-first approach: Most tools are built for mouse pushers.
jnl stores everything as plain Markdown in a configurable directory (iCloud-synced in my case). No database, no proprietary format. The files are readable with any editor and fully versionable.
What jnl Can Do
Daily Journal
jnl journal edit today
jnl journal edit yesterday
jnl journal edit 2026-01-15
jnl journal list 2026 01
One command and the editor opens. The file is automatically placed at journal/2026/02/23.md. No thinking about file names or folder structure.
AI-Powered Journal Interviews
The highlight: jnl journal talk starts an interactive dialogue with a local LLM (Ollama). The model asks empathetic questions like an interviewer - "What was on your mind today?", "How did that make you feel?" - and summarizes the conversation as a structured journal entry.
What makes it special:
- Completely local: Runs through Ollama, no cloud, no data leaving your machine.
- Context-aware: Reads entries from the last 7 days and can reference them.
- Smart detection: If an entry already exists for today, it asks whether to expand it.
- Configurable model: Default is
gemma3:27b, changeable viaJNL_TALK_MODEL.
Knowledge Base (Info)
jnl info edit bash-snippets
jnl info edit networking/wireguard-setup
jnl info search "iptables"
Hierarchically organized Markdown files. Perfect for all the notes you accumulate as a sysadmin and developer - configuration snippets, checklists, how-tos.
Meeting Notes
jnl minutes edit "Sprint Review Week 08"
jnl minutes list 2026 02
Automatically dated and searchable.
Todos and Bookmarks
jnl todo edit
jnl bookmark add
jnl bookmark open # fzf selection, opens in browser
Simple Markdown files. Bookmarks use open (macOS) or xdg-open (Linux) to launch directly from the terminal.
Full-Text Search with fzf + ripgrep
jnl search "kubernetes"
This might be the feature I use most. jnl search combines ripgrep for searching with fzf for interactive selection - including a live preview of each match. Press Enter to open the editor at the exact line.
Alternatively, jnl <type> choose provides an fzf-based selection within a specific type.
Blog Publishing: From Terminal to Live
This is where it gets really interesting. jnl blog is a full blog publishing client that communicates with my blog backend (jblog2) via REST API.
The Workflow
jnl blog new my-article # Guided creation
jnl blog edit my-article de # Write German text
jnl blog edit my-article en # Write English text
jnl blog tag my-article add java # Set tags
jnl blog cat my-article morphium # Set category
jnl blog validate my-article # Pre-flight check
jnl blog submit my-article # Push + DRAFT
jnl blog preview my-article --remote # Preview in browser
jnl blog approve my-article # Immediately LIVE
Or with scheduling:
jnl blog approve my-article --at "2026-03-01 10:00"
Intelligent Sync
Each blog entry has a .sync.json with SHA384 checksums. Only changed files are transferred during push. jnl blog status shows at a glance which entries are synced, which have local changes, and where conflicts exist.
Offline-First
All changes happen locally first. No internet? No problem. Write, edit, set metadata - everything works offline. Once connectivity returns, jnl blog push syncs everything.
Category Validation
Freshly built: jnl blog cat list shows all available categories. And when you set an unknown category, the tool warns you and asks for confirmation. Sounds trivial, but it just saved me from a broken blog article.
User Management
jnl blog user list
jnl blog user create alice --role BLOGGER --email alice@example.com
jnl blog user reset-password alice
And for emergencies: jnl blog user bootstrap-reset admin --break-glass - an emergency reset that directly creates or resets an admin user via SSH and mongosh. Hopefully never needed, but when your database has issues, you'll be glad it exists.
Multi-Environment Support
jnl env list
jnl env homelab # Switch to homelab
jnl env live # Switch to production
I run a homelab for testing and a production instance. jnl env switches between environments - including separate token caches and keychain entries. No accidental publishing to the wrong instance.
The Tech Stack
jnl is deliberately minimalist:
- Bash for the entire core - no compile step, no runtime dependency.
- jq for JSON processing (metadata, API responses).
- fzf for interactive selection.
- ripgrep for full-text search.
- curl for REST API communication.
- Swift for the
jnl-talkfeature (Ollama integration). - macOS Keychain / environment variables for secrets.
Self-update is a one-liner git pull. No package manager, no build system.
What I Like About It
Speed: jnl journal edit today is faster than any GUI app can launch.
Transparency: Everything is plain text. I can search my notes with grep, version them with git, back them up with rsync. No vendor lock-in.
Extensibility: A new function is a Bash function in a .sh file. No framework, no plugin system, just code.
Offline-first: I write on trains, on planes, in the basement. Everything works, sync happens when there's internet.
One tool for everything: Journal, wiki, blog, bookmarks, todos - a single command, a unified interface.
Conclusion
jnl is not a product and not a polished open-source project. It's my personal tool, grown over years, adapted to my workflow. But that's exactly what makes it so effective: it does exactly what I need, nothing more and nothing less.
If you also live in the terminal and are looking for a similar tool - maybe it serves as inspiration. The basic idea is simple: plain Markdown, a good editor, and a bit of Bash glue around it. That's all you need.