I've tried a lot of time trackers. Desktop apps, phone apps, browser extensions, the self-hosted ones that looked promising on GitHub. None of them stuck for more than a week.

The phone ones were basically a stopwatch with extra steps. Writing session notes on a phone keyboard after two hours of coding is genuinely awful, so I just didn't. The desktop ones were either loaded with features I'd never touch, or I'd forget they existed and open them three days later to find a session still running. 28 hours. Technically my most productive day on record.

At some point I stopped looking and started building.


The first version was stupid simple, on purpose. A stopwatch and a text box. Start the clock, do the work, stop the clock, write down what I did, what I left hanging, what broke. That was the whole thing. But that loop, as dumb as it sounds, quietly turned into a habit. I started actually documenting what I was working on. Not for anyone else, just so I could remember what the hell I was doing when I came back the next day.

Then I ran into code-server, which is VS Code running in a Docker container. The whole pitch is that you set it up once, with your extensions and your project folders, and it's just there no matter what machine you're on. You open it in the browser. No reinstalling, no reconfiguring if you swap laptops, no losing your setup when you distro-hop for the fourth time in a month. That last part gets its own post eventually.

code-server opens projects via URL. Something like ip:port/project-name. That gave me an idea.


If I'm already clicking a link to open a project, why am I opening code-server from anywhere other than the tracker itself? So I added a links section. Code-server, live preview, whatever tools that specific project needs. TinyPNG, icon sources, staging URL, whatever. Now when I start a session I hit the project page, hold Control, click a few links, and everything opens at once. All the context loaded before I've even started the timer.

It went from a stopwatch to a launchpad pretty fast after that.


A few months in I noticed something in the data that annoyed me: my coding hours were slowly dropping. Not dramatically, but enough that it showed. I thought about the GitHub contribution graph, that green square heatmap, and how weirdly effective it is at making you feel bad about blank patches. So I built one. 52 weeks, color-coded by hours logged. The threshold is intentionally high. An easy heatmap doesn't motivate anyone.

I open the tracker now, see a stretch of empty weeks, and that's usually enough. I sit down and work.


How it actually works

The timer is client-side, stopwatch-style. State saves to localStorage so a page reload doesn't wipe it. When you stop a session you have to write a summary before anything saves. No note, no log entry. That's on purpose. It's basically the whole point.

Storage is flat files. No database. Each project has a .log file for session history and a .meta file that tracks totals, last worked date, and weekly goal. Sessions store a timestamp, a duration in seconds, and the note text.

On top of that: a 30-day card view per project, the 52-week heatmap, and a weekly goal with a progress bar. Per-project notes with autosave, the tool links I mentioned, and a global state tracker so the dashboard always knows which project has a running timer. No login. No multi-user. Single-user by design.

It runs on tonycorev2, the Dell OptiPlex home server from the first post, on port 8102. Local only, accessible over Tailscale. Nobody else needs to see my work log.


It's not a product. I'm not trying to replace Toggl. It's also grown past just dev work at this point. I use it for client stuff too. Each client is a project. The notes section holds everything: snippets, copy drafts, metadata, even credentials. I know. It's local-only behind Tailscale, so I've made my peace with it.

Still on the list: categories, and some kind of project state system so I can mark things active, deprecated, or dead without deleting them. Nothing complicated, just enough to keep it from becoming a mess as the list grows.

It does exactly what I need and nothing I don't. I've actually used it consistently, which is more than I can say for everything else I tried.