Skip to content
Joh Flow흐름
JohData · consistency tracking

A tracker that tells the truth about your time.

Wake and sleep, workouts, reading, small goals — and what you actually do on the computer, block by block. Six tabs in the app, short commands in the terminal, one SQLite file underneath that you own. Both read and write the same data, so mix them freely.
Two ways to use it

Click things, or type things.

The app has six tabs — Today, Screen time, Plan, Kalender, Progress, Wins. The terminal has short commands for the same data. Both write to one file, so you can log a set from the keyboard and read the week back in the app.

The whole daily habit takes about ten seconds.

the daily habit — ~10 seconds
# 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
Six tabs

Your day, your week, your wins.

Today

Wake and sleep, plank, workout, a session timer and today's screen time — plus the trackers that take a page, a unit or a score and turn it into a pace.

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.

Plan

A board you sort by hand. Everything you add lands in Unsorted; drag it down into Today, Medium or Low, or back up. Adding a todo starts its clock — dragging never touches that.

Kalender

The week as a time grid, 4am to 4am: todos in the left lane of each day, screen time in the right — so you can see what a stretch of work actually contained.

Progress

Streak, plank best, workouts, average wake, focus vs distraction — with a 12-week heatmap, stacked week 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.

Screen tracking

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, and what counts as a distraction is a plain list of rules you can edit.

screen time · today
Nothing unaccounted for

Every second of a tracked day lands somewhere.

Once a day has any tracking at all, the gaps between screen blocks become offline time — the tracker already knows when you left and came back, so the day closes itself. Sleep is drawn from your own wake and sleep log, not guessed.

  • screen — you were there and using it, by app and site
  • offline — a real gap: away from the machine
  • sleep — covered by your own wake/sleep log
  • away — machine on, window focused, no input
  • not tracked — a day the tracker never saw

A day nothing watched stays entirely untracked — never backfilled as offline, because that would claim you were away when the truth is that nothing was recording. Untracked days are excluded from every average.

joh week
Plan & Kalender

What you meant to do, next to what you did.

Plan is a board you sort by hand. Everything you add lands in Unsorted at the top; drag it down into Today, Medium or Low, between them, or back up. Adding a todo starts its clock, so every row also says how long it has been running — dragging never touches that.

Kalender lays the week out as a time grid, 4am to 4am: todos in the left lane of each day, screen time in the right. The two lanes side by side are the point — you can see what a stretch of work actually contained.

kalender · this week
Goals — the point of the Wins page

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. Log a page, a unit or a score as you go, and the app works out your pace, your trend, and every check-in behind it.

When you finish, Wins shows the rate, the elapsed days, and what the distraction actually cost in your own units.

Focused is the sum of your timed sessions matching the goal's name. Distracted is all distraction tracked between the start and end dates — including the days you never touched the goal, because that time existed and went somewhere else.

wins · atomic habits
joh goal done "a book"
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.
Progress

Twelve weeks at a glance.

The long view: how consistent you have actually been, where the days went, whether distraction is trending up or down, and how long things take you. Every chart holds its exact numbers on hover — nothing is rounded away.

5s
between window samples
12 wk
of consistency in one grid
4am
where the day starts, and ends
1 file
SQLite, yours to copy
every day · last 12 weeks
Honest instrumentation

“Running” and “recording” are different questions.

The tracker once stayed perfectly healthy while recording nothing: it starts at login, the compositor wasn't up yet, and it never found a window to attribute time to. Four days went missing while the service reported itself fine.

So joh status answers the question that matters. It goes red when the last sample is more than ten minutes old — even with the process running happily — and tells you which of the two is wrong.

reading it back
joh status
tracker recording (pid 3241)
last sample 4s ago

joh              # today at a glance
joh timeline     # every block of the day, in order
joh week         # last 7 days as a table
joh report       # full dashboard in the browser
Your data

One file. You own it.

Everything lives in a single SQLite file — four tables, no server, no account. Back it up by copying it, or open it with anything that reads SQLite. 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 and sleep log
  • Nothing is uploaded, because there is nowhere to upload it

Honest note: history only accrues forward. Earlier days can't be reconstructed, because nothing recorded them at the time.

install & run
# build the app and put it on your path
npm run install-app

# start the tracker — auto-starts at login after
systemctl --user enable --now joh-trackd
joh status       # is it recording, not just alive

# then open the app
joh-app          # or search "joh" in your launcher

Stop guessing where the day went.

JohData is a personal tool, built for one user — you. It runs on your own machine, watches only your focused window, and keeps everything in a file you can copy, read, and delete.

Linux · HyprlandOne SQLite fileNo account