← All posts
📅

AI HLV giấc ngủ chạy Telegram: PM journey + 5 design principle cho ADHD

Tôi đeo Garmin 2 năm — sleep, HRV, RHR data đầy đủ nhưng action zero. Bài này tôi log lại theo PM lens: JTBD, existing alternatives, MVP scope decisions, ADHD-first design principle, và roadmap V2 cho con AI coach giấc ngủ cá nhân hóa qua Telegram.

TL;DR — Tôi build health-coach — con AI coach giấc ngủ cá nhân hóa, đọc Garmin sleep/HRV/RHR data, gửi 1-2 nudge actionable qua Telegram đúng thời điểm trong ngày. Stack: GCP cron-host (free tier) + Python + Anthropic Haiku + Telegram bot. Cost $0.05/năm, ship MVP sau 1 weekend, ~10 nudge/ngày, severity tag 🟢🟡🔴 + action verb đầu câu (ADHD-friendly). Bài này tôi viết theo PM lens — JTBD framework, existing alternatives + tại sao fail, MVP scope decisions, ADHD-first design principle, và roadmap V2. Take-away cuối: personal product là PM training tốt nhất — không có roadmap, không có team, không có dashboard — buộc tôi phải tự design end-to-end thinking.

User research n=1

User của product này là tôi. Profile:

  • PM ở SaaS company VN, lịch ~6-8 meeting/ngày
  • ADHD diagnosed, cognitive switch cost cao, attention span ngắn
  • Đeo Garmin Venu 3 hơn 2 năm, sleep/HRV/RHR data đầy đủ
  • Goal cá nhân: ngủ ≥80 điểm trung bình tuần (target số sleep score Garmin)
  • Hiện trạng: ~50% tuần đạt mục tiêu — không phải vì không biết phải làm gì, mà vì không nhớ hành động đúng giờ

Pain point thật sự: không phải thiếu data, không phải thiếu kiến thức (tôi đọc Why We Sleep, Outlive, biết về circadian rhythm). Pain là moment-of-decision: 14h chiều, đang gặp client, brain ADHD focus 100% vào meeting, không có ai nhắc “đừng uống cafe nữa”. 22h, đang dở 1 task interesting, không có ai nhắc “đến giờ tắt màn hình”. Sáng dậy 95 điểm, brain không tự kết luận “vậy hôm nay push it” — phải có ai nói cho mới hành động.

JTBD framework

Khi tôi viết JTBD cho product này, statement là:

Khi tôi đang sống ngày bình thường (làm việc, họp, mệt), tôi muốn được biết duy nhất 1-2 hành động cụ thể nên làm bây giờ để ngủ tốt hơn tối nay, mà không cần mở app, không cần nhớ, không cần suy nghĩ — để tôi giữ được focus cho công việc đang làm và vẫn cải thiện sleep score tuần.

Phân tích statement:

ElementYêu cầu
TriggerĐang sống ngày bình thường → product phải là passive push, không pull
Outcome wantedBiết 1-2 action cụ thể (không phải dashboard, không phải lecture)
ConstraintKhông cần mở app, không cần nhớ, không cần suy nghĩ
Why nowGiữ focus cho công việc + cải thiện sleep

→ Product = bundled actionable nudge gửi đúng thời điểm, không phải dashboard analytics.

Existing alternatives + tại sao fail

AlternativeTại sao không work cho ADHD profile
Garmin Connect appPassive — phải chủ động mở. Brain ADHD: 1 lần switching context = -10 điểm productivity. Skip 80% ngày.
Apple Health + Smart RemindersReminder generic, không có context (sleep score hôm qua bao nhiêu? RHR có cao bất thường?). Mute sau 2 ngày.
Whoop coachCost $30/tháng. Nudge tiếng Anh, generic AI advice không cá nhân hóa, không hiểu ADHD context.
HLV thật$200-500/tháng. Tôi không cần human, tôi cần trigger đúng giờ.
Tự nhớADHD. Đã thử 6 tháng. Fail.

Gap: không có sản phẩm nào convert wearable data + personal context → actionable nudge cho ADHD profile, free tier.

Product hypothesis

Sau khi map JTBD + alternatives, hypothesis của tôi:

