1 points par GN⁺ 2025-02-10 | 1 commentaires | Partager sur WhatsApp
  • Ghostwriter est un projet expérimental pour reMarkable qui surveille ce que l’utilisateur écrit à la main, l’envoie à un Vision-LLM lorsqu’un geste ou le contenu de l’écran le déclenche, puis réaffiche le résultat à l’écran sous forme de texte manuscrit ou de dessin
  • Son exécution nécessite des clés API comme OPENAI_API_KEY, ANTHROPIC_API_KEY et GOOGLE_API_KEY. Il faut télécharger les binaires pour reMarkable2 et reMarkable Paper Pro, les copier sur l’appareil, puis les lancer via SSH
  • Le modèle par défaut est claude-sonnet-4-0, et il est possible de changer de modèle et de moteur avec --model gpt-4o-mini, --engine openai, --engine anthropic, --engine google, --engine-base-url, etc.
  • La sortie prend en charge à la fois le dessin SVG et la saisie de texte via clavier virtuel, avec des options comme --no-svg, --no-keyboard, --thinking, --web-search et --apply-segmentation pour ajuster le comportement
  • Le projet s’est étendu à la capture d’écran, à l’appel de Vision-LLM, à l’usage d’outils, aux segments d’image, aux scripts d’évaluation et à la prise en charge du module uinput de la reMarkable Paper Pro, mais certaines fonctions sont explicitement expérimentales ou encore en WIP

Ce que fait Ghostwriter

  • Ghostwriter est une interface expérimentale qui fonctionne sur reMarkable
    • l’utilisateur écrit ou dessine à la main sur l’écran
    • il déclenche l’outil en touchant un coin précis avec le doigt ou via le contenu affiché
    • l’écran courant est envoyé à un Vision-LLM, puis la réponse du modèle est réaffichée à l’écran
  • Un exemple montre un utilisateur écrivant un prompt à la main, puis GPT-4o dessinant un chihuahua
  • Le but du projet est d’explorer différents modes d’interaction dans un médium combinant écriture manuscrite et écran

Installation et exécution

  • Avant l’exécution, il faut définir les clés API dans l’environnement reMarkable
    • OPENAI_API_KEY
    • ANTHROPIC_API_KEY
    • GOOGLE_API_KEY
  • L’installation consiste à télécharger depuis un ordinateur local le binaire correspondant à l’appareil, puis à le copier sur la reMarkable
    • reMarkable2 : ghostwriter-rm2
    • reMarkable Paper Pro : ghostwriter-rmpp
  • Sur l’appareil, on se connecte en SSH, on donne les droits d’exécution, puis on lance ./ghostwriter
  • L’exécution par défaut utilise claude-sonnet-4-0
    • ./ghostwriter
    • ./ghostwriter --model gpt-4o-mini
  • Exemple d’exécution en arrière-plan : nohup ./ghostwriter --model gpt-4o-mini &
  • Le lancement automatique au démarrage reste marqué comme TODO

Flux d’utilisation et options CLI

  • L’utilisateur lance d’abord ghostwriter sur la reMarkable, dessine du contenu à l’écran, puis déclenche l’assistant en touchant le coin supérieur droit avec le doigt
  • Pendant le traitement, la session SSH affiche les logs de détection tactile et de traitement, tandis que des points de progression sont dessinés à l’écran avant l’apparition d’une réponse tapée ou dessinée
  • Options liées au modèle et au moteur
    • --model MODEL : modèle à utiliser, valeur par défaut claude-sonnet-4-0
    • --engine ENGINE : choisir parmi openai, anthropic, google, avec détection automatique possible à partir du modèle
    • --engine-api-key KEY : définir directement la clé API
    • --engine-base-url URL : définir une URL de base API personnalisée
  • Options de comportement
    • --prompt PROMPT : fichier de prompt à utiliser, valeur par défaut general.json
    • --trigger-corner CORNER : coin de déclenchement tactile, valeur par défaut UR, avec prise en charge de UL, LR, LL
  • Options liées aux outils
    • --no-svg : désactiver l’outil de dessin SVG
    • --no-keyboard : désactiver la sortie texte
    • --thinking : activer le mode thinking d’Anthropic
    • --web-search : activer la recherche web d’Anthropic
  • Options de test et de débogage
    • --log-level LEVEL : info, debug, trace
    • --no-loop : exécuter une seule fois puis quitter
    • --input-png FILE : utiliser un fichier PNG au lieu d’une capture d’écran
    • --output-file FILE : enregistrer la sortie
    • --save-screenshot FILE : enregistrer la capture d’écran
    • --save-bitmap FILE : enregistrer le rendu
    • --no-submit : ne pas envoyer au modèle
    • --no-draw : ne pas dessiner la sortie
    • --no-trigger : désactiver le déclenchement tactile
    • --apply-segmentation : ajouter des segments d’image pour la perception spatiale

