← Todos los artículos

· 4 min de lectura

TagMod: libero el software de mi ereader hackeado

Convertí un ereader con la pantalla rota en un Kindle de un solo botón con dashboard siempre visible. Ahora el código es open source.

Tengo varios Tagus (ereaders de Onyx con Android 4.4) con la pantalla táctil rota. Arreglar el táctil no compensa, pero el panel e-ink y el hardware funcionan perfectamente. Así que los convertí en algo distinto: un ereader que se maneja entero con un solo botón y que, mientras duerme, muestra un dashboard con mi agenda, tareas, analíticas de Umami, estado de mis servidores y el tiempo.

Hoy lo publico como open source.

El problema

Un Tagus sin táctil es un pisapapeles. Android espera que toques la pantalla para todo: elegir un libro, pasar página, volver atrás. Sin táctil no hay forma de usarlo.

La solución fue escribir un daemon en C que secuestra el botón de encendido y convierte patrones de pulsación en eventos de teclado. El sistema Android nunca ve el botón real. El daemon interpreta:

Gesto Biblioteca Leyendo
Click siguiente elemento página siguiente
Doble click anterior página anterior
Mantener 0.8-3s y soltar abrir volver a la biblioteca
Mantener 3s dormir (muestra el panel) dormir

El dashboard

Mientras el ereader duerme, la pantalla no se apaga: muestra un panel estilo TRMNL con información útil. El daemon tiene un temporizador de kernel (CLOCK_REALTIME_ALARM) que despierta el dispositivo desde suspensión profunda cada hora, actualiza el panel y lo vuelve a dormir. La luz frontal se mantiene apagada durante todo el ciclo para no iluminar la habitación.

Qué muestra el panel:

  • Cabecera: día de la semana, fecha, nivel de batería
  • Agenda: próximos eventos del calendario (desde un servidor con iCal)
  • Tareas: pendientes con fecha (Markdown o Todoist)
  • Libro actual: el último libro abierto
  • Analíticas: visitas, sesiones, páginas vistas, tiempo medio (Umami self-hosted), gráfica de 7 días, top eventos
  • Monitor de servicios: latido a mis servidores cada hora, barras de 24h, uptime semanal, historial de incidencias
  • Tiempo: previsión horaria y semanal (Open-Meteo, sin API key)

Todo se pinta con Canvas en Java sobre un Bitmap de 758x1024 que SurfaceFlinger usa como imagen de reposo. Sin vistas de Android, sin WebView. El panel se ve en la foto de portada de este artículo.

Cómo funciona por dentro

El proyecto tiene cuatro piezas independientes:

powerkeyd (C) — el daemon raíz. Toma posesión exclusiva de /dev/input/event0 (el botón de encendido) y emite eventos de teclado sintéticos a otros dispositivos de entrada. Corre dentro de la ramdisk del boot image, así que arranca antes que Android. También escucha en un socket Unix abstracto (@tagmod) para que el launcher le pueda pedir refrescos del panel, wakelocks del kernel y actualizaciones programadas.

Launcher APK (Java, API 19) — sin Gradle, sin dependencias externas. Biblioteca de un botón con control de luz frontal. PanelService recolecta datos con PanelSource (weather, feed del servidor, Umami, batería, servicios), los pinta con PanelRenderer y escribe el bitmap. StatusTracker es el monitor de uptime. Umami es el cliente de analíticas. Http fuerza TLS 1.2 y empaqueta los certificados raíz actuales porque el store de Android 4.4 está caducado.

tagmod-server (Python) — backend opcional para una VPS. Expone GET /feed.json con autenticación Bearer. Junta eventos de calendarios ICS (con recurrencias expandidas) y tareas de un archivo Markdown o de la API de Todoist. Cada fuente tiene su caché independiente; si una falla, sirve la última copia buena.

Boot image y arte — scripts en Python que empaquetan/desempaquetan imágenes boot v0 de Android, inyectan los archivos de TagMod en la ramdisk, parchean init.rc y default.prop (ro.secure=0 para adb root), y reemplazan el logo del bootloader en la partición resource.

Estado actual y qué falta

Lo que funciona, verificado en el dispositivo:

  • Control por botón único, biblioteca, luz frontal 150-255
  • Dashboard completo con todos los bloques descritos
  • Refresco programado desde suspensión profunda
  • Despliegue con un script: deploy/flash.sh install
  • Servicios de Onyx desactivados (barra de estado, tienda, OTA)
  • WiFi configurable por script

Lo que no está probado aún:

  • Pasar página con el botón en AlReader (no tengo FB2/MOBI en el dispositivo)
  • El servidor no está desplegado en producción (uso file:///sdcard/TagMod/feed.json local con datos de prueba)

Por qué open source

El código funciona y está probado en hardware real. Un ereader e-ink es un cacharro estupendo para tener un dashboard siempre visible sin gastar batería, y el software para hacerlo no debería quedarse en mi disco duro.

Las piezas son independientes. El daemon de C es genérico (cualquier Rockchip con Android 4.4+). El launcher es Java vanilla. El servidor es Python estándar. Si tienes un ereader Android tirado por casa, probablemente puedas adaptarlo.

En la documentación del repo he incluido guías para portarlo a otros dispositivos (Kindle, Kobo, genérico), usarlo como dashboard e-ink y modificar el firmware.

El código está en github.com/IgnacioLD/tagmod con licencia MIT.

Borrador con IA, edición a mano. Lo publico cuando me suena a mí.