Plain Markdown
Your journal is a single readable .md file. No databases, no lock-in — just text you already know how to read.
v2.0.0 · MIT · github.com/klcombr/journal
journal keeps your life as plain markdown and syncs it in real time — across terminal, desktop, browser and phone. One journal. Every device.
$ journal add "learned how Actions cron works"
✔ added — 2026-08-08T09:27:47+00:00
$ journal sync
✔ pulled 3 new · pushed 2 · 12 total
$ journal count --days
2026-08-06
2026-08-07
2026-08-08
$ ▋
One journal. Every device. Synced in real time.
Write in the browser, sync over WebSocket. No install — just open the link.
open app →Install the APK directly on your phone. Same account, same entries.
download apk (3.2 mb) →Tkinter app for Linux/Windows/macOS. Local-first with one-click sync.
read more →The original. journal add your way, sync from the shell.
FastAPI + SQLite + JWT + WebSocket. Self-host it, or point apps at a hosted instance.
read more →Product, API and sync protocol — fully documented so you can extend it.
read the specs →Everything a tiny journal should be. Nothing it shouldn't.
Your journal is a single readable .md file. No databases, no lock-in — just text you already know how to read.
journal count tells you how many days you've logged. Perfect for streaks, habits, and quiet consistency.
pip install -e . and you're done. Entries default to journal.md, or point anywhere with -f.
Every entry is stamped automatically in ISO 8601. Your history sorts itself — no manual dates required.
Set JOURNAL_FILE to move your journal anywhere. Works great in scripts, crons, and zsh aliases.
Import append_entry, read_entries and day_count directly — build your own tools on top.
# 1. install
pip install -e .
# 2. write an entry
journal add "learned how Actions cron works"
# 3. create your account + sync
journal sync --register --base http://127.0.0.1:8000
# 4. check your streak anywhere
journal count --days
By default to journal.md in the current directory. Override with -f FILE or the JOURNAL_FILE environment variable.
Yes — journal list -n 10 prints the most recent entries, and journal list defaults to the last 10.
No. The file is plain markdown. If you ever stop using journal, your entries are just a text file you can read anywhere.
Run the server once (uvicorn journal_server.app:app) and point any client at it with journal sync --base URL. Entries flow in both directions and updates appear live on other devices over WebSocket. Local-first: your markdown file is always the source of truth.
No. It's a local Python CLI. Offline, private, and yours.