Turn a free Kindle into a hands-off e-ink art frame (KUAL extension).
Shell
3
4 commits
updated Jul 2, 2026
Turn a free Kindle into a hands-off, battery-friendly e-ink art frame. It shows a random image full screen, then deep-sleeps and wakes itself on a timer to rotate to the next one — so the device is asleep almost all of the time and a single charge lasts weeks. E-ink holds each image at zero power between changes.
It's a small KUAL
extension: a shell script plus eips/FBInk for drawing and the Kindle's RTC for
self-wake. No network, no accounts, nothing running in the cloud.
-f flash) to avoid e-ink ghosting.eips (images still
display, just with a bit more ghosting). See "Image quality" below.Tested on a Kindle 8 (Basic, 2016 — 600×800 screen). Other models should work; you may want to change the target image size (see "Images").
git clone).artframe folder into the Kindle's
extensions/ folder, so you end up with:
<Kindle>/extensions/artframe/config.xml
<Kindle>/extensions/artframe/menu.json
<Kindle>/extensions/artframe/bin/artframe.sh
ArtFrame
at the root of the Kindle drive (same level as documents) and put .png
files in it; that folder takes priority over the bundled samples (see "Images").Open KUAL → Art Frame → pick how often the image should change:
The screen briefly goes black (the system UI is stopped), then your art appears and starts rotating on the timer.
(To add or change intervals, edit artframe/menu.json — the number after
params is the interval in minutes.)
To exit: press the power button once. The frame detects the early wake, quits, and restarts the normal Kindle UI (this looks a little like a boot — it's the UI relaunching, not a real reboot).
Drop or remove .png files in the ArtFrame folder over USB, eject, then restart
the frame from KUAL (it rescans on launch). New images are also picked up
automatically after the current shuffle completes a full pass.
The extension ships with 10 starter images (in artframe/images/) so it works
out of the box. When you want your own art, use the ArtFrame folder — it takes
priority over the bundled samples.
.png files in the ArtFrame folder. Add as many as you like — the
device only holds one image in memory at a time, so hundreds are fine.Two quick options to get 600×800 dithered grayscale PNGs:
magick in.jpg -resize 600x800^ -gravity center -extent 600x800 \
-colorspace Gray -dither FloydSteinberg -colors 16 out.png
Open artframe/bin/artframe.sh in a text editor:
artframe/menu.json (the number after params is minutes).QUIET_START=0 # 12am
QUIET_END=6 # 6am
Set QUIET_START equal to QUIET_END to disable. Quiet hours need the Kindle's
clock/timezone set correctly (Settings → Date & Time). Works in airplane mode —
the hardware clock keeps time without WiFi./mnt/us/ArtFrame; falls back to the extension's
own images/ folder. Change IMGDIR in the script to use another path.The extension draws with FBInk when available, using its -f (flash) full
refresh so each new image fully replaces the previous one with no ghosting. It
looks for fbink in a few common locations, including the extension's own bin/
folder. Without FBInk it falls back to eips, which works but leaves more
ghosting between images.
Recommended — install an image-capable FBInk build:
fbink binary into artframe/bin/fbink (inside this
extension), then eject and relaunch from KUAL.artframe.log — the renderer: line should point at your
fbink. Make sure the build has image support (some minimal builds are
compiled without it); if image drawing fails, the frame quietly falls back to
eips.FBInk is by NiLuJe — the same e-ink drawing tool used by many Kindle projects.
The frame writes artframe.log inside extensions/artframe/. Plug in over USB
and read it to see what it's doing (which image, sleep/wake timing, quiet hours,
which renderer). If images show as a checkerboard, the file couldn't be
decoded — make sure they're valid grayscale PNGs and that no hidden macOS
._name.png files were copied alongside (the extension already skips those).
echo mem).artframe/images/, 1.png–10.png) — © 2026 Bruno Marinho,
all rights reserved. Provided only as bundled samples to try the frame: you may
display them on your own device, but not redistribute, sell, or reuse them. See
artframe/images/LICENSE.txt.Turn a free Kindle into a hands-off e-ink art frame (KUAL extension).
Shell
3
4 commits
updated Jul 2, 2026
Turn a free Kindle into a hands-off, battery-friendly e-ink art frame. It shows a random image full screen, then deep-sleeps and wakes itself on a timer to rotate to the next one — so the device is asleep almost all of the time and a single charge lasts weeks. E-ink holds each image at zero power between changes.
It's a small KUAL
extension: a shell script plus eips/FBInk for drawing and the Kindle's RTC for
self-wake. No network, no accounts, nothing running in the cloud.
-f flash) to avoid e-ink ghosting.eips (images still
display, just with a bit more ghosting). See "Image quality" below.Tested on a Kindle 8 (Basic, 2016 — 600×800 screen). Other models should work; you may want to change the target image size (see "Images").
git clone).artframe folder into the Kindle's
extensions/ folder, so you end up with:
<Kindle>/extensions/artframe/config.xml
<Kindle>/extensions/artframe/menu.json
<Kindle>/extensions/artframe/bin/artframe.sh
ArtFrame
at the root of the Kindle drive (same level as documents) and put .png
files in it; that folder takes priority over the bundled samples (see "Images").Open KUAL → Art Frame → pick how often the image should change:
The screen briefly goes black (the system UI is stopped), then your art appears and starts rotating on the timer.
(To add or change intervals, edit artframe/menu.json — the number after
params is the interval in minutes.)
To exit: press the power button once. The frame detects the early wake, quits, and restarts the normal Kindle UI (this looks a little like a boot — it's the UI relaunching, not a real reboot).
Drop or remove .png files in the ArtFrame folder over USB, eject, then restart
the frame from KUAL (it rescans on launch). New images are also picked up
automatically after the current shuffle completes a full pass.
The extension ships with 10 starter images (in artframe/images/) so it works
out of the box. When you want your own art, use the ArtFrame folder — it takes
priority over the bundled samples.
.png files in the ArtFrame folder. Add as many as you like — the
device only holds one image in memory at a time, so hundreds are fine.Two quick options to get 600×800 dithered grayscale PNGs:
magick in.jpg -resize 600x800^ -gravity center -extent 600x800 \
-colorspace Gray -dither FloydSteinberg -colors 16 out.png
Open artframe/bin/artframe.sh in a text editor:
artframe/menu.json (the number after params is minutes).QUIET_START=0 # 12am
QUIET_END=6 # 6am
Set QUIET_START equal to QUIET_END to disable. Quiet hours need the Kindle's
clock/timezone set correctly (Settings → Date & Time). Works in airplane mode —
the hardware clock keeps time without WiFi./mnt/us/ArtFrame; falls back to the extension's
own images/ folder. Change IMGDIR in the script to use another path.The extension draws with FBInk when available, using its -f (flash) full
refresh so each new image fully replaces the previous one with no ghosting. It
looks for fbink in a few common locations, including the extension's own bin/
folder. Without FBInk it falls back to eips, which works but leaves more
ghosting between images.
Recommended — install an image-capable FBInk build:
fbink binary into artframe/bin/fbink (inside this
extension), then eject and relaunch from KUAL.artframe.log — the renderer: line should point at your
fbink. Make sure the build has image support (some minimal builds are
compiled without it); if image drawing fails, the frame quietly falls back to
eips.FBInk is by NiLuJe — the same e-ink drawing tool used by many Kindle projects.
The frame writes artframe.log inside extensions/artframe/. Plug in over USB
and read it to see what it's doing (which image, sleep/wake timing, quiet hours,
which renderer). If images show as a checkerboard, the file couldn't be
decoded — make sure they're valid grayscale PNGs and that no hidden macOS
._name.png files were copied alongside (the extension already skips those).
echo mem).artframe/images/, 1.png–10.png) — © 2026 Bruno Marinho,
all rights reserved. Provided only as bundled samples to try the frame: you may
display them on your own device, but not redistribute, sell, or reuse them. See
artframe/images/LICENSE.txt.