Nếu tôi nhận 1 message Telegram ≤2 dòng, có severity tag + action verb đầu câu, gửi đúng thời điểm trong ngày (sáng plan, tối nhắc bedtime, real-time alert anomaly), dùng data Garmin của tôi chứ không phải generic advice — thì sleep score trung bình tuần sẽ tăng từ ~50% → ~80% đạt mục tiêu, mà không tốn switching cost trong giờ làm việc.

Hypothesis này có 4 component cần verify:

  1. Format ≤2 dòng + severity tag thật sự efficient cho ADHD brain?
  2. Đúng giờ matter bao nhiêu so với content đúng?
  3. Personal data > generic advice — bao nhiêu nudge cần personalization để valuable?
  4. Telegram channel vs SMS / Apple Notif / Voice — channel nào activation cao nhất?

MVP scope decisions

Tôi cho mình 1 weekend (~2 ngày) để ship MVP. Những thứ phải cut để ship được trong 2 ngày:

FeatureIn MVP?Lý do
Daily morning summary nudgeCore JTBD: biết hôm nay nên đẩy hay recovery
Bedtime reminderCore JTBD: nudge đúng moment
Pre-meeting breath nudgeĐã có Google Calendar integration, ROI cao
Anomaly alert (sleep <60, RHR z-score >1.5)Critical — không thể miss
Weekly digest tổng kếtHabit reflection, mỗi Saturday
Caffeine/alcohol/screen-time remindersBehavior-shaping, có evidence (Drake 2013, Roehrs 2001)
iOS native appCost build cao, không matter (Telegram đủ)
Voice nudge❌ V2Tốn TTS infra, defer
Multi-user / SaaS❌ V3Mục tiêu personal product, đừng over-engineer
Dashboard / chartsAnti-pattern — tôi build chống lại dashboard mode
Manual logging UI🟡 partialSunday batch prompt qua Telegram, không build UI riêng

Build/buy decision:

  • Compute: GCP cron-host e2-micro always free — $0/tháng. Buy free tier > build infra.
  • LLM: Anthropic Haiku 4.5 raw HTTP (chỉ cho weekly digest narrative) — ~$0.05/năm. Buy LLM > train model.
  • Channel: Telegram bot — unlimited free, có markdown, native push. Buy > build SMS.
  • Data: Garmin Connect API qua intermediate sync repo. Buy data > build wearable.

MVP cost: $0.05/năm. Free-tier infra force good MVP discipline — không có “thôi cứ ship cloud Premium” để escape decision.

Design principle: ADHD-first, không general-purpose

Đây là phần quyết định product success/fail nhất.

Khi build product cho ADHD user, mọi quyết định UX cần ngược với “common best practice”:

Common UX ruleADHD-first overrideRationale
”Cá nhân hóa với tên user”Skip — user biết là user rồiMỗi character thừa = cognitive cost
”Tone thân thiện, đầy đủ ngữ cảnh”Action verb đầu câu, ngắn”Lên giường giờ quen” > “Bạn có muốn cân nhắc lên giường?"
"Soft suggestion để user không feel forced”Direct + evidence + impact số”(target sleep ≥80, expected +6, Smarr 2018)” → ADHD trust evidence
”Real-time notification để engaged”Bundle 2x/ngày, real-time chỉ P0Real-time mọi event = burnout sau 2 ngày
”Show progress dashboard”1 dòng 🎯 Tuần này: 3/7 đêm ≥80Dashboard = pull mode = ADHD skip
”Polite emoji friendly”Severity-coded emoji (🟢🟡🔴)Tag ở đầu = 100ms scan, brain prioritize đúng

Output ví dụ (sáng score 95):

🟢 Push day
Sáng nay ngủ 95 điểm và HRV 41 — push it today nhé.

⚡ sleep 95 · HRV 41 · RHR 57
🎯 Tuần này: 4/7 đêm ≥80 điểm

Hôm nay:
• lên giường cùng giờ quen (+6 điểm)
• ra nắng 10 phút sáng (+5 điểm)

📅 2 meeting căng trong 14h tới

5 dòng. Severity, score, weekly streak, 2 action specific, calendar context. Đây là toàn bộ thông tin cần để vận hành 1 ngày. Không cần dashboard, không cần app.

Stack tóm gọn

Vì đây là blog PM lens nên tôi để stack ở 1 đoạn ngắn cho ai tò mò technical:

  • Compute: GCP cron-host e2-micro (Always Free us-west1)
  • Schedule: systemd user timers (declarative, persistent, journal logs free)
  • Code: Python 3.11 + venv, stdlib zoneinfo, no heavy framework
  • Data: Garmin Connect → GitHub sync repo → cron-host pull mỗi 30min
  • LLM: Anthropic Haiku 4.5 (raw HTTP, chỉ cho weekly digest)
  • Channel: Telegram bot (markdown, push native)
  • Calendar: Google Calendar API (OAuth) cho pre-meeting breath nudge

