Find a file
Huang Xin 9506073e88
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (rust) (push) Waiting to run
Publish Docker image / build (linux/amd64, ubuntu-latest) (push) Waiting to run
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm) (push) Waiting to run
Publish Docker image / merge (push) Blocked by required conditions
Build with Nix / tests (push) Waiting to run
PR checks / nix_flake_check (push) Waiting to run
PR checks / rust_lint (push) Waiting to run
PR checks / koplugin_rust_lint (push) Waiting to run
PR checks / build_web_app (push) Waiting to run
PR checks / test_web_app (1) (push) Waiting to run
PR checks / test_web_app (2) (push) Waiting to run
PR checks / test_extensions (push) Waiting to run
PR checks / build_tauri_app (push) Waiting to run
Scorecard supply-chain security / Scorecard analysis (push) Waiting to run
Deploy to vercel on merge / build_and_deploy (push) Waiting to run
chore: declare tsx for the worktree scripts and clean up merged worktrees in the triage loop (#6807)
* chore(agent): remove a merged PR's worktree in the triage loop

Worktrees for the loop's PRs stayed on disk after merge. When a followed
PR is merged, the loop now removes its worktree with `pnpm worktree:rm` and
deletes the local branch, but only for a worktree it made, with no local
changes and HEAD at the merged head; anything else is kept and reported.

Verified: the same checks and removal ran by hand on today's nine merged
worktrees (all clean, all at their merged heads); the main checkout's
shared target/ was untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(agent): keep the commit-author check under open PRs

The worktree-cleanup sentences made "Then check every commit's author"
read as part of the merged case; it applies to PRs that are still open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(scripts): declare tsx so worktree:new and worktree:rm run

`worktree:new`, `worktree:rm` and `dictionary:yomitan:convert` run their
TypeScript with tsx, but tsx was never a dependency: it was only in the
lockfile as an optional Vite peer, so `pnpm exec tsx` failed with
"Command tsx not found". Declare it at the version already locked
(4.21.0), so no new package is fetched.

Verified: before, `pnpm worktree:new` failed at once with "Command tsx not
found"; after, it created a worktree end to end (submodules, install,
Android gen, vendor and simplecc copies, clean git status), and
`pnpm worktree:rm` removed it.
Not run: the Nix build locally (no nix here); nix_flake_check in CI checks
the pnpmDeps hash, which shouldn't move since no new package is fetched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(agent): keep a merged worktree whose submodules hold local work

The cleanup checked the superproject only (--ignore-submodules=all), so a
submodule commit or edit, such as a foliate-js fix, could be removed with
the worktree. It now also requires no submodule at a different commit
(no '+' in git submodule status) and no submodule changes. Ignored files
are expected and still don't block removal.

Verified: both checks print nothing on two real worktrees, so a clean
worktree is still removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(agent): check worktree cleanup with plain git status

--ignore-submodules=all hid a staged submodule pointer, and the extra
submodule status check missed it too. Plain git status --porcelain reports
a submodule at another commit, a staged pointer and edits inside a
submodule, so it replaces the three checks.

Verified on the foliate-js submodule: moved to another commit, plain
status prints ' M packages/foliate-js' while --ignore-submodules=all prints
nothing; staged, plain status prints 'M  packages/foliate-js' while both
older checks print nothing. Plain status prints nothing on three clean
worktrees.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(agent): require the branch itself at the merged head before cleanup

