brunomarinho/labs-kindle-artframe

Turn a free Kindle into a hands-off e-ink art frame (KUAL extension).

Shell

3

4 commits

updated Jul 2, 2026

See the code

README

Kindle Art Frame

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.

Features

  • Automatic rotation on a timer (1 hour / 30 min / 15 min / 5 min).
  • Randomized, non-repeating order — every image shows once before any repeats.
  • Very low power — deep-sleeps between changes; weeks per charge.
  • Clean full-refresh draws via FBInk (-f flash) to avoid e-ink ghosting.
  • Quiet hours — overnight it holds one image instead of flashing (default 12am–6am, configurable).
  • Simple exit — press the power button to return to the normal Kindle.
  • Starter images included — 10 samples so it works out of the box; add your own anytime.

Requirements

  • A free Kindle with KUAL installed (this is what launches the extension).
  • Root shell access, which KUAL provides (the extension stops/starts the system UI framework so it can control the screen and sleep).
  • FBInk with image support is recommended for the crispest, ghost-free draws. If it isn't found, the extension falls back to the built-in 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").

Install

  1. Download this repo (green Code button → Download ZIP, or git clone).
  2. Connect your Kindle over USB. Copy the 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
    
  3. That's enough to start — the extension ships with 10 sample images, so it works right away. To use your own instead, create a folder named 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").
  4. Eject the Kindle.

Use

  • Open KUAL → Art Frame → pick how often the image should change:

    • Start (1 hour)
    • Start (30 minutes)
    • Start (15 minutes)
    • Start (5 minutes, test) — handy for quickly checking rotation
  • 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).

Updating images

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.

Images

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.

  • Put .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.
  • For best results, images should be grayscale, sized to your screen (600×800 for the Kindle 8/Basic) and dithered (Floyd–Steinberg or Atkinson) to ~16 gray levels. That's what e-ink displays best.
  • Any PNG will display; correctly-sized grayscale images just look sharpest.

Preparing images

Two quick options to get 600×800 dithered grayscale PNGs:

  • ImageMagick (one image):
    magick in.jpg -resize 600x800^ -gravity center -extent 600x800 \
      -colorspace Gray -dither FloydSteinberg -colors 16 out.png
    
  • Any editor: crop to your screen's aspect ratio, convert to grayscale, and export as PNG. Dithering is optional but looks better on e-ink.

Configuration

Open artframe/bin/artframe.sh in a text editor:

  • Rotation interval — chosen from the KUAL menu, or edit the entries in artframe/menu.json (the number after params is minutes).
  • Quiet hours — near the top of the script:
    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.
  • Image folder — defaults to /mnt/us/ArtFrame; falls back to the extension's own images/ folder. Change IMGDIR in the script to use another path.

Image quality (FBInk)

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:

  1. Download a Kindle build from the FBInk releases page: https://github.com/NiLuJe/FBInk/releases
  2. Copy the Kindle fbink binary into artframe/bin/fbink (inside this extension), then eject and relaunch from KUAL.
  3. On first run, check 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.

Logs / troubleshooting

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).

How it works

  1. Stops the Kindle UI framework so nothing fights it for the screen.
  2. Draws a random image full screen with a flashing full refresh.
  3. Arms an RTC wake alarm for the interval, then deep-sleeps (echo mem).
  4. Wakes itself, rotates to the next image, and repeats.
  5. A power-button press wakes it early → it exits and restarts the UI.

License

  • Code — MIT.
  • Sample images (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.

brunomarinho/labs-kindle-artframe

Turn a free Kindle into a hands-off e-ink art frame (KUAL extension).

Shell

3

4 commits

updated Jul 2, 2026

See the code

README

Kindle Art Frame

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.

Features

  • Automatic rotation on a timer (1 hour / 30 min / 15 min / 5 min).
  • Randomized, non-repeating order — every image shows once before any repeats.
  • Very low power — deep-sleeps between changes; weeks per charge.
  • Clean full-refresh draws via FBInk (-f flash) to avoid e-ink ghosting.
  • Quiet hours — overnight it holds one image instead of flashing (default 12am–6am, configurable).
  • Simple exit — press the power button to return to the normal Kindle.
  • Starter images included — 10 samples so it works out of the box; add your own anytime.

Requirements

  • A free Kindle with KUAL installed (this is what launches the extension).
  • Root shell access, which KUAL provides (the extension stops/starts the system UI framework so it can control the screen and sleep).
  • FBInk with image support is recommended for the crispest, ghost-free draws. If it isn't found, the extension falls back to the built-in 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").

Install

  1. Download this repo (green Code button → Download ZIP, or git clone).
  2. Connect your Kindle over USB. Copy the 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
    
  3. That's enough to start — the extension ships with 10 sample images, so it works right away. To use your own instead, create a folder named 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").
  4. Eject the Kindle.

Use

  • Open KUAL → Art Frame → pick how often the image should change:

    • Start (1 hour)
    • Start (30 minutes)
    • Start (15 minutes)
    • Start (5 minutes, test) — handy for quickly checking rotation
  • 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).

Updating images

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.

Images

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.

  • Put .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.
  • For best results, images should be grayscale, sized to your screen (600×800 for the Kindle 8/Basic) and dithered (Floyd–Steinberg or Atkinson) to ~16 gray levels. That's what e-ink displays best.
  • Any PNG will display; correctly-sized grayscale images just look sharpest.

Preparing images

Two quick options to get 600×800 dithered grayscale PNGs:

  • ImageMagick (one image):
    magick in.jpg -resize 600x800^ -gravity center -extent 600x800 \
      -colorspace Gray -dither FloydSteinberg -colors 16 out.png
    
  • Any editor: crop to your screen's aspect ratio, convert to grayscale, and export as PNG. Dithering is optional but looks better on e-ink.

Configuration

Open artframe/bin/artframe.sh in a text editor:

  • Rotation interval — chosen from the KUAL menu, or edit the entries in artframe/menu.json (the number after params is minutes).
  • Quiet hours — near the top of the script:
    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.
  • Image folder — defaults to /mnt/us/ArtFrame; falls back to the extension's own images/ folder. Change IMGDIR in the script to use another path.

Image quality (FBInk)

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:

  1. Download a Kindle build from the FBInk releases page: https://github.com/NiLuJe/FBInk/releases
  2. Copy the Kindle fbink binary into artframe/bin/fbink (inside this extension), then eject and relaunch from KUAL.
  3. On first run, check 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.

Logs / troubleshooting

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).

How it works

  1. Stops the Kindle UI framework so nothing fights it for the screen.
  2. Draws a random image full screen with a flashing full refresh.
  3. Arms an RTC wake alarm for the interval, then deep-sleeps (echo mem).
  4. Wakes itself, rotates to the next image, and repeats.
  5. A power-button press wakes it early → it exits and restarts the UI.

License

  • Code — MIT.
  • Sample images (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.