Implémentation et workflow de développement

  • Le développement s’est fait principalement sur Ubuntu, avec fonctionnement aussi sur OSX
  • Le flux de développement comprend l’installation des dépendances, la compilation croisée pour reMarkable, le transfert vers l’appareil avec scp, puis le redémarrage sur l’appareil
  • La compilation croisée utilise Docker, Rust, cross-rs et des cibles ARM
    • cible reMarkable2 : armv7-unknown-linux-gnueabihf
    • cible reMarkable Paper Pro : aarch64-unknown-linux-gnu
  • Après compilation, le transfert est encapsulé dans build.sh
    • ./build.sh : build et transfert pour reMarkable2
    • ./build.sh rmpp : build et transfert pour reMarkable Paper Pro
  • Pour les releases, il suffit d’ajouter sur main un tag comme v2026.09.21-01, puis une GitHub Action génère la dernière release

Évolution des fonctionnalités et journal d’expérimentation

  • Le 2024-10-06, la preuve de concept de base fonctionnait
    • un exemple répondait au problème de maths 3 + 7 =
    • un exemple faisait fonctionner “Draw a picture of a chihuahua. Use simple line-art”
    • la méthode consistant à rasteriser une sortie SVG puis à dessiner beaucoup de points ne fonctionnait pas toujours bien sur reMarkable
  • Le 2024-10-07, le déclencheur tactile en haut à droite et l’indication d’état ont été ajoutés
    • au toucher, un X est dessiné à l’écran, avec des traits supplémentaires pendant le traitement
    • l’utilisateur doit l’effacer lui-même
  • À partir du 2024-10-10, des essais de saisie de texte via clavier virtuel ont commencé
    • chaque page de reMarkable dispose d’une grande zone de texte, avec une mise en forme basique
    • le projet a validé l’approche consistant à créer un clavier virtuel avec rM-input-devices pour écrire dans la couche texte
  • Le 2024-11-02, les outils draw_text et draw_svg ont commencé à être fournis
    • un assistant unique décide de répondre soit en texte clavier, soit en dessin SVG
  • Le 2024-11-07, la prise en charge de Claude/Anthropic a été ajoutée
    • il est possible d’utiliser une configuration d’outils presque identique à celle d’OpenAI
    • le modèle semblait davantage aimer dessiner, mais ses capacités de dessin et de perception spatiale étaient jugées faibles
  • Le 2024-12-02, une étape de segmentation d’image de base a été ajoutée
    • les coordonnées des segments sont transmises au Vision-LLM pour qu’il en tienne compte
    • à ce moment-là, cela n’était branché que sur Claude
    • des améliorations ont été relevées pour placer un X dans une case et positionner une réponse de mathématiques
    • l’option doit être activée explicitement avec --apply-segmentation, et repose sur une réanalyse du PNG via --input-png ou --save-screenshot
  • Le 2024-12-15, une couche moteur polymorphe a été séparée pour les backends OpenAI et Anthropic
    • il devient possible de passer moteur et modèle en paramètres
    • les définitions de prompts et d’outils sont externalisées et unifiées dans le répertoire prompts/
  • Le 2024-12-25, la CLI a été simplifiée et étendue
    • en passant seulement -m gpt-4o-mini, le moteur est déduit comme openai
    • un exemple d’usage avec Groq a été ajouté
    • la prise en charge de Google Gemini via gemini-2.0-flash-exp et GOOGLE_API_KEY a été ajoutée
  • Le 2025-05-10, thinking et web_search d’Anthropic ont été ajoutés
    • les réponses de thinking sont traitées mais non envoyées à l’écran
    • la recherche web fonctionne comme une capacité côté serveur chez Anthropic
    • ce n’est pas activé par défaut et s’utilise avec ./ghostwriter --thinking --web-search
  • Le 2025-09-21, des correctifs et options liés à la reMarkable Paper Pro ont été ajoutés
    • le problème de captures d’écran incorrectes après le changement de résolution d’écran en 3.20 a été corrigé
    • --no-svg a été ajouté à la demande d’un utilisateur
    • le choix du coin de déclenchement, comme --trigger-corner LR, a été ajouté

