2

Pitch: Criei um app de hábitos: Expo, SQLite local, TanStack Start no Cloudflare e marketing com IA

Kada

Faz uns dias que comecei um app de hábitos pra mim mesmo, porque os que eu testava pediam conta, mostravam anúncio ou zeravam minha sequência na primeira falha. Virou o Kada: grátis, sem conta, sem anúncios, sem rastreamento, e os dados ficam no celular. A 1.3.0 acabou de sair do forno e está em revisão na Apple. Quis contar como ele é feito por dentro, porque a stack ficou bem enxuta.

O app: Expo e nada de backend

  • Expo SDK 57 + React Native. Um código só pra iOS e Android.
  • Expo Router com NativeTabs. A tab bar é a nativa do iOS (o vidro do iOS 26 vem de graça), e no Android é a do Material.
  • Expo UI pra alguns controles em SwiftUI no formulário de hábito (pickers, toggles, stepper).
  • expo-widgets pro widget interativo: você marca o hábito direto na tela inicial, e o app concilia esses toques quando abre.
  • SQLite local + Drizzle ORM. Não tem servidor. Backup é um arquivo que você exporta e importa.
  • EAS Build, Submit e Update. Um pnpm release gera iOS e Android e já envia pras lojas; correção pequena vai por OTA.

Um bug que me pegou nessa versão: o onboarding travava em "Preparando seus exemplos". O expo-sqlite dispara um evento de mudança por linha, e o useLiveQuery do Drizzle refaz a consulta inteira a cada evento. Semear uns 800 registros de exemplo virava centenas de consultas completas e re-renders, e o JS ficava preso em 100%. Troquei por um hook que junta os eventos em rajada e faz uma consulta só no próximo tick. Coisa de 60 linhas, e o problema sumiu (vale também pra importar backup e pra "apagar tudo").

Dinheiro: só gorjeta

Não tem assinatura nem nada bloqueado. O RevenueCat cuida de 3 gorjetas avulsas (consumíveis). Os números de verdade, sem enfeite:

RevenueCat

MRR zero, 11 dólares em gorjetas e uns 40 aparelhos novos nos últimos 28 dias. É pequeno, e tudo bem. O "cliente" ali é cada aparelho que abre o app, porque o RevenueCat registra um ID anônimo pra gorjeta funcionar.

O site: TanStack Start no Cloudflare

  • TanStack Start rodando em Cloudflare Workers, em 5 idiomas (pt, en, es, de, it), com changelog, central de ajuda e página do Android.
  • As imagens de compartilhamento (og:image) das páginas são geradas no próprio Worker com Takumi (WASM). A da home é feita à mão, por idioma.
  • Analytics com DataFast no modo sem cookies, então o site não precisa de banner de cookies. O painel é público: https://datafa.st/share/6ac9e003737256f34f6b2ebb

Marketing feito por uma pessoa só

  • Os screenshots da App Store saem de um build Release no simulador. O Maestro navega pelo app e tira as capturas nos 5 idiomas, e um editor em Next.js monta os slides.

Screenshot da loja

  • As imagens dos posts foram feitas com a OpenAI (gpt-image, via Codex CLI): o fundo vem do modelo, mas a tela do app é sempre o screenshot real, colado por script. Modelo inventando interface de app não presta.

Post

O que tem de novo na 1.3.0

  • Grade com 20 semanas de cada hábito
  • "Últimos dias", pra registrar o dia que você esqueceu
  • Notas no dia, metas de sequência, "a cada N dias" e "X vezes por mês"
  • Modo pra largar um hábito, tema preto e o visual nativo do iOS

E uma regra que guia o app inteiro: falhar um dia não zera a sequência.


O app tá na App Store (iPhone) e o Android tá em teste fechado. Se testar, qualquer feedback é bem-vindo, seja de bug, de UX ou da stack.

https://kada.day

Carregando publicação patrocinada...