A xovi mod for the reMarkable Paper Pro Move: pin any document page — or keep the live screen — as your sleep screen, with an optional clock/date/battery bar that stays fresh even in deep sleep.
Built and tested on the Paper Pro Move, OS 3.27.x.
| With the clock companion | Main package alone |
|---|---|
(schematic mockups, not device screenshots — the real thing shows your actual page at full e-ink quality)
Open any document, open the page menu (Pages foldout) and tap Pin as sleep screen. From then on, pressing the power button shows that page as the sleep image — captured clean, without toolbars or menus, in the exact zoom/position you pinned it. Re-pin any time to update; unpin from the same menu to go back to stock sleep screens. Pinned images survive reboots.
Turn on the native Settings → Display → Visible content toggle and the mod keeps whatever was on screen when the device fell asleep — captured in ~70 ms at the moment sleep starts, in the correct orientation. If both are active: the power button shows your pinned page, an idle timeout keeps the live screen.
With a passcode set, the PIN pad is never captured — a locked device shows the last unlocked screen instead, or falls back to stock.
No pin and toggle off? You keep the stock sleep screens; the bar still draws on top.
A full-width bar at the top of every sleep screen. What's in it depends on which packages you installed:
- Main package only: a static "Sleeping" label. Nothing repaints it and no wake is ever scheduled, so a sleeping device stays asleep. (While you are awake with a pinned page open, the mod still captures that page in the background — that is how the sleep image stays current — so "no clock wakes" is not the same as "no work at all".)
- With
pinned-sleep-clock: weekday + date on the left, a bold clock in the center, battery % with a charging bolt on the right. In deep sleep the clock updates every 5 minutes by default, exactly on :00/:05/:10… wall-clock marks (1 / 5 / 15 minutes, or off, in Settings → Display → Sleep clock). This costs battery — read the companion section before installing.
If you filled in the OS "If found…" contact info, a thin bar at the bottom shows your name and contact on every sleep screen too.
Missing sleep images (e.g. first sleep after a reboot) fall back to stock screens silently. A corrupt image shows a friendly "couldn't load the sleep image" page with a link to the issue tracker — the mod never leaves you with a black screen.
You need xovi and vellum set up. Then:
vellum add pinned-page-sleep-screen # the mod (static bar)
vellum add pinned-sleep-clock # optional: live clock/battery bar
The clock is armed by the mod itself at the next xochitl start after the
companion is installed (default 5 minutes) — or immediately by touching the
toggle in Settings → Display → Sleep clock (a toggle, then
1 / 5 / 15 minutes), which also owns the cadence — or off — from then on.
The installer deliberately arms nothing: only the running mod may switch
the wake timer on, so a half-removed setup can never wake the device on
its own. Remove the companion with vellum del pinned-sleep-clock and the bar goes static again; vellum del pinned-page-sleep-screen removes the mod, but not your saved sleep images
— those stay in /home/root/.pinnedSleepScreen/ until you delete them.
The bar follows the device locale and timezone, and the stock UI can change
neither (factory setting is en_US — 12-hour clock, MM/DD dates — and
the device runs UTC; the stock interface simply never shows you a clock).
Set both over SSH: timedatectl set-timezone Europe/London (any
Region/City from timedatectl list-timezones) works immediately but
silently reverts to UTC on the next reboot — /etc on this OS is a
RAM-backed overlay. Making it stick means writing the real rootfs through
the mount-utils window (locale: echo 'LANG=en_GB.UTF-8' > /etc/locale.conf, needs a reboot to take effect):
mount-rw
timedatectl set-timezone Europe/London
mount-restore
Warning: mount-rw unmounts xovi's launcher drop-in as a side effect,
and mount-restore does not put it back — until you reboot (and re-run
your usual xovi start, e.g. triple-tap), a plain xochitl restart would come
up stock, with every mod gone. Reboot right after closing the window. An
OS update resets all of this, like everything else.
Don't hand-shift the clock instead (date -s to fake local time):
the OS runs chrony against Google NTP with rtcsync, so the first
successful sync after any reboot steps the clock straight back to true
UTC and keeps rewriting the hardware clock with it. The system clock
belongs to NTP; the timezone is yours.
The companion is a sister package, not a standalone mod — it hard-depends
on pinned-page-sleep-screen (vellum won't install it alone) and does
nothing but power the main mod's live bar.
Battery caution. A sleeping tablet that repaints a clock must wake the SoC — there is no way around that on this hardware. The cadence is yours: Settings → Display → Sleep clock is a toggle (same pattern as Battery → Standby); switched on it offers 1 / 5 / 15 minutes. Switched off, the bar keeps the date and battery (refreshed whenever the device wakes anyway) with no clock wakes at all. Each update wakes the device for roughly half a minute:
| Sleep clock setting | Standing drain (measured, OS 3.27.3) |
|---|---|
| Off | ~0.16 %/h |
| 5 minutes (default) | ~0.9 %/h (~22 %/day) |
| 15 minutes | ~0.42 %/h |
It does not keep the device out of hibernation — an earlier version of
this README said it did, and our own overnight capture disproves it. Running at
the most aggressive 1-minute cadence (OS 3.27.3, night of 2026-08-11), the
device hibernated anyway at 08:19:45 with the clock still running: xochitl
keeps its own cumulative already-slept counter (Going straight to hibernate, already slept: 14419282ms) and that counter advances through
our RTC wakes. Hibernation powers the SoC down, so the timer stops firing
entirely and the bar stays frozen on its last frame until you wake the
device by hand. Where that counter starts and when it resets is not yet known, so
there is no honest estimate of how long a given idle stretch takes to get
there. The figures above are for a device that is still cycling; if you
routinely leave the device unplugged for days, widen the cadence or skip
the companion.
Everything it changes on your system (all applied by lifecycle
scripts, all reverted by vellum del pinned-sleep-clock):
/etc/systemd/system/pinsleep-clock.{service,timer}— theWakeSystemtimer that thaws the device so the bar's (frozen) QML timer can repaint; its cadence follows the Sleep clock setting (written as a timer drop-in, re-asserted on every xochitl start). The service is/bin/true: the wake itself is the payload. Written to the persistent rootfs/etc(the/etcoverlay upper is tmpfs and forgets everything on reboot); the enable symlink is volatile, so the main mod re-asserts enablement on every xochitl start./usr/lib/systemd/system-sleep/sleep-zz-pinsleep.sh— new hook: shrinks the EPD PMIC rail keep-alive during battery sleep so re-suspends never abort (details below)./usr/lib/systemd/system-sleep/sleep-wifi.sh— replaces the stock hook, adding a gate: no WiFi/BT driver reload on clock wakes (stock reloads the whole driver on every resume). Any user wake — button, pen, charger — restores full stock behavior, as does USB power. The genuine stock copy is kept at/home/root/.pinnedSleepScreen/sleep-wifi.sh.stockand restored on uninstall; after an OS update the vellumpost-os-upgradehook re-captures the new stock before re-gating it./home/root/.pinnedSleepScreen/— state directory (stock WiFi-hook backup, saved sleep images, pin metadata).vellum del pinned-sleep-clockrestores the stock hook from here andvellum purgeadditionally deletes that backup copy — but nothing removes the rest.pinned.json,power.json,pinned.png, the chapter images andpersist/stay on disk, including your pinned page captures, until you delete them yourself — once both packages are removed (the companion's uninstall reads its stock-hook backup out of this directory, so deleting it early strips the hook restore):rm -rf /home/root/.pinnedSleepScreen.
The main package stays in mod space only: files under
/home/root/xovi/ (the qmd, SVG assets, and the bundled fastshot xovi
extension providing the ~70 ms synchronous framebuffer captures).
Stock OS makes each wake expensive; the companion's hooks fix that:
minimumAwakeTimeis hardcoded at 34 s. After any RTC wake, xochitl's batterymanager stays up 34 s before re-suspending ("Re-entering DeepSleep in 34000ms"). We found no env var, no conf key, and no QML property that changes it — it is a compiled-in constant (novel finding, previously undocumented in the community).- The EPD PMIC keep-alive (
vpdd_length) collides with that 34 s. The g2194 PMIC holds the panel rails 30 s after every display update (interactive-latency optimization). 30 s hold vs 34 s re-suspend left no margin: ~30 % of re-suspends aborted (g2194-regulator: Can't suspend, vpdd timer running), costing ~60 s extra awake each. Our hook drops the hold to 50 ms during battery sleep — the smallest nonzero entry in the g2194 driver's hold table (0 is avoided: it reverses the panel power-down order and logs a kernel warning). Per the GPL kernel source, the hold starts only after the display pipeline releases the regulator, so no hold length can clip a running waveform. - WiFi/BT reload gate — see the footprint list above. Clock wakes are
identified by the SPLD
wakeup_reason(0x00 = RTC), on battery only.
Measured on device (17 h, OS 3.27.3):
| Quantity | Value |
|---|---|
| Deep-sleep floor | 0.157 %/h |
| One 34 s clock wake | 0.066 % (~half the stock wake cost) |
| 5-min cadence total | ~0.9 %/h (~22 %/day standing) |
| 15-min cadence | ~0.42 %/h |
Full architecture, timeline and the discarded/parked levers: docs/power-design.md. The idle-gated hibernation design (docs/plan-d-design.md) is on hold: it was written against the "the clock prevents hibernation" premise the overnight capture disproved, and carries a dated erratum saying so.
scripts/package.sh— builds both.apks on the device (its apk 3.0.3 providesmkpkg; packages are signed with vellum's local key), pulls them todist/, installs, restarts xochitl with a health check.packaging/*/VELBUILD— the upstream recipes, kept in sync with the script.extensions/fastshot/— C source for the capture extension; cross-built from macOS withzig cc -target aarch64-linux-gnu.2.36(see Makefile).scripts/deploy.sh— the raw dev loop (scp + restart + journal check), no packaging.
- Cannot be installed alongside
mini-light-sleep. Both current 3.27 variants of that mod remove the same stockArkControls.ActionBarnode this mod removes, so the two cannot compose — whichever loads second fails to apply its diff. This mod supersedes it; remove mini-light-sleep first. The main package declares the conflict (!mini-light-sleep), so vellum refuses to install the two together. - qmd hashes target OS 3.27 QML; the packages pin
remarkable-os>=3.27 <3.28. fastshotderives geometry (width/height/stride) from framebuffer-spy at runtime — nothing device-specific is hardcoded except cropping the Move's 6 dead framebuffer columns (960-px buffer, 954-px panel). It does require a 32 bpp BGRX framebuffer (byte-identical to BMP pixels, which is what makes the ~70 ms zero-conversion capture possible): both Paper Pros qualify; the reMarkable 2's RGB565 framebuffer does not and would need a conversion pass.- The hooks' sysfs paths (g2194 EPD PMIC, slg46824 wakeup reason) are
Paper Pro Move specific (
rmppmove). Ports to other Paper Pro devices likely need only path changes.
GPL-3.0-or-later. The power hooks build on findings from reMarkable's GPL kernel sources.