1 pontos por GN⁺ 2025-02-10 | 1 comentários | Compartilhar no WhatsApp
  • 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_KEY e GOOGLE_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 google e --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-search e --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 uinput do 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_KEY
    • ANTHROPIC_API_KEY
    • GOOGLE_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
  • 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 ghostwriter no 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ão claude-sonnet-4-0
    • --engine ENGINE: escolha entre openai, anthropic e google; 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ão general.json
    • --trigger-corner CORNER: define o canto de disparo por toque; padrão UR, com suporte também a UL, LR e LL
  • 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: define info, debug ou trace
    • --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 scp e reiniciar a execução no dispositivo
  • A cross-compilation usa Docker, Rust, cross-rs e alvos ARM
    • Alvo do reMarkable2: armv7-unknown-linux-gnueabihf
    • Alvo do reMarkable Paper Pro: aarch64-unknown-linux-gnu
  • 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-01 na 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
  • 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
  • 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-devices e escrever na camada de texto
  • Em 2024-11-02, passaram a existir as ferramentas draw_text e draw_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-png ou --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-mini para inferir o engine como openai
    • Foi adicionado um exemplo de uso com Groq
    • Foi adicionado suporte ao Google Gemini com gemini-2.0-flash-exp e GOOGLE_API_KEY
  • Em 2025-05-10, foram adicionados thinking e web_search da 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-svg foi 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 uinput se 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 uinput já 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 todo e executar comandos externos como add-todo.sh
  • 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-vision não suporta ferramentas
    • O llama-3.2-vision da Groq suporta ferramentas, mas foi registrado como inferior a ChatGPT, Claude e Gemini
  • 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

 
GN⁺ 2025-02-10
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

    • Muito legal. Não penso apenas em algo “turn-based sem firulas”, mas em formas de uso mais colaborativas
      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
    • O efeito é muito legal. Fico curioso para saber como você imagina que isso será usado na prática
      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/

    • Toda vez que vejo algo assim, fico com vontade de experimentar desenvolvimento de apps para Remarkable 2. Fico curioso se há algum material recomendado
      Encontrei o site oficial de desenvolvedores: https://developer.remarkable.com/documentation
    • Legal. Gosto de ver hacks criativos expandindo as funcionalidades do reMarkable
      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

    • Fechado? Se você se conectar por SSH, consegue um shell. Quando o iPad permitir isso, aí a gente conversa
  • Há alguns meses eu queria tentar implementar isso, e ficou muito bem feito

    • Ainda é um trabalho em andamento, mas é um projeto bem divertido para aprender e se inspirar
      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
    • Em certo momento quis transformar o goMarkableStream em um servidor MCP
      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

    • Alguns meses atrás fiz uma prova de conceito com Claude e rMPP, e funcionou bem
      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
    • Posso ajudar se precisar. Acho que até agora só cerca de uma pessoa rodou isso de verdade
      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

    • Por causa das limitações do reMarkable, usei uma abordagem de tirar screenshots e injetar eventos de entrada para interagir com o app proprietário de desenho
      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

    • Fiz isso há alguns meses com um Remarkable Paper Pro e Claude, e funcionou bem
      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
    • Em geral, se eu consigo ler minha própria letra, o modelo também consegue. Essa parte não foi problema
      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

    • Há dois motivos. Um é que ainda não cheguei lá, e o segundo é… na verdade é só esse mesmo
      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

    • Já li artigos no Remarkable 2, mas ele era um pouco pequeno para ler o texto confortavelmente
      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
    • Comprei recentemente o tablet reMarkable Pro, e isso me permitiu migrar do Sony DPT-S1 e do reMarkable 2
      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
    • Para PDFs, é apenas minimamente utilizável
  • 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