thorium-reader is a free, open source publishing project written in TypeScript and released under BSD-3-Clause. It has 2,872 GitHub stars, 237 forks and 206 open issues, and was last pushed 10 hours ago. On this registry it ranks #17 of 46 tracked projects in Publishing, with 5 head-to-head comparisons available. It gained 2 stars over the last 3 tracked days.

What is thorium-reader?

What it is

Thorium Reader is a cross-platform desktop reading application for Windows 10/10S, macOS, and Linux, based on the open-source Readium Desktop toolkit. It lives in the content and publishing ecosystem, is categorized as Content & Publishing / Publishing, and is released under the BSD-3-Clause license. The repository reports 2,871 stars, 237 forks, and a last push on 2026-09-14.

The concrete problem it solves is local, private, accessible desktop reading for EPUB publications. Users import e-books from a directory or OPDS feed, then read on any screen size, customize layout settings, navigate through a table of contents or page list, and set bookmarks. The README states that no ads are present and that no private data flows anywhere, while the application supports visually impaired people using NVDA, JAWS, or Narrator.

Key capabilities

  • The application reads EPUB and EPUB3 publications on Windows 10/10S, macOS, and Linux.
  • It imports e-books from local directories or OPDS feeds.
  • It provides layout customization, screen-size adaptation, table-of-contents navigation, page-list navigation, and bookmarks.
  • It supports visually impaired readers using NVDA, JAWS, or Narrator.
  • It includes LCP-related reading capabilities, as indicated by the lcp topic.
  • It offers localization in 28 languages, with Weblate project Thorium used since February 2025.
  • It uses TypeScript, Electron, React, Redux, and saga to build the desktop application.

Who uses it and how

  • Readers use it as a desktop application for personal EPUB reading after importing books from a directory or OPDS feed.
  • Visually impaired users use it with NVDA, JAWS, or Narrator.
  • Developers use it as a local Electron and React application, running npm ci, the manual Electron install step, npm run start:dev, or npm start.
  • Translators use Weblate project Thorium to work on the 28 supported languages.
  • Packagers use npm run package:win, npm run package:mac, and npm run package:linux to create installers, with GitHub Actions workflows covering Intel and ARM architectures.

Getting started

Developers install dependencies with npm ci, complete the manual Electron binary setup, and run npm run start:dev or npm start. Platform installers are built with npm run package:win, npm run package:mac, or npm run package:linux.

When to use it — and when not to

Use Thorium Reader when a user needs a free, cross-platform desktop EPUB reader with OPDS import, layout controls, bookmarks, localization, and screen-reader support. Do not choose it when a hosted option is required, because the README describes desktop installers and local source workflows. Builders must operate NodeJS 22, NPM 11, the manual Electron binary step, and packaging commands, and the project reports 206 open issues while describing itself as in constant evolution.

project readme (upstream, from github) — read inline

Thorium Reader

Thorium Reader is an easy to use EPUB reading application for Windows 10/10S, MacOS and Linux. After importing e-books from a directory or OPDS feed, you'll be able to read on any screen size, customize layout settings, navigate via the table of contents or page list, set bookmarks ... A great care is taken to ensure the accessibility of the application for visual impaired people using NVDA, JAWS or Narrator.

Free application. No ads. No private data flowing anywhere.

This project is in constant evolution, corrections and new features will be added soon and your support is welcome for that. The application is based on the open-source Readium Desktop toolkit.

More information can be found in the Landing page.

It is currently localized in following 28 languages:

  • (en) English
  • (fr) Français (French)
  • (fi) Suomi (Finnish)
  • (de) Deutsch (German)
  • (es) Español (Spanish)
  • (nl) Nederlands (Dutch)
  • (ja) 日本語 (Japanese)
  • (ka) ქართული (Georgian)
  • (lt) Lietuvių (Lithuanian)
  • (pt-BR) Português Brasileiro (Portuguese - Brazil)
  • (pt-PT) Português (Portuguese - Portugal)
  • (zh-CN) 简体中文 - 中国 (Simplified Chinese - China)
  • (zh-TW) 繁體中文 - 台灣 (Traditional Chinese - Taiwan)
  • (it) Italiano (Italian)
  • (ru) Русский (Russian)
  • (ko) 한국어 (Korean)
  • (sv) Svenska (Swedish)
  • (ca) Catalan
  • (gl) Galician
  • (eu) Euskadi (Basque)
  • (el) ελληνικός (Greek)
  • (bg) български (Bulgarian)
  • (hr) Hrvatski (Croatian)
  • (da) Dansk (Danish)
  • (sl) Slovenščina (Slovene)
  • (cs) čeština (Czech)
  • (ar) عَرَبِيّ (Arabic)

Since february 2025 we use Weblate project Thorium as the main tool for localisation. The following bar chart shows the translation status that is available from weblate.

Translation status

library publication info reader

Prerequisites

  1. NodeJS 22 (check with node --version)
  2. NPM 11 (check with npm --version)

TIP: the default version of NPM that ships with the NodeJS installer may be slightly old, so make sure to update with npm install --global npm@latest, or nvm install-latest-npm if you are an NVM user.

Technologies

  • typescript
  • electron
  • reactjs
  • redux
  • saga
  • i18next

Quick start

Install dependencies

  • npm ci --ignore-scripts --foreground-scripts --allow-git=root (or npm install --ignore-scripts --foreground-scripts --min-release-age=3 --allow-git=root if package-lock.json needs to be updated): initialize local node_modules packages from dependencies declared in package.json
  • in case of failure to NPM "install" because of "Divina player" SHA integrity mismatch, please try running the following command in your shell: node scripts/package-lock-patch.js && cat package-lock.json | grep -i divina-player-js
  • cd node_modules/electron && DEBUG=@electron/get* force_no_cache=true node install.js && cd -: this used to be done automatically via a NPM postinstall hook script but it is now a manual step, this sets up the Electron binary for the current platform.

