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:
| Element | Yêu cầu |
|---|---|
| Trigger | Đang sống ngày bình thường → product phải là passive push, không pull |
| Outcome wanted | Biết 1-2 action cụ thể (không phải dashboard, không phải lecture) |
| Constraint | Không cần mở app, không cần nhớ, không cần suy nghĩ |
| Why now | Giữ 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
| Alternative | Tại sao không work cho ADHD profile |
|---|---|
| Garmin Connect app | Passive — phải chủ động mở. Brain ADHD: 1 lần switching context = -10 điểm productivity. Skip 80% ngày. |
| Apple Health + Smart Reminders | Reminder 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 coach | Cost $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:
- Format ≤2 dòng + severity tag thật sự efficient cho ADHD brain?
- Đúng giờ matter bao nhiêu so với content đúng?
- Personal data > generic advice — bao nhiêu nudge cần personalization để valuable?
- 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:
| Feature | In MVP? | Lý do |
|---|---|---|
| Daily morning summary nudge | ✅ | Core JTBD: biết hôm nay nên đẩy hay recovery |
| Bedtime reminder | ✅ | Core 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ết | ✅ | Habit reflection, mỗi Saturday |
| Caffeine/alcohol/screen-time reminders | ✅ | Behavior-shaping, có evidence (Drake 2013, Roehrs 2001) |
| iOS native app | ❌ | Cost build cao, không matter (Telegram đủ) |
| Voice nudge | ❌ V2 | Tốn TTS infra, defer |
| Multi-user / SaaS | ❌ V3 | Mục tiêu personal product, đừng over-engineer |
| Dashboard / charts | ❌ | Anti-pattern — tôi build chống lại dashboard mode |
| Manual logging UI | 🟡 partial | Sunday batch prompt qua Telegram, không build UI riêng |
Build/buy decision:
- Compute: GCP
cron-hoste2-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 rule | ADHD-first override | Rationale |
|---|---|---|
| ”Cá nhân hóa với tên user” | Skip — user biết là user rồi | Mỗ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ỉ P0 | Real-time mọi event = burnout sau 2 ngày |
| ”Show progress dashboard” | 1 dòng 🎯 Tuần này: 3/7 đêm ≥80 | Dashboard = 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-hoste2-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:
| Feature | Why | Effort |
|---|---|---|
| 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 planner | Personalization 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 → transcript | Sunday batch reflection nhanh hơn typing | ~3 ngày |
| Open-source cho ADHD user khác | Test 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