Introducing KindleShelf: A Better Way to Browse Jellyfin Books on a Kindle
I recently found myself trying to solve a problem that probably affects a fairly small group of people: I wanted a convenient way to browse and download books from my Jellyfin library using the web browser built into an e-ink Kindle.
Jellyfin already handles my book collection through the Bookshelf plugin, but its normal web interface was never designed for the Kindle’s limited experimental browser. Modern web applications tend to depend heavily on JavaScript, dynamic interfaces, large images, and browser features that older or lower-powered devices either handle poorly or do not support at all.
That led me to create KindleShelf.
KindleShelf is a small, self-hosted web frontend for Jellyfin book libraries. It runs alongside Jellyfin and provides a deliberately simple interface for browsing, searching, inspecting, and downloading books from an e-ink Kindle.
The project is available on GitHub:
Lightweight web frontend for downloading Jellyfin Bookshelf books from your Kindle. - HonkeyKong/KindleShelf
Built for a Limited Browser
The Kindle browser is not exactly known for being fast or standards-complete. Instead of fighting against those limitations, KindleShelf embraces them.
Pages are rendered as straightforward HTML on the server. Navigation, sorting, searching, and pagination all use ordinary links and forms. JavaScript is not required, and even images can be disabled without making the interface unusable.
Book covers are requested at a maximum width of 120 pixels, keeping pages lightweight and more appropriate for an e-ink display.
The result is intentionally plain, but that is the point. KindleShelf is designed to remain usable on hardware that struggles with the average modern website.
Jellyfin Remains the Source of Truth
KindleShelf does not maintain a separate book database or require another copy of the library.
It connects to an existing Jellyfin server and reads the Books library managed by the Jellyfin Bookshelf plugin. Metadata, authors, covers, available formats, and downloads all come from Jellyfin.
KindleShelf currently recognizes common book and archive formats including:
EPUB
AZW and AZW3
MOBI
CBZ and CBR
ZIP, RAR, and 7Z
Actual availability depends on what Jellyfin and the Bookshelf plugin report for each item.
Because KindleShelf is read-only, it stays focused on its primary job: making an existing library accessible from a Kindle.
Keeping the Jellyfin API Key Off the Kindle
One of my main design requirements was that the Kindle should never receive the Jellyfin API key.
The browser communicates only with KindleShelf. KindleShelf then makes the necessary requests to Jellyfin from the server side.
That keeps the API key out of page source, browser history, bookmarks, and download URLs. The application also validates Jellyfin item identifiers and confirms that requested books belong to the configured library rather than accepting arbitrary file paths or upstream URLs.
For a basic trusted home network, KindleShelf can operate without a login. It can also be protected with HTTP Basic Authentication.
For a better multi-user setup, it supports Jellyfin Quick Connect.
Signing In with Jellyfin Quick Connect
Typing a long username and password through a Kindle browser would be miserable, so Quick Connect is a much better fit.
When Quick Connect authentication is enabled, KindleShelf displays a short authorization code. The user enters that code from another browser or Jellyfin application where they are already signed in, then returns to the Kindle and checks the authorization.
KindleShelf never receives the user’s Jellyfin password.
The resulting Jellyfin token is stored in a bounded, server-side, in-memory session. The Kindle receives only a random HTTP-only session cookie. Browsing, covers, and downloads then use that user’s own Jellyfin permissions.
This also means different users can access the same KindleShelf installation without exposing the entire book library to everyone who can reach it.
Downloading Without Loading the Entire Book into Memory
Book downloads are streamed through KindleShelf rather than being completely buffered by the application.
KindleShelf can forward safe HTTP range requests and preserve Jellyfin’s partial-content and file-size headers. This matters for larger books and for devices or browsers that may resume or request only part of a file.
Format support still varies between Kindle models. EPUB and Amazon-compatible formats are generally the best options, but KindleShelf presents whatever compatible files Jellyfin reports.
Easy to Self-Host
KindleShelf is written in Python and can be run directly during development, but Docker Compose is the intended deployment method.
The basic setup consists of providing:
The Jellyfin server URL
A Jellyfin API key
The name of the Books library
Then the service can be built and started with Docker Compose.
No persistent application volume is required. KindleShelf uses a bounded in-memory cache for metadata and covers, while Jellyfin remains responsible for the actual library.
It can connect to Jellyfin over a shared Docker network, through the host machine, or elsewhere on the local network.
Designed for Home Servers
My own use case is a self-hosted media environment, so KindleShelf is designed with that kind of deployment in mind.
A simple trusted-LAN installation can be exposed over local HTTP, which may be necessary for older Kindles that cannot negotiate modern TLS configurations.
For access beyond the local network, KindleShelf should be placed behind a reverse proxy with HTTPS and authentication. A VPN or network allow-list is also a sensible option.
I would strongly advise against weakening the TLS configuration of an otherwise secure public server solely to support an old Kindle browser. A separate, carefully isolated compatibility endpoint is a much safer approach.
What KindleShelf Is Not
KindleShelf is not intended to replace Jellyfin, Calibre, or a full ebook management platform.
It does not currently edit metadata, upload books, track reading progress, or perform library management. Its interface is intentionally narrow and read-only.
That limited scope helps keep the project small, predictable, and usable on the devices it targets.
Future Send-to-Kindle Support
One obvious future feature is the ability to send a selected book through Amazon’s Send to Kindle service.
That functionality is not implemented yet, but the project already includes an extension point for a future delivery service. A complete implementation could eventually support:
SMTP delivery
Per-user Send to Kindle addresses
Approved-sender configuration
Format conversion through Calibre
Delivery history
Duplicate-send prevention
For now, books are downloaded through the browser, but the architecture leaves room for a more convenient delivery workflow later.
Why Build Something This Specific?
KindleShelf is admittedly a niche project.
It exists at the intersection of self-hosting, Jellyfin, ebooks, and aging e-ink hardware. That is also what made it interesting to build.
Modern software often abandons older or less capable devices long before the hardware stops being useful. A Kindle is still an excellent reading device, even when its browser can't cope with modern web applications.
Sometimes the right solution is not to replace the hardware. It is to build a smaller, simpler interface that respects its limitations.
That is what KindleShelf is meant to be: a lightweight bridge between a modern self-hosted book library and a device that is still very good at its primary job: reading books.










