v2.0.0 · MIT · github.com/klcombr/journal

Write today.
Remember tomorrow.

journal keeps your life as plain markdown and syncs it in real time — across terminal, desktop, browser and phone. One journal. Every device.

Open web app See it live Read the docs
0 apps
0 platforms
0 setup lines
0 data format
zsh — journal
$ 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
$ 

Run it anywhere

One journal. Every device. Synced in real time.

Why journal?

Everything a tiny journal should be. Nothing it shouldn't.

01 / plain

Plain Markdown

Your journal is a single readable .md file. No databases, no lock-in — just text you already know how to read.

02 / days

Day tracking

journal count tells you how many days you've logged. Perfect for streaks, habits, and quiet consistency.

03 / zero

Zero config

pip install -e . and you're done. Entries default to journal.md, or point anywhere with -f.

04 / time

Timestamps built-in

Every entry is stamped automatically in ISO 8601. Your history sorts itself — no manual dates required.

05 / env

Env-friendly

Set JOURNAL_FILE to move your journal anywhere. Works great in scripts, crons, and zsh aliases.

06 / api

Python API

Import append_entry, read_entries and day_count directly — build your own tools on top.

Quick start

terminal · install + sync
# 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

FAQ

Where do my entries go?

By default to journal.md in the current directory. Override with -f FILE or the JOURNAL_FILE environment variable.

Can I see all entries?

Yes — journal list -n 10 prints the most recent entries, and journal list defaults to the last 10.

Is my data locked into this tool?

No. The file is plain markdown. If you ever stop using journal, your entries are just a text file you can read anywhere.

How does sync work?

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.

Does it need an internet connection?

No. It's a local Python CLI. Offline, private, and yours.