7 systemd timer phụ trách 7 cadence khác nhau (sáng plan, fire-due mỗi 15min, anomaly check, weekly digest, weekly chart, log prompt, garmin pull). Clean separation, dễ debug từng cadence riêng.

Activation tuần đầu

Sau 1 tuần dùng MVP:

  • Open rate: 100% — tôi đọc mọi nudge sáng và bedtime (Telegram push thẳng vào lock screen)
  • Action rate (subjective): ~70% nudge action — tôi thật sự ra nắng sáng, lên giường giờ quen, không uống cafe sau 14h
  • Sleep score 7-day moving average: chưa đủ data để statistical significance, nhưng pattern ban đầu là tích cực
  • Cognitive load: 5-15s mỗi nudge, gần như không tốn switching cost vì Telegram push đã là habit
  • Burnout risk: zero — vì bundle 2x/ngày + severity tag tự filter

→ Hypothesis “đúng giờ + đúng action + ≤2 dòng + personal data” có vẻ đang được validate. Cần thêm 4 tuần để conclude.

Roadmap V2

Sau khi V1 ổn định, tôi đang cân nhắc 4 hướng:

FeatureWhyEffort
Voice nudge thay text (clone giọng tôi qua VieNeu-TTS)Hypothesis: voice nhanh hơn text 30-40% cho ADHD parsing~2 ngày
LLM coach realtime thay rule-based plannerPersonalization mạnh hơn — đọc full context (sleep + meeting + diary tuần) → output personalized plan. ~$0.50/năm cost~1 ngày
Logging via voice → transcriptSunday batch reflection nhanh hơn typing~3 ngày
Open-source cho ADHD user khácTest hypothesis ngoài profile của tôi. Cùng codebase, khác Garmin token + Telegram chat~1 tuần (refactor + docs)

Monetize không phải mục tiêu. Đây là personal tool — share OK, đừng SaaS.

5 take-away cho PM khác

Nếu bạn cũng là PM đang build personal product hoặc oversee engineering side project, đây là 5 lesson tôi rút ra:

1. JTBD trước stack. Tôi viết JTBD statement đầu tiên, mọi quyết định MVP scope sau đó dễ trade-off. Không có JTBD thì kéo dài “có nên ship feature X không” mãi.

2. Free-tier infra là design constraint, không phải limitation. GCP/Cloudflare/Telegram free tier buộc tôi cut feature thừa, ship MVP trong weekend. Nếu có cloud budget thoải mái, tôi sẽ build dashboard + iOS app + multi-tenant — và không bao giờ ship.

3. ADHD-first design là portable principle. Action verb đầu câu, severity tag, ≤2 dòng, bundle thay real-time — apply được cho mọi product có target user “busy + cognitive overload” (executive, doctor, ICU nurse, on-call SRE). Đây là principle có thể bring sang product day-job.

4. AI assistant như team mate — phải onboard. Tôi save 4-5 product principle vào AI memory; next project AI tự apply. Đầu tư 30 phút viết memory rules trade ROI > 30 giờ debug repeat lessons. PM 1-người cần extend mình bằng AI infrastructure, không phải dùng AI như Google Search nâng cao.

5. Personal product là PM training tốt nhất. Không có roadmap, không có engineering team, không có user research budget — buộc bạn tự owner end-to-end thinking: research → spec → ship → measure → iterate. Tôi học được nhiều về MVP scope discipline + free-tier creativity từ side project hơn từ work day-job — vì ở day-job luôn có team đỡ giúp 1 phần.


Bài học cuối cùng: product không bắt đầu từ stack — bắt đầu từ user pain. Khi tôi map JTBD trước viết Python, MVP scope tự rõ ràng: cut 60% feature ban đầu nghĩ là “phải có”, giữ lại 40% thật sự serve JTBD. Đó là kỷ luật PM quan trọng nhất, mà 1 con coach giấc ngủ cá nhân hóa cuối tuần đã dạy tôi tốt hơn bất kỳ MBA case study nào.

Source code (private repo, có thể share architecture nếu DM): github.com/marcng-study/health-coach