TL;DR — I built
health-coach(private repo) — a personalized AI sleep coach that reads Garmin data (sleep score, HRV — heart rate variability, RHR — resting heart rate) and sends 1-2 actionable nudges over Telegram at the right time of day. Stack: GCP cron-host (free tier) + Python + Anthropic Haiku + Telegram bot. Cost $0.05/year, MVP (Minimum Viable Product) shipped over a weekend, ~10 nudges/day, severity tag 🟢🟡🔴 + action verb at the start of each sentence (ADHD-friendly). I’m writing this through a PM lens — JTBD (Jobs-To-Be-Done — the framework for identifying the “job” a user hires a product to do) framework, existing alternatives + why they fail, MVP scope decisions, ADHD-first design principles, and a V2 roadmap. Final take-away: personal products are the best PM training there is — no roadmap, no team, no dashboard — they force you to design end-to-end thinking by yourself.
User research n=1
The user of this product is me. Profile:
- PM at a VN SaaS company, ~6-8 meetings/day
- ADHD diagnosed, high cognitive switching cost, short attention span
- Garmin Venu 3 for over 2 years, full sleep/HRV/RHR data
- Personal goal: average weekly sleep score ≥80 (the Garmin sleep score target)
- Status quo: ~50% of weeks hit the goal — not because I don’t know what to do, but because I don’t remember the right action at the right time
Real pain point: not a data shortage, not a knowledge shortage (I’ve read Why We Sleep, Outlive, I understand circadian rhythm). The pain is the moment-of-decision: 2 PM, in a client meeting, ADHD brain 100% on the meeting, nobody to say “stop drinking coffee now”. 10 PM, in the middle of an interesting task, nobody to say “time to turn off the screen”. Morning sleep score 95, the brain doesn’t auto-conclude “push it today” — someone has to say it before I act.
JTBD framework
When I wrote the JTBD for this product, the statement was:
When I’m living a normal day (working, in meetings, tired), I want to be told exactly 1-2 specific actions I should take right now to sleep better tonight, without opening an app, without remembering, without thinking — so that I keep focus on what I’m working on and still improve my weekly sleep score.
Breaking it down:
| Element | Requirement |
|---|---|
| Trigger | Living a normal day → product must be passive push, not pull |
| Outcome wanted | Know 1-2 specific actions (not a dashboard, not a lecture) |
| Constraint | No app to open, nothing to remember, nothing to think about |
| Why now | Keep focus on work + improve sleep |
→ Product = bundled actionable nudges delivered at the right time, not a dashboard analytics tool.
Existing alternatives + why they fail
| Alternative | Why it doesn’t work for an ADHD profile |
|---|---|
| Garmin Connect app | Passive — I have to open it. ADHD brain: one context switch = -10 productivity points. Skipped 80% of days. |
| Apple Health + Smart Reminders | Generic reminders, no context (what was yesterday’s sleep score? is RHR abnormally high?). Muted after 2 days. |
| Whoop coach | $30/month. Nudges in English, generic AI advice with no personalization, no ADHD context. |
| A real coach | $200-500/month. I don’t need a human, I need a trigger at the right time. |
| Self-reminders | ADHD. Tried for 6 months. Failed. |
→ Gap: nothing on the market converts wearable data + personal context → actionable nudges for an ADHD profile, on a free tier.
Product hypothesis
After mapping JTBD + alternatives, my hypothesis:
If I receive a Telegram message ≤2 lines, with a severity tag + an action verb at the start of the sentence, delivered at the right time of day (morning planning, bedtime reminder, real-time anomaly alert), using my own Garmin data rather than generic advice — then weekly average sleep score will rise from ~50% → ~80% hit rate, without spending switching cost during work hours.
The hypothesis has 4 components to verify:
- Is the ≤2-line + severity tag format actually efficient for an ADHD brain?
- How much does the right timing matter compared to the right content?
- Personal data > generic advice — how many nudges need personalization to feel valuable?
- Telegram channel vs SMS / Apple Notifications / Voice — which channel produces the highest activation (the rate at which the user actually acts on a notification)?
MVP scope decisions
I gave myself one weekend (~2 days) to ship the MVP. Things I had to cut to ship in 2 days:
| Feature | In MVP? | Reason |
|---|---|---|
| Daily morning summary nudge | ✅ | Core JTBD: know whether today is push or recovery |
| Bedtime reminder | ✅ | Core JTBD: nudge at the right moment |
| Pre-meeting breath nudge | ✅ | Google Calendar integration already there, high ROI |
| Anomaly alert (sleep <60, RHR z-score >1.5 — RHR abnormally high vs the 30-day baseline) | ✅ | Critical — can’t miss |
| Weekly digest summary | ✅ | Habit reflection, every Saturday |
| Caffeine/alcohol/screen-time reminders | ✅ | Behavior-shaping, evidence-backed (Drake 2013, Roehrs 2001) |
| iOS native app | ❌ | High build cost, doesn’t matter (Telegram is enough) |
| Voice nudge | ❌ V2 | Costly TTS (Text-to-Speech) infra, defer |
| Multi-user / SaaS | ❌ V3 | Personal product goal, don’t over-engineer |
| Dashboard / charts | ❌ | Anti-pattern — I built this to fight against dashboard mode |
| Manual logging UI | 🟡 partial | Sunday batch prompt over Telegram, no separate UI |
Build/buy decisions:
- Compute: GCP
cron-hoste2-micro always free — $0/month. Buy free tier > build infra. - LLM: Anthropic Haiku 4.5 raw HTTP (only for the weekly digest narrative) — ~$0.05/year. Buy LLM > train model.
- Channel: Telegram bot — unlimited free, markdown, native push. Buy > build SMS.
- Data: Garmin Connect API via an intermediate sync repo. Buy data > build wearable.
→ MVP cost: $0.05/year. Free-tier infra forces good MVP discipline — no “let’s just ship Premium cloud” to escape the decision.
Design principle: ADHD-first, not general-purpose
This is the part that most determines product success or failure.
When building for an ADHD user, every UX decision needs to go against “common best practice”:
| Common UX rule | ADHD-first override | Rationale |
|---|---|---|
| ”Personalize with the user’s name” | Skip — user knows they’re the user | Every extra character = cognitive cost |
| ”Friendly tone, full context” | Action verb at the start, short | ”Get into bed at your usual time” > “Would you like to consider going to bed?" |
| "Soft suggestion so the user doesn’t feel forced” | Direct + evidence + impact number | ”(target sleep ≥80, expected +6, Smarr 2018)” → ADHD trusts evidence |
| ”Real-time notifications to stay engaged” | Bundle 2x/day, real-time only for P0 | Real-time everything = burnout in 2 days |
| ”Show a progress dashboard” | One line 🎯 This week: 3/7 nights ≥80 | Dashboard = pull mode = ADHD skips |
| ”Polite friendly emoji” | Severity-coded emoji (🟢🟡🔴) | Tag at the start = 100ms scan, brain prioritizes correctly |
Example output (morning score 95):
🟢 Push day
Slept 95 last night and HRV 41 — push it today.
⚡ sleep 95 · HRV 41 · RHR 57
🎯 This week: 4/7 nights ≥80
Today:
• get into bed at your usual time (+6 points)
• 10 min sunlight in the morning (+5 points)
📅 2 heavy meetings in the next 14h
5 lines. Severity, score, weekly streak, 2 specific actions, calendar context. This is all the information needed to run a day. No dashboard, no app.
Stack in brief
Since this is a PM-lens post, I’ll keep the stack to one short paragraph for the technically curious:
- Compute: GCP
cron-hoste2-micro (Always Free us-west1) - Schedule: systemd user timers (declarative, persistent, free journal logs)
- Code: Python 3.11 + venv, stdlib
zoneinfo, no heavy framework - Data: Garmin Connect → GitHub sync repo → cron-host pulls every 30min
- LLM: Anthropic Haiku 4.5 (raw HTTP, only for the weekly digest)
- Channel: Telegram bot (markdown, native push)
- Calendar: Google Calendar API (OAuth) for the pre-meeting breath nudge
7 systemd timers handle 7 different cadences (morning plan, fire-due every 15min, anomaly check, weekly digest, weekly chart, log prompt, garmin pull). Clean separation, each cadence easy to debug independently.
First-week activation
After one week of MVP use:
- Open rate: 100% — I read every morning and bedtime nudge (Telegram push goes straight to the lock screen)
- Action rate (subjective): ~70% of nudges acted on — I actually got morning sun, went to bed on time, stopped drinking coffee after 2 PM
- 7-day moving average sleep score: not enough data for statistical significance yet, but the early pattern is positive
- Cognitive load: 5-15s per nudge, almost no switching cost because Telegram push is already a habit
- Burnout risk: zero — bundle 2x/day + severity tag self-filters
→ The “right time + right action + ≤2 lines + personal data” hypothesis is being validated. 4 more weeks needed to conclude.
V2 roadmap
After V1 stabilizes, I’m weighing 4 directions:
| Feature | Why | Effort |
|---|---|---|
| Voice nudge instead of text (cloning my voice via VieNeu-TTS) | Hypothesis: voice is 30-40% faster than text for ADHD parsing | ~2 days |
| Real-time LLM coach instead of a rule-based planner | Stronger personalization — read full context (sleep + meetings + weekly diary) → personalized plan. ~$0.50/year cost | ~1 day |
| Logging via voice → transcript | Sunday batch reflection faster than typing | ~3 days |
| Open-source for other ADHD users | Test the hypothesis beyond my profile. Same codebase, different Garmin token + Telegram chat | ~1 week (refactor + docs) |
Monetization is not the goal. This is a personal tool — sharing is fine, don’t SaaS it.
5 take-aways for other PMs
If you’re also a PM building a personal product or overseeing engineering on a side project, here are 5 lessons:
1. JTBD before stack. I wrote the JTBD statement first, and every MVP scope decision afterward was easy to trade off. Without JTBD, “should we ship feature X” drags on forever.
2. Free-tier infra is a design constraint, not a limitation. GCP/Cloudflare/Telegram free tiers forced me to cut extras and ship the MVP in a weekend. With a comfortable cloud budget, I’d build a dashboard + iOS app + multi-tenant — and never ship.
3. ADHD-first design is a portable principle. Action verb at the start, severity tag, ≤2 lines, bundle instead of real-time — these apply to any product targeting “busy + cognitive overload” users (executives, doctors, ICU nurses, on-call SREs). It’s a principle worth bringing to the day-job product.
4. The AI assistant is a teammate — onboard it. I save 4-5 product principles into AI memory; the next project, the AI applies them itself. 30 minutes spent writing memory rules trades for >30 hours of debugging repeat lessons. A one-person PM needs to extend themselves with AI infrastructure, not use AI as advanced Google Search.
5. Personal products are the best PM training. No roadmap, no engineering team, no user research budget — you’re forced to own end-to-end thinking: research → spec → ship → measure → iterate. I learned more about MVP scope discipline + free-tier creativity from this side project than from the day job — because at the day job there’s always a team carrying part of it.
Final lesson: the product doesn’t start from the stack — it starts from user pain. When I mapped JTBD before writing Python, the MVP scope became obvious: cut 60% of the features I initially thought were “must-have”, keep the 40% that genuinely serve the JTBD. That’s the most important PM discipline, and a personal weekend sleep coach taught it to me better than any MBA case study.
Source code (private repo, architecture can be shared on DM).