A tracker that tells the truth about your time.
Click things, or type things.
The app has five tabs — Today, Screen time, Week, Progress, Wins. The terminal has short commands for the same data. Both write to one SQLite file, so you can log a set from the keyboard and read the week back in the app.
The whole habit takes about ten seconds a day.
# right when you get up joh wake 8am # or 730, 19:15, 7.30 — it figures it out joh plank 95 # or run a live timer, press Enter when you drop joh workout push day # what you did — or "no" for a rest day joh sleep # heading to bed
Your day, your week, your wins.
Today
Wake and sleep, plank, workout, a session timer, today's goals, a win box, and today's screen time at a glance.
Screen time
Your day block by block, like phone screen time. Arrow through any past day; toggle Show every switch to see even the five-second ones.
Week
7, 14 or 21 days as stacked bars — screen, offline, sleep — on one shared scale. Whether distraction is trending up or down.
Progress
Streak, plank best, workouts, average wake, focus vs distraction. A 12-week heatmap, time-split bars, and how long things take you.
Wins
Completed goals with their full numbers — the rate, the elapsed days, and what the distraction actually cost — then everything else worth remembering.
Small goals
Time anything with a start and a stop — a language unit, a chapter — and learn your own average. joh start reading → joh stop.
21:05–21:10 Editor · project 5m //// typing hard 21:10–21:14 Video site 4m /... just watching 21:15–21:21 away from the machine 5m .... away
Two hours working, or two hours open?
A background service samples the focused window every five seconds and records the app, the window title, a category, and how much you were actually typing and clicking. That's what separates real work from an editor left open in the background.
- //// typing hard — sustained typing
- ///. working — working, with pauses
- //.. scrolling — consuming, little typing
- /... just watching — barely touching it
Only input counts are stored — which keys you pressed is never read. Browser pages are tracked from the window title, so sites show up by name without touching your history.
What did it actually cost?
A goal is anything with a start and a finish — a book, a course, a project. Two friction points only: start and finish. Joh does the rest.
When you finish, the Wins page shows the rate, the elapsed days, and what the distraction actually cost in your own units.
A book 2026-03-08 → 2026-03-27 TOOK FOCUSED PAGES 20d 5h 16m 320 61 pages/hour · 16.0 pages/day Distracted in that window: 29h 54m That's 5.7× the time you gave the goal itself. At your own pace that was worth ~1812 more pages — about 5.7× this goal again.
One SQLite file. You own it.
Everything lives in data/joh.db — back it up by copying that one file. A background service (joh-trackd) starts automatically at login. A day runs 4am to 4am, so a 1am session belongs to the day it started.
- App or terminal — same data, mix freely
- Unattended time never counts as screen time
- Offline gaps fill themselves from your wake/sleep log
Honest note: history only accrues forward. Earlier days can't be reconstructed, because nothing recorded them at the time.
# start the tracker (auto-starts at login after) systemctl --user start joh-trackd systemctl --user status joh-trackd # today at a glance joh joh timeline # every block of the day, in order joh week # last 7 days as a table joh report # full dashboard in the browser
Stop guessing where the day went.
Joh is a personal tool, built for one user — you. It runs on your own Linux machine, watches only your focused window, and keeps everything in a file you can copy, read, and delete.