For the last few weeks I’ve been running a personal tracking system that actually stuck. That’s unusual for me. The whole thing is a WhatsApp thread, two JSON files, and two ugly-beautiful HTML pages on this site. Nothing else.
Why it works when nothing else has: the hard part of quantified self was always capture. Not dashboards. Not insights. Capture. And LLMs in chat apps are now good enough at parsing free-form text that capture has collapsed to “tell the agent what you did.”
How it works
One WhatsApp thread with Hermes Agent. That’s it. Throughout the day, Hermes nudges me every fifteen minutes - but only while I’m awake - with one of two questions:
“What did you do in the last 15 minutes?” or “Did you eat anything since last time?”
I reply however I feel like. Voice notes. “Half veg burger and a cold brew.” “Deep work on contextgraph.” “Nothing, scrolling.” Whatever. Hermes parses it, routes to the right skill, estimates what needs estimating, and appends one of two JSON files:
time-audit-public.json- ninety-six fifteen-minute slots per day, each tagged with activity and a productivity level from 0 to 3calories-audit-public.json- calorie entries, activity credits, sedentary TDEE, daily deficit number
A typical entry looks like this:
{
"at": "2026-05-16T17:57:41+05:30",
"date": "2026-05-16",
"time": "17:57",
"food": "half veg burger, Japanese cold brew with condensed milk, half slice marble cake",
"calories": 550,
"estimated": true,
"confidence": "medium",
"corrected_at": null
}
Those JSON files get committed to the srijanshukla.com repo. Astro builds two pages from them at deploy time:
- /time - every 15-minute block of every day, 96 cells per row
- /calories - daily deficit, calorie bar, activity credits
No app to open. No form to fill. No database. Pipeline is whatsapp → hermes → skills → json → static page. That’s the whole thing.
Why Hermes and not a custom app
I underplayed this at first, but it matters a lot. Hermes isn’t a quantified-self app wearing a chatbot costume. It’s a general-purpose agent, and two small skills own the tracking domains:
time-audit handles wake state detection, the 15-minute cron schedule, the 0-3 productivity grammar, missed slot tracking, and the public export format.
food-audit handles the food nudge, rough calorie estimation, correction flows, activity credit calculation, sedentary TDEE, and deficit math.
The split is important. The LLM gets to understand messy human text - voice notes, slang, incomplete sentences. But the skill owns the contract. It knows where the files live. It knows which command to call. It knows that food-audit shares the time-audit wake state. It knows not to turn every calorie message into unsolicited diet coaching.
A normal app would make me adapt to its interface. Hermes adapts to my message, then hands off to deterministic scripts. Free-form capture at the edge, boring append-only JSON at the core. Weirdly sturdy combination.
Calling Hermes a chatbot bolted onto a tracker would be underselling it. It’s the interface, the router, the memory, and the operator. The HTML pages are just readouts.
Why this didn’t work before
I’ve tried quantified self before. Everyone has. The classic failure goes like this: buy the wearable, install the app, open the spreadsheet. Use it religiously for two weeks. Stop. Either the data lies (wearable inferred the wrong activity) or the data stops (manual entry friction beat your discipline).
An AI agent in a chat app fixes capture in a way I didn’t anticipate. The friction floor dropped from “open the app and tap through a form” to “reply to the chat thread that’s already open on your phone.” I was going to type something to someone anyway. Now some of those messages go to the agent.
The estimation piece matters more than you’d think. If I had to look up every food’s calorie count, I’d quit by day three. Hermes guesses, marks the guess as estimated: true, and moves on. I can override later if I care. The guess is honest about being a guess.
Why exactly two things
I deliberately chose to track two things and nothing else. The temptation to add more is constant and I fight it daily. Sleep quality, mood, weight, training load, focus minutes, spending, books, social interactions, screen time - I have notes-app drafts for every single one. None are live. For structural reasons.
The agent is a chat. One WhatsApp thread can hold two or three nudge streams before it gets annoying. Past that, I’ll mute it. The system dies the same way every tracking system dies - silently, with the user pretending they just “lost interest.”
Time and calories cover the day. Time tells me what I did. Calories tell me what I put in. Sleep shows up implicitly in /time as gaps in the exported blocks. Almost everything else - mood, energy, focus - is downstream of those two. Tracking downstream feels like measuring symptoms instead of causes.
Simplicity is the actual feature. The original quantified-self movement died of bloat. Sixty metrics, dashboards nobody read, wearables that flattered you with green badges. I want the opposite. A setup so small I can’t get bored of it. Readouts so blunt I can’t argue with them.
If a third sensor ever earns its place, it’ll be because the existing two created a gap I can’t reason around. Until then, the list is closed.
Visible gaps as a feature
This is the design pattern I’m most proud of. Both readouts make the gaps in the data visible as first-class information.
On /time, missed nudges show up as amber-outlined cells - only when there’s no logged block for that time bucket. Not hidden, not interpolated, not smoothed over. Visibly missed. If Sunday afternoon has a string of amber cells, the page just shows that.
On /calories, every entry carries an estimated: true/false flag in the JSON. The page renders an “honesty tax” meter showing the ratio. As I write this, it’s at 43% - almost half my calorie log is rough guesses. The meter exists to erode trust in the readout itself when guesses pile up. The more I estimate, the less anyone should trust the numbers.
I haven’t seen this pattern anywhere else. Most tracking apps hide their uncertainty. This one surfaces it as a metric.
Things I deliberately didn’t build
No coaching. The page never tells me to do anything. No “you should eat less,” no green-when-good badges, no streak guilt-tripping. Strava is the anti-pattern.
No macro breakdown. Calories are calories. I don’t split them into protein, carbs, and fat because the WhatsApp pipeline can’t reliably capture that, and honestly I don’t care enough.
No reactivity. Pages render statically at deploy time. Reload and you see the last commit. No live charts, no websockets, no “now syncing…” indicators.
No fake placeholder data. Empty days render as empty rows. The page handles two days and sixty days identically.
Where to look
The actual readouts:
- /time - time audit, each day is a row of 96 resolved 15-minute buckets
- /calories - calorie audit, today’s deficit, calorie bar, activity credits
- /quantified-self - parent page tying it together
The data files live in the same repo, public, generated from append-only private logs. Privacy is by field selection - Hermes strips the raw source text before committing, so the JSON has cleaned labels and numbers but not the original WhatsApp messages.
What comes next
Honestly? Nothing structural. The temptation to add features is the exact failure mode I’m trying to avoid. This setup needs to run for six months without me touching it before I’d even consider adding a third sensor. If it’s still alive in November and there’s a gap I can’t reason around, I’ll think about it then.
In the meantime, I’m watching the readouts. The /time 45-day matrix is the one I expected to find useful and turned out to be genuinely humbling - my real schedule looks nothing like the schedule I carry in my head. That alone has been worth the build.
If you build something similar, I’d love to see it. What to track turns out to be a much harder question than how to track it. And the answers should be small.