Built · ~1h 30 minutes
Readwise → x3
An OPDS bridge that serves my Readwise Reader queue to an e-ink reader as on-the-fly EPUBs.
Built with: Cloudflare Workers · TypeScript · OPDS · EPUB · fflate · htmlparser2
This was on my list of possible projects for my sabbatical and I completed it about 2 hours after finishing up for the month 😅
The Xteink X3 is a tiny e-ink reader, and the Crosspoint Reader firmware it runs has a built-in OPDS client. That means if I can build an OPDS proxy, I can pull in articles as ebooks into the reader. This Worker does that: sitting between the x# and Readwise Reader so I can pull in New and Later collections as an OPDS catalog, and download any article as a text-only EPUB to read offline.
The result is that saved articles flow straight onto the e-reader with no companion app, no cable, and no firmware changes.
How it was built
A Cloudflare Worker in TypeScript, with htmlparser2 to sanitize article HTML and fflate to zip the EPUB. The interesting constraints came from the firmware: its EPUB parser is expat-based and wants strictly well-formed XHTML, its OPDS client only downloads application/epub+zip acquisition links, and it sends Basic auth preemptively. Rather than guess, Claude decided to read the crosspoint-reader source to learn exactly what its parsers accept and shaped the feed and EPUBs around that 🤯.
About half an hour end to end — researching the firmware’s parsers, building, deploying, and a follow-up to add collection navigation feeds.