Icono de la app: fondo azul pizarra, palabra 'eduletter' en blanco redondeado y un libro abierto de páginas naranjas debajo del texto

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

2025–2026Google PlayFlutter · Firebase · Next.js

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

01 · El estante desordenado
Lector EPUBCatálogoAudiolibrosIA de estudioprogreso
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.

EduLetter

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.

02 · Lo que sostiene la app

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.

03 · La interfaz

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 👋

AS

Semana de clásicos

40 títulos abiertos para todos

🔥

7

Racha de Lectura

+30 pts hoy

Continuar Leyendo

Ver todo
Leyendo

El hombre que calculaba

Malba Tahan

Leyendo

La ciudad y los perros

M. Vargas Llosa

Terminado

Ensayo sobre la ceguera

J. Saramago

Destacados

Ver todo

Patrocinado · anuncio nativo

Sólo para cuentas sin Premium

RecienteCategoríaInicioSocialGuardadoCuenta

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.

38 % leído24 min restantes
Banner AdMob · cuenta gratuita

Lector EPUB

Barra fija, progreso de 3 px y banner anclado abajo.

320 ppm
saltar.Ellector
Cap. 4 · Fantasía12 min restantes

Lectura rápida (RSVP)

El motor cambia de palabra con la duración de cada token.

04 · Lectura rápida

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

Fondo vertical del ambiente 'fantasía' del modo de lectura rápida, usado en la landing de influencers
Fantasía
Fondo vertical del ambiente 'ciencia ficción' del modo de lectura rápida
Ciencia ficción
Fondo vertical del ambiente 'clásico' del modo de lectura rápida
Clásico
05 · EduGenius

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

💬Habla con el librarian IAChat sobre el libro abierto
🧭Rutas de LecturaCaminos curados por IA
RecomendacionesLibros personalizados
🎓Modo EstudioFlashcards y quizzes
📈Analíticas de LecturaTu progreso
🔖Marcadores InteligentesMarcadores con IA
Consejo del Día · Lee 20 minutos antes de dormir: la retención sube y la racha no se corta.

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

Avatar animado dentro de la app
Versión WebM con canal alfa para la web
06 · Cómo se paga

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

Prueba Premium 7 días por solo $1

Acceso total: sin anuncios, lectura y narración ilimitadas. Cancela cuando quieras.

Sin anuncios
Lectura ilimitada
Narración
Lectura rápida ilimitada

La suscripción se renueva automáticamente salvo cancelación 24 h antes del fin del periodo. Gestiona el plan desde Google Play.

Continuar con Google Play

Oferta Premium (paywall)

Google Play Billing + RTDNStripeBraintree / PayPalNOWPayments (cripto)Pago manual con referenciaAdMob para el tramo gratuito
Banner de la tarjeta de mejora a Premium dentro de la app
Banner de la tarjeta de mejora a Premium dentro de la app

El contraste que costó un token

Blanco · 2,91:1onBrand #1A0E0A · 6,50:1

El mismo par viaja como token único a la app, a la web y al panel de administración.

07 · Piezas gráficas

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.

Ilustración del onboarding: retrato recortado sobre un libro abierto naranja dentro de una cápsula rosa con cruces decorativas
Ilustración del onboarding: retrato recortado sobre un libro abierto naranja dentro de una cápsula rosa con cruces decorativas

intro 1

Segunda ilustración del onboarding, misma familia visual de cápsula y libro abierto
Segunda ilustración del onboarding, misma familia visual de cápsula y libro abierto

intro 2

Tercera ilustración del onboarding
Tercera ilustración del onboarding

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

08 · Funciones

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

09 · Stack

Siete baldas, una por dominio

App móvil

Flutter (Dart SDK ^3.7)GetXflutter_screenutilflex_color_schemegoogle_fontsflutter_animateflutter_staggered_animationsshimmerlottiesmooth_page_indicator

Lectura y audio

epub_propage_flip_builderflutter_widget_from_html_coresyncfusion_flutter_pdfpdfxflutter_pdfviewflutter_ttsjust_audioaudio_serviceaudioplayerswakelock_plus

Firebase y datos

firebase_corecloud_firestorefirebase_authfirebase_storagecloud_functionsfirebase_messagingfirebase_analyticsfirebase_crashlyticsfirebase_performancefirebase_app_checkhivesqfliteget_storageshared_preferences

Backend serverless

Python 3.11firebase-functionsfirebase-admingoogle-genai (Gemini)google-cloud-texttospeechgoogle-cloud-storagegoogle-api-python-clientbraintreerequests

Monetización

google_mobile_adsin_app_purchasein_app_purchase_androidGoogle Play BillingStripeBraintree / PayPalNOWPaymentsandroid_play_install_referrerfacebook_app_eventsapp_tracking_transparency

Web

Next.js 14React 18TypeScriptTailwind CSSnext-intlzustandlucide-reactfirebase-jsfirebase-adminidbjsziphtml2canvasNetlify

Panel de administración

Flutterflutter_riverpodfl_chartcloud_functionsfirebase_authfirebase_messagingflutter_local_notifications
10 · Arquitectura

La estantería tumbada

Los lomos se vuelven carriles: tres clientes, un backend y los servicios que se pagan por uso.

Clientes

App Flutter · 71 pantallasPWA Next.js 14 · 33 páginasPanel admin · Riverpod

Cloud Functions

34 callable20 HTTP · webhooks y RTDN12 tareas programadas

Firestore + Storage

55 rutas de colecciónLa app lee derechos, nunca los escribeCaché Hive con TTL

Servicios externos

GeminiCloud Text-to-SpeechPlay Billing · Stripe · Braintree · NOWPaymentsAdMob

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.

11 · Retos

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.

12 · Las cifras

Cada número, un título impreso

71

pantallas en la app Flutter

64

Cloud Functions en Python

55

rutas de colección en reglas de Firestore

33

páginas en la web Next.js

20

ambientes visuales de lectura rápida

8

temas de interfaz

2

idiomas (español e inglés)

1.053

claves de traducción

~72k

líneas de Dart en lib/

desliza la balda →

13 · En corto
Marca gráfica del libro abierto en SVG, la usa también la web de influencersLogotipo de la pantalla de arranque, versión para tema claroLogotipo de la pantalla de arranque, versión para tema oscuromarca en claro y en oscuro

EduLetter 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.

Lector EPUB propioRSVP 100–800 ppmNarración con créditosEduGenius sobre GeminiOffline con concesiones firmadasRacha diariaEspañol · EnglishLector EPUB propioRSVP 100–800 ppmNarración con créditosEduGenius sobre GeminiOffline con concesiones firmadasRacha diariaEspañol · English

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.