Saltar al contenido principal
←Volver a proyectos

CASO DE ESTUDIO · 01

English Journal: un diario de pronunciación que escucha cómo hablas

Lees inglés sin problema; ahora falta que te entiendan. English Journal escucha cómo hablas, detecta qué sonido se te escapa y decide qué practicas mañana. Sin mascotas, sin vidas, sin premios vacíos. Y funciona incluso sin internet.

ROL
Diseño y desarrollo completo
TIPO
Diario de pronunciación · App web instalable (PWA)
TECNOLOGÍAS
Next.js 16 · React 19 · Supabase · Gemini API · Dexie · Kokoro TTS
ESTADO
En producción · desde 2025
English Journal: un diario de pronunciación que

EL PROBLEMA

Las apps de idiomas suelen necesitar internet todo el tiempo, premian rachas en lugar de aprendizaje real y, cuando usan IA, cada respuesta cuesta dinero.

EL OBJETIVO

Una app que puedas abrir en el metro sin señal, que te diga con honestidad qué ya dominas y qué no, y que use la IA solo cuando realmente aporta.

PROCESO

De una libreta de pronunciación a una app completa

  1. 01

    Primero el dispositivo

    Todo lo que haces se guarda al instante en tu teléfono o computadora. La sincronización con la nube pasa en segundo plano, con reintentos automáticos.

  2. 02

    IA con presupuesto

    Antes de llamar a Gemini, la app revisa las respuestas con reglas propias. Así se ahorran llamadas y las correcciones son predecibles.

  3. 03

    Datos privados por usuario

    139 migraciones en Supabase con seguridad a nivel de fila en todas las tablas: cada persona solo puede ver lo suyo.

  4. 04

    Probado a fondo

    Unos 6,600 tests automáticos con Vitest y Playwright revisan desde la lógica de repaso hasta la accesibilidad.

DECISIONES TÉCNICAS

Lo que pasa detrás de la interfaz

Decisiones técnicas para que la app sea rápida, no pierda datos y mantenga bajo control el gasto en IA.

recovery.tscola de sincronización
// lib/sync/recovery.ts: reintentos con espera creciente
const RETRY_DELAYS_MS = [5_000, 30_000, 2 * 60_000]

export function getNextRetryAt(retryCount: number, attemptedAt: string): string {
  const delay = RETRY_DELAYS_MS[Math.min(retryCount - 1, RETRY_DELAYS_MS.length - 1)]
  return new Date(new Date(attemptedAt).getTime() + delay).toISOString()
}

/** Releases entries left in `syncing` by a crashed or closed tab. */
export async function reclaimStaleSyncingEntries(currentTime = Date.now()) {
  const staleBefore = new Date(currentTime - SYNCING_STALE_MS).toISOString()
  return db.syncOutbox
    .where('status')
    .equals('syncing')
    .filter((entry) => Boolean(entry.lastAttemptAt && entry.lastAttemptAt < staleBefore))
    .modify({ status: 'pending' })
}
  • Sincronización local-first (Dexie + Supabase)

    Las respuestas se guardan primero en IndexedDB y pasan por una cola de salida. Si una pestaña se cierra a mitad de camino, la app recupera esos envíos sola.

  • IA con reglas antes del modelo

    Validadores deterministas y contenido pregenerado resuelven la mayoría de los ejercicios sin llamar a Gemini en vivo.

  • Voz que funciona sin conexión

    La lectura en voz alta usa Kokoro directamente en el navegador, sin depender de un servidor.

  • Repaso con FSRS (ts-fsrs)

    El dominio de cada palabra se calcula solo con práctica evaluada. Abrir la app o mantener una racha no cuenta como aprender.

LA SOLUCIÓN

Cuatro pilares, un solo perfil de tu voz

Captura o video de sound lab
01

Sound Lab

Grabas tu voz, ves tu onda junto a la de un hablante nativo y descubres qué sonido se te escapa.

Captura o video de palabras esenciales
02

Palabras esenciales

Las 2,800 palabras que aparecen en casi todo lo que vas a escuchar, con su forma débil real.

Captura o video de tu diario
03

Tu diario

Escribes lo que te pasó hoy y recibes correcciones explicadas en español. Tu vocabulario sale de tu vida.

Captura o video de misiones orales
04

Misiones orales

Conversaciones con un objetivo: pides un café, explicas un problema, defiendes una idea.

RESULTADO

En números

~6,600

Tests automáticos

Unitarios, de integración y end-to-end con Vitest y Playwright.

2,800

Palabras esenciales

Cada una con su forma débil real y repaso espaciado.

66

Mini lecciones

De A1 a C2, más 276 mazos de patrones gramaticales.

LO QUE APRENDÍ

Una app que respeta tu tiempo funciona primero en tu dispositivo y usa la nube solo cuando hace falta.
Aprendizaje técnico:

Resolver con reglas propias lo que no necesita un modelo de lenguaje hace que la IA salga más barata y que sus respuestas sean más predecibles.

Aprendizaje de producto:

Leer es exposición, guardar es intención y practicar es evidencia. El dominio se gana con el tiempo, no con clics ni rachas.

¿Me cuentas tu idea?

No hace falta que la tengas clara ni que sepas cómo se llama lo que necesitas. Escríbeme como le escribirías a una amiga y te respondo en menos de 24 horas.

Respuesta habitual en menos de 24 horas