🔗 O link /healthdb: o painel ao vivo
O coach mora no Telegram, mas às vezes você quer ver tudo de uma vez — sono da semana, peso caindo, pressão, intake. Pra isso existe o comando /healthdb: ele te manda um botão de deep-link que abre o dashboard ao vivo, lendo direto do seu Supabase. É a mesma verdade do bot, só que num painel visual.
🟣 Novo aqui?
- Dashboard — uma página web (em
agent/dashboard/) que lê o seu Supabase e desenha cards e gráficos. Mesmo banco do coach, outra janela. - Deep-link — um link que já abre direto no lugar certo e autenticado. Aqui ele carrega o seu token de uma vez só, sem você digitar senha.
- Cookie HttpOnly — um cookie que o navegador guarda mas o JavaScript da página não consegue ler. Serve pra esconder o token de scripts maliciosos.
🎛️ Recriação ilustrativa do dashboard — não é screenshot real. Números fictícios, só para mostrar o leiaute.
📊 Como ler: a janela tem a barra de título (3 bolinhas) e cards independentes. Cada card é uma fonte: sono, peso, intake, pressão, HRV. As mini-barras mostram a tendência, não só o número de hoje — é isso que o painel acrescenta ao chat.
Objetivo: abrir o dashboard ao vivo autenticado. No Telegram você só manda /healthdb e o coach devolve este botão; o link em si é assim:
https://<seu-host>/healthdb?token=<DASHBOARD_TOKEN>
Como verificar: ao abrir, o painel carrega; recarregue a página e repare que o ?token=... some da URL — ele migrou para um cookie HttpOnly no 1º load. Se o painel continuar aberto sem o token na barra, deu certo.
💡 Por que um link, e não uma senha
O token vai uma vez na URL e na sequência some — fica só no cookie HttpOnly. Você não digita nada, e o segredo não fica pendurado no histórico do navegador depois do 1º load. É conveniência sem deixar a porta destrancada.
Conceitos-chave
O comando que gera o botão do painel.
Abre direto e já autenticado.
Some da URL no 1º load.
Lê o mesmo Supabase do coach.
😴 O card Sleep & Recovery
O card mais importante do painel é o Sleep & Recovery: os últimos 7 dias de sono e recuperação, lado a lado. Um número isolado mente; sete dias mostram o padrão — se você está acumulando dívida de sono ou se recuperou. É o mesmo dado que entra no snapshot do coach, agora desenhado.
📊 Como ler: a barra roxa é quanto você dormiu; a linha ciano é como você recuperou. Note a quarta-feira (barra vermelha, 5h30 → recovery 48%): noite curta puxa a recuperação pra baixo. A sexta dormiu mais e recuperou a 80%. O painel mostra a relação, não números soltos.
🔎 O que olhar nesse card
- •A tendência da semana, não o dia: 7 dias dizem se você está pagando ou acumulando dívida de sono.
- •Os vales (dias vermelhos) e o que veio antes: jantar tarde, álcool, treino pesado à noite.
- •Se a recuperação sobe depois de uma boa noite — confirma que o sono é a sua maior alavanca.
Conceitos-chave
A janela que revela o padrão.
Barra e linha contam a mesma história.
O dia ruim aponta a causa do dia anterior.
É o que o coach usa no snapshot.
📉 Tendências: peso, intake e vitals
Peso, intake (o que você comeu) e vitals (pressão, HRV, frequência de repouso) só fazem sentido ao longo do tempo. O peso de hoje pode ser água; a linha de duas semanas é a verdade. O dashboard plota essas tendências pra você ver a inclinação, não o ruído do dia.
📊 Como ler: ignore se um ponto sobe um pouco (água, sal). O que importa é a inclinação: a linha desce de 78,5 para 75,0 kg e entra na faixa de meta (ciano). Tendência descendente suave > obsessão com o número diário.
Objetivo: ver os mesmos pontos que o dashboard plota, direto do Supabase, sem abrir o navegador.
python3 agent/scripts/db.py query \
"select date, weight_kg from vitals \
where weight_kg is not null \
order by date desc limit 14"
Como verificar: sai uma tabela de 14 linhas com data e peso. Confira que os valores batem com a linha do card de peso no /healthdb — painel e banco contam a mesma história.
✓ Ler tendência
- ✓Olhar a inclinação de 7–14 dias.
- ✓Cruzar peso ↓ com intake e sono da semana.
- ✓Esperar a linha antes de mudar a estratégia.
✗ Reagir ao ruído
- ✗Surtar porque subiu 0,4 kg num dia.
- ✗Cortar comida vendo um único pico.
- ✗Pesar em horários diferentes e comparar.
Conceitos-chave
A direção da linha > o ponto de hoje.
Água e sal mexem no dia, não na semana.
O que entrou: calorias e macros.
Pressão, HRV, RHR ao longo do tempo.
📖 Ler como história, não como número solto
Um número sozinho — "recovery 48%" — não ensina nada. A história ensina: por que caiu, o que mudou, o que fazer. O dashboard mostra os números; você (e o coach) os transforma em narrativa. Ler o painel é perguntar "qual é a história desta semana?".
✗ Número solto
- ✗"Recovery 48%." E daí? Não diz a causa nem o próximo passo.
- ✗"Peso 75,4." Subiu ou desceu? Em relação a quê?
- ✗Olhar um dado, sentir culpa, fechar o painel.
✓ Como história
- ✓"Caiu pra 48% porque jantei tarde + vinho; amanhã janto cedo."
- ✓"Peso desce há 10 dias; o que mudou foi parar de comer às 19h."
- ✓Olhar a semana, entender a causa, ajustar uma coisa.
Vê o vale
A recuperação despencou na quarta. O número sozinho só assusta.
Busca a causa
Olha o dia anterior no card de intake: jantar às 21h30 + duas taças de vinho.
Tira a lição
"Jantar tarde + álcool = recovery baixa pra mim." Vira um padrão conhecido.
Ajusta e confirma
Janta cedo na quinta; sexta a recuperação volta a 80%. A história fechou — e ensinou um botão seu.
Conceitos-chave
A causa por trás do número.
A variável que moveu a linha.
Número → causa → próximo passo.
Dado é informação, não julgamento.
🔐 Segurança do dashboard
O painel mostra dado de saúde — sensível. Quem protege é o DASHBOARD_TOKEN: uma chave secreta no seu ~/.env que destranca o dashboard. Sem o token certo, a página não abre. E o token nunca fica exposto: depois do 1º load ele vive só no cookie HttpOnly.
🟣 Novo aqui?
- DASHBOARD_TOKEN — uma das chaves do
~/.env(a tabela do README diz: "Gates the web dashboard"). É o segredo que libera o painel. - ~/.env — arquivo na sua home onde ficam os segredos. Fora do git, nunca versionado.
- HttpOnly — o cookie existe para o servidor, mas o JavaScript da página não lê. Reduz o risco se algum script malicioso rodar na aba.
📊 Como ler: da esquerda pra direita é o caminho do token: nasce no ~/.env, vai uma vez na URL, é guardado no cookie HttpOnly (caixa roxa) e a URL fica limpa (caixa verde). Depois disso, o segredo não está mais visível na barra de endereço.
Objetivo: criar um token longo e aleatório e gravá-lo no seu ~/.env (nunca um valor fácil de adivinhar).
python3 -c "import secrets; print('DASHBOARD_TOKEN=' + secrets.token_urlsafe(32))" \
>> ~/.env
Como verificar: rode grep DASHBOARD_TOKEN ~/.env e veja uma linha com ~43 caracteres aleatórios. Reinicie o servidor do dashboard e o /healthdb passa a abrir só com esse token.
⚠️ Nunca faça isto com o token
- •Colar o link
?token=...num grupo, print ou rede social — é a chave do seu painel. - •Commitar o
~/.envou o token no git. - •Usar um valor curto/óbvio (ex.:
123456). Se vazar, gere outro e troque no~/.env.
Conceitos-chave
A chave que destranca o painel.
Cookie que o JS não lê.
Segredo fora do git.
Gere outro token e atualize.
🗓️ Revisar toda semana
O coach faz a revisão da manhã (diária). O dashboard é pra revisão da semana: uma vez por semana, abra o /healthdb com calma e leia as quatro tendências como um relatório. Cinco minutos transformam dados acumulados em decisão.
✅ Checklist da revisão semanal
Objetivo: garantir que a recuperação e o sono da semana inteira já estão no banco antes de você abrir o painel.
python3 agent/scripts/whoop-sync.py
Como verificar: o script escreve recovery_pct, hrv_ms, resting_hr e sleep_hours na tabela vitals. Rodar de novo é idempotente (não duplica). Depois, o card Sleep & Recovery do /healthdb mostra a semana completa.
💡 Um ajuste por vez
A revisão semanal não é pra mudar tudo. Escolha um botão (jantar mais cedo, cortar café à tarde, dormir 30 min antes) e teste por sete dias. Na próxima revisão, a tendência confirma — ou não. É assim que você aprende os seus botões sem virar uma planilha de culpa.
Conceitos-chave
Manhã = coach; semana = painel.
Sono, peso, intake, vitals.
Uma mudança por semana, testável.
Re-rodar o sync não duplica.
🔁 Dado → ajuste → resultado
Tudo no curso converge para um único ciclo: você vê o dado no painel, faz um ajuste, e a próxima semana mostra o resultado — que vira o novo dado. Foi esse loop que levou o autor a −3,5 kg no sprint, sem passar fome: dormindo cheio e parando de comer por volta das 19h.
📊 Como ler: três caixas, um ciclo. Dado (painel) → Ajuste (uma mudança pequena) → Resultado (verde, a meta) → e a seta de baixo devolve ao Dado. Cada volta é uma semana. O segredo do −3,5 kg não foi força de vontade: foi o ciclo girando.
🏁 O curso inteiro em uma frase
Você construiu um coach que registra (Trilha 2), que conversa com você todo dia (Trilha 3) e que te mostra a história nos números (este módulo). O resto é girar o ciclo: ver, ajustar, confirmar. Os seus botões você aprende fazendo.
✅ Auto-checagem (opcional): o que levou o autor a −3,5 kg sem passar fome?
Conceitos-chave
O painel mostra onde você está.
Uma mudança pequena e testável.
−3,5 kg sem fome: o loop funcionando.
O resultado vira o próximo dado.
📋 Resumo do módulo
🎉 Você concluiu o curso!
Você concluiu o curso! Volte ao início para revisar qualquer trilha ou retomar de onde parou. Agora é girar o ciclo na sua própria rotina — ver, ajustar, confirmar.