Zenolet

I’ve just launched a new web-based e-reader called Zenolet, and this post is the story of how and why I built it.

Zenolet library view Zenolet reader view

Background

I have always wanted to be able to read long-form text on the web like I would read a magazine or a book or even an e-reader. Read a column of text, move your eye to the next column, turn the page. Or swipe left and right to browse. It is a natural way to read. Endless vertical scrolling is just not as pleasant.

A problem that needs to be handled immediately is different pagination for each display. First, the height of the display tells you how much text fits in a column. The width of the display tells you how many columns you can display. The display resizes, changes orientation, etc. It is a bit of a nightmare so it is no wonder that a scrolling vertical panel is the de facto standard.

Another feature I wanted was for this reader to work when disconnected from the internet. Your browser can save (cache) the book data, save where you were reading, etc. without an internet connection. I wanted that to be a first-class feature as I spend too much time in spots that have poor internet quality.

I didn’t know enough about web standards to implement this on my own. I only knew how I wanted it to work. Fortunately, since November, 2025 we have lived in a new time of wonder. We can ask LLMs to create things for us. Yes, you may call this vibe-coding, but would you rather have something vibe-coded vs. nothing at all? In this case, I’ll choose the vibes. You do you.

First Vibes: Bookie

In June, I started a first attempt at this and created bookie as a Single Page web App (SPA). I kept the conversation log and a developer log if you’d like to see the gory details of how it went. I was pretty pleased with the interaction with agents for making this code. While there were hiccups, it almost immediately knew what I wanted to do and created an interactive reader experience that was what I desired and also worked offline.

In the end, I had a reader that basically did what I wanted — users could search for and download Project Gutenberg Free Ebooks, but I needed to host it on my own server, which wasn’t something I was interested in. So, after a couple of weeks I set this aside. As a warning, I’m not really sure how well the code works, so caveat emptor.

Zenolet

A few weeks later, I struck up a conversation with some LLM describing my predicament and I asked about creating a static website with a curated list of books (with pointers to where they were online). If I put a bookie-like reader in that static website, could that work? Could I get rid of my server requirement? It replied in the affirmative and I started work on the Zenolet code and what would become the Zenolet ebook site.

It is named in honor of Zenodotus of Ephesus (the first chief librarian of Alexandria who invented alphabetical cataloging) combined with the -let suffix (a small, self-contained micro-library applet). I have to say I’m not 100% on this name, but you try finding an e-reader name that hasn’t already been taken!

The features of Zenolet are:

  • any static web host (github.io, pages.dev, gitlab.io, etc.) can have an independent micro-library
  • fork Zenolet and the micro-library can be curated to have your own list of ebooks
  • the default Zenolet library is a subset of the 1,000 most popular ebooks from Project Gutenberg
  • the reader is 100% client-side
  • no user accounts
  • no tracking
  • no subscription fees
  • cached offline storage
  • easily share your progress across devices with a link or QR code

It has been an off-and-on process over the past few months getting this to work, but now I think it is good enough to call it “1.0”. Besides the online experience, I’ve also worked to add documentation, testing, and make a good developer experience.

Note that for downloading across domains, it does require a Cloudflare Worker as a CORS proxy helper. But, Cloudflare provides a very high number of daily queries for free — I would be surprised if it didn’t handle the load. We’ll see!

What’s Next?

I hope people find Zenolet useful! Please feel free to send feedback and bug reports, and if you fork it to create your own curated micro-library of ebooks, I’d love to hear about it.