Todos os artigos

Pistochia

Em breve

Um app de iPhone para pessoas com TDAH. Você fala ou digita o que está na sua cabeça e recebe de volta passos pequenos o bastante para começar, organizados pela sua energia naquele dia.

Meu papel
Design e desenvolvimento, sozinho
Ano
2026
Feito com
Expo · React Native · SQLite · Supabase Edge Functions · Claude · Whisper · RevenueCat
EXPO CLIENT: OFFLINE-FIRSTSQLITESUPABASE ANONYMOUS AUTHEDGE PROXY: OPERATIONALLOWLIST, QUOTASREVENUECAT: PAYWALLCLAUDE: TASK BREAKDOWNWHISPER: VOICE INTAKEFIRST OPENOPERATION IDWORKS IN AIRPLANE MODEFAIL-CLOSED LIMITS, AI_PAUSED KILL SWITCHPROMPTS LIVE SERVER-SIDE (ops.ts)

Role para o lado para ver o diagrama inteiro.

ArquiteturaOFFLINE-FIRST CLIENT → OPERATION ALLOWLIST PROXY → CLAUDE / WHISPER

O problema

Para quem tem TDAH, o difícil muitas vezes é começar, não lembrar. Um app de tarefas que guarda a montanha inteira vira uma lista de coisas pelas quais se sentir culpado. A unidade de trabalho precisa encolher até que começar pareça fácil, e o app precisa funcionar assim que é aberto.

Como foi construído

Um app Expo offline-first sobre SQLite local, com migrations versionadas. A identidade vem da auth anônima do Supabase, então o primeiro brain dump acontece antes de qualquer tela de cadastro. Toda chamada de IA passa por uma edge function que funciona por operação: o app envia o nome de uma operação e seus parâmetros, nunca um prompt e nunca uma chave. A função confere a operação contra uma allowlist e aplica rate limit por IP, cotas diárias por instalação e um kill switch. O Claude divide as tarefas, e o Whisper, atrás do mesmo proxy, cuida da voz. O RevenueCat gerencia o paywall, e o analytics fica desligado até o usuário concordar.

Decisões importantes

  • O app não guarda nenhuma chave de API

    Entram nomes de operações e saem resultados estruturados. A chave da API fica na edge function, atrás de um kill switch, cotas e limites que bloqueiam em caso de falha.

  • É offline-first

    As tarefas ficam no SQLite do celular, com migrations de verdade. Uma ferramenta para TDAH que precisasse de internet para mostrar seu próximo passo falharia com as pessoas para quem foi feita.

  • Sem cadastro antes do primeiro uso

    A auth anônima cria uma identidade em silêncio. A tela de conta vem depois, quando o app já foi útil.

Código do repositório

functions/anthropic-proxy/index.tsO proxy no edge: uma allowlist de operações e um kill switch
// The legacy free-relay surface: any request still carrying these is either
// an outdated client or an abuse probe — reject outright.
const FORBIDDEN_KEYS = ['system', 'model', 'messages', 'maxTokens'] as const;1
 
// …
const paused = Deno.env.get('AI_PAUSED');2
if (paused === 'true' || paused === '1') {
  return jsonResponse({ error: 'ai_paused' }, 503);
}
 
// …
for (const key of FORBIDDEN_KEYS) {
  if (key in body) {
    return jsonResponse({ error: 'invalid_request' }, 400);
  }
}
 
const op = body.op;
if (typeof op !== 'string' || !(op in OPS)) {3
  return jsonResponse({ error: 'invalid_op' }, 400);
}
const config = OPS[op]!;
  1. Linha 3. O app não pode enviar um prompt, um modelo nem um limite de tokens. Isso fica no servidor, e o app só pode indicar uma operação da allowlist.

  2. Linha 6. AI_PAUSED é um kill switch: uma única variável de ambiente interrompe todo o gasto com IA sem precisar de redeploy.

  3. Linha 19. Uma operação desconhecida é rejeitada. A chave da API nunca existe em nenhum lugar do bundle do app.

Como está hoje

O material para a App Store, o checklist de lançamento, os builds do EAS, um vídeo promocional e o pistochia.com com lista de espera estão prontos. Primeiro o iPhone; o próximo passo é o lançamento na App Store.

Próximo artigoDissertação de mestrado: detecção explicável de phishing escrito por IA