⏱️ Lectura: 12 min
Un EPUB en Kobo puede aparecer como “archivo corrupto” aunque haya pasado epubcheck sin un solo error. Eso fue exactamente lo que descubrió un autor independiente: su nuevo libro, validado al 100% contra la versión 3.3 del estándar, funcionaba en Kindle, Apple Books y Thorium, pero se negaba a abrir en cualquier lector Kobo, de cualquier generación.
📑 En este artículo
El responsable no era un manifest mal armado ni una imagen rota. Era una sola línea de CSS perfectamente válido. La historia es un recordatorio incómodo de que validar contra el estándar no garantiza que tu libro funcione en el mundo real.
TL;DR
- Un EPUB que pasó epubcheck 3.3 sin errores aparecía como “archivo corrupto” en todos los lectores Kobo del autor.
- El mismo libro abría sin problemas en Kindle, Apple Books y Thorium; solo Kobo lo rechazaba.
- La causa: Kobo usa RMSDK, el motor de Adobe que también mueve Adobe Digital Editions.
- RMSDK nació hacia 2010 y su parser de CSS quedó congelado alrededor de 2013: sin flexbox, grid, variables ni funciones matemáticas.
- El detonante fue una sola línea:
max-width: min(150px, 30vw), CSS válido que RMSDK no reconoce. - Al ver CSS desconocido, RMSDK no degrada ni avisa: descarta el libro completo en silencio.
- epubcheck no puede atrapar el problema porque valida contra el estándar, no contra un motor roto.
- Cambiar la línea a
max-width: 150pxresolvió el fallo por completo.
Qué pasó: un libro válido que Kobo rechaza
El autor distribuye sus libros como archivos EPUB libres de DRM, algo poco común y que se agradece. Antes de publicar, cada archivo pasa por una batería de procesos hasta que aprueba epubcheck, la herramienta de referencia para validar libros electrónicos bien formados. Es exigente hasta la obsesión: si tu manifest no declara cada fragmento e imagen, si usas elementos HTML fuera de orden o te desvías mínimamente de las reglas del estándar EPUB, no pasa.
Tras meses de trabajo, el libro aprobó epubcheck con la versión 3.3 del estándar sin un solo aviso. Y aun así, un lector escribió para reportar que el archivo estaba “corrupto”. El autor probó entregarle también una versión EPUB2, igualmente conforme a las reglas, pensando en compatibilidad hacia atrás. Mismo resultado: el libro no abría en ninguno de sus dispositivos Kobo.
La pregunta es la que cualquier desarrollador se haría: ¿qué haces cuando el patrón de oro dice que tu archivo está bien, funciona en todas partes, pero un lector específico insiste en que está roto?
Por qué un EPUB en Kobo termina como “corrupto”
La pista clave aparece al investigar qué motor usa Kobo por dentro. La respuesta es RMSDK, las siglas de “Reader Mobile Software Development Kit”, el motor de renderizado propietario de Adobe. Es el mismo corazón que late dentro de Adobe Digital Editions, esa aplicación que muchos recordamos más por su gestión de DRM que por la experiencia de lectura, y también el motor presente en varios dispositivos Kobo y en antiguos Sony y Nook.
RMSDK fue construido alrededor de 2010, pensado para EPUB2. Recibió actualizaciones ligeras para soportar EPUB3, pero nunca fue modernizado de verdad. El problema no es solo que esté viejo: es cómo reacciona ante lo que no entiende. En lugar de ignorar una propiedad CSS desconocida, como manda el propio estándar para garantizar compatibilidad hacia adelante, RMSDK simplemente descarta el libro entero. Sin mensaje de error, sin pantalla de fallback, sin un solo indicio de qué salió mal.
graph LR
A["EPUB valido"] --> B["epubcheck 3.3: OK"]
B --> C{"Que motor lo abre"}
C -->|"Kindle / Apple Books"| D["Renderiza bien"]
C -->|"Kobo con RMSDK"| E["CSS min() no reconocido"]
E --> F["Libro descartado: archivo corrupto"]
Para depurarlo, el autor cargó el libro en Adobe Digital Editions, esperando un mensaje útil. Como era de esperar, falló al cargar. Pero lo hizo en el peor estilo posible: sin error, sin queja, solo una pantalla en blanco. El único rastro de que lo había intentado fue que, al reintentar, ADE respondía “no puedes importar ese libro, ya lo agregaste”. Clásico.
Contexto: RMSDK, un motor congelado en 2013
Identificar a RMSDK como sospechoso no resolvía el caso, pero daba un camino. El autor empezó a desarmar su libro, creando una docena de variantes mientras se aseguraba de que cada una siguiera pasando epubcheck. Reorganizó carpetas, vació metadatos, eliminó atributos de idioma, generó UUID nuevos, aplanó directorios, renombró extensiones y reconstruyó el ZIP desde cero varias veces. Y falló. Y falló. Y volvió a fallar.
Cuando estaba a punto de rendirse, se le ocurrió desactivar la hoja de estilos. De golpe, el libro abrió. Con el CSS identificado como origen del problema, fue cuestión de bisección: crear subconjuntos del stylesheet hasta aislar la línea culpable. Resultó ser esta:
.copyright img {
max-width: min(150px, 30vw);
}
Al cambiarla por la versión clásica, todo funcionó:
.copyright img {
max-width: 150px;
}
¿Cuál es el problema con la primera versión? Ninguno, desde el punto de vista del estándar. min() es una función matemática de CSS perfectamente válida y ampliamente soportada en navegadores. El problema es que el parser de CSS de RMSDK quedó congelado aproximadamente en 2013: sin flexbox, sin grid, sin funciones matemáticas, sin propiedades personalizadas (variables). Solo float de la vieja escuela, manejo deficiente de fuentes y caídas silenciosas cuando ve algo que no reconoce.
⚠️ Ojo: RMSDK no ignora la propiedad que no entiende, como exige el modelo de compatibilidad hacia adelante de CSS. Descarta el archivo completo. Una línea inválida para el motor equivale a un libro inservible.
Datos y cifras del caso
No estamos ante un bug aislado de versión: hablamos de un motor con unos 16 años de antigüedad que sigue en producción. RMSDK se diseñó hacia 2010 para EPUB2 y su soporte de CSS se detuvo alrededor de 2013. En la práctica, eso significa que toda la familia de CSS moderna que damos por sentada en la web queda fuera: display: flex, display: grid, las variables --mi-color, y las funciones min(), max(), clamp() y calc() con unidades mixtas.
El detalle más revelador es el contraste de comportamientos. El mismo archivo, byte por byte, abría sin problemas en Kindle, Apple Books y Thorium. Tres motores distintos lo aceptaban; uno lo rechazaba. Y la diferencia entre “libro perfecto” y “archivo corrupto” era exactamente una línea de CSS y dos palabras: min(150px, 30vw) contra 150px.
¿Por qué epubcheck no lo detectó? Porque hace una validación básica de CSS, pero no puede validar tu hoja de estilos contra un motor que está fundamentalmente roto. epubcheck comprueba conformidad con el estándar, no compatibilidad con cada lector real del mercado. Es, como lo describe el autor, lo más parecido a un “type-linter” o suite de pruebas que tienen quienes publican libros, pero su garantía termina donde empieza un renderizador que ignora el estándar.
Impacto y análisis para autores y devs en LATAM
Para quien publica de forma independiente en español —y el ecosistema de autopublicación en LATAM no para de crecer— esta clase de fallo es especialmente dañina. Un lector que paga por tu libro, lo descarga y obtiene un mensaje de “archivo corrupto” rara vez sospecha del motor de Adobe. Sospecha de ti. La percepción es que el autor entregó un producto defectuoso, cuando en realidad el archivo es impecable según el estándar.
El problema escala. Kobo tiene presencia fuerte fuera del ecosistema Amazon, y es una de las pocas plataformas que respeta formatos abiertos y DRM-free. Que su motor de renderizado se atragante con CSS moderno castiga precisamente a quienes apuestan por la portabilidad y los archivos abiertos. Un EPUB en Kobo debería ser un terreno seguro para el formato libre, y termina siendo el más frágil.
💭 Clave: Pasar epubcheck es necesario pero no suficiente. La validación contra el estándar y la compatibilidad con motores reales son dos cosas distintas, y el segundo es el que ve tu lector.
Hay una lección de ingeniería más amplia aquí, válida más allá de los ebooks: el manejo de errores importa tanto como la funcionalidad. Un motor que ante una propiedad desconocida la ignora y sigue, degrada con gracia. Un motor que descarta todo el documento sin avisar convierte un detalle cosmético en una falla total. Es la diferencia entre fail open con un fallback y fail closed en silencio.
Cómo evitar que tu EPUB falle en Kobo
La conclusión amarga es que confiar solo en epubcheck no alcanza si te importan los lectores Kobo. Estas son las prácticas que reducen el riesgo:
- Escribe CSS conservador — Evita
min(),max(),clamp(), variables, flexbox y grid en las hojas de estilo del EPUB. Prefierefloat, anchos en píxeles o porcentajes simples y propiedades soportadas desde hace una década. - Usa valores estáticos para imágenes — En lugar de
max-width: min(150px, 30vw), opta pormax-width: 150pxo, si necesitas adaptabilidad, un porcentaje sencillo comomax-width: 30%. - Prueba en un motor RMSDK — Carga el archivo en Adobe Digital Editions o en un Kobo real antes de publicar. Es la única forma de ver lo que verá ese lector.
- Mantén epubcheck igualmente — Sigue siendo tu primera línea de defensa contra errores reales del estándar; solo no lo tomes como garantía total.
Para validar localmente, epubcheck se instala en cualquier sistema. Aquí los tres entornos:
# macOS (Homebrew)
brew install epubcheck
epubcheck mi-libro.epub
# Linux (Debian/Ubuntu)
sudo apt install epubcheck
epubcheck mi-libro.epub
# Windows (Scoop) o multiplataforma con el JAR
scoop install epubcheck
# o descarga el .jar desde github.com/w3c/epubcheck y corre:
java -jar epubcheck.jar mi-libro.epub
💡 Tip: Si necesitas un ancho adaptable y no quieres romper RMSDK, una regla simple como max-width: 30%; max-height: 150px; suele cubrir el caso sin recurrir a funciones matemáticas que el motor de Adobe no entiende.
Qué sigue
En un mundo ideal, RMSDK dejaría la edad de piedra del CSS o, al menos, manejaría los errores en vez de descartar el libro entero. Pero el motor lleva más de una década sin modernizarse y poco indica que eso vaya a cambiar pronto, probablemente porque su valor para la plataforma está más en el DRM que en la experiencia de lectura. La industria de la publicación digital sigue más obsesionada con restringir el acceso que con dar la mejor experiencia posible.
Mientras eso no cambie, la responsabilidad recae en quien publica. Si quieres asegurarte de que tu libro sea compatible con Kobo, vas a tener que probarlo contra un motor RMSDK y escribir tu CSS pensando en lo que un parser de 2013 puede entender. No es justo, pero es el terreno real donde aterrizan tus lectores.
📖 Resumen en Telegram: Ver resumen
Preguntas frecuentes
¿Por qué mi EPUB pasa epubcheck pero falla en Kobo?
Porque epubcheck valida tu archivo contra el estándar EPUB, no contra el motor real de cada lector. Kobo usa RMSDK, de Adobe, cuyo parser de CSS quedó congelado hacia 2013. Si tu hoja de estilos usa CSS moderno como min() o flexbox, RMSDK puede descartar el libro completo aunque epubcheck lo apruebe.
¿Qué es RMSDK y por qué importa?
RMSDK (Reader Mobile Software Development Kit) es el motor de renderizado propietario de Adobe que está dentro de Adobe Digital Editions y de varios dispositivos Kobo, Sony y Nook. Importa porque define qué CSS funciona realmente en esos lectores, y su soporte se detuvo hace más de una década.
¿Qué CSS debo evitar para que mi libro funcione en Kobo?
Evita funciones matemáticas como min(), max(), clamp() y calc() con unidades mixtas, además de flexbox, grid y variables CSS. Prefiere float, anchos en píxeles o porcentajes simples, soportados desde hace muchos años.
¿Cómo aislo qué línea de CSS rompe el libro?
Desactiva primero toda la hoja de estilos y confirma que el libro abre. Luego reincorpora el CSS por subconjuntos (bisección) hasta encontrar la regla concreta que provoca el fallo, validando con epubcheck en cada paso para no introducir errores reales.
¿Sirve de algo seguir usando epubcheck?
Sí. epubcheck sigue siendo la mejor defensa contra errores reales de conformidad con el estándar: manifests incompletos, HTML mal ordenado o metadatos faltantes. Solo no debe tomarse como garantía de que el libro funcionará en todos los lectores; complementa con pruebas en un motor RMSDK.
Referencias
- André Klein — “Your EPUB Is Fine. Kobo Disagrees. Blame Adobe” — relato original del caso y la depuración línea por línea.
- w3c/epubcheck en GitHub — validador oficial de EPUB, mantenido por el W3C.
- MDN — función CSS min() — documentación de la función matemática que detonó el fallo.
- W3C — EPUB 3.3 — especificación del estándar contra el que valida epubcheck.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
0 Comentarios