Todos los artículos

Pistochia

Próximamente

Una app de iPhone para personas con TDAH. Dices o escribes lo que tienes en la cabeza y te lo devuelve en pasos lo bastante pequeños para empezar, ordenados según tu energía de ese día.

Mi papel
Diseño y desarrollo, en solitario
Año
2026
Hecho con
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)

Desplázate en horizontal para ver el diagrama completo.

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

El problema

Para las personas con TDAH, lo difícil muchas veces es empezar, no acordarse. Una app de tareas que guarda la montaña entera se convierte en una lista de cosas por las que sentirse culpable. La unidad de trabajo tiene que encogerse hasta que empezar resulte fácil, y la app tiene que funcionar nada más abrirla.

Cómo está construido

Una app de Expo offline-first sobre SQLite local, con migraciones versionadas. La identidad viene de la auth anónima de Supabase, así que el primer brain dump ocurre antes de cualquier pantalla de registro. Cada llamada a la IA pasa por una edge function que trabaja por operaciones: la app envía el nombre de una operación y sus parámetros, nunca un prompt y nunca una clave. La función comprueba la operación contra una allowlist y aplica rate limiting por IP, cuotas diarias por instalación y un kill switch. Claude desglosa las tareas, y Whisper, detrás del mismo proxy, se encarga de la voz. RevenueCat gestiona el paywall, y la analítica sigue desactivada hasta que el usuario la acepta.

Decisiones importantes

  • La app no guarda ninguna clave de API

    Entran nombres de operaciones y salen resultados estructurados. La clave de la API vive en la edge function, detrás de un kill switch, cuotas y límites que bloquean en caso de fallo.

  • Es offline-first

    Las tareas viven en SQLite en el móvil, con migraciones de verdad. Una herramienta para el TDAH que necesitara conexión para mostrarte tu siguiente paso les fallaría a las personas para las que está hecha.

  • Sin registro antes del primer uso

    La auth anónima crea una identidad en silencio. La pantalla de cuenta llega más tarde, cuando la app ya ha sido útil.

Código del repositorio

functions/anthropic-proxy/index.tsEl proxy en el edge: una allowlist de operaciones y un 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. Línea 3. La app no puede enviar un prompt, un modelo ni un límite de tokens. Eso vive en el servidor, y la app solo puede nombrar una operación de la allowlist.

  2. Línea 6. AI_PAUSED es un kill switch: una sola variable de entorno detiene todo el gasto en IA sin hacer un redeploy.

  3. Línea 19. Una operación desconocida se rechaza. La clave de la API no existe en ningún punto del bundle de la app.

En qué punto está

El material para la App Store, la checklist de lanzamiento, las builds de EAS, un vídeo promocional y pistochia.com con lista de espera están listos. Primero iPhone; el siguiente paso es el lanzamiento en la App Store.

Siguiente artículoTrabajo de fin de máster: detección explicable de phishing escrito por IA