Start application in development environment

(with hot-reload dev server, web inspectors / debuggers)

  • npm run start:dev (or npm run start:dev:quick to bypass TypeScript checks / launch the app faster)

Start application in production environment

  • npm start (or npm run start)

Build installers

  • npm run package:win or npm run package:mac or npm run package:linux (see the GitHub Actions Workflow YAML scripts for more information on how to handle the build matrix with Intel and ARM target architectures)

Code Signing information: https://github.com/edrlab/thorium-reader/wiki/Code-Signing

Firebase Measurement Protocol telemetry

Firebase / GA4 Measurement Protocol support is configured at build time with environment variables consumed by webpack.config-preprocessor-directives.js. It is disabled by default, and emitted events still respect the in-app "Disable telemetry measurements" setting.

Boolean flags are enabled by any value except 0 or false.

Environment variable Purpose
THORIUM_FIREBASE_ENABLED Enables Firebase / GA4 Measurement Protocol telemetry. Defaults to disabled.
THORIUM_FIREBASE_DEBUG Sends Measurement Protocol requests to the debug validation endpoint. Defaults to disabled.
THORIUM_FIREBASE_MEASUREMENT_ID GA4 measurement ID. Required when Firebase telemetry is enabled.
THORIUM_FIREBASE_MEASUREMENT_PROTOCOL_API_SECRET GA4 Measurement Protocol API secret. Required when Firebase telemetry is enabled; keep it in main-process build environments only.
THORIUM_FIREBASE_MEASUREMENT_PROTOCOL_ENDPOINT Optional collection endpoint override. Defaults to https://www.google-analytics.com/mp/collect.
THORIUM_FIREBASE_MEASUREMENT_PROTOCOL_DEBUG_ENDPOINT Optional debug endpoint override. Defaults to https://www.google-analytics.com/debug/mp/collect.
THORIUM_FIREBASE_MEASUREMENT_PROTOCOL_QUEUE_SQLITE_ENABLED Uses SQLite instead of the JSON file store for the persistent Measurement Protocol queue. Defaults to disabled.

Proxy server support

The HTTPS_PROXY, HTTP_PROXY, and NO_PROXY environment variables are used to configure the behavior of a client application when making HTTP or HTTPS requests through a proxy server.

  • HTTPS_PROXY: Specifies the proxy server to use for HTTPS requests. The value should be in the format http://proxy.example.com:8080.
  • HTTP_PROXY: Specifies the proxy server to use for HTTP requests. The value should be in the format http://proxy.example.com:8080.
  • NO_PROXY: Specifies a comma-separated list of hostnames or IP addresses that should not be proxied. This is useful for excluding local or intranet addresses from being proxied.

When these environment variables are set, the client application will automatically use the specified proxy server for HTTP or HTTPS requests, unless the request is for a hostname or IP address listed in the NO_PROXY variable.

we used proxy-agent package from TooTallNate (https://github.com/TooTallNate/proxy-agents/tree/main/packages/proxy-agent)

see https://www.npmjs.com/package/proxy-from-env#environment-variables for more information.

LCP support in Thorium Reader

Thorium Reader supports LCP-protected publications via an additional software component which is not available in this open-source codebase. When Thorium Reader is compiled from the open-source code without the additional production-grade library, the application can only load publications protected with the LCP "Basic Encryption Profile". For example, licenses generated by the open-source LCP server written in Go, without the patch that enables production-grade LCP Encryption Profiles.

In order to create a production-grade LCP-compliant variant / derivation of Thorium Reader (known as a "fork"), additional confidential software components and processes must be integrated in the custom application's build / release workflow. This represents a non-trivial amount of time and effort, as well as close collaboration between the fork's development team and EDRLab's technical staff. To cover operational costs, EDRLab charges a maintenance fee. Feel free to contact EDRlab to discuss your requirements.

Command line

thorium <cmd> [args]

Commands:
  thorium opds <title> <url>  import opds feed
  thorium import <path>       import epub or lpcl file
  thorium read <title>        searches already-imported publications with the
                              provided TITLE, and opens the reader with the
                              first match
  thorium [path]              import and read an epub or lcpl file     [default]
  thorium completion          generate bash completion script

Positionals:
  path  path of your publication, it can be an absolute, relative path  [string]

Options:
  --version  Show version number                                       [boolean]
  --help     Show help                                                 [boolean]

[DEV] Architecture

Thorium-reader is composed of 3 parts:

  • One node.js main process (electron back-end)
  • One library window (chromium renderer)
  • One to N reader window(s) (chromium renderer)

Each part runs a model-controller and a view for the renderer process.

  • the model is a state container with Redux. It's based on flux architecture
  • the controller is a middleware from Redux named Redux-saga. It handles all side effects and application behaviour.
  • the view for the rendering is React with class components

To link these 3 parts we use:

  • IPC/RPC: we use an implementation from

readme truncated — read the full docs on github

Frequently asked questions

Is thorium-reader free to use?

thorium-reader is open source under the BSD-3-Clause licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does thorium-reader do?

A cross platform desktop reading app, based on the Readium Desktop toolkit

What is thorium-reader written in?

thorium-reader is primarily written in TypeScript. Its source is publicly available at https://github.com/edrlab/thorium-reader, and it has 2,872 GitHub stars.