- Ghostwriter es un proyecto experimental que monitorea lo que el usuario escribe a mano en reMarkable, lo envía a un Vision-LLM cuando se activa mediante un gesto o el contenido de la pantalla, y luego muestra el resultado de vuelta en la pantalla como texto o dibujo.
- Para ejecutarlo se requieren claves de API como
OPENAI_API_KEY,ANTHROPIC_API_KEYyGOOGLE_API_KEY; se descargan los binarios para reMarkable2 y reMarkable Paper Pro, se copian al dispositivo y se ejecutan por SSH. - El modelo predeterminado es
claude-sonnet-4-0, y se pueden cambiar el modelo y el motor con opciones como--model gpt-4o-mini,--engine openai,--engine anthropic,--engine googley--engine-base-url. - El modo de salida admite tanto dibujo SVG como entrada de texto basada en teclado virtual, y su comportamiento se ajusta con opciones como
--no-svg,--no-keyboard,--thinking,--web-searchy--apply-segmentation. - El proyecto se expandió para incluir capturas de pantalla, llamadas a Vision-LLM, uso de herramientas, segmentos de imagen, scripts de evaluación y soporte para el módulo
uinputde reMarkable Paper Pro, aunque algunas funciones se indican explícitamente como experimentales o WIP.
Qué hace Ghostwriter
- Ghostwriter es una interfaz experimental que funciona sobre reMarkable.
- El usuario escribe a mano o dibuja en la pantalla.
- Se activa tocando con el dedo una esquina específica o mediante el contenido de la pantalla.
- Envía la pantalla actual a un Vision-LLM y vuelve a mostrar la respuesta del modelo en la pantalla.
- Se incluye como ejemplo un caso en el que el usuario introduce un prompt escrito a mano y GPT-4o dibuja un chihuahua.
- El objetivo del proyecto es explorar distintas formas de interacción en un medio que combina escritura a mano y pantalla.
Instalación y forma de ejecución
- Antes de ejecutarlo, hay que configurar claves de API en el entorno de reMarkable.
OPENAI_API_KEYANTHROPIC_API_KEYGOOGLE_API_KEY
- La instalación consiste en descargar en la computadora local el binario correspondiente al dispositivo y luego copiarlo al reMarkable.
- reMarkable2:
ghostwriter-rm2 - reMarkable Paper Pro:
ghostwriter-rmpp
- reMarkable2:
- En el dispositivo, se accede por SSH, se otorgan permisos de ejecución y se ejecuta
./ghostwriter. - La ejecución predeterminada usa
claude-sonnet-4-0../ghostwriter./ghostwriter --model gpt-4o-mini
- Un ejemplo de ejecución en segundo plano es
nohup ./ghostwriter --model gpt-4o-mini &. - La ejecución automática al arrancar queda pendiente como TODO.
Flujo de uso y opciones de CLI
- Primero el usuario ejecuta
ghostwriteren reMarkable, luego dibuja contenido en la pantalla y toca con el dedo la esquina superior derecha para activar el asistente. - Durante el procesamiento, la sesión SSH muestra registros de detección táctil y procesamiento; en la pantalla se dibujan puntos de progreso y luego aparece la respuesta escrita o dibujada.
- Opciones relacionadas con modelo y motor
--model MODEL: modelo a usar; el valor predeterminado esclaude-sonnet-4-0--engine ENGINE: permite elegir entreopenai,anthropicygoogle; también puede detectarse automáticamente a partir del modelo--engine-api-key KEY: especifica directamente la clave de API--engine-base-url URL: especifica una URL base de API personalizada
- Opciones relacionadas con el comportamiento
--prompt PROMPT: especifica un archivo de prompt; el valor predeterminado esgeneral.json--trigger-corner CORNER: especifica la esquina de activación táctil; el valor predeterminado esURy también admiteUL,LRyLL
- Opciones relacionadas con herramientas
--no-svg: desactiva la herramienta de dibujo SVG--no-keyboard: desactiva la salida de texto--thinking: activa thinking de Anthropic--web-search: activa la búsqueda web de Anthropic
- Opciones relacionadas con pruebas y depuración
--log-level LEVEL: configurainfo,debugotrace--no-loop: ejecuta una vez y termina--input-png FILE: usa un archivo PNG en vez de una captura de pantalla--output-file FILE: guarda la salida--save-screenshot FILE: guarda la captura de pantalla--save-bitmap FILE: guarda el resultado renderizado--no-submit: no envía al modelo--no-draw: no dibuja la salida--no-trigger: desactiva el disparador táctil--apply-segmentation: agrega segmentos de imagen para reconocimiento espacial
Implementación y flujo de desarrollo
- El desarrollo se realizó principalmente en Ubuntu y también funciona en OSX.
- El flujo de desarrollo consta de instalar dependencias, hacer cross-compilation para el objetivo reMarkable, transferir al dispositivo con
scpy volver a ejecutarlo en el dispositivo. - Para la cross-compilation se usan Docker, Rust,
cross-rsy targets ARM.- Target de reMarkable2:
armv7-unknown-linux-gnueabihf - Target de reMarkable Paper Pro:
aarch64-unknown-linux-gnu
- Target de reMarkable2:
- El proceso de compilación y transferencia está envuelto en
build.sh../build.sh: compilación y transferencia para reMarkable2./build.sh rmpp: compilación y transferencia para reMarkable Paper Pro
- Para builds de release, al etiquetar main con algo como
v2026.09.21-01, GitHub Action crea la release más reciente.
Cambios de funciones y registro de experimentos
- El 2024-10-06 funcionó la prueba de concepto básica.
- Funcionó un ejemplo que completa la respuesta al problema matemático
3 + 7 =. - Funcionó el ejemplo “Draw a picture of a chihuahua. Use simple line-art”.
- El método de rasterizar la salida SVG y luego dibujar muchos puntos a veces no funcionaba bien en reMarkable.
- Funcionó un ejemplo que completa la respuesta al problema matemático
- El 2024-10-07 se agregaron el disparador táctil en la esquina superior derecha y la indicación de estado.
- Al tocar, se dibuja una
Xen la pantalla; durante el procesamiento se trazan líneas adicionales sobre la X. - El usuario debe borrarla manualmente.
- Al tocar, se dibuja una
- Desde el 2024-10-10 comenzó el experimento de entrada de texto basada en teclado virtual.
- Cada página de reMarkable tiene una gran área de texto y el formato es básico.
- Se validó un enfoque que crea un teclado virtual mediante
rM-input-devicesy escribe en la capa de texto.
- El 2024-11-02 comenzaron a ofrecerse las herramientas
draw_textydraw_svg.- Un único asistente completo decide si responder con texto de teclado o con un dibujo SVG.
- El 2024-11-07 se agregó soporte para Claude/Anthropic.
- Puede usar una configuración de uso de herramientas casi igual a la de OpenAI.
- Parecía preferir más el dibujo, pero se registró que el dibujo y el reconocimiento espacial no eran buenos.
- El 2024-12-02 se agregó una etapa básica de segmentos de imagen.
- Envía las coordenadas de los segmentos al Vision-LLM para que las considere.
- En ese momento solo estaba conectada con Claude.
- Se registraron mejoras en una tarea de poner una X dentro de un recuadro y en la colocación de respuestas matemáticas.
- Debe activarse explícitamente con
--apply-segmentation, y vuelve a parsear el PNG asumiendo--input-pngo--save-screenshot.
- El 2024-12-15 se separó una capa de motor polimórfica para los backends de OpenAI y Anthropic.
- El motor y el modelo pasaron a poder enviarse como argumentos.
- Las definiciones de prompts y herramientas se externalizaron y unificaron en el directorio
prompts/.
- El 2024-12-25 la CLI se simplificó y amplió.
- Con pasar solo
-m gpt-4o-mini, infiere el motor comoopenai. - Se agregó un ejemplo de uso de Groq.
- Se agregó soporte para Google Gemini mediante
gemini-2.0-flash-expyGOOGLE_API_KEY.
- Con pasar solo
- El 2025-05-10 se agregaron
thinkingyweb_searchde Anthropic.- Las respuestas de thinking se procesan, pero no se envían a la pantalla.
- La búsqueda web funciona como una característica del lado del servidor de Anthropic.
- No está activada por defecto; se ejecuta con
./ghostwriter --thinking --web-search.
- El 2025-09-21 se hicieron correcciones relacionadas con reMarkable Paper Pro y se agregaron opciones.
- Se corrigió un problema en 3.20 por el que la captura de pantalla no llegaba correctamente debido a un cambio de resolución.
- Se agregó
--no-svgpor pedido de un usuario. - Se agregó la especificación de esquina de activación, como
--trigger-corner LR.
reMarkable Paper Pro y uinput
- El 2025-03-03 Ghostwriter pasó a funcionar también en reMarkable Paper Pro.
- Las diferencias en pantalla y método de entrada eran cambios esperados.
- El problema inesperado fue que reMarkable Paper Pro no incluía el módulo de kernel
uinput. - Se compiló y empaquetó el módulo
uinputusando reMarkable/linux-imx-rm. - Ghostwriter intenta cargar el módulo
uinputsi no está cargado. - Como cada release de reMarkable suele usar una nueva versión de Linux y podrían no ser compatibles entre sí, esto quedó registrado como una gran carga.
- El 2025-04-26 se prepararon módulos para 3.16, 3.17 y 3.18.
- En el registro del 2025-12-06 se indica que, tras la actualización, el Linux de rmpp ya estaba publicado y el módulo
uinputya existía, pero seguía siendo necesario cargarlo.
Evaluación e ideas futuras
- El sistema básico de evaluación aparece organizado como elementos completados.
- Crear un conjunto de capturas de pantalla de entrada
- Representar distintos casos de uso
- Generar ejemplos de salida en forma de texto, SVG y acciones
- Algunos incluyen la posibilidad de evaluación por parte de humanos o de un Vision-LLM evaluador independiente
- El 2024-12-22 empezó a ampliarse el sistema de evaluación, incluido run_eval.sh.
- En ese momento, los parámetros estaban hardcodeados para elegir si usar segmentos y entre Claude 3.5 Sonnet o ChatGPT 4o-mini.
- Se incluye un reporte inicial de evaluación.
- En el reporte final hubo 48 ejecuciones y el costo registrado fue de aproximadamente US$1.
- Como elemento WIP aparece una biblioteca de prompts.
- Hay un punto de partida en
prompts/. - La idea es que las herramientas puedan configurarse desde el prompt.
- Un ejemplo de prompt para gestionar TODO incluye encontrar y extraer
todo, y ejecutar un comando externo comoadd-todo.sh.
- Hay un punto de partida en
- Entre las ideas futuras se incluyen la creación de un archivo de configuración inicial, el ingreso de claves de API, inicio automático y recuperación automática, generación de diagramas basados en PlantUML o Mermaid, consultas externas, y envío por correo electrónico o Slack.
- También hay una idea de modo conversacional.
- Rastrear versiones de pantalla por turno dentro de una misma pantalla.
- Se propone distinguir por color la entrada original, la respuesta del modelo y la nueva entrada.
- También incluye dividir “nuevo prompt” y “continuar” en disparadores distintos.
- También hay experimentos con Vision-LLM en red local.
- El modo compatible con la API de OpenAI de Ollama falló porque
llama3.2-visionno admite herramientas. - Se registró que
llama-3.2-visionde Groq sí admite herramientas, pero no es tan bueno como ChatGPT, Claude o Gemini.
- El modo compatible con la API de OpenAI de Ollama falló porque
- Entre las ideas adicionales se incluyen servicios LLM con streaming e interrupción, procesamiento asíncrono, OpenAI responses API, MCP (Model Context Protocol) y una interfaz web integrada.
Recursos consultados
- Awesome reMarkable: recursos relacionados con reMarkable
- reSnap: base para captura de pantalla
- rmkit lamp: referencia para técnicas de dibujo en pantalla
- resvg: procesamiento de SVG a PNG
- rM-input-devices: creación de dispositivo de entrada virtual sin teclado
- reMarkableAI: proyecto relacionado con el flujo OCR→OpenAI→PDF→Device
- rMAI: interfaz reMarkable-LLM en forma de app separada
- Crazy Cow: herramienta para reMarkable1 que convierte texto en trazos de lápiz
1 comentarios
Opiniones en Hacker News
Soy la persona que creó el proyecto. Sigue siendo un trabajo en curso, y el mayor aprendizaje fue la limitación de conciencia espacial de los modelos de visión.
Hay ejemplos aproximados de evaluación en https://github.com/awwaiid/ghostwriter/blob/main/evaluation_...
Lo siguiente será seguir construyendo y extrayendo con un framework/herramienta de agentes basado en yaml+shell scripts, explorar más métodos de conciencia espacial como la segmentación previa, y escribir un backend reSvg que envíe trazos reales de lápiz en vez de muchos puntos.
Por ejemplo, mientras escribo notas que mezclan palabras, matemática simple y diagramas, si subrayo una frase clave, el “dispositivo” podría expandir esa frase en el margen.
Si el dispositivo está dibujando un diagrama y yo intervengo para borrar y corregir una parte, parece posible que lo entienda y haga el cambio.
La combinación de texto obtenido por reconocimiento de escritura, gestos de trazos, un pequeño lenguaje de íconos y un LLM podría abrir un nuevo paradigma de interacción de usuario que a quienes estamos atrapados en hábitos existentes nos cuesta imaginar de inmediato.
Parece que pronto podría salir de algo así un momento tipo “la madre de todas las demos”, aunque no soy diseñador de UX y me cuesta imaginarlo con claridad; tal vez la persona que lo creó pueda lograrlo.
Desde el punto de vista de producto, creo que debería ser fácil activar y desactivar un modo para pedirle una respuesta al LLM, para que no intente escribir una respuesta cada vez que se detiene el stylus.
Tal vez uno quiera dibujar y pensar un rato, y luego retomar la conversación; o quizá activar el LLM solo en ciertas páginas y desactivarlo en otras.
También me da curiosidad qué tipo de jailbreak hace falta para tener acceso SSH al dispositivo.
Me encanta ver hacks para crear apps para la tablet reMarkable.
Hace tiempo hice una pequeña app para reMarkable y la compartí aquí: https://digest.ferrucc.io/
Encontré el sitio oficial para desarrolladores: https://developer.remarkable.com/documentation
Estuve viendo la app y me da curiosidad cuál fue la parte más difícil de desarrollar para reMarkable.
Ojalá la tablet reMarkable estuviera un poco menos cerrada.
Es uno de mis hardware favoritos, así que me gustaría que hubiera más apps.
Desde hace unos meses quería intentar implementar esto; está muy bien hecho.
También tiene algo de Rust, lidiar con las restricciones del dispositivo, varias normalizaciones de APIs de LLM, enseñanza de visión espacial a LLM, etc.
Podía capturar la pantalla, pero no podía volver a escribir la respuesta sin “hackear”.
Pienso probarlo este fin de semana.
Tenía la idea de que, al escribir una lista de pendientes, se enviara un PDF por email y se pasara a un LLM para crear tareas automáticamente; esto abre una forma mucho mejor de lograr ese objetivo en tiempo real.
Incluso manejó programación ambigua como “quiero hacerlo algún día, pero no tengo una hora definida, así que elige un horario que no choque con mi agenda real”.
Casi no hizo falta prompt, pero el workflow no era muy bueno, así que al final era enviar el PDF por email.
Creo que debería volver a revisarlo, aunque no me motivaba porque de todos modos ignoraba las tareas creadas.
Está en el servidor de Discord de reMarkable https://discord.gg/u3P9sDW. También está enlazado desde https://github.com/reHackable/awesome-reMarkable
Como es un binario en Rust, la instalación debería ser fácil. En teoría :)
Me pregunto si también sería posible en los lectores de ebooks Onyx Boox basados en Android.
En Android, con los permisos adecuados, creo que las capturas de pantalla entre apps serían posibles, pero no estoy seguro de la inyección de eventos de dibujo.
Otra opción es crear una app dedicada. Acabo de comprar un Apple Pencil y estoy pensando en llevar este concepto a una app web; hasta ahora funciona sorprendentemente bien.
Aun así, como solución adecuada, creo que sería mejor que este agente interactuara con apps existentes.
Combinar entrada manuscrita con LLM es un gran caso de uso que permite un workflow mucho más natural.
Me pregunto qué tan bien maneja la letra desprolija y si, con fine-tuning sobre notas personales, el reconocimiento mejoraría con el tiempo.
Aunque mi letra es bastante horrible, si escribía lo que quería hacer y una hora aproximada o concreta, generaba un ical que podía agregarse al calendario.
El problema real está más cerca de la conciencia espacial. Incluso dibujar una X de forma confiable dentro de un recuadro es difícil, y juegos como ta-te-ti o unir puntos lo son todavía más.
Bien. También hay varios modelos de difusión vectorial; si el modelo decide dibujar algo, me pregunto si podría delegárselo a esos modelos mediante una llamada a herramienta.
Así se podrían especificar el rango de coordenadas y el prompt.
Me pregunto si hay algún modelo recomendable, idealmente con una API alojada.
Me pregunto si el tamaño de 11 pulgadas de reMarkable es suficiente para leer papers en PDF.
Uso una Sony DPT de 13 pulgadas de segunda generación y visualmente es perfecta. Aun así, por proyectos como este, los productos de reMarkable me siguen tentando.
Como leo de forma activa, también extrañé no tener resaltado en color. Las funciones de anotación son excelentes.
Ahora sigo revisando papers en la app de Zotero para iPad.
La reMarkable 2 estaba bien por sus posibilidades de hackeo, pero el tamaño de pantalla y las funciones de color de la Pro la convirtieron en un reemplazo excelente.
Uso una tablet Boox y, como básicamente es una tablet Android completa con pantalla de tinta electrónica, parece ideal para este tipo de función.
Me pregunto si dentro de unos 5 años el hardware móvil podrá soportar algo así con ejecución local.