The firmware the AI tried to talk me out of
A credit-card-sized e-reader got its own firmware branch on top of open-source CrossPoint, and a cloud bridge connects it to Notion and Claude. In twelve days the firmware build ran forty-one times in the cloud. The first suggestion was not to fork at all.
- Written by
- Kristóf Karner — independent developer, Budapest
- Updated
- 26 October 2026
“everything I want to read distraction-free, I should read on the Xteink” Kristóf Karner, 8 October 2026 — translated from Hungarian
The Xteink X3 is a 3.7-inch e-reader, the size of a credit card. Instead of its factory software it runs CrossPoint: MIT-licensed, open-source firmware (the device's own software) that a community develops for Xteink readers.
On the morning of 8 October 2026 I asked Claude Code to build on it. Its first answer was cautious: it suggested “at most one feature” of firmware, and preferably as a proposal sent to the original project rather than as a fork of my own. That same day we compiled five versions anyway, and three of them succeeded. By 19 October there were 48 commits on my branch, the firmware build had run forty-one times, and every morning a cloud pipeline put together what I should read.
The caution had a reason. CrossPoint is narrow on purpose: according to
LWN's August 2026
article, RSS, PDF and interactive apps are out of its scope, mainly
because of the battery. What I wanted — my calendar, my notes, a
connection to the cloud — is exactly what the project leaves out. So it
became a fork of my own, started from CrossPoint's 1.6.5 release, named
kk.
What it does now
It builds my reading from my calendar. I plan what I read in my Notion calendar. Every item not yet ticked off becomes a chapter in an e-book, in the calendar's order, and the book rebuilds itself when the calendar changes. When I've read every chapter of an item, and spent at least 30% of the planned time reading it, the item ticks itself off and the measured minutes go back into the calendar. The 30% is there against skimming.
It's fresh in the morning. The device wakes up by itself, downloads the day's issue — a short book with the things to do — and goes back to sleep. The sleep screen shows the oldest open item in my calendar, without a date, in large, sharp type.
The next day it gives back what I read. If I stopped reading a book on an earlier day, a summary by Claude of what I actually read last time is waiting when I open it. It works only from pages that were on the screen for at least eight seconds. The words I looked up come back in bold, and if I look a word up again, it comes back again. My rule was “it should only let me out of the recap once I've paged through it”, so the only way into the book is through the recap: the Back button leaves the whole book, and the recap comes up again next time.
It explains the word. If a word isn't in the dictionary, one button has Claude explain it — in a Hungarian book, knowing my notes — and another opens Wikipedia. I don't type the question, because typing on e-ink is a torment: I select a paragraph and pick one of three ready-made questions.
I practise English on it for at most ten minutes a day. New everyday words, with an American pronunciation written in Hungarian letters — for me, water is UÁ-dör. The topics come from my own film and music notes. The level follows my answers, not the calendar.
I can read my Hungarian novels in Cyrillic, from a quarter of the words to all of them. I'm not learning Russian: I want to know the letters, and I like how they look on the page.
Its statistics don't flatter. A page counts once per sitting, time spent paging back goes to the page it belongs to, and a book started before the measuring began says that only part of it was measured. That came from it showing three hours for a book I had started earlier, and me saying: “the Murakami didn't take 3 hours to read”.
And it updates itself. New firmware installs by itself when the device goes to sleep, with a trial period: if it crashes three times or syncs badly five times during the trial, it falls back to the old one. This came from one question: “couldn't it be solved so that I don't have to do anything manually for you to be able to push update packages like these?”
A dumb device, a smart bridge
The device stayed calm: no notifications, no feed, no browser on it. All the cleverness lives in a small cloud program, a Cloudflare Worker, on the free plan, without a bank card. This bridge is the one that talks to Notion, Claude and Letterboxd, so the services' keys aren't on the device. Books, firmware and the reading log travel through a mailbox, signed; whatever is personal is encrypted too. One of Claude's first suggestions was that the content should arrive in sealed batches, like a newspaper.
- e-reader own firmware: kk — apart from Wikipedia, talks only to the bridge, through a mailbox
- cloud bridge Cloudflare Worker — talks to the others on the device's behalf
- Notion calendar and notes: the books come from here, and the ticks go back here
- Claude explains, sums up
- Letterboxd the films I logged: a logged film gets ticked off on my list too
- cloud pipeline books, morning issue: built on GitHub's servers
apart from Wikipedia, the device only talks to the bridge
The books are built by a cloud pipeline on GitHub's servers, and the firmware is compiled there too, because the local toolchain took up nearly nine gigabytes on an almost full disk.
What didn't work the first time
The alarm that didn't wake. We built in the morning wake-up on 9 October, and on battery it never worked once. When the X3 goes to sleep, it switches off its own battery with a control pin (a GPIO pin). The first fix tried to hold that pin on, but the community hardware layer underneath CrossPoint took it for the SD card's power line and pulled it low again before sleep. What gave it away was that the morning sync lines were missing from the bridge's log. The fix came in kk.32, and on the morning of 19 October it was proven to work. A missing log line is data too.
Installed, but not running. The same day it turned out that the X3, waking from deep sleep, always starts the version that ran last. According to the log kk.38 had been installed, while kk.35 kept running. Since kk.39, a fresh version also starts, with a quiet restart. On an embedded device “installed” doesn't mean running: the device's own boot log decides.
The tick that never worked. From launch, the Letterboxd
sync never ticked off a single thing, and it caused no error at all. The
real feed writes its ID tag with an extra attribute
(<guid isPermaLink="false">), but the parser only knew
the bare form. The test ran on a simplified sample, so it was green.
Since then, test data follows the shape of the real data.
The card that didn't fit. In the first versions of the English word cards, the type was so large it didn't fit on the screen. Since then every new screen is first rendered on the Mac, with the device's real fonts, in both orientations, and only then goes onto the device.
The course that moved on by itself. The first version of the Cyrillic course relied on my own word, a “Got it” button, and it also moved on if I'd looked at a lesson on two separate days. It got to the third lesson while I was only looking — “I haven't even really worked on it, I just looked at it”. Since then only a two-choice test moves progress forward, with no self-assessment.
Where I decided
I built it with AI. I decided what it should do, and how I check it — and several times that wasn't what the AI suggested. For the main menu Claude recommended a dark, cinematic design; I chose the world of the Zune and Frutiger Metro. For storage it suggested R2, but that asked for a bank card, so the card-free KV store stayed. It recommended hyphenation (splitting words at line ends) at least seven times; on the device it stayed off.
On the morning of 19 October Claude suggested a one-week pause on features, so the time could go to the business. Two more firmware versions were built that day.
What only I could do: create the accounts, enter the secret keys, because the AI doesn't handle them, put the early versions onto the device, and try everything on the device. The hardware's surprises — how the buttons are wired, the pin holding the battery, the bootloader — don't show up in automated tests. That was the larger part of the work: saying what's not right.
What to watch
The bridge touches all three things Simon Willison calls the lethal trifecta: private data (my calendar, my notes), outside content (books and web pages) and an outbound connection (the calls to Claude). With all three, a malicious text could in principle leak the data.
What limits it for me: the bridge has a daily call cap and the Claude key a monthly budget, the text uploaded for the recap is deleted after processing, and the services' keys aren't on the device. Part of my notes, though, goes to Claude as context when I have it explain a paragraph, or ask about a word in a Hungarian book. I decided this knowing it, and I consider it the most sensitive point of the system.
What could be useful to others
The bridge pattern carries over to any CrossPoint reader: a free cloud program, signed sync with the personal content encrypted, resumable downloads, and firmware that installs itself with a trial period. For that, the personal parts would have to come out, and it would need a settings file, an English write-up, a key per user and a security review.
The e-book built from a calendar works for anyone who plans their reading in a calendar: stable chapter IDs, ticked off by itself, with a threshold against skimming. The recap is for anyone learning a language from books: the next day, from the text actually read, with the looked-up words, no quiz.
Some parts could also go back to the original project, as separate pull requests: keeping the reading position when a new version of a book arrives, the statistics rules, the greedy line breaking (which breaks a line only where the next word no longer fits), and the blue-noise dithering (an irregular dot pattern for the shades of grey). CrossPoint accepts contributions made with an LLM, if they're labelled.
The amount of work, for the period from 8 to 19 October 2026: 48 commits on the firmware branch, 41 cloud builds, 36 of them successful; 47 commits on the bridge and 35 on the pipeline. Claude Code worked on the system for about 28 hours, across 10 days. My other systems, and the connections between them, are on the Systems of my own map.
Questions on the topic
Does this work on other e-readers?
CrossPoint runs on the Xteink X3 and X4. My branch is tailored to the X3, to its factory bootloader and the control pin that holds its battery, so it isn't guaranteed elsewhere. The bridge pattern, though, carries over to any CrossPoint reader.
What does it cost to run?
The bridge runs on Cloudflare's free plan, without a bank card. What costs money is the calls to Claude: in the seven days up to 21 October 2026 there were 33 calls, for 7.55 dollars. The bridge has a daily call cap, and the Claude key a monthly budget.
What happens to the text I read?
For the recap, the device uploads the text of the pages that were on screen for at least eight seconds, encrypted. Claude sums it up, then the text is deleted. Part of my notes goes to Claude as context when I have it explain a paragraph, or ask about a word in a Hungarian book; I decided this knowing it.
Do you need to know how to code for this?
I built it with AI. The larger part of the work was saying exactly what I wanted and trying it on the device: whether the type fits, whether the picture really refreshed in the morning, whether the statistics show what happened. The hardware's surprises only showed up on the device.