La estantería que se enciende
App móvil de lectura + backend serverless + web
EduLettercuatro formas de leer un mismo libro
Biblioteca digital con lector EPUB propio, lectura rápida RSVP y un asistente de IA para leer más y mejor
Desarrollo integral: producto, app Flutter, backend Firebase/Python, web Next.js, panel de administración y monetización
En producción — publicada en Google Play (com.artlex.eduletter_app, v2.1.13+5), web en Netlify y panel admin operativo; iteración activa
perdido
Cuatro apps, cuatro progresos
Las apps de lectura suelen resolver solo una pieza: o son un lector EPUB, o son un catálogo, o son un reproductor de audiolibros. El lector que quiere avanzar de verdad acaba repartido entre varias apps, pierde el progreso al cambiar de dispositivo, no tiene forma de leer sin conexión con control de derechos y no encuentra ningún apoyo real cuando un libro se le atraganta. A eso se suma el lado del negocio: sostener un catálogo con costes de almacenamiento, síntesis de voz e IA exige una monetización que funcione en mercados donde la tarjeta de crédito no es la norma.
▸ Leer
▸ Escuchar
▸ Leer rápido
▸ Estudiar con IA
un mismo progreso en Firestore
Un solo lomo encendido
EduLetter unifica en una sola app las cuatro formas de consumir un libro —leer, escuchar con narración sintética, leer rápido en RSVP y estudiarlo con IA— sobre un mismo estado de progreso sincronizado en Firestore, de modo que la posición, la racha y los apuntes viajan entre móvil y web. El lector EPUB es propio (parseo con epub_pro, paginación HTML y animación de pase de página), las descargas offline pasan por concesiones firmadas con cuota por usuario, y EduGenius encapsula Gemini detrás de Cloud Functions con límites de uso para que la clave nunca viaje en el binario. La monetización combina anuncios de AdMob para el tramo gratuito con suscripción de Google Play, Stripe, Braintree/PayPal, criptomonedas vía NOWPayments y un flujo de pago manual revisado desde el panel de administración, lo que permite cobrar también donde no hay pasarela convencional.
Seis piezas que encienden el estante
Lector EPUB construido desde cero
Parseo de EPUB con epub_pro, paginación del HTML con flutter_widget_from_html_core, índice de capítulos, buscador dentro del libro, resaltados y anotaciones, animación de pase de página con page_flip_builder y sonido propio. El progreso se guarda por libro y se reanuda desde la sección 'Continuar leyendo'.
Lectura rápida RSVP con motor propio
Motor RSVP puro y testeable (sin dependencias de widgets) que tokeniza el capítulo y calcula la duración de cada palabra según longitud, puntuación y fin de párrafo, entre 100 y 800 palabras por minuto. Resalta la letra pivote (ORP) con el color del ambiente y mantiene la pantalla encendida durante la sesión.
EduGenius: IA de lectura tras Cloud Functions
Nueve funciones callable en Python (chat, resumen, explicación, temas, personajes, predicciones, quiz, rutas de lectura, marcadores inteligentes) que llaman a Gemini con alias '-latest' y control de coste sobre el presupuesto de razonamiento, más límites de uso y contadores por usuario en Firestore.
Narración por voz con créditos medidos
Síntesis con Google Cloud Text-to-Speech por fragmentos, cacheada en Cloud Storage y facturada contra un saldo de créditos en Firestore, con recarga mensual programada, tienda de créditos dentro de la app y reproducción en segundo plano con audio_service.
Monetización multicanal y programa de afiliados
AdMob (banner, intersticial, nativo, bonificado y App Open) con consentimiento UMP para el tramo gratuito; suscripción por Google Play Billing con verificación en servidor y RTDN; Stripe, Braintree/PayPal, criptomonedas con NOWPayments y pagos manuales aprobados desde el panel. Los influencers se atribuyen leyendo el Install Referrer de Play.
Un ecosistema, no solo una app
La misma cuenta y el mismo progreso funcionan en la app Flutter, en una PWA Next.js 14 con next-intl y Tailwind, y en un panel de administración Flutter con Riverpod y fl_chart para revisar pagos manuales, afiliados y liquidaciones.
Tres pantallas de pie en la balda
Recreadas en HTML y CSS con los colores, las medidas y los textos reales de la app.
Buenas noches
Arturo 👋
Semana de clásicos
40 títulos abiertos para todos
7
Racha de Lectura
Continuar Leyendo
Ver todoEl hombre que calculaba
Malba Tahan
La ciudad y los perros
M. Vargas Llosa
Ensayo sobre la ceguera
J. Saramago
Destacados
Ver todoPatrocinado · anuncio nativo
Sólo para cuentas sin Premium
Inicio (portada de la biblioteca)
Racha, continuidad y navegación de seis destinos.
El hombre que calculaba
Capítulo IV
Íbamos los dos, en aquella tarde inolvidable, por el camino que lleva a Bagdad. Beremiz caminaba despacio y en silencio, con los ojos fijos en la arena, como si buscara en ella la solución de un problema antiguo.
De pronto se detuvo y me dijo: «Los números tienen una manera de hablar que sólo entiende quien los escucha despacio». Anoté la frase en el margen, donde ya se acumulaban otras tres.
Aquella noche, mientras el desierto se enfriaba, comprendí que la aritmética podía ser también una forma de cortesía.
Lector EPUB
Barra fija, progreso de 3 px y banner anclado abajo.
Lectura rápida (RSVP)
El motor cambia de palabra con la duración de cada token.
Veinte ambientes, un lomo cada uno
Pasa el cursor por la fila: cada lomo se abre y enseña su degradado, sus partículas y una palabra con la letra pivote tintada.
Los tres fondos que sí existen como imagen



