A recovery note

The Receiver Was Still Here: Recovering Notes from a Ten-Year-Old Equil Smartpen

The graduation gift survived the service that supported it. I spent a weekend listening to what the hardware still knew.

Local EquilBridge viewer displaying recovered writing
The result is deliberately local: files, evidence, and a viewer on the same machine.

What came back

EquilBridge did not restore the old app or cloud service. It restored a local path from a model-3 receiver's stored notes to evidence controlled by the user: raw note and wire bytes, replayable decoding, traceable SVG pages, and a local viewer/library. The core uses only Python's standard library.

Dedication

More than ten years ago, I received an Equil Smartpen as a graduation gift. This project is dedicated to the friend behind that gift, and to a friendship that has lasted longer than the service built around the pen.

The receiver was still here

More than ten years ago, I received an Equil Smartpen as a graduation gift. The hardware remained. The software around it did not: the service and the old path into the notes had vanished.

That gave me a narrow weekend question: what could I recover if I treated the receiver as hardware with a protocol, rather than as an app whose service had disappeared?

The manual describes two Bluetooth pairing modes. The receiver uses its Others mode for a desktop path, while Android uses a separate phone-pairing mode. I paired through Linux and BlueZ, then made every live command take an explicit receiver address. That kept the hardware boundary visible instead of turning discovery into an automatic scan.

Listening to the wire

I began with the wire. A real receiver completed the model-3 handshake, which gave me an observed session boundary to work from. I have left the receiver identity anonymized: the useful evidence is the handshake and its fields, not a personal identifier.

The bridge keeps raw chunks first. It frames and decodes them into pages, strokes, and points, then can replay the same path from the captured bytes. Derived records stay linked to their source data. When a record is malformed, it becomes a diagnostic instead of a made-up mark.

One note came back

The receiver's onboard memory supplied the concrete test. One actual 912-byte note decoded into 9 strokes and 126 points spelling Test 123. That is enough to inspect the full chain: note bytes, decoded points, stroke boundaries, and an SVG rendered from the same evidence.

The recovered offline note rendered as strokes
912 bytes became 9 strokes and 126 points spelling Test 123.

I built a small self-hosted viewer around that provenance. It shows local notes backed by files I control, instead of reconstructing a cloud account or treating a rendering as the only record. The viewer is a way to inspect the result; it does not replace the raw bytes behind it.

Optional text tools stay local

OCR is optional. EquilBridge exposes PP-OCR profiles for balanced, fast, quality, and English handwriting work. The command takes raster PNG or JPEG input. The synced SVG remains a provenance artifact, and the web client rasterizes it locally when OCR needs pixels.

Text cleanup is also optional. The local AI profile uses Ollama with qwen3:1.7b for editor-style proposals, not silent rewrites. Raw OCR and accepted text remain separate. Ollama uses OLLAMA_KEEP_ALIVE=0, so the model is released after each request instead of becoming another invisible background process.

On demand, including Docker

The Compose workflow starts the local viewer only when I ask for it. The default image includes OCR, and a build argument can omit it. The AI profile starts Ollama and pulls its model only when selected. Bluetooth sync is a separate one-shot command with EQUIL_ADDRESS set for that run. Notes use a host bind mount, and model weights use a named volume, so both outlive a stopped container without requiring services to auto-restart.

Clean-room recovery

This repository is a clean-room implementation of observed interoperability facts: frame boundaries, field packing, command shapes, and coordinate equations. It does not include an old APK, JAR, plugin source, or decompiled source. I am grateful to the original hardware engineers for making a receiver that still has something coherent to say, and to the public documentation and prior interoperability observations that made careful testing possible.

What is still pending

The web viewer's sync control has now completed a live offline-memory sync on one paired model-3 receiver. Starting with an intentionally empty library, it imported 13 notes without duplicates, producing 13 pages and 39 local artifacts. This validates the offline-memory importer and local viewer sync path for that receiver.

It does not cover live pen events. The measurable dot, line, pen-up, page-button, disconnect, and recovery checks still need an awake receiver run. Receiver memory deletion is also unsupported because no compatible destructive command has been observed; local removal is recoverable and leaves the receiver unchanged.

Return to the project page or inspect the source.