Ghostwriter usa o reMarkable2 como interface para Vision-LLMs
(github.com/awwaiid)- Ghostwriter é um projeto experimental que monitora o que o usuário escreve à mão no reMarkable e, quando é acionado por gestos ou pelo conteúdo da tela, envia isso para um Vision-LLM e depois exibe o resultado novamente na tela como escrita ou desenho
- Para executar, são necessárias chaves de API como
OPENAI_API_KEY,ANTHROPIC_API_KEYeGOOGLE_API_KEY; baixe os binários para reMarkable2 e reMarkable Paper Pro, copie para o dispositivo e execute via SSH - O modelo padrão é
claude-sonnet-4-0, e é possível trocar o modelo e o engine com opções como--model gpt-4o-mini,--engine openai,--engine anthropic,--engine googlee--engine-base-url - O método de saída oferece suporte tanto a desenho em SVG quanto a entrada de texto baseada em teclado virtual, e o comportamento pode ser ajustado com opções como
--no-svg,--no-keyboard,--thinking,--web-searche--apply-segmentation - O projeto foi expandido para captura de tela, chamada de Vision-LLM, uso de ferramentas, segmentos de imagem, scripts de avaliação e suporte ao módulo
uinputdo reMarkable Paper Pro, mas alguns recursos são explicitamente experimentais ou ainda estão em WIP
O que o Ghostwriter faz
- Ghostwriter é uma interface experimental que roda no reMarkable
- O usuário escreve à mão ou desenha na tela
- Aciona com um toque em um canto específico com o dedo ou por conteúdo da tela
- Envia a tela atual para um Vision-LLM e exibe a resposta do modelo de volta na tela
- Como exemplo, há um caso em que o usuário escreve um prompt à mão e o GPT-4o desenha uma chihuahua
- O objetivo do projeto é explorar várias formas de interação em um meio que combina escrita manual com tela
Instalação e execução
- Antes de executar, é preciso configurar chaves de API no ambiente do reMarkable
OPENAI_API_KEYANTHROPIC_API_KEYGOOGLE_API_KEY
- A instalação funciona baixando o binário correspondente em um computador local e depois copiando para o reMarkable
- reMarkable2:
ghostwriter-rm2 - reMarkable Paper Pro:
ghostwriter-rmpp
- reMarkable2:
- No dispositivo, conecte via SSH, dê permissão de execução e rode
./ghostwriter - A execução padrão usa
claude-sonnet-4-0./ghostwriter./ghostwriter --model gpt-4o-mini
- Um exemplo de execução em segundo plano é
nohup ./ghostwriter --model gpt-4o-mini & - A execução automática no boot ainda está como TODO
Fluxo de uso e opções de CLI
- Primeiro, o usuário executa
ghostwriterno reMarkable, depois desenha ou escreve na tela e toca o canto superior direito com o dedo para acionar o assistente - Durante o processamento, a sessão SSH mostra logs de toque e processamento, e na tela aparecem pontos de progresso antes da resposta digitada ou desenhada
- Opções relacionadas a modelo e engine
--model MODEL: modelo a usar; padrãoclaude-sonnet-4-0--engine ENGINE: escolha entreopenai,anthropicegoogle; também pode ser detectado automaticamente a partir do modelo--engine-api-key KEY: define diretamente a chave de API--engine-base-url URL: define uma URL base de API personalizada
- Opções relacionadas ao comportamento
--prompt PROMPT: define o arquivo de prompt; padrãogeneral.json--trigger-corner CORNER: define o canto de disparo por toque; padrãoUR, com suporte também aUL,LReLL
- Opções relacionadas a ferramentas
--no-svg: desativa a ferramenta de desenho SVG--no-keyboard: desativa a saída de texto--thinking: ativa o thinking da Anthropic--web-search: ativa a busca na web da Anthropic
- Opções relacionadas a teste e depuração
--log-level LEVEL: defineinfo,debugoutrace--no-loop: executa uma vez e encerra--input-png FILE: usa um arquivo PNG em vez de screenshot--output-file FILE: salva a saída--save-screenshot FILE: salva a screenshot--save-bitmap FILE: salva o resultado renderizado--no-submit: não envia ao modelo--no-draw: não desenha a saída--no-trigger: desativa o gatilho por toque--apply-segmentation: adiciona segmentos de imagem para percepção espacial
Implementação e fluxo de desenvolvimento
- O desenvolvimento foi feito principalmente no Ubuntu e também funciona no OSX
- O fluxo de desenvolvimento consiste em instalar dependências, fazer cross-compilation para o alvo reMarkable, enviar ao dispositivo via
scpe reiniciar a execução no dispositivo - A cross-compilation usa Docker, Rust,
cross-rse alvos ARM- Alvo do reMarkable2:
armv7-unknown-linux-gnueabihf - Alvo do reMarkable Paper Pro:
aarch64-unknown-linux-gnu
- Alvo do reMarkable2:
- O processo de build e envio é encapsulado em
build.sh./build.sh: build e envio para reMarkable2./build.sh rmpp: build e envio para reMarkable Paper Pro
- Para builds de release, ao adicionar uma tag como
v2026.09.21-01na main, uma GitHub Action cria a release mais recente
Mudanças de recursos e histórico de experimentos
- Em 2024-10-06, a prova de conceito básica já funcionava
- Funcionava um exemplo de responder ao problema matemático
3 + 7 = - Funcionava o exemplo “Draw a picture of a chihuahua. Use simple line-art”
- O método de rasterizar a saída SVG e desenhar muitos pontos às vezes não funcionava bem no reMarkable
- Funcionava um exemplo de responder ao problema matemático
- Em 2024-10-07, foram adicionados o gatilho por toque no canto superior direito e a indicação de estado
- Ao tocar, um
Xé desenhado na tela, e durante o processamento linhas adicionais são traçadas sobre esse X - O usuário precisa apagar isso manualmente
- Ao tocar, um
- A partir de 2024-10-10, começaram os experimentos com entrada de texto via teclado virtual
- Cada página do reMarkable tem uma grande área de texto e a formatação é básica
- Foi validado um método de criar um teclado virtual via
rM-input-devicese escrever na camada de texto
- Em 2024-11-02, passaram a existir as ferramentas
draw_textedraw_svg- Um único assistente completo decide se responde com texto digitado pelo teclado ou com desenho SVG
- Em 2024-11-07, foi adicionado suporte a Claude/Anthropic
- É possível usar praticamente a mesma configuração de uso de ferramentas que no OpenAI
- Parecia preferir mais desenhar, mas foi registrado que desenho e percepção espacial não eram bons
- Em 2024-12-02, foi adicionada uma etapa básica de segmentação de imagem
- As coordenadas dos segmentos são passadas ao Vision-LLM para consideração
- Na época, isso estava conectado apenas ao Claude
- Foram registrados casos de melhoria em tarefas como colocar um X dentro de uma caixa e posicionar respostas de matemática
- É preciso ativar explicitamente com
--apply-segmentation, e isso pressupõe reprocessar um PNG com--input-pngou--save-screenshot
- Em 2024-12-15, foi separada uma camada de engine polimórfica para os backends OpenAI e Anthropic
- Passou a ser possível fornecer engine e modelo como argumentos
- Prompts e definições de ferramentas foram externalizados e unificados no diretório
prompts/
- Em 2024-12-25, a CLI foi simplificada e ampliada
- Basta passar
-m gpt-4o-minipara inferir o engine comoopenai - Foi adicionado um exemplo de uso com Groq
- Foi adicionado suporte ao Google Gemini com
gemini-2.0-flash-expeGOOGLE_API_KEY
- Basta passar
- Em 2025-05-10, foram adicionados
thinkingeweb_searchda Anthropic- As respostas de thinking são processadas, mas não enviadas para a tela
- A busca na web funciona como recurso do lado do servidor da Anthropic
- Não fica ativa por padrão; execute com
./ghostwriter --thinking --web-search
- Em 2025-09-21, foram feitas correções e adicionadas opções relacionadas ao reMarkable Paper Pro
- Na versão 3.20, uma mudança na resolução da tela fazia a screenshot entrar incorretamente, e isso foi corrigido
--no-svgfoi adicionado a pedido de um usuário- Foi adicionada a definição de canto de disparo, como
--trigger-corner LR
reMarkable Paper Pro e uinput
- Em 2025-03-03, o Ghostwriter passou a funcionar também no reMarkable Paper Pro
- Já eram esperadas pequenas diferenças de tela e entrada
- O problema inesperado foi que o reMarkable Paper Pro não incluía o módulo de kernel
uinput - Foi usado reMarkable/linux-imx-rm para compilar e empacotar o módulo
uinput - O Ghostwriter tenta carregar o módulo
uinputse ele ainda não estiver carregado - Como cada release do reMarkable costuma usar uma nova versão do Linux, pode não haver compatibilidade entre elas, e isso foi registrado como uma grande carga
- Em 2025-04-26, foram preparados módulos para 3.16, 3.17 e 3.18
- No registro de 2025-12-06, foi anotado que, após a atualização, o Linux do rmpp já havia sido publicado e o módulo
uinputjá existia, mas ainda precisava ser carregado
Avaliação e ideias futuras
- O sistema básico de avaliação está listado como concluído
- Geração de um conjunto de screenshots de entrada
- Representação de vários casos de uso
- Geração de exemplos de saída em texto, SVG e ações
- Em alguns casos, inclui a possibilidade de avaliação por humanos ou por outro julgador Vision-LLM
- Em 2024-12-22, o sistema de avaliação começou a ser expandido com run_eval.sh
- Na época, os parâmetros eram hardcoded para escolher uso ou não de segmentos e Claude 3.5 Sonnet ou ChatGPT 4o-mini
- Inclui um relatório inicial de avaliação
- O relatório final registrou 48 execuções e custo aproximado de $1
- Há um item WIP de biblioteca de prompts
- Já existe um ponto de partida em
prompts/ - A ideia é permitir configurar ferramentas a partir do prompt
- Um exemplo de prompt para gerenciar TODO inclui encontrar e extrair
todoe executar comandos externos comoadd-todo.sh
- Já existe um ponto de partida em
- Entre as ideias futuras estão criação de arquivo de configuração inicial, entrada de chave de API, inicialização automática e recuperação automática, geração de diagramas com PlantUML ou Mermaid, consultas externas e envio por e-mail ou Slack
- Também existe um plano para modo de conversa
- Acompanhar versões da tela por turno em uma única tela
- Foi proposto diferenciar por cor a entrada original, a resposta do modelo e a nova entrada
- Também inclui separar “novo prompt” e “continuar” com gatilhos diferentes
- Há também experimentos com Vision-LLMs em rede local
- O modo compatível com API OpenAI do Ollama falhou porque
llama3.2-visionnão suporta ferramentas - O
llama-3.2-visionda Groq suporta ferramentas, mas foi registrado como inferior a ChatGPT, Claude e Gemini
- O modo compatível com API OpenAI do Ollama falhou porque
- Ideias adicionais incluem serviço de LLM com streaming e interrupção, processamento assíncrono, OpenAI responses API, MCP (Model Context Protocol) e uma interface web integrada
Recursos consultados
- Awesome reMarkable: recursos relacionados ao reMarkable
- reSnap: baseado em captura de tela
- rmkit lamp: referência para técnica de desenho na tela
- resvg: processamento de SVG para PNG
- rM-input-devices: criação de dispositivo de entrada virtual sem teclado
- reMarkableAI: projeto relacionado com fluxo OCR→OpenAI→PDF→Device
- rMAI: interface reMarkable-LLM em formato de aplicativo separado
- Crazy Cow: ferramenta que converte texto em traços de caneta para o reMarkable1
1 comentários
Opiniões no Hacker News
Sou a pessoa que criou o projeto. Ele ainda está em andamento, e a maior descoberta foi a limitação de percepção espacial dos modelos de visão
Há alguns exemplos de avaliação aproximada em https://github.com/awwaiid/ghostwriter/blob/main/evaluation_...
Em seguida, pretendo continuar construindo e extraindo com um framework/ferramentas de agente baseado em yaml+shell script, explorar mais métodos de percepção espacial como pré-segmentação e escrever um backend reSvg que envie traços reais de caneta em vez de muitos pontos
Por exemplo, enquanto você escreve anotações misturando palavras, matemática simples e diagramas, ao sublinhar uma frase-chave, o “dispositivo” poderia expandir essa frase na margem
Se eu interromper enquanto o dispositivo está desenhando um diagrama, apagar e corrigir parte dele, parece possível que ele entenda isso e faça a alteração
A combinação de texto obtido por reconhecimento de escrita, gestos de traços, uma pequena linguagem de ícones e LLMs parece abrir novos paradigmas de interação do usuário que nós, presos a hábitos existentes, talvez não consigamos imaginar de imediato
Parece que algo assim pode em breve produzir um momento tipo “mãe de todas as demos”, mas, como não sou designer de UX, é difícil imaginar com clareza; talvez quem criou consiga fazer isso
Do ponto de vista de produto, acho que deveria ser fácil ligar e desligar um modo de solicitar resposta ao LLM, para que ele não tente continuar escrevendo respostas toda vez que o stylus parar
Talvez eu queira esboçar e pensar por um tempo antes de retomar a conversa, ou talvez queira ativar o LLM só em certas páginas e desativá-lo em outras
Também fiquei curioso sobre que tipo de jailbreak é necessário para ter acesso SSH ao dispositivo
Gosto muito de ver gente hackeando e criando apps para o tablet reMarkable
Um tempo atrás fiz um pequeno app para reMarkable e compartilhei aqui: https://digest.ferrucc.io/
Encontrei o site oficial de desenvolvedores: https://developer.remarkable.com/documentation
Dei uma olhada no app e fiquei curioso: qual foi a parte mais difícil ao desenvolver para o reMarkable?
Queria que o tablet reMarkable fosse um pouco menos fechado
É um dos meus hardwares favoritos, então eu gostaria que houvesse mais apps
Há alguns meses eu queria tentar implementar isso, e ficou muito bem feito
Tem um pouco de Rust, briga com limitações do dispositivo, várias normalizações de APIs de LLM, treinamento de LLMs de visão espacial e coisas do tipo
Eu conseguia capturar a tela, mas não conseguia escrever a resposta de volta sem “hackear”
Pretendo experimentar neste fim de semana
Eu tinha a ideia de escrever uma lista de tarefas, enviar o PDF por e-mail e passá-lo para um LLM para criar tarefas automaticamente; isto abre uma forma muito melhor de atingir esse objetivo em tempo real
Ele também lidava com agendamento ambíguo, como “quero fazer algum dia, mas não tenho horário definido, então escolha um horário que não conflite com minha agenda real”
Quase não precisei de prompt, mas o fluxo de trabalho era ruim, então no fim era o método de enviar PDF por e-mail
Acho que preciso revisitar isso, embora eu acabasse ignorando as tarefas criadas, então perdi a motivação
Estou no servidor Discord do reMarkable https://discord.gg/u3P9sDW. Também está linkado em https://github.com/reHackable/awesome-reMarkable
Como é um binário em Rust, a instalação deve ser fácil. Em teoria :)
Fico curioso se isso também seria possível em e-readers Onyx Boox baseados em Android
No Android, com as permissões adequadas, acho que screenshots entre apps devem ser possíveis, mas não sei quanto à injeção de eventos de desenho
Outra abordagem é criar um app dedicado. Acabei de comprar um Apple Pencil e estou pensando em levar esse conceito para um app web; até agora, surpreendentemente, funciona bem
Ainda assim, para uma solução adequada, acho que seria melhor esse agente interagir com apps existentes
Combinar entrada manuscrita com LLMs é um ótimo caso de uso que cria um fluxo de trabalho muito mais natural
Fico curioso para saber quão bem ele lida com caligrafia bagunçada e se um fine-tuning com notas pessoais melhoraria o reconhecimento com o tempo
Mesmo com minha caligrafia bastante ruim, ao escrever o que eu queria fazer e horários aproximados ou específicos, ele gerava um ical que eu podia colocar no calendário
O problema real está mais na percepção espacial. Até desenhar um X de forma confiável dentro de uma caixa é difícil, e jogo da velha ou ligue-os-pontos são ainda mais difíceis
Legal. Existem alguns modelos de difusão vetorial; se o modelo decidir que precisa desenhar algo, talvez pudesse delegar isso a esses modelos por meio de uma chamada de ferramenta
Assim seria possível especificar o intervalo de coordenadas e o prompt
Fico curioso se há algum modelo recomendável, de preferência com API hospedada
Fico curioso se o tamanho de 11 polegadas do reMarkable é suficiente para ler artigos em PDF
Uso um Sony DPT de 13 polegadas de segunda geração, e ele é perfeito para visualização. Mesmo assim, projetos como este continuam me atraindo para os produtos reMarkable
Como leio de forma ativa, também senti falta de destaques coloridos. Os recursos de anotação são excelentes
Hoje continuo revisando artigos no app Zotero do iPad
O reMarkable 2 era bom por sua capacidade de ser hackeado, mas o tamanho da tela e os recursos de cor do Pro fizeram dele um ótimo substituto
Uso um tablet Boox e, como ele é basicamente um tablet Android completo com tela e-ink, parece perfeito para esse tipo de recurso
Fico curioso se daqui a uns 5 anos o hardware móvel poderá oferecer suporte a isso com execução local