La IA vive detrás del servidor
Nueve funciones callable en Python delante de Gemini: la clave nunca viaja en el binario y el coste tiene techo.
EduGenius
Tu asistente de lectura inteligente ✨
📚
12
Libros Leídos
📄
340
Páginas
🔥
7
Racha
Funciones
EduGenius Hub
Habla con el librarian IA
Chat sobre el libro abierto
Rutas de Lectura
Caminos curados por IA
Recomendaciones
Libros personalizados
Modo Estudio
Flashcards y quizzes
Analíticas de Lectura
Tu progreso
Marcadores Inteligentes
Marcadores con IA
Cinco caminos hasta el mismo derecho
Play Billing, Stripe, Braintree/PayPal, criptomonedas y un pago manual aprobado a mano: donde no hay pasarela, hay referencia.
Mejorar plan
Todo Eduletter Premium, en un solo plan
EduGenius sin límites, sin anuncios y lectura premium. El precio final lo confirma Google Play al pagar.
Prueba Premium 7 días por solo $1
Acceso total: sin anuncios, lectura y narración ilimitadas. Cancela cuando quieras.
La suscripción se renueva automáticamente salvo cancelación 24 h antes del fin del periodo. Gestiona el plan desde Google Play.
Oferta Premium (paywall)

El contraste que costó un token
El mismo par viaja como token único a la app, a la web y al panel de administración.
Lo que ve el lector antes de entrar
Las tres láminas del onboarding y los anuncios verticales con los que se presenta la app.

intro 1

intro 2