A worktree detached at the merged head could pass the HEAD check while its
branch held later local commits, and git branch -D would drop them. Both
HEAD and the branch ref must be the merged PR's head sha.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 02:06:54 +08:00
.devcontainer fix(docker): fix Docker image latest tag and production runtime errors; add dev compose file, Codespace support, and semver release tagging (#7) (#4277) 2026-05-23 10:39:15 +08:00
.github build(android): ship per-ABI APKs (arm64, armv7, legacy) instead of universal (#6772) 2026-10-13 19:33:05 +02:00
.husky feat(send): Send to Readest — multi-channel capture into your library (#4230) 2026-05-19 20:06:52 +02:00
.vscode chore: switch code formatter from Prettier to Biome (#4223) 2026-05-19 08:13:36 +02:00
.zed chore: enable setting to let vstls report on the entire codebase (#5098) 2026-07-14 03:50:07 +02:00
apps chore: declare tsx for the worktree scripts and clean up merged worktrees in the triage loop (#6807) 2026-10-15 02:06:54 +08:00
data release: version 0.12.16 (#6779) 2026-10-14 00:33:31 +02:00
docker feat(sync): sync the import-time page count across devices (#6775) 2026-10-13 20:45:34 +02:00
docs/designs feat(reader): Notebook as a linked writing workspace (#5928) 2026-08-28 21:18:17 +02:00
fastlane chore(store): replace Play listing images instead of appending (#5574) 2026-08-08 08:25:22 +02:00
nix fix(nix): refresh pnpmDeps hash for music-metadata (#6688) 2026-10-10 02:51:46 +02:00
packages fix(reader): release closed reader views from the cached book document, closes #6710 (#6788) 2026-10-14 20:35:15 +08:00
patches fix(deps): resolve open Dependabot alerts (#6573) 2026-10-02 20:22:47 +02:00
.dockerignore ci: optimize build time for Docker and CI workflows (#4263) 2026-05-22 18:43:33 +02:00
.editorconfig dev: add editorconfig (#206) 2025-01-21 07:18:00 +01:00
.gitignore feat(linux): ship Readest on the tauri CEF runtime (#6074) 2026-09-05 20:09:06 +02:00
.gitmodules chore: remove the packages/tao submodule (#6085) 2026-09-06 06:42:51 +02:00
biome.json fix(nix): get nix devshell working (#4883) 2026-07-04 12:56:21 +02:00
Cargo.cef.lock fix(linux): stop the CEF focus loop that froze two-window sessions (#6691) 2026-10-09 14:12:26 +02:00
Cargo.lock fix(windows): stop the main window from growing on every launch (#6546) 2026-10-02 07:54:10 +02:00
Cargo.toml chore(linux): catch up the CEF runtime with upstream feat/cef, closes #6397 (#6487) 2026-09-30 04:07:58 +08:00
CODE_OF_CONDUCT.md docs: add contributor code of conduct (#5758) 2026-08-17 10:49:39 +02:00
CONTRIBUTING.md feat: package for nix (#5605) 2026-08-18 18:03:22 +02:00
Dockerfile fix(docker): unbreak large uploads and self-hosted cloud sync (#6100) 2026-09-06 17:56:25 +02:00
flake.lock feat: package for nix (#5605) 2026-08-18 18:03:22 +02:00
flake.nix fix(nix): match the Android AVD ABI to the host architecture (#5732) (#5850) 2026-08-24 18:10:00 +02:00
LICENSE Add AGPLv3 license 2024-11-11 21:25:22 +01:00
package.json fix(reader): scroll oversized blocks in-place instead of turning the page (#4400) (#4415) 2026-06-02 14:45:18 +02:00
pnpm-lock.yaml chore: declare tsx for the worktree scripts and clean up merged worktrees in the triage loop (#6807) 2026-10-15 02:06:54 +08:00
pnpm-workspace.yaml fix(deps): resolve open Dependabot alerts (#6573) 2026-10-02 20:22:47 +02:00
README.md fix(import): pick the declared cover when <meta name="cover"> holds an href (#6635) 2026-10-04 20:08:49 +02:00
SECURITY.md docs: add threat model and incident response plan to SECURITY.md (#3788) 2026-04-07 19:17:56 +02:00
tsconfig.json chore: enforce prettier, ignore submodules and vendor files (#3018) 2026-01-21 14:53:02 +01:00

Readest Logo

Readest


Readest is an open-source ebook reader designed for immersive and deep reading experiences. Built as a modern rewrite of Foliate, it leverages Next.js 16 and Tauri v2 to deliver a smooth, cross-platform experience across macOS, Windows, Linux, Android, iOS, and the Web.

Website Web App OS
Discord Reddit AGPL Licence Language Coverage Donate Latest release Last commit Commits Ask DeepWiki

Features • Planned Features • Screenshots • Downloads • Documentation • Getting Started • Troubleshooting • Support • License

Features

Feature Description
Multi-Format Support Support EPUB, PDF, MOBI, KF8 (AZW3), FB2, CBZ, TXT, HTML, MD (Markdown)
Scroll/Page View Modes Switch between scrolling or paginated reading modes.
Full-Text Search Search inside a book or across the current library shelf to find relevant sections.
Annotations and Highlighting Add highlights, bookmarks, and notes to enhance your reading experience and use instant mode for quicker interactions.
Dictionary/Wikipedia Lookup Look up words with built-in sources or import local packs, including Yomitan ZIP/RDICT, from Settings → Custom Dictionaries.
Parallel Read Read two books or documents simultaneously in a split-screen view.
Customize Font and Layout Adjust font, layout, theme mode, and theme colors for a personalized experience.
Code Syntax Highlighting Read software manuals with rich coloring of code examples.
File Association and Open With Quickly open files in Readest in your file browser with one-click.
Library Management Organize, sort, and manage your entire ebook library.
OPDS/Calibre Integration Integrate OPDS/Calibre to access online libraries and catalogs.
Web Page Clipping Open websites, sign in, and clip pages with From Web Browser. From Web Novel can reuse your browser session to import selected chapters and their images.
Translate with DeepL and Yandex From a single sentence to the entire book—translate instantly.
Audiobook Support Extend functionality to play and manage audiobooks.
Text-to-Speech (TTS) Support Enjoy smooth, multilingual narration—even within a single book.
Read-Along Narration Play embedded EPUB 3 Media Overlays with timed highlighting, or pair a reflowable EPUB locally with DRM-free MP3, M4A, or M4B narration. Storyteller remains an option for generating phrase-aligned EPUBs.
Sync across Platforms Synchronize book files, reading progress, notes, and bookmarks across all supported platforms.
Sync with Koreader Synchronize reading progress, notes, and bookmarks with Koreader devices.
Accessibility Provides full keyboard navigation and support for screen readers such as VoiceOver, TalkBack, NVDA, and Orca.
Visual & Focus Aids Reading ruler, paragraph-by-paragraph reading mode, and speed reading features.

Planned Features

🛠 Building | 🔄 Planned
Feature Description
AI-Powered Summarization Generate summaries of books or chapters using AI for quick insights. 🛠
Advanced Reading Stats Track reading time, pages read, and more for detailed insights. 🛠
Handwriting Annotations Add support for handwriting annotations using a pen on compatible devices. 🔄

Stay tuned for continuous improvements and updates! Contributions and suggestions are always welcome—let's build the ultimate reading experience together. 😊

Screenshots

Annotations

TTS

DeepL

Footnote

Wikipedia

Theming Dark Mode


Downloads

Mobile Apps

Download on the App Store     Get it on Google Play

Platform-Specific Downloads

Nix

Note

The Nix package supports x86_64-linux only. nix-darwin is not supported.

Try it without installing. --accept-flake-config opts in to the project's binary cache; without it Nix builds the whole Rust/Tauri stack from source.

nix run --accept-flake-config github:readest/readest

To install it, add the input to your flake.nix:

# Due to a limitation in how Nix fetches submodules, a regular GitHub input type will fail to evaluate.
inputs.readest = {
  url = "https://github.com/readest/readest.git";
  type = "git";
  submodules = true;
};

then in configuration.nix add the package and the cache. The cache is needed here as well because a flake input's own nixConfig does not apply to your system build:

environment.systemPackages = [
  inputs.readest.packages.${pkgs.stdenv.hostPlatform.system}.default
];

nix.settings = {
  substituters = [ "https://readest.cachix.org" ];
  trusted-public-keys = [
    "readest.cachix.org-1:KvKAePcZZCZB8ytFIAOGdgN3VRdmFHGRMHqMVckbt5c="
  ];
};

Documentation

Guides, tutorials, and FAQs for installing and using Readest live in the official documentation:

📖 https://readest.com/docs

Contributor references live in the repository: architecture, code layout, and testing.

Building from Source

To build Readest from the latest commit, see Getting Started.

Troubleshooting

1. Readest Won’t Launch on Windows (Missing Edge WebView2 Runtime)

Symptom

  • When you double-click readest.exe, nothing happens. No window appears, and Task Manager does not show the process.
  • This can affect both the standard installer and the portable version.

Cause

  • Microsoft Edge WebView2 Runtime is either missing, outdated, or improperly installed on your system. Readest depends on WebView2 to render the interface on Windows.

How to Fix

  1. Check if WebView2 is installed
    • Open “Add or Remove Programs” (a.k.a. Apps & features) on Windows. Look for “Microsoft Edge WebView2 Runtime.”
  2. Install or Update WebView2
    • Download the WebView2 Runtime directly from Microsoft: link.
    • If you prefer an offline installer, download the offline package and run it as an Administrator.
  3. Re-run Readest
    • After installing/updating WebView2, launch readest.exe again.
    • If you still encounter problems, reboot your PC and try again.

Additional Tips

  • If reinstalling once doesn’t work, uninstall Edge WebView2 completely, then reinstall it with Administrator privileges.
  • Verify your Windows installation has the latest updates from Microsoft.

Still Stuck?

  • See Issue readest/readest#358 for further details, or head over to our Discord server and open a support discussion with detailed logs of your environment and the steps you’ve taken.

Linux Fails to Launch on Wayland / Niri

Current Linux builds, including Flatpak, use CEF with an X11 window backend. Wayland sessions therefore need XWayland. Without a DISPLAY, older builds exit with Runtime(CreateWindow) before opening a window.

On Niri, install xwayland-satellite 0.7 or later using your distribution's package manager and restart your Niri session. Niri 25.08 and later can start it on demand and set DISPLAY for applications. See Niri's XWayland setup instructions.

From a terminal in that session, check printenv DISPLAY, then launch Readest:

flatpak run com.bilingify.readest

The Flatpak already requests the X11 socket. If you have customized its sandbox permissions, allow that socket as well. Setting DISPLAY to an arbitrary value does not start XWayland; use the value provided by your session. --ozone-platform=wayland cannot enable native Wayland support in this runtime, and WebKitGTK environment variables do not affect CEF.

Contributors

Readest is open-source, and contributions are welcome! Feel free to open issues, suggest features, or submit pull requests. Please review our contributing guidelines and Code of Conduct before you start. We also welcome you to join our Discord community for either support or contributing guidance.

A table of avatars from the project's contributors

Support

If Readest has been useful to you, consider supporting its development at donate.readest.com, where you'll find all available donation methods, including GitHub Sponsors, PayPal, card payments, and crypto. Your contribution helps us fix bugs faster, improve performance, and keep building great features.

Sponsors

License

Readest is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See the LICENSE file for details.

The following libraries and frameworks are used in this software:

  • foliate-js, which is MIT licensed.
  • zip.js, which is licensed under the BSD-3-Clause license.
  • fflate, which is MIT licensed.
  • PDF.js, which is licensed under Apache License 2.0.
  • daisyUI, which is MIT licensed.
  • marked, which is MIT licensed.
  • next.js, which is MIT licensed.
  • react-icons, which has various open-source licenses.
  • react, which is MIT licensed.
  • tauri, which is MIT licensed.

The following fonts are utilized in this software, either bundled within the application or provided through web fonts:

Bitter, Fira Code, Inter, Literata, Merriweather, Noto Sans, Roboto, LXGW WenKai, MiSans, Source Han, WenQuanYi Micro Hei

We would also like to thank the Web Chinese Fonts Plan for offering open-source tools that enable the use of Chinese fonts on the web.


Happy reading with Readest!