Skip to content

Repository files navigation

Literary Clock

I took my old Kobo eReader and repurposed it into a literary clock that displays real book quotes matching the current time. Each minute, the screen updates with a random quote containing that exact time, rendered cleanly on the eInk display.

The setup is not permanent, removing the startup commands, followed with a reboot will return the Kobo to its normal state.

Overview

This project turns a Kobo device into a minimalist clock powered by literature.

  • Uses a dataset of 3000+ time-tagged quotes
  • Covers all 1440 minutes in a day
  • Displays text using FBInk directly to the framebuffer
  • Updates automatically every minute
  • Optional tap input cycles between multiple quotes for the same time
  • Displays the weather of the specified city
Ignore the dead pixels in the center. The screen was damaged when the unit was dropped.

Device

  • Model: Kobo Touch N905C (Trilogy @ Mark 4)
  • CPU: i.MX507 ARMv7
  • Screen: 600x800 eInk, 167 dpi
  • Kernel: Linux 2.6.35.3 (BusyBox v1.35.99.139-g15f7d618e)
  • Extra SD Card 32 GB (Capacity is overkill)

How It Works

On boot, the device runs a udev hook (provided by NiLuJe's usbnet package). This launches litclock-start.sh, which waits for the SD card to mount, kills the Kobo UI (nickel), and starts the clock script. The clock script reads quotes.csv every minute, finds a matching literary quote for the current time, and renders it to the eInk screen using FBInk.

  1. A udev hook runs stuff.sh
  2. This launches litclock-start.sh
  3. The script:
    • Waits for the SD card to mount
    • Stops the Kobo UI (nickel)
    • Starts the clock loop

The main script:

  • Reads quotes.csv
  • Matches the current time (HH:MM)
  • Renders a quote using FBInk
    • Refreshes every minute
  • Retrieves/renders the weather of the specified city from wttr.in
    • Refreshes every hour

File Layout

Easier to use a SD card due to the limited onboard memory

File Location Description
Main clock script /mnt/sd/litclock.sh The main clock loop
Touch watcher script /mnt/sd/touch_watcher.sh Process touch screen events
Quotes database /mnt/sd/quotes.csv Time-tagged literary quotes
Boot entry point /usr/local/stuff/bin/stuff.sh Runs at boot via udev
Boot launcher /usr/local/stuff/bin/litclock-start.sh Waits for SD, kills nickel, starts clock
FBInk binary /mnt/sd/koreader/fbink Writes text to the eInk framebuffer
Fonts /mnt/sd/koreader/fonts/noto/ NotoSerif Regular/Bold/Italic/BoldItalic

Key Commands

Manually start the clock (from telnet/SSH)

killall nickel 2>/dev/null
killall sickel 2>/dev/null
killall sickel-launcher 2>/dev/null
killall touch_watcher.sh 2>/dev/null
killall litclock.sh 2>/dev/null

mount -o remount,rw /mnt/sd

setsid nohup /mnt/sd/touch_watcher.sh 2> /tmp/touch_watcher.log &
setsid nohup /mnt/sd/litclock.sh 2> /tmp/litclock.log &

Check if the clock is running

ps | grep litclock

Remount SD card as writable (if needed)

mount -o remount,rw /mnt/sd

The SD card mounts read-only by default. You must remount it before writing or editing any files on it.

Update the clock script or quotes

# SCP from your PC
scp litclock.sh root@KOBO_IP:/mnt/sd/litclock.sh
scp quotes.csv root@KOBO_IP:/mnt/sd/quotes.csv

Changes take effect on the next minute cycle — no reboot needed.


quotes.csv Format

The CSV uses | as a separator with five columns:

HH:MM|time phrase|full quote text|Book Title|Author Name

Example:

13:00|one o'clock|Czarina Catherine reported entering Galatz at one o'clock today.|Dracula|Bram Stoker

Extra Fonts

You can try more fonts by adding them to the /mnt/sd/fonts and altering the font constants in litclock.sh

  • $REGULAR
  • $BOLD
  • $ITALIC
  • $BOLDITALIC

Weather

Above the quote, the weather for the specified city is displayed (if the wttr.in API is reachable) and logged to /tmp/weather_cache.txt. Change $CITY in litclock.sh to view the weather for a different city.


Touch Watcher

If other quotes are available at the current time, the touch_watcher.sh script listens for touch input events. When the screen is tapped, it triggers a refresh signal (/tmp/litclock_refresh), prompting the clock to update and randomly select a different quote from quotes.csv. The script also includes a short debounce delay to prevent multiple rapid triggers from a single touch.


Orientation

By sending the 2 to the system file /sys/class/graphics/fb0/rotate we can control the orientation of the framebuffer. This command is sent on startup in litclock-start.sh.

If your Kobo can support a newer version of fbink you can adjust the rotation fbink -r rather than adjusting the framebuffer below.

# Set landscape rotation
echo 2 > /sys/class/graphics/fb0/rotate

Boot Chain

udev (loop0 event)
  └── /usr/local/stuff/bin/stuff.sh
        └── /usr/local/stuff/bin/litclock-start.sh  (backgrounded with setsid)
              ├── waits for /mnt/sd to mount
              ├── sleeps 15s for nickel to start
              ├── killall nickel / sickel / sickel-launcher
              ├── mount -o remount,rw /mnt/sd
              └── setsid nohup /mnt/sd/litclock.sh > /tmp/litclock.log 2>&1 &

Burn-in / Ghosting Prevention

The script performs a full flashing screen refresh (fbink -f -k) every 5 minutes to clear eInk ghosting. This is normal — the screen will flash black briefly then return to the quote.


Required Packages

NiLuJe's USB Net / Telnet / SSH package

https://www.mobileread.com/forums/showthread.php?t=254214

  • Necessary for telnet and SSH access to the device
  • Contains FBInk — the binary responsible for writing custom quotes to the eInk screen
  • Provides the stuff.sh udev boot hook used for autostart
  • Install by copying KoboRoot.tgz to /mnt/onboard/.kobo/ and rebooting
  • Does not touch rcS, inittab, or any system files! I learned that the hard way.

Kobo Firmware Archive

https://pgaskin.net/KoboStuff/kobofirmware.html

Historical Kobo firmware versions for all devices. Useful if you need to restore or identify the correct firmware version for your device.


Warnings & Gotchas

  • Do NOT press Home + Power together — this triggers the recovery partition (sda2) which reformats sda1 and wipes all your changes
  • Do NOT put untested KoboRoot.tgz files in .kobo/ — a bad rcS will cause a boot loop that requires manually mounting sda1 on a PC to fix
  • The SD card mounts read-only — always run mount -o remount,rw /mnt/sd before editing files on it
  • hindenburg is the watchdog binary that monitors nickel— do not delete it or the device will reboot after ~1 minute

More E-reader Jailbreaks

If you need more e-reader hacks, tools, and community support:

https://www.mobileread.com/


Credits

  • FBInk by NiLuJe — eInk framebuffer writing library
  • Literary clock quotes based on Jaap Meijers's dataset
  • NiLuJe's usbnet/KoboStuff package — telnet, SSH, and boot hook infrastructure
  • KoReader — provided the pre-compiled FBInk binary and NotoSerif fonts

About

Turn a Kobo into a literary clock that tells time using quotes from books. Got the idea to recreate this after seeing an "Author Clock" in the MoMA for an exorbitant price.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Packages

Contributors

Languages