intro 3
spot es
Anuncio vertical 1080x1920 montado para TikTok con voz en off, subtítulos y música
spot en
Versión en inglés del anuncio vertical
Quince títulos: saca uno del estante
Toca cualquier lomo. El libro sale de la balda y se convierte en la ficha de esa funcionalidad.
función 01 de 15
Catálogo de libros con portadas, autores, categorías, secciones configurables desde el backoffice y carrusel destacado en la portada
Siete baldas, una por dominio
App móvil
Lectura y audio
Firebase y datos
Backend serverless
Monetización
Web
Panel de administración
La estantería tumbada
Los lomos se vuelven carriles: tres clientes, un backend y los servicios que se pagan por uso.
Clientes
Cloud Functions
Firestore + Storage
Servicios externos
Tres clientes contra un único backend Firebase (proyecto eduletter-10974). La app Flutter organiza lib/ por capas funcionales —view/ con 71 pantallas repartidas en 24 módulos, controller/ con 12 controladores GetX, services/ con 20 servicios, models/ con 22 modelos y ads/ aislando toda la lógica de AdMob—, y usa Hive y SharedPreferences como caché local con TTL para que el catálogo y el progreso funcionen sin conexión. El backend son 64 Cloud Functions en Python (34 callable, 20 HTTP para webhooks de Stripe, Braintree, NOWPayments y las notificaciones en tiempo real de Google Play, y 12 tareas programadas para barridos de suscripciones, recarga de créditos y campañas de reenganche), organizadas en módulos por dominio: catálogo público, búsqueda con tokens precalculados, descargas, suscripciones, pagos manuales, afiliados, TTS y EduGenius. Firestore define 55 rutas de colección en reglas, con la regla de negocio en el servidor: la app nunca escribe derechos de acceso ni saldos, solo los lee. Las claves sensibles (Gemini, pasarelas, credenciales de Play) viven como variables de entorno de Functions, y las llamadas callable pueden exigir App Check. La web Next.js consume las mismas funciones públicas y comparte los ficheros de idioma con la app mediante un script de sincronización; el panel de administración es un cliente Flutter que solo habla por Cloud Functions callable protegidas con un custom claim de administrador, sin acceso directo a Firestore.
Seis pares de lomos: apagado y encendido
problema 01
Cargar el catálogo completo en memoria para pintar la sección de recientes provocaba cierres por falta de memoria: se traían miles de documentos de Firestore solo para localizar unos pocos libros.
solución
Se invirtió la consulta: primero se leen los identificadores recientes guardados en local, se recortan a los últimos 30 y se piden solo esos documentos por lote. La portada dejó de depender del tamaño del catálogo.
problema 02
El texto blanco sobre el naranja de marca daba 2,91:1 de contraste, por debajo del mínimo legible, y al sol se perdía; cambiar el naranja habría roto la identidad ya presente en la app, la web y la ficha de Play.
solución
Se definió un color 'onBrand' casi negro (#1A0E0A) que sube el contraste a 6,50:1 sin tocar el naranja, y se propagó como token único a la app, a la web (variable CSS de marca) y al panel de administración.
problema 03
El modo RSVP necesita cambiar de palabra a intervalos distintos —una palabra larga o el final de un párrafo deben durar más— y a 800 ppm cualquier animación por palabra tiraba los fotogramas.
solución
El motor usa un temporizador de un solo disparo que se rearma con la duración calculada de cada token en lugar de un temporizador periódico, y las transiciones de fundido y escala solo se aplican por debajo de 450 ppm; el resto del tiempo únicamente se notifica al widget de la palabra.
problema 04
La síntesis de voz y las llamadas a Gemini se pagan por uso, así que un usuario podía disparar el coste del proyecto en una tarde.
solución
Todo pasa por el servidor: los fragmentos de audio se cachean en Cloud Storage por hash y se descuentan de un saldo de créditos en Firestore con recarga mensual programada, y EduGenius aplica límites de frecuencia por usuario, modelos 'lite' para las operaciones baratas y presupuesto de razonamiento apagado.
problema 05
El identificador de la suscripción mensual estaba escrito a mano en cuatro archivos distintos y no coincidía con el configurado en Play Console, de modo que el plan mensual simplemente no cargaba en el paywall.
solución
Se auditaron y unificaron los identificadores de producto y de oferta en los cuatro puntos (servicio de facturación, pantalla de oferta, detalle de suscripción y 'mi suscripción'), y el texto del paywall pasó a leer el precio de introducción real que devuelve la tienda en lugar de estar escrito en la interfaz.
problema 06
Buena parte del público objetivo no puede pagar con tarjeta ni tiene cuenta en una pasarela internacional.
solución
Se añadió un flujo de pago manual con referencia, bloqueos anti-duplicado, tasas de cambio actualizadas por tarea programada y aprobación desde el panel de administración, que concede el derecho premium por Cloud Function y lo revoca automáticamente al vencer.
Cada número, un título impreso
desliza la balda →

marca en claro y en oscuroEduLetter es una app de lectura construida en Flutter (240 archivos Dart, ~72.000 líneas en lib/) sobre Firebase, con catálogo de libros, lector EPUB propio, narración por voz, modo de lectura rápida y un módulo de IA llamado EduGenius.
El backend son 64 Cloud Functions en Python 3.11 (firebase-functions) que cubren catálogo público, búsqueda, descargas firmadas, suscripciones, créditos de narración, afiliados e IA, más 55 rutas de colección definidas en las reglas de Firestore.
Alrededor del producto móvil hay un ecosistema completo: una web PWA en Next.js 14 (33 páginas, 79 componentes) que replica la lectura en navegador, un programa de influencers con atribución por Install Referrer y un panel de administración en Flutter con Riverpod para pagos y afiliados.
Todo está bilingüe (español e inglés, 1.053 claves de traducción) y con ocho temas de aplicación más veinte ambientes visuales dedicados al modo de lectura rápida.
La luz de esta página viene de los lomos: el mismo naranja #F46F4C que en la app marca el progreso, la racha y el botón que abre Google Play.
EduLetter
¿Quieres algo así para tu producto?
Una app de lectura con su propio lector EPUB, su motor de lectura rápida, narración medida por créditos y una IA que no se sale de presupuesto — más la web y el panel que la sostienen. Si tienes un producto de contenido que cobrar y escalar, es el terreno que conozco.