← All posts
📅

An AI sleep coach over Telegram: PM journey + 5 design principles for ADHD

I've worn a Garmin for 2 years — sleep, HRV, RHR data all there but zero action. This post logs my build through a PM lens: JTBD, existing alternatives, MVP scope decisions, ADHD-first design principles, and a V2 roadmap for a personalized AI sleep coach over Telegram.

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:

ElementRequirement
TriggerLiving a normal day → product must be passive push, not pull
Outcome wantedKnow 1-2 specific actions (not a dashboard, not a lecture)
ConstraintNo app to open, nothing to remember, nothing to think about
Why nowKeep focus on work + improve sleep

→ Product = bundled actionable nudges delivered at the right time, not a dashboard analytics tool.

Existing alternatives + why they fail

AlternativeWhy it doesn’t work for an ADHD profile
Garmin Connect appPassive — I have to open it. ADHD brain: one context switch = -10 productivity points. Skipped 80% of days.
Apple Health + Smart RemindersGeneric 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-remindersADHD. 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:

  1. Is the ≤2-line + severity tag format actually efficient for an ADHD brain?
  2. How much does the right timing matter compared to the right content?
  3. Personal data > generic advice — how many nudges need personalization to feel valuable?
  4. 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:

FeatureIn MVP?Reason
Daily morning summary nudgeCore JTBD: know whether today is push or recovery
Bedtime reminderCore JTBD: nudge at the right moment
Pre-meeting breath nudgeGoogle 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 summaryHabit reflection, every Saturday
Caffeine/alcohol/screen-time remindersBehavior-shaping, evidence-backed (Drake 2013, Roehrs 2001)
iOS native appHigh build cost, doesn’t matter (Telegram is enough)
Voice nudge❌ V2Costly TTS (Text-to-Speech) infra, defer
Multi-user / SaaS❌ V3Personal product goal, don’t over-engineer
Dashboard / chartsAnti-pattern — I built this to fight against dashboard mode
Manual logging UI🟡 partialSunday batch prompt over Telegram, no separate UI

Build/buy decisions:

  • Compute: GCP cron-host e2-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 ruleADHD-first overrideRationale
”Personalize with the user’s name”Skip — user knows they’re the userEvery 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 P0Real-time everything = burnout in 2 days
”Show a progress dashboard”One line 🎯 This week: 3/7 nights ≥80Dashboard = 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-host e2-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:

FeatureWhyEffort
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 plannerStronger personalization — read full context (sleep + meetings + weekly diary) → personalized plan. ~$0.50/year cost~1 day
Logging via voice → transcriptSunday batch reflection faster than typing~3 days
Open-source for other ADHD usersTest 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).