CalendulaOS GitHub

CalendulaOS

Lightweight firmware for the Xteink X3 and X4 e-readers.

board: X3 X4 turn pages Enter confirm Esc back Q sleep

The emulator above runs the app and rendering code of CalendulaOS, compiled to WebAssembly, in a simulated e-ink panel.

Flash CalendulaOS

Install it onto your reader over USB, right from your browser.

1Choose your device

Not sure which one you have? If CalendulaOS is already installed, the reader can tell us itself.

2Flash over USB

Versionv0.6.0
Imagefirmware-x3.bin
Size~2.8 MB
Choose your device above to continue.
Web flashing needs a secure (https) connection. Download .bin

Uses WebSerial, in Chrome or Edge on the desktop. Wake the reader to its home screen and connect it; after flashing, replug USB to boot. If you checked your reader above, you will be asked to pick it again here — that is normal.

The reader restarts on its own when flashing finishes. If the screen then stays blank or looks scrambled, the image was probably for the other device. Nothing is damaged. Take out the SD card, open BOARDID.TXT on it, and flash the file it names.

Prefer the command line? Download the .bin and flash it with esptool over USB. See the docs.

Or install from an SD card

For readers with USB flashing locked at the factory. It writes only the app slot and leaves the bootloader intact.

Download SD image ↓

Already running Calendula? Use FWUPDX3.BIN on X3 or FWUPDATE.BIN on X4 and reboot normally.

On v0.5.0 or older, that will not work — the reader will ignore the file and carry on as before. Nothing is broken; those builds check for a name this release no longer uses.

Fixing it takes two steps, once. Flash from a computer using the button above, or with the SD image: that replaces one of the reader's two copies of the firmware. Then hold Back + Up while it restarts, and run one more update from the card to replace the second copy. After that, card updates work normally again. The full steps are here.

v0.6.0 release notes ↗

panelUC8253 · 792 × 528 · 1-bit
page turn~424 ms measured, 379 ms panel busy
firmwareRust · esp-hal · no_std on device
this pagesame crates, wasm32 · no framework