Synthèse, home

Work

achi

The e-reader companion: low-level Rust firmware for the embedded ESP32-C3, an Android app built on Crux, and a small Snoopy-inspired mascot who says kind things, regularly and with restraint: the perfect friend, in the Vipassana sense. A small LFM2.5, fine-tuned in house, provides the words. On the bench, public soon.

RustESP32CruxAI

Role
Concept, firmware, app, model training.
Period
2026
Stack
Rust (esp-hal, Embassy), Crux, Jetpack Compose, llama.cpp, LFM2.5 (MLX)
A sheet of eleven 1-bit portraits of Achi, a beagle in profile with a long black ear and a spot on his side, rendered by the desktop simulator: calm, stretching, under an umbrella, focused, reading behind a book, dreaming under a thought bubble, shivering, eyes closed under sparkles, glad, a little bored, celebrating.

The brief

Achi is a digital companion: a small drawn beagle who shows a kind sentence a few times a day. He appears on the phone and on an XTEInk X4, a pocket e-reader built around an ESP32-C3 chip. I started the project on 21 June 2026, with one principle: restraint.

The drawing, in ligne claire, is an original homage to Snoopy, and the name comes from Hachikō, the dog who waited for his master. The project draws on S. N. Goenka’s Vipassana and on the idea of kalyāṇa-mitta, “the friend for the good”.

In use

Achi’s expression follows the day. The phone sends him the time, the weather from Open-Meteo and the phase of the moon. From a 60% chance of rain, Achi holds an umbrella; at 3 °C, he shivers. In the morning he stretches, on full-moon evenings he dreams, and when the phone comes back in range, he smiles.

Three times a day, at 8:00, 13:00 and 19:00, the phone prepares a thought. Achi then closes his eyes under a small sparkle, until the person presses a button. The thought starts from a fact of the day and fits in one or two sentences.

The model runs on the phone, and all data stays there. The e-reader receives the context and the thought over Bluetooth.

Architecture

The project comprises three Rust workspaces and an Android app. Shared crates define the message format, the mood engine, the face animation and the text generation. The same mood engine runs in the firmware, so the phone and the e-reader show the same face.

The app follows the Crux architecture: a Rust core decides when to refresh the screen, generate a thought or send it, and the Jetpack Compose layer carries out those actions, including generation through llama.cpp.

The firmware is written in Rust and runs directly on the chip, with the Embassy async runtime. With the phone in range, the e-reader is in light sleep; out of range, in deep sleep, and the e-ink screen keeps the last image at zero power.

Decisions

One mood engine. The face and the sentence use the same thresholds, computed by a pure function: they always describe the same day.

A model trained for Achi. I fine-tuned LFM2.5-350M on a Mac, first through distillation: a 1.2 billion parameter model answered 192 facts, filtered by a style judge at a 0.70 threshold. A preference optimisation pass, on 154 pairs, then won four comparisons out of six, with zero regressions.

The smallest sufficient model. Quantised, the model weighs about 217 MB and loads on the phone for each thought. I keep the smallest model that passes a blind evaluation.

Restraint. One thought per scheduled time, in simple words.

A verified restore before any flash. I backed up the X4’s 16 MB of flash and verified the restore before writing the firmware. The fuses and secure boot, two irreversible settings, stay in their factory state.

Today

The firmware runs on the X4, the app connects to it automatically, and the model is at its third version. Achi will be public soon.

A project in mind? Let's talk