Fable이 reMarkable을 Harry Potter의 Tom Riddle 일기장으로 바꿈

1 week ago 19
  • riddle은 reMarkable Paper Pro에서 펜으로 쓴 글씨가 잠시 뒤 사라지고, Tom Riddle의 일기장처럼 답변이 손글씨 획으로 다시 쓰였다가 사라지는 앱임
  • 동작 흐름은 펜 입력을 받아 2.8초 유휴 후 페이지를 PNG로 확정하고, 비전 LLM이 손글씨를 읽어 문장 단위로 답변을 스트리밍하는 방식임
  • 설치는 remagic을 통한 설치가 가장 쉽고, 사전 빌드 번들 설치나 소스 빌드도 가능하지만 reMarkable Paper Pro 개발자 모드와 런처가 필요함
  • 앱은 root로 실행되고 takeover 모드에서는 vendor UI를 중지한 뒤 e-ink 엔진을 직접 구동하며, 테스트 범위는 reMarkable Paper Pro ferrari, aarch64, OS 3.26–3.27로 제한됨
  • LLM 백엔드는 OpenAI 호환 /chat/completions API 또는 resident pi --mode rpc 프로세스를 사용할 수 있으며, 기기 수정과 vendor 라이브러리 사용은 사용자가 직접 감수해야 함

Tom Riddle 일기장처럼 동작하는 reMarkable 앱

  • riddle은 reMarkable Paper Pro에서 펜으로 페이지에 글을 쓰면, 잠시 뒤 글씨가 종이에 스며들듯 사라지고 답변이 흐르는 손글씨로 획 단위로 나타나는 앱임
  • 화면 빛, 키보드, 채팅 UI 없이 종이에 잉크가 나타나는 경험을 목표로 함
  • 데모에 나온 일기장 앱이며, “Tom”에게 글을 쓰는 형태로 사용함

설치와 실행 방식

  • 처음 사용하는 경우 reMarkable Paper Pro를 개발자 모드로 설정하고 런처를 설치해야 함
  • remagic은 개발자 모드 활성화와 환경 설정을 한 명령으로 진행하도록 안내함
  • remagic 설치 명령:
    • remagic install riddle: 체크섬 검증 다운로드 후 AppLoad에 설치
    • remagic config riddle: 브라우저에서 설정 폼을 열고 휴대폰용 QR도 제공
  • 이미 xovi와 AppLoad가 있으면 remagic 카탈로그, 사전 빌드 번들, 소스 빌드 중 하나로 설치 가능함
  • 설치 후 AppLoad에서 Reload를 누르고 The Diary를 실행한 뒤 글을 쓰고 펜을 쉬게 두면 동작함

사전 빌드 번들 설치

  • 최신 릴리스에서 riddle-<version>.zip을 받아 riddle 폴더로 압축 해제함
  • 폴더를 태블릿의 /home/root/xovi/exthome/appload/로 복사함
  • oracle.env.example을 oracle.env로 복사하고 RIDDLE_OPENAI_KEY에 OpenAI 호환 API 키를 넣음
  • API 키를 넣지 않으면 pi 경로를 사용할 수 있음
  • AppLoad에서 Reload 후 The Diary를 실행함

기기 수정과 지원 범위

  • riddle은 기기를 수정하며, root로 실행됨
  • takeover 모드에서는 vendor UI를 중지하고 e-ink 엔진을 직접 구동함
  • 테스트된 환경은 reMarkable Paper Pro ferrari, aarch64, OS 3.26–3.27뿐임
  • 다른 모델이나 OS 버전에서는 동작하지 않을 수 있음
  • reMarkable AS와 관련이 없으며, 설치 전 SSH 접근이 계속 가능해야 복구 경로를 확보할 수 있음

내부 동작 구조

  • 입력은 raw evdev를 통해 받으며, 4096단계 압력과 하드웨어 이벤트 속도를 사용함
  • 사용자가 글을 쓰고 2.8초 동안 멈추면 페이지를 커밋하고 PNG로 변환함
  • resident LLM 프로세스인 oracle이 PNG를 읽고 답변을 문장 단위로 스트리밍함
  • 답변은 Dancing Script 폰트를 래스터화한 뒤 Zhang-Suen thinning으로 단일 픽셀 펜 경로로 만들고, 획 추적 후 애니메이션 재생함
  • 표시 백엔드는 두 가지임
    • qtfb: xochitl 내부에서 창 모드로 실행되는 AppLoad 앱
    • quill: xochitl을 중지하고 vendor e-ink 엔진을 직접 구동하는 full takeover 모드

저장소 구성

  • riddle/은 Rust 앱이며 펜 입력, 잉크 표면, 손글씨 합성, oracle 프로세스 관리자, 두 표시 백엔드를 포함함
  • quill/은 C/C++로 된 takeover display host임
  • quill은 vendor libqsgepaper.so waveform engine 위에 epfb-re 스타일 QImage constructor interposition shim을 두고, quill_init, quill_buffer, quill_swap C ABI를 제공함
  • quill에는 scribble 지연시간 테스트와 지도, 이미지, GIF 렌더러 데모도 포함됨

제스처

  • 글을 쓰고 펜을 쉬게 두면 일기장이 잉크를 흡수하고 Tom이 답함
  • 마커를 뒤집으면 지우개로 동작함
  • ? 를 그리면 내장 가이드를 호출함
  • 다섯 손가락으로 동시에 탭하면 일기장을 나감
  • 전원 버튼을 누르면 페이지에 “The diary sleeps.”가 표시된 뒤 태블릿이 suspend되고, 다시 누르면 같은 위치에서 깨어남

LLM 백엔드

  • 답변은 커밋된 페이지를 inline PNG로 받아 손글씨를 읽는 비전 LLM에서 생성됨
  • 시작 시 두 백엔드 중 하나를 선택함
  • OpenAI 호환 API

    • RIDDLE_OPENAI_KEY를 설정하면 OpenAI 호환 /chat/completions 엔드포인트로 직접 요청함
    • OpenAI, OpenRouter, Groq, 로컬 서버처럼 같은 형식을 지원하는 대상에서 동작함
    • 기본 설정 예:
    • RIDDLE_OPENAI_KEY: 필수
    • RIDDLE_OPENAI_BASE: 선택, 기본값 https://api.openai.com/v1
    • RIDDLE_OPENAI_MODEL: 선택, 기본값 gpt-4o-mini, 이미지를 볼 수 있어야 함
    • RIDDLE_OPENAI_REASONING: thinking 모델용
    • RIDDLE_OPENAI_MAX_TOKENS: runaway guard
    • thinking 모델인 Gemini 3.x나 o-series에서는 첫 잉크까지의 시간을 줄이기 위해 RIDDLE_OPENAI_REASONING=low를 설정할 수 있음
    • 일부 제공자는 non-thinking 모델에서 reasoning 필드를 거부하므로 이 경우 설정하지 않아야 함
    • hidden reasoning token도 RIDDLE_OPENAI_MAX_TOKENS에 포함되므로, 너무 낮은 제한은 보이는 답변을 부족하게 만들 수 있음
    • 실행 전 riddle --oracle-test path/to/handwriting.png로 스트리밍 답변을 확인할 수 있음
    • 기기에서 첫 잉크까지 측정 시간은 약 0.9–1.1초이며, HTTPS는 pure-Rust로 riddle에 내장됨
  • pi 경로

    • pi를 이미 실행 중이면 riddle은 따뜻하게 유지되는 resident pi --mode rpc 프로세스를 사용함
    • 이 경로는 Node와 구독 인증을 한 번 로드해두고, 각 턴에서는 모델 지연시간만 지불하는 방식임
    • RIDDLE_OPENAI_KEY가 설정되지 않았을 때 자동으로 사용됨
    • 두 백엔드 모두 답변을 문장 단위로 스트리밍하므로, 모델이 끝내기 전 quill이 먼저 쓰기 시작할 수 있음
    • persona prompt는 riddle/src/oracle.rs에 있음

빌드

  • x86_64에서 크로스 컴파일함
  • 창 모드 AppLoad/qtfb 빌드는 기기에 xovi + AppLoad가 필요함
  • takeover 빌드는 데모에 사용된 방식이며 reMarkable SDK toolchain ~/rm-sdk-3.26과 사용자 기기에서 가져온 proprietary libqsgepaper.so가 필요함
  • takeover 번들은 binary, libquill.so, launch script, manifest를 포함한 self-contained dist/riddle/로 staged됨
  • AppLoad로 실행하면 transient systemd unit으로 분리 실행되고, xochitl을 중지한 뒤 일기장을 실행하며 종료 시 항상 xochitl을 복원
  • 종료 방법은 전원 버튼, 다섯 손가락 탭, SIGTERM임
  • 문제가 생기면 SSH로 systemctl start xochitl을 실행해 xochitl을 다시 시작할 수 있음

폰트와 라이선스

  • 답변 손글씨는 Dancing Script를 사용하며 SIL OFL 1.1 라이선스임
  • 저장소의 코드는 MIT 라이선스임
  • interpose 대상인 vendor libqsgepaper.so와 Qt 라이브러리는 포함되지 않으며, 사용자의 기기나 SDK에서 가져와야 함
Read Entire Article