Luma
Produtividade gamificada com um assistente de IA que age por você.
- Next.js 16
- React 19
- Tailwind 4
- TanStack Query
- Fastify 5
- Drizzle
- PostgreSQL
- Better Auth
- AI SDK
- Google Calendar API
Visão geral
Tarefas, calendário, metas e timer de foco num lugar só, com XP, sequências e conquistas para transformar organização em hábito. O assistente não só responde: ele cria tarefas, registra progresso e monta o seu dia.
Contexto
Apps de produtividade são fáceis de instalar e fáceis de abandonar. O Luma aposta em duas coisas: tornar a constância visível e tirar o atrito, deixando um assistente fazer o trabalho braçal.
Construí como produto de verdade, não como demo: landing page com SEO, onboarding, e-mail transacional, área de admin e um monorepo que roda localmente sem nenhuma chave externa.
O que construí
- Um assistente de IA com 25 ferramentas que mudam dados reais: criar e remarcar tarefas, registrar progresso de metas, planejar o dia. As respostas chegam por streaming (SSE), com até 5 passos de ferramenta por turno.
- Um motor de gamificação dirigido por dados: pontos, níveis, sequências, conquistas, moeda interna com ledger, loja, avatares e ranking semanal.
- Fuso horário por usuário: jobs de hora em hora fecham sequências e rankings e disparam notificações na meia-noite local de cada pessoa, com horário de verão incluído.
- Sincronização com o Google Agenda via OAuth, com tarefas arrastadas direto para o calendário.
- Uma API Fastify modular: 17 módulos com a mesma estrutura (rotas, controller, repositório, schema), validação com Zod, rate limit e um tipo de erro único.
Decisões principais
01Uma API separada
Separei a API do front-end em Next.js para que, no futuro, um app nativo consuma a mesma API, e porque um servidor próprio é mais robusto para jobs agendados e regras de negócio.
02Regras do jogo no banco
Valores de XP, gatilhos e recompensas ficam no banco para que o admin tenha o controle: dá para mudar qualquer coisa direto pelo painel, quando precisar, sem deploy.
03Custo de IA sob controle
Janela deslizante com as últimas 20 mensagens, contexto diário do usuário em cache por 5 minutos, modelos menores, tokens registrados por chamada e rate limit na rota do chat.
04Um job por hora, convertido por usuário
Em vez de um job por fuso, um único job de hora em hora verifica quais usuários acabaram de passar da meia-noite no próprio fuso.
05Cortar escopo de propósito
Construí assinaturas, período de teste e créditos, e depois removi tudo para focar no ciclo principal. Também juntei o app e a API num monorepo público.
O que foi difícil
Tempo. Uma sequência significa "você fez algo hoje", e o hoje depende de onde a pessoa está. Acertar sequências, rankings e lembretes entre fusos e mudanças de horário de verão exigiu mais cuidado do que qualquer tela do app.
Deixar um modelo alterar dados do usuário. Cada ferramenta é uma função pequena e tipada, com validação própria, então o assistente só faz o que o app já permite, e cada chamada fica registrada com seu custo.