Touvie é um sistema operacional de vida — um único app, privado, que reúne os módulos que normalmente ficam espalhados em cinco apps diferentes: agenda de rotina, metas, diário, controle financeiro, treino e dieta. Construído como PWA (instala no celular, funciona offline) com um bot de Telegram acoplado pra lançar gasto e consultar saldo sem abrir o app.
Não é um clone de tutorial — é um produto pessoal real, em produção na Vercel, com 18 migrations de banco, modelo de segurança próprio e identidade visual autoral.
▶ Demo ao vivo: touvie.vercel.app
| Módulo | O que faz | |
|---|---|---|
| 🗓️ | Rotina | Blocos de hábito/tarefa do dia com marcação de conclusão |
| 🎯 | Metas | Objetivos de curto e longo prazo com acompanhamento |
| 📓 | Diário | Entradas + humor, protegido por PIN de dois níveis (ler ≠ escrever) |
| 💰 | Finanças | Lançamentos, contas a pagar, caixinhas (envelopes) e gráficos |
| 🏋️ | Treino | Séries, cargas, recordes pessoais (PRs) e progressão |
| 🥗 | Dieta | Refeições, macros e medidas corporais |
| 📝 | Notas | Bloco de notas rápido |
| 🔔 | Notificações | Lembretes via Telegram com templates editáveis pela UI |
| 🔍 | Busca | Busca global entre os módulos |
Next.js 15 (App Router, RSC) ──┐
├─ middleware de auth + trust ├─► Supabase (Postgres + RLS + Auth)
├─ Server Actions │ 18 migrations versionadas
└─ Route Handlers (API) │
├─► Bot de Telegram (webhook)
Tailwind + temas CSS └─► Crons (Vercel + externos)
Recharts · next-intl (pt/en)
- Framework: Next.js 15 (App Router, React Server Components, Server Actions)
- Banco/Auth: Supabase (Postgres com Row Level Security, Auth nativo)
- UI: Tailwind CSS + sistema de temas trocável + Recharts pros gráficos
- i18n:
next-intlcom pt-BR e inglês - Integrações: Bot de Telegram (webhook) + crons agendados
- Qualidade: TypeScript estrito com tipos do Supabase gerados, Biome (lint+format)
Estas são as partes em que o "porquê" importa mais que o "o quê":
- Modelo de confiança por dispositivo. O
middleware.tslibera escrita só em dispositivos marcados como confiáveis — no celular o app fica somente-leitura por padrão. A confiança é um cookie assinado com HMAC-SHA256 (lib/crypto.ts), validado server-side via Web Crypto pra rodar igual no edge e no node. - Diário com PIN de dois níveis. Um hash destrava a leitura, outro destrava a escrita — separados de propósito, pra você poder revisitar o diário sem habilitar edição num aparelho emprestado.
- Brute-force barrado no servidor. O PIN tem rate limit no banco (
pin_attempts+pin_locked_until): depois de N erros, o destrave trava por minutos. Não dá pra forçar pelo client. - Notificações como dados, não código. Os lembretes do bot usam templates no Postgres com sintaxe
{{variavel}}— dá pra editar o texto na UI e publicar sem deploy. Cada variável some sozinha quando não tem dado. - Arquitetura de crons híbrida. Os 2 crons mais críticos ficam no
vercel.json(limite do plano Hobby); os demais ficam num scheduler externo autenticado porBearer $CRON_SECRET. O cron financeiro mensal é blindado server-side pra só disparar no dia certo.
pnpm install
cp .env.local.example .env.local # preencha as chaves do Supabase
pnpm dev # http://localhost:3007O passo a passo completo — criar o projeto Supabase, rodar as 18 migrations, configurar o bot de Telegram e agendar os crons — está em docs/OPERATIONS.md.
- ✅ P1 — scaffold, auth, rotina e metas
- ✅ P2 — diário com PIN + autosave
- ✅ P3 — finanças completo + gráficos
- ✅ P4 — bot de Telegram + crons de lembrete
- ✅ P5 — treino avançado (séries, PRs, progressão)
- ✅ P6 — dieta (refeições, macros, medidas)