reMarkable Paper Pro et uinput

  • Le 2025-03-03, Ghostwriter s’est mis à fonctionner aussi sur reMarkable Paper Pro
  • Quelques différences d’écran et de méthode d’entrée étaient attendues
  • Le problème inattendu était que le module noyau uinput n’était pas inclus sur reMarkable Paper Pro
  • Le projet utilise reMarkable/linux-imx-rm pour compiler et embarquer le module uinput
  • Ghostwriter tente de charger le module uinput s’il ne l’est pas déjà
  • Comme chaque release reMarkable utilise souvent une nouvelle version de Linux potentiellement incompatible, cette partie est décrite comme une lourde contrainte
  • Le 2025-04-26, des modules pour 3.16, 3.17 et 3.18 étaient prêts
  • Une note du 2025-12-06 indique qu’après mise à jour, le Linux de la rmpp était déjà publié et que le module uinput existait déjà, mais nécessitait toujours un chargement

Évaluation et idées pour la suite

  • Le système d’évaluation de base est listé comme terminé
    • génération d’un ensemble de captures d’écran d’entrée
    • représentation de divers cas d’usage
    • génération d’exemples de sortie en texte, SVG et actions
    • possibilité, pour certains cas, d’une évaluation par humain ou par un Vision-LLM distinct
  • Le 2024-12-22, le système d’évaluation a commencé à s’étendre avec run_eval.sh
    • à l’époque, les paramètres étaient codés en dur autour de l’usage ou non des segments et du choix entre Claude 3.5 Sonnet et ChatGPT 4o-mini
    • un rapport d’évaluation initial est inclus
    • le rapport final mentionne 48 exécutions pour un coût d’environ 1 $
  • Une bibliothèque de prompts figure parmi les éléments WIP
    • un point de départ existe dans prompts/
    • l’idée est de permettre la configuration des outils depuis les prompts
    • un exemple de prompt pour gérer des TODO inclut la détection et l’extraction de todo, puis l’exécution de commandes externes comme add-todo.sh
  • Parmi les idées futures : génération d’un fichier de configuration initiale, saisie des clés API, démarrage automatique et reprise automatique, génération de diagrammes via PlantUML ou Mermaid, requêtes externes, envoi par email ou vers Slack
  • Un mode conversationnel est également envisagé
    • il suivrait les versions d’écran tour après tour sur une même page
    • l’entrée d’origine, la réponse du modèle et la nouvelle entrée seraient distinguées par couleur
    • l’idée inclut aussi des déclencheurs séparés pour “nouveau prompt” et “continuer”
  • Des expérimentations avec des Vision-LLM en réseau local sont aussi mentionnées
    • le mode compatible OpenAI API d’Ollama a échoué car llama3.2-vision ne prend pas en charge les outils
    • llama-3.2-vision de Groq prend en charge les outils, mais est jugé moins bon que ChatGPT, Claude et Gemini
  • D’autres idées incluent des services LLM en streaming avec interruption, le traitement asynchrone, l’API OpenAI responses, MCP (Model Context Protocol) et une interface web unifiée

Ressources utilisées

  • Awesome reMarkable : ressources autour de reMarkable
  • reSnap : basé sur la capture d’écran
  • rmkit lamp : référence pour les techniques de dessin à l’écran
  • resvg : traitement SVG-vers-PNG
  • rM-input-devices : création de périphériques d’entrée virtuels sans clavier
  • reMarkableAI : projet lié avec approche OCR→OpenAI→PDF→Device
  • rMAI : interface reMarkable-LLM sous forme d’application séparée
  • Crazy Cow : outil pour reMarkable1 transformant du texte en tracés de stylet

