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.
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
- 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)
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.
- A udev hook runs
stuff.sh - This launches
litclock-start.sh - 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
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 |
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 &ps | grep litclockmount -o remount,rw /mnt/sdThe SD card mounts read-only by default. You must remount it before writing or editing any files on it.
# SCP from your PC
scp litclock.sh root@KOBO_IP:/mnt/sd/litclock.sh
scp quotes.csv root@KOBO_IP:/mnt/sd/quotes.csvChanges take effect on the next minute cycle — no reboot needed.
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
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
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.
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.
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/rotateudev (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 &
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.
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.shudev boot hook used for autostart - Install by copying
KoboRoot.tgzto/mnt/onboard/.kobo/and rebooting - Does not touch
rcS,inittab, or any system files! I learned that the hard way.
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.
- 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/sdbefore editing files on it - hindenburg is the watchdog binary that monitors nickel— do not delete it or the device will reboot after ~1 minute
If you need more e-reader hacks, tools, and community support:
- 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

