Readest is a Foliate rewrite that vendors its own Tauri fork
Readest is a modern, feature-rich ebook reader designed for avid readers offering reliable cross-platform access, powerful tools, and an intuitive interface to elevate your reading experience.
At a glance
- What is it?
- Readest rebuilds the Foliate ebook reader as a Next.js 16 and Tauri v2 app for six platforms under AGPL-3.0, with a Rust side that patches Tauri and swift-rs so macOS builds survive Xcode 26.x. The reader does a lot on paper; the parts worth checking before you trust it with a library are shelf-scoped search, DRM-free narration, and the NEXT_PUBLIC arguments a self-hosted build needs.
- Who is it for?
- Readest suits readers who want one annotated library on six platforms and can live with shelf-scoped search, DRM-free audio, and a sync tier they configure themselves. Skip it if you need library-wide search in one query or narration over protected audio files, and verify the submodule requirement, the NEXT_PUBLIC build arguments, and the three roadmap items before you point an existing library at it.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- readest/readest26,256 ★ · +3,400
| Repository | 2026-07-28 | 2026-11-13 |
|---|---|---|
| readest/readest | 22.9k | 26.3k |
3,400 Stars in the last 108 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
One workspace, one app, six targets
Readest is presented as a modern rewrite of Foliate rather than a fork of it, and that decision shows in the layout: a TypeScript front end on Next.js 16, a native shell on Tauri v2, and a single codebase aimed at macOS, Windows, Linux, Android, iOS and the web. The repository is a pnpm workspace pinned to [email protected], and its root package is @readest/monorepo marked private, so work is routed through filters rather than run at the root. Most root scripts delegate into one target, @readest/readest-app, which means the commands you type look like this:
pnpm --filter @readest/readest-app tauri
pnpm --filter @readest/readest-app dev-webThe exceptions include the biome format commands, which run repo-wide. Listed format coverage is EPUB, PDF, MOBI, KF8 (AZW3), FB2, CBZ, TXT, HTML and MD, and the top level carries fastlane, nix and a flake.nix alongside apps, packages and docker. The feature table does not compare the six platforms feature by feature, so treat the platform claim as a target and check the platform you actually use.
Cargo pins a vendored Tauri fork to survive Xcode 26.x
The Rust side is a Cargo workspace with a single member, apps/readest-app/src-tauri. packages/qcms and packages/tauri sit in exclude, with a comment explaining that the fork is its own workspace whose crates use workspace inheritance and must resolve against packages/tauri/Cargo.toml instead. tauri is declared with default-features = false, and the workspace package sets edition 2021, rust-version 1.90, authors Bilingify LLC and licence AGPL-3.0.
The consequential part is [patch.crates-io], which points tauri at packages/tauri/crates/tauri and swift-rs at a vendored path. The in-repo comment gives the reason plainly: Xcode 26.x with Swift 6.2 broke upstream swift-rs's per-swiftc target override, so the vendored copy cross-compiles through --triple and --sdk, and upstream 1.0.8 only takes that path on Xcode 27. The catch is recorded too: the vendored swift-rs is labelled 1.0.8 purely to satisfy tauri's swift-rs = "1.0.8" requirement, and if that unification fails, cargo silently drops the tauri patch and builds against crates.io instead. You get a build that looks right and is not the one these files describe. Linting and formatting go through the app target as well:
pnpm --filter @readest/readest-app clippy:check
pnpm --filter @readest/readest-app fmt:checkThe Docker build stops unless two submodules are checked out
The Dockerfile begins from a pinned docker.io/library/node:24-slim digest, enables corepack, activates [email protected], then copies package.json, pnpm-lock.yaml, pnpm-workspace.yaml, patches and packages before installing with a frozen lockfile against a shared pnpm store mount. Right after that install it asserts two submodule outputs are present and fails the image build with a specific message if they are not. The message names the command to run:
git submodule update --init packages/foliate-js packages/simplecc-wasmWhen the assertion passes, the next step is pnpm --filter @readest/readest-app setup-vendors. The practical consequence is that a shallow clone without submodules breaks at image build rather than at runtime, which is the friendlier failure mode, but it means any automated pipeline has to initialise submodules before build. The development stage is a plain dev server bound to every interface:
ENTRYPOINT ["pnpm", "dev-web", "-H", "0.0.0.0"]with port 3000 exposed. Note what that entrypoint is: a development web server, not a packaged reader. Do not expose it on an untrusted network expecting it to behave like a shipped app.
Self-hosted sync is wired through seven NEXT_PUBLIC build arguments
The build stage declares NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, NEXT_PUBLIC_APP_PLATFORM, NEXT_PUBLIC_API_BASE_URL, NEXT_PUBLIC_OBJECT_STORAGE_TYPE, NEXT_PUBLIC_STORAGE_FIXED_QUOTA and NEXT_PUBLIC_TRANSLATION_FIX, and sets no default values for any of them. Because the names are prefixed, they are resolved at build time and baked into the front end rather than read from the environment when the app starts. Two of them decide the shape of a self-hosted deployment: the Supabase pair points the sync layer somewhere, and NEXT_PUBLIC_OBJECT_STORAGE_TYPE with NEXT_PUBLIC_STORAGE_FIXED_QUOTA decides where files land and what space the deployment assumes.
The consequence for a reader running their own copy is concrete. Sync is listed as covering book files, reading progress, notes and bookmarks across platforms, and in a self-built image it depends on the Supabase URL and anon key supplied at build time. Translation is listed with DeepL and Yandex as the named engines, from a single sentence to the whole book, with NEXT_PUBLIC_TRANSLATION_FIX in the build list. Web clipping leans the same way, since From Web Novel explicitly reuses your browser session to import selected chapters and their images.
Full-text search stops at the current shelf
Search is described as working inside a book or across the current library shelf. That boundary is the one limitation worth reading twice, because it is easy to assume a reader that indexes EPUB and PDF files also indexes your whole collection in one query. There is no index spanning everything you own, and nothing in the feature list adds one.
The consequence is a workflow limit rather than a crash. If you keep thousands of books in one library and have not split them into shelves, a search for a name you half remember has to be repeated shelf by shelf, and the shelf you forget to check is the shelf holding the answer. Library management is listed separately and covers organising, sorting and managing the collection, so shelves are the intended structure; the point is that search respects them. Anyone migrating from a tool where a single query sweeps the whole library should test this on their own collection before they move anything, because the difference only shows up after the library is large enough to feel it.
Narration pairs an EPUB with local DRM-free audio
Read-along narration works two ways: play embedded EPUB 3 Media Overlays with timed highlighting, or pair a reflowable EPUB locally with DRM-free MP3, M4A or M4B narration. Two boundaries follow from that wording. The pairing path takes local audio files that are explicitly DRM-free, so protected or encrypted audio is outside what is described here. Where an EPUB carries no Media Overlays, timing has to come from separate audio files matched to the text, and the timed highlighting depends on either what the publisher embedded or a phrase-aligned EPUB generated through the Storyteller route, which is described as remaining an option.
The consequence lands on sync readers rather than on listeners. Text to speech is listed as multilingual and usable inside a single book, but alignment accuracy rests on the EPUB, not on something the app repairs. A book with sloppy overlays will highlight the wrong sentence and the reader has no correction path described. Check timing on two or three books you already know before you rely on it for an audiobook-style workflow.
Koreader sync moves progress, notes and bookmarks, not files
Two sync features sit side by side and they do not cover the same things. Sync across platforms is listed as synchronising book files, reading progress, notes and bookmarks across all supported platforms. Sync with Koreader is listed as synchronising reading progress, notes and bookmarks with Koreader devices, and the entry links out to a separate Koreader wiki page.
The gap is the book files. On the Koreader path the item that carries the book itself is absent from the list, so progress can follow you between a phone and a Koreader device while the file itself has to travel by whatever mechanism you already use. For a reader who keeps one library in one place and syncs markers, that is enough. For someone who expects the same pattern to move books, it is not, and the mismatch is only visible in the feature wording rather than as an error message. The installation question that comes up most often about this project, how to install the Koreader plugin, is answered by that linked wiki page; treat any instructions you find elsewhere as something to check against the wiki rather than assume.
Summaries, reading stats and handwriting are not built yet
Three entries sit outside the implemented list. AI-Powered Summarization and Advanced Reading Stats are both marked as building, and Handwriting Annotations as planned. That means automatic chapter summaries, a reading-time or pages-read dashboard, and pen input are all absent today, and there is no partial behaviour to expect from them.
The consequence is straightforward: do not design a workflow around them. The annotations you can rely on now are highlights, bookmarks, notes and instant mode for quicker interactions, along with visual aids such as a reading ruler, paragraph-by-paragraph mode and speed reading features. On currency, the newest listed release is v0.12.16 dated 2026-10-13, preceded by v0.12.12 on 2026-10-04 and v0.12.10 on 2026-09-21, and the most recent push is dated 2026-11-02. That cadence is what the roadmap items are moving against, so a feature marked as building can change without notice between releases.
Editorial conclusion
Readest suits readers who want one annotated library on six platforms and can live with shelf-scoped search, DRM-free audio, and a sync tier they configure themselves. Skip it if you need library-wide search in one query or narration over protected audio files, and verify the submodule requirement, the NEXT_PUBLIC build arguments, and the three roadmap items before you point an existing library at it.
Frequently asked questions
How much does Readest cost?
The code is released under AGPL-3.0, and mobile builds are linked through an App Store listing and a Google Play listing.
Is Readest safe to use?
It is open source under AGPL-3.0 and the newest listed release is v0.12.16, dated 2026-10-13. Worth knowing before you start: the From Web Novel clipping mode reuses your existing browser session to import selected chapters and their images.
what is readest
A rewrite of the Foliate ebook reader built on Next.js 16 and Tauri v2, targeting macOS, Windows, Linux, Android, iOS and the web, opening EPUB, PDF, MOBI, KF8 (AZW3), FB2, CBZ, TXT, HTML and MD files.
how to install readest koreader plugin
Sync with Koreader is listed as implemented for reading progress, notes and bookmarks, and the README links out to a separate Koreader wiki page for it. Follow that wiki page rather than third-party walkthroughs.
readest vs koreader
Readest's listed surface covers PDF, MOBI, FB2 and CBZ alongside EPUB, OPDS/Calibre catalogs, DeepL and Yandex translation, web clipping and text to speech. The Koreader side is where the two meet: only reading progress, notes and bookmarks cross that boundary, not book files.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/readest-readest)Star history chart for your README
[](https://hysenlabs.com/projects/readest-readest)Was this useful?