1 commentaires

 
GN⁺ 2025-02-10
Avis sur Hacker News
  • C’est moi qui ai réalisé le projet. C’est un travail en cours, et la plus grande prise de conscience a été les limites de perception spatiale des modèles de vision
    Un exemple d’évaluation approximative se trouve ici : https://github.com/awwaiid/ghostwriter/blob/main/evaluation_...
    Ensuite, je compte continuer à développer et extraire avec un framework/outillage d’agents basé sur yaml + scripts shell, explorer davantage des méthodes de perception spatiale comme la pré-segmentation, et écrire un backend reSvg qui envoie de vrais traits de stylet au lieu de beaucoup de points

    • Vraiment génial. Ça évoque un mode d’usage plus collaboratif, et pas simplement du « tour par tour brut »
      Par exemple, on écrit des notes mêlant mots, calculs simples et diagrammes, puis on souligne une phrase clé, et le « dispositif » pourrait développer cette phrase dans la marge
      Si j’interviens pendant que l’appareil dessine un diagramme pour effacer et corriger une partie, on peut imaginer qu’il le comprenne et modifie en conséquence
      Avec le texte obtenu par reconnaissance d’écriture manuscrite, les gestes de traits, un petit langage d’icônes, et les LLM combinés ensemble, on a l’impression qu’un nouveau paradigme d’interaction utilisateur peut s’ouvrir, difficile à imaginer immédiatement pour nous qui sommes enfermés dans nos habitudes
      On a l’impression qu’un moment du genre « la mère de toutes les démos » pourrait bientôt sortir de ce type de choses, mais je ne suis pas designer UX donc j’ai du mal à me le représenter clairement, et peut-être que la personne qui l’a créé y arrivera
    • L’effet est vraiment impressionnant. Je me demande comment tu vois son usage concret
      Du point de vue produit, il faudrait sans doute pouvoir activer et désactiver facilement un mode qui demande une réponse au LLM, afin qu’il n’essaie pas d’écrire une réponse à chaque fois que le stylet s’arrête
      On peut vouloir esquisser et réfléchir un moment, puis reprendre la conversation ensuite
      On peut aussi vouloir activer le LLM seulement sur certaines pages et le désactiver sur d’autres
      Je me demande aussi quel type de jailbreak est nécessaire pour obtenir un accès SSH à l’appareil
  • J’adore voir des apps pour tablettes reMarkable créées en hackant le système
    J’avais déjà développé une petite app reMarkable et je l’avais partagée ici : https://digest.ferrucc.io/

    • Chaque fois que je vois ce genre de chose, ça me donne envie d’essayer le développement d’apps pour Remarkable 2. Je me demande s’il y a des ressources à recommander
      J’ai trouvé le site officiel pour développeurs : https://developer.remarkable.com/documentation
    • Super. J’aime voir les capacités de la reMarkable s’étendre grâce à des hacks créatifs
      J’ai regardé l’app, et je me demande quel a été le point le plus difficile dans le développement pour reMarkable
  • J’aimerais que les tablettes reMarkable soient un peu moins verrouillées
    C’est l’un de mes matériels préférés, donc j’aimerais qu’il y ait davantage d’apps

    • Verrouillées ? Si tu t’y connectes en SSH, tu obtiens un shell. Le jour où l’iPad permettra ça, on en reparlera
  • Je voulais essayer de faire ça depuis quelques mois, c’est vraiment très bien réalisé

    • C’est encore un travail en cours, mais c’est un projet très amusant pour apprendre et s’inspirer
      Il y a aussi un peu de Rust, de la lutte avec les contraintes matérielles, diverses normalisations d’API LLM, et même un peu d’entraînement de LLM de vision spatiale
    • À une époque, je voulais transformer goMarkableStream en serveur MCP
      Je pouvais récupérer l’écran, mais sans « hack », je ne pouvais pas réécrire la réponse dessus
  • Je pense essayer ça ce week-end
    J’avais l’idée d’écrire une liste de tâches, puis d’envoyer le PDF par e-mail et de le transmettre au LLM pour générer automatiquement des tâches, et ça ouvre une voie bien meilleure pour atteindre cet objectif en temps réel

    • Il y a quelques mois, j’avais fait une preuve de concept avec Claude et rMPP, et ça fonctionnait plutôt bien
      Ça gérait aussi la planification floue, du genre « j’aimerais faire ça un jour, mais je n’ai pas d’horaire fixe, alors choisis un moment qui ne chevauche pas mon planning réel »
      Il ne fallait presque pas de prompt non plus, mais le workflow n’était pas terrible, donc au final ça passait par l’envoi du PDF par e-mail
      Je devrais peut-être m’y remettre, mais de toute façon j’ignore les tâches créées, donc je n’étais pas très motivé
    • Je peux aider si besoin. J’ai l’impression qu’il n’y a qu’environ une seule personne qui l’ait vraiment fait tourner jusqu’ici
      Je suis sur le serveur Discord reMarkable https://discord.gg/u3P9sDW. Il est aussi lié depuis https://github.com/reHackable/awesome-reMarkable
      C’est un binaire Rust, donc l’installation devrait être simple. En théorie :)
  • Je me demande si ce serait possible aussi sur les liseuses électroniques Onyx Boox basées sur Android

    • À cause des contraintes de reMarkable, j’ai utilisé une méthode consistant à faire des captures d’écran et à injecter des événements d’entrée pour interagir avec l’app de dessin propriétaire
      Sur Android, avec les bonnes autorisations, les captures d’écran inter-apps semblent possibles, mais pour l’injection d’événements de dessin je ne sais pas trop
      Une autre approche serait de créer une app dédiée. Je viens d’acheter un Apple Pencil et je me demande si je ne vais pas porter ce concept dans une web app ; jusqu’ici, ça fonctionne étonnamment bien
      Cela dit, pour une vraie solution, il vaudrait probablement mieux que cet agent interagisse avec les apps existantes
  • Associer la saisie manuscrite et un LLM est un excellent cas d’usage pour créer un workflow bien plus naturel
    Je me demande à quel point ça gère une écriture brouillonne, et si un fine-tuning sur des notes personnelles pourrait améliorer la reconnaissance au fil du temps

    • Il y a quelques mois, j’ai essayé avec une Remarkable Paper Pro et Claude, et ça marchait plutôt bien
      Mon écriture est assez catastrophique, mais si j’écrivais ce que je voulais faire avec une heure approximative ou précise, ça me générait un ical que je pouvais ajouter au calendrier
    • En général, si moi je peux relire mon écriture, le modèle peut la lire aussi. Ce n’était pas le problème
      Le vrai problème est plus proche de la perception spatiale. Dessiner de manière fiable un X dans une case est déjà difficile, et des jeux comme le morpion ou les points à relier le sont encore davantage
  • Sympa. Il existe aussi quelques modèles de diffusion vectorielle ; si le modèle juge qu’il faut dessiner quelque chose, on pourrait peut-être déléguer ça à ces modèles via un appel d’outil
    On pourrait alors spécifier une plage de coordonnées et un prompt

    • Il y a deux raisons. La première, c’est que je ne suis pas encore allé jusque-là, et la seconde… c’est en fait seulement celle-là
      Je serais curieux d’avoir des recommandations, si possible avec une API hébergée
  • Je me demande si la taille de 11 pouces du reMarkable suffit pour lire des PDF d’articles scientifiques
    J’utilise un Sony DPT 2e génération de 13 pouces, et c’est parfait pour l’affichage. Malgré ça, les produits reMarkable continuent de me tenter à cause de projets comme celui-ci

    • J’ai essayé de lire des articles sur un Remarkable 2, mais c’était légèrement trop petit pour lire le texte confortablement
      Je lis de façon assez active, donc l’absence de surlignage en couleur me manque aussi. Les fonctions d’annotation sont excellentes
      Maintenant, je continue à relire mes articles dans l’app Zotero sur iPad
    • J’ai récemment acheté une tablette reMarkable Pro, ce qui m’a permis de quitter le Sony DPT-S1 et la reMarkable 2
      La reMarkable 2 restait intéressante pour ses possibilités de hack, mais les dimensions de l’écran et la couleur de la Pro en ont fait un excellent remplacement
    • Pour les PDF, c’est tout juste acceptable
  • J’utilise une tablette Boox, et c’est en fait essentiellement une tablette Android complète avec un écran e-ink, donc ça semble parfaitement adapté à ce genre de fonctionnalité
    Je me demande si, dans cinq ans environ, le matériel mobile pourra prendre en charge ce genre de chose en exécution locale