About Codexa

A self-hosted EPUB and comic book reader with KOReader sync, OPDS browsing, and offline support

Codexa is a self-hosted reading platform for your EPUB books and comic books — your own private library that follows you across every device. It runs as a single lightweight Node.js container, needs no cloud account, and keeps everything — books, covers, highlights, bookmarks, and reading positions — on your own server. Open it in any modern browser, install it as a Progressive Web App, or use the dedicated Android and iOS apps. Pick up exactly where you left off, on any of them.

What sets Codexa apart is CXReader, its own purpose-built rendering engine. Instead of leaning on a generic third-party EPUB library, Codexa renders books with code written specifically for reliability, faithful typography, and — crucially — flawless behaviour on slow e-ink screens. The result is a reader that handles stubborn real-world EPUBs, fixed-layout manga, and CBZ/CBR comics with the same care, and stays fast on a BOOX or Kobo.

It began as a personal itch. I was running Grimmory/Booklore as my ebook server, with a fleet of devices syncing through its OPDS catalog and KOReader sync server. Later I migrated to more resource friendly Book Orbit server, but some of my EPUBs rendered poorly in the web reader, and two-way Grimmory ↔ KOReader sync wasn't working for me. Unable to find a web-based reader that did everything I needed, I built my own. It grew far beyond a weekend project — so I'm sharing it in case it's useful to you too.

Everything stays local, with optional two-way synchronisation to KOReader devices over the open KOSync protocol — Codexa even includes its own KOSync-compatible server, so your e-reader and your phone stay on the same page without any extra software.

Codexa library view showing book covers in a grid
The Codexa library — all your books in one place

At a Glance

  • Single Node.js process — easy to deploy with Docker in minutes
  • Multi-user with JWT authentication — per-user libraries
  • Full offline reading — via a Service Worker cache
  • CXReader — Codexa's own custom-built EPUB engine (replaces epub.js) for better reliability
  • Comic book support — read CBZ and CBR files alongside your EPUB library
  • Built-in KOSync-compatible server — connect KOReader devices without extra software
  • OPDS catalog browser — for Calibre-Web, Book Orbit, Booklore Komga, Kavita, and others; downloads books directly
  • Works on any device — desktop browsers, mobile PWA, Android APK, iOS IPA
  • Optimised for e-ink displays — BOOX, Kobo, and similar
↑ Top

Features

Everything included in Codexa

📖 Reading

  • CXReader — Codexa's own EPUB engine; reflowable, fixed-layout, and comic book formats
  • CBZ & CBR comic books — two-page spread on desktop, ComicInfo.xml metadata, theme-aware background
  • Fixed-layout EPUB — manga, children's books, and art books at pixel-accurate dimensions
  • Paginated layout — with configurable margins and columns
  • Exact position restore — reopens at the precise page, not just an approximate percentage
  • Bookmarks — with custom labels
  • Highlights — in four colours (yellow, green, blue, pink) with notes
  • In-book full-text search — with result navigation
  • StarDict dictionary lookup — double-click on desktop, long-press on mobile
  • Footnote and endnote popups — without leaving the page
  • Bionic reading — bolds word prefixes to guide the eye
  • Two-page spread — for wider screens
  • Fullscreen mode
  • Auto-hiding toolbar

🌟 Display & Themes

  • 7 built-in themes — Light, Sepia, Dark, Sepia Dark, Midnight, Nord, plus Custom with free color picking
  • E-ink mode — high-contrast black-and-white for e-ink displays
  • Custom fonts (TTF/OTF/WOFF/WOFF2) uploaded by admin
  • Extensive text settings — font, size, line height, letter spacing, indentation, hyphenation
  • Configurable status bar — with up to 6 overlay slots
  • Screen edge padding — for curved screens and notches

🔁 Sync & Progress

  • Automatic position saving — on every device
  • Built-in KOSync-compatible server — for KOReader devices
  • External KOSync server support — with conflict resolution
  • Interrupted session recovery banner
  • Reading statistics — time read, pages turned, sessions, books started/finished

📱 Offline & Mobile

  • Download any book for offline reading — via Service Worker cache
  • PWA — installable on desktop and mobile
  • Android app — with volume-key navigation, portrait lock, hardware e-ink toggle
  • iOS app — IPA file sideload (work in progress)
  • Responsive layout — for phones, tablets, and desktops

📚 Library

  • Multi-user with JWT authentication — per-user libraries
  • Shelves — organise books into named collections
  • Online library — browse OPDS catalogs from Calibre-Web, Book Orbit, Booklore, Komga, Kavita, and more
  • Bulk shelf sync — from OPDS folder with stale-book detection
  • OPDS-linked shelves — synced shelves remember their source folder; one click opens it in the OPDS browser or re-triggers a sync
  • Series support — with series name, number, and one-click filter
  • Sort — by date, title, author, progress, or series
  • Real-time library search

🛡 Admin

  • User management — view all accounts, delete users
  • Font management — upload and delete custom fonts for all users
  • Dictionary management — upload StarDict ZIP archives
  • Registration control — enable or disable new-user sign-up
  • Refresh book metadata — re-extract genres, descriptions, and covers from all EPUB files
Reader view
Reader
E-ink mode
E-ink Mode
Dictionary lookup popup
Dictionary
Online library OPDS browser
Online library OPDS browser
Library view
Library view
Dark mode
Dark mode
↑ Top

Installation

Deploy with Docker or build from source

Docker (Recommended)

The quickest way to run Codexa is with Docker Compose.

1. Create your compose file

cp docker-compose.sample.yaml docker-compose.yaml

Or create docker-compose.yaml with this content:

services:
  codexa:
    image: ghcr.io/thehijacker/codexa:latest
    container_name: codexa
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - codexa_data:/data
    environment:
      JWT_SECRET: "replace_with_a_long_random_secret_string_at_least_64_chars"
      # CORS_ORIGIN: "https://books.example.com"
      # PORT: "3000"
volumes:
  codexa_data:

2. Generate a JWT secret

JWT_SECRET is required and must be at least 64 characters. The server will refuse to start without it. Generate one with either command:

node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
openssl rand -hex 64

Paste the output into docker-compose.yaml as the value of JWT_SECRET.

⚠ Keep your JWT secret safe Changing JWT_SECRET will invalidate all active sessions — every user will be logged out. Store it in a password manager or secrets vault.

3. Start the container

docker compose up -d

Codexa is now running at http://localhost:3000. Register the first account — it will automatically become the admin.

Environment Variables

VariableRequiredDefaultDescription
JWT_SECRET Yes Long random string (≥ 64 chars). Signs session tokens. Changing it logs everyone out.
PORT No 3000 TCP port the server listens on.
DATA_DIR No ./data Path to persistent storage (books, covers, fonts, dictionaries, database).
CORS_ORIGIN No same-origin Allowed CORS origin, e.g. https://books.example.com. Only needed when the app is served from a different origin than the API.

Updating

docker compose pull
docker compose up -d

The data volume is preserved across updates. The database schema is migrated automatically on startup.

Manual Build from Source

Requires Node.js ≥ 18.

git clone https://github.com/thehijacker/codexa.git
cd codexa
cp .env.example .env
# Edit .env and set JWT_SECRET
npm install
npm run build
npm start
CommandDescription
npm run buildBundles and minifies the client-side assets. Run this after every pull.
npm startStarts the server. Reads configuration from environment variables or .env.
npm run devStarts with nodemon — auto-restarts on file changes (development only).

Behind a Reverse Proxy

Codexa serves plain HTTP. Put it behind nginx, Caddy, or Traefik to add HTTPS. Set client_max_body_size to at least 300 MB so large EPUB uploads are not rejected.

Nginx:

server {
    listen 443 ssl;
    server_name books.example.com;

    location / {
        proxy_pass         http://127.0.0.1:3000;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        client_max_body_size 300M;
    }
}

Caddy:

books.example.com {
    # Set the max body size to 300MB
    request_body {
        max_size 300mb
    }

    # Proxy all traffic to your app
    reverse_proxy 127.0.0.1:3000
}
↑ Top

Mobile Apps

Install Codexa on any phone or tablet

Progressive Web App (PWA)

The easiest way to use Codexa on mobile. No app store needed — install directly from the browser.

  • Android (Chrome): tap the install icon in the address bar, or open the browser menu and choose "Add to Home screen".
  • iOS (Safari): tap the Share button △ → "Add to Home Screen".
  • Desktop (Chrome/Edge): click the install icon in the address bar.

Once installed, Codexa opens in fullscreen without browser chrome, just like a native app.

Mobile library view
Mobile library
Mobile reader
Mobile reader

Android APK

The Android APK is a native wrapper that integrates Codexa with hardware features not available in a browser.

Installation

  1. Download the APK from the GitHub Releases page.
  2. On your Android device, go to Settings → Security (or Apps → Special app access) and enable Install from unknown sources for your browser or file manager.
  3. Open the downloaded APK and tap Install.
  4. Launch Codexa. On first run you will see a URL input screen — enter your Codexa server address (e.g. https://books.example.com).

Changing the Server URL

From the reader, press the hardware back button twice quickly to return to the server selection screen. You can then enter a new URL.

E-ink Mode

The URL input screen has an E-ink mode toggle. When enabled, Codexa applies a grayscale colour filter system-wide, increases contrast, and disables animations. This setting is saved across restarts.

Hardware Features

  • Volume keys: navigate pages with the physical volume up/down buttons (enable in reader Settings → Device).
  • Portrait lock: prevent screen rotation (Settings → Device).
  • Screen on: keep the display awake while reading (Settings → Device).
  • Fullscreen: automatically hides Android navigation and status bars while in the reader.
Compatibility The Android app is compatible with older WebView versions and handles known quirks in Chrome 83-era WebView found on some e-ink devices.
E-ink mode on Android
E-ink mode
Dictionary on mobile
Dictionary on mobile

iOS App

The iOS app is built with Capacitor and wraps the Codexa web app in a native container. Distribution is available via two paths:

Path A — Free Sideload (no Apple account fee)

  1. Download the .ipa file from the GitHub Actions artifacts (available 30 days after each build).
  2. Install Sideloadly on Windows or macOS. iTunes drivers are required on Windows.
  3. Connect your iPhone/iPad via USB, open Sideloadly, drag in the IPA, and click Start.
  4. On the device: go to Settings → General → VPN & Device Management and trust the developer certificate.
⚠ 7-day expiry Sideloaded apps signed with a free Apple ID expire after 7 days. Re-sign with Sideloadly or use AltStore for automatic renewal over Wi-Fi.

Path B — TestFlight / App Store ($99/year)

With an Apple Developer Program membership you can build and distribute via TestFlight or publish to the App Store. The repository includes a Fastlane configuration for automated builds. See the iOS/ folder for setup instructions.

First Launch

A "Connecting…" splash screen appears briefly. Tap it to enter your Codexa server URL. The app keeps the screen on while reading and hides the iOS status bar for fullscreen content.

↑ Top

Data Directory

Where Codexa stores everything

All persistent data lives in a single directory — ./data by default, or the path set by the DATA_DIR environment variable. Mount this directory as a Docker volume to preserve data across container updates.

data/
├── codexa.db         # SQLite database (WAL mode)
├── books/
│   └── {user_id}/
│       ├── {sha256}.epub
│       └── {sha256}.cbz   # CBR files converted to CBZ
├── covers/
│   └── {sha256}.jpg
├── fonts/
│   └── {fontname}.ttf / .otf / .woff / .woff2
└── dictionaries/
     ├── en-sl/oxford/   # StarDict files inside
     └── merriam-webster/

Details

codexa.db

SQLite database running in WAL (Write-Ahead Logging) mode. Stores users, books metadata, reading progress, annotations, bookmarks, settings, and shelf assignments. The schema is migrated automatically on startup — you never need to run manual migrations.

books/

Book files (EPUB and CBZ) are stored per-user in subdirectories named by the numeric user ID. Each file is named by its SHA-256 hash, so duplicate uploads are rejected (same content = same hash). The original filename is stored in the database. CBR files are converted to CBZ before storage — only .epub and .cbz files appear on disk.

covers/

Cover images extracted from EPUB metadata during upload. Shared across all users (same book hash → same cover). Served directly by the web server with HTTP caching.

fonts/

Custom fonts uploaded by admins. Available to all users in the reader's Text settings. Supported formats: .ttf, .otf, .woff, .woff2.

dictionaries/

StarDict dictionary files. Each dictionary lives in its own subdirectory. The naming convention lang-from-lang-to/dict-name/ (e.g. en-sl/oxford/) is used to infer source and target languages, but any directory structure is valid. Dictionaries are shared across all users.

Backup tip To back up everything, copy the entire data/ directory. The SQLite database can be backed up live with sqlite3 codexa.db ".backup backup.db".
↑ Top

First Login

Register the first account and get started

When you open Codexa for the first time, you will see the login page. No default admin password exists — you must register an account.

Register
Register a new user

Registering

  1. Navigate to your Codexa server URL in a browser.
  2. Click Register on the login page.
  3. Enter a username (3–32 characters, letters, numbers, and underscores only) and a password (minimum 8 characters).
  4. Click Register. You will be logged in automatically.
⭐ First user is the admin The very first account registered on a fresh Codexa instance is automatically the administrator. The admin account has access to user management, font uploads, dictionary uploads, and the registration toggle. There is no separate admin setup step.

Logging In

Enter your username and password on the login page. Sessions last 1 year. If your session expires, you will be redirected to the login page.

Login
Login

Security

  • Passwords are hashed with bcrypt before storage — they are never stored in plain text.
  • Login attempts are rate-limited to 10 per 15 minutes per IP address.
  • Sessions use JWT tokens signed with your JWT_SECRET.

Changing Your Password

Go to Settings → General → Change password. Enter your new password twice (minimum 8 characters) and click Save.

Disabling Registration

After creating all the accounts you need, an admin can disable new-user registration to prevent unauthorised sign-ups. See Settings → Admin.

↑ Top

Settings

Configure KOReader sync, OPDS servers, dictionaries, and admin options

Open Settings by by choosing gear icon Settings option from the left menu sidebar.

Settings panel
Settings panel

General

  • Auto-open last book: when enabled, Codexa automatically opens the most recently accessed book when you visit the library. Stored in your browser's local storage.
  • Change password: enter a new password (minimum 8 characters) and confirm it, then click Save.

KOReader Sync

Codexa can synchronise your reading position with KOReader devices in two ways: using its built-in sync server, or connecting to an external KOSync server.

Built-in KOSync Server

Codexa includes a KOSync-compatible server at /kosync. Enable it with the Internal KOSync server toggle. The settings page will show you the URL to enter in your KOReader device.

In KOReader:

  1. Go to Tools → KOReader Sync
  2. Set Custom sync server to your Codexa URL (e.g. https://books.example.com)
  3. Log in with the same username and password you use in Codexa

Reading positions are synced automatically when you open or close a book. The server stores a high-water mark — it only advances your position, never goes backwards.

External KOSync Server

You can also connect to a separate KOSync-compatible server (e.g. a shared community server). Enter the server URL, username, and password, then tap Test connection. If the test passes, click Save.

The Clear button removes all stored external server credentials.

OPDS Servers

Add catalog servers that appear in the Online library.

  • Click Add OPDS server to expand the form.
  • Enter a server name, the catalog URL, and optional username and password for protected catalogs.
  • Click Add server to save.
  • Each saved server has Open (go to Online library), Edit, and Delete buttons.

Dictionaries

Every user can configure their own dictionary preferences independently — changes here are personal and do not affect other users. The dictionary files themselves are global (installed by an admin and available to everyone), but the order and language labels are stored per account.

  • Language labels: set From and To language codes (ISO 639-1, e.g. en, de) for each installed dictionary.
  • Order: click the up/down arrows to change which dictionary's results appear first during lookup.

Changes take effect immediately in the reader.

Admin

The Admin section is visible only to the administrator. Admins are identified as the user with the lowest ID (the first account ever registered on this server).

Registration

Toggle Allow new registrations to enable or disable the registration link on the login page. Disable this after setting up all accounts to prevent unauthorised sign-ups.

User Management

Lists all registered users. Click the delete (×) button next to a user to permanently remove their account and all associated books, annotations, and settings.

Font Management

Upload custom fonts that will be available to all users in the reader's Text settings. Supported formats: .ttf, .otf, .woff, .woff2. Up to 50 files per upload; maximum 50 MB per file.

The reader automatically groups font files into families based on their filename. If you name files using the convention FontName-Weight.ext, all variants appear as a single entry in the font picker and bold/italic are applied automatically:

  • MyFont-Regular.ttf
  • MyFont-Bold.ttf
  • MyFont-Italic.ttf
  • MyFont-BoldItalic.ttf

Recognised weight keywords: Thin, ExtraLight, Light, Regular, SemiBold, Bold, ExtraBold, Black. Recognised style keywords: Italic, Oblique. Files sharing the same stem before these keywords are grouped into one family ("MyFont" in the example above).

Dictionary Management

Upload a .zip archive containing a StarDict dictionary. The ZIP must contain the .ifo, .idx, and .dict (or .dict.dz) files. Up to 10 ZIPs per upload; maximum 200 MB per ZIP.

The ZIP filename (without .zip) becomes a subfolder inside data/dictionaries/, and the archive contents are extracted into it. For example, uploading en-sl-oxford.zip creates data/dictionaries/en-sl-oxford/. The folder name is also used as the dictionary's ID, so naming ZIPs with a language prefix (e.g. en-de-langenscheidt.zip) lets Codexa infer source and target languages automatically.

Uploaded dictionaries are immediately available to all users. Click the delete button next to a dictionary to remove it from the server.

Refresh Book Metadata

The ↺ Refresh metadata for all books button re-reads genres, description, cover image, publisher, language, ISBN, and page count directly from every EPUB file on disk and updates the database. Title and author are not overwritten so any manual edits are preserved.

Use this after updating books on an OPDS server and re-downloading them, or if books were added to the library before a newer version of Codexa that extracts additional fields (such as genre tags). The same action is also available in the library's Edit mode (select the "All Books" tab, enable Edit, then click ↺ Refresh metadata in the toolbar).

↑ Top

Dictionary Lookup

Look up words instantly using StarDict dictionaries

Dictionary lookup popup showing word definition
Dictionary popup in the reader

How It Works

Dictionary lookup can be triggered in different ways depending on your device:

  • Desktop browser — double-click: double-clicking a word opens the dictionary immediately without any extra steps.
  • Desktop browser — drag selection: drag the cursor over a word or phrase to select it. A bottom toolbar appears; click the dictionary icon to look up the selection.
  • Mobile / touch: long-press a word to open the bottom toolbar, then tap the dictionary icon.
Bottom toolbar with dictionary icon
Bottom toolbar — appears on selection (desktop) or long-press (mobile)

A bottom sheet slides up showing all definitions found across your enabled dictionaries. If multiple dictionaries are enabled, each result is labelled with its dictionary name. If no exact match is found, Codexa shows words with similar spelling as suggestions.

Installing Dictionaries

Codexa uses the StarDict format. A dictionary consists of at least three files:

  • .ifo — dictionary metadata (name, word count)
  • .idx — word index
  • .dict or .dict.dz — compressed definitions

Option 1 — Upload a ZIP (admin)

  1. Create a ZIP archive containing the StarDict files for one dictionary.
  2. Go to Settings → Admin → Dictionaries.
  3. Click Upload dictionary ZIP and select your file.
  4. The dictionary is extracted and becomes immediately available to all users.

Option 2 — Place files directly

Copy StarDict files into the data/dictionaries/ folder on the server. Arrange them in subdirectories — one subdirectory per dictionary. The naming convention lang-from-lang-to/dict-name/ (e.g. en-sl/oxford/) is optional but allows Codexa to infer the dictionary's language.

No server restart is required — dictionaries are discovered at lookup time.

Enabling and Reordering

  • In the reader sidebar → Dictionaries tab: toggle checkboxes to enable/disable dictionaries for the current session. Use the up/down arrows to change priority.
  • In Settings → Dictionaries: set language labels (From/To) and change the default order. Preferences are saved to your account.

Dictionaries higher in the list appear first in the lookup popup.

Dictionary settings
Enable and reorder dictionaries
↑ Top

Online Library

Browse and import books from any OPDS-compatible catalog

Online library OPDS browser showing catalog entries
Online library OPDS browser with catalog navigation

Getting Started

OPDS (Open Publication Distribution System) is a standard catalog format supported by Calibre-Web, BookOrbit, Booklore, Komga, Kavita, Ubooquity, Bookwyrm, and many other self-hosted book servers. There are also a number of public OPDS catalogs available online. To browse an OPDS catalog, you must first add it as a server in Codexa.

  1. Go to Settings → OPDS Servers and add at least one server (name, URL, and optional credentials).
  2. Open the Online library from the sidebar.
  3. Select a server from the left pane to browse its catalog.

Browsing

  • Navigate folders by clicking on them — a breadcrumb trail shows your location.
  • Book covers and titles are shown in a grid. Click a book to see its details and download options.
  • If the server supports OpenSearch, a search box appears at the top of the catalog pane.
  • Paginated feeds are loaded automatically as you scroll.

Downloading a Single Book

Click any book in the catalog → click Add to library. The EPUB is saved to your Codexa library immediately. Metadata (title, author, cover, series) is extracted automatically.

Folder Sync to Shelf

Navigate to any folder in the OPDS catalog and click Sync to Shelf button on top right side of the folder icon. This bulk-imports the entire folder into a Codexa shelf, keeping it in sync with the source catalog.

  • A pre-flight count is shown before you confirm — so you know how many books will be downloaded.
  • Progress is streamed in real time. Books already in your library are skipped (no duplicate downloads).
  • Books that were previously synced but are no longer in the catalog are flagged as stale.
  • Re-running a sync on the same shelf adds new books and reports removals without deleting anything automatically.
  • Tick Force redownload all books before confirming to re-download every book in the folder regardless of whether it already exists in the library. Each file is replaced on disk, its MD5 is recomputed, and all metadata fields (genres, description, cover, language, etc.) are refreshed from the new file. Title and author are not overwritten. Use this after updating book files or metadata on the OPDS server.
Supported catalog types Codexa handles both OPDS 1.x (Atom XML) and OPDS 2.x (JSON) catalogs, and resolves relative URLs and authentication automatically.

Linked Shelves

When you run Sync to Shelf for the first time, Codexa records the OPDS server and folder URL on that shelf — making it a linked shelf. Linked shelves appear with a distinct icon in the sidebar so you can tell them apart from manually-created shelves at a glance.

Whenever you open a linked shelf in the library, a banner appears at the top showing the last sync date and time alongside two quick-action buttons:

  • Open in OPDS — switches to the Online Library panel and navigates directly to the source folder. You can browse new arrivals or individually pick books to download without running a full sync.
  • Sync again — opens the sync dialog pre-filled with the source folder and always targets the same shelf, even if the shelf has been renamed since the original sync.

Automatic Background Sync

Opening a linked shelf also triggers a silent background sync. Codexa checks the source OPDS folder for new books and downloads any it finds — no dialog, no spinner, no interruption to your browsing. A one-hour cooldown per shelf prevents repeated checks when you switch shelves quickly.

  • If new books are found while you are viewing the shelf, the library refreshes automatically.
  • If new books are found while you are on a different shelf, a badge appears on the linked shelf's sidebar entry showing the count. The badge clears when you open that shelf.
  • Stale-book warnings (books removed from the catalog) are never shown during auto-sync — they appear only on a manual Sync again.

Removing the Link

To detach a shelf from its OPDS source, hover over the shelf in the sidebar, click the edit (✎) icon, and press Unlink from OPDS. The shelf and all its books are kept; only the OPDS connection is removed. The shelf reverts to a regular manually-managed shelf.

Shelf identity is preserved Re-syncing a linked shelf always updates the same shelf by ID, not by name. You can freely rename the shelf in the sidebar without breaking the OPDS link.
↑ Top

Themes

Light, dark, sepia, and e-ink display modes

Reader Themes

Codexa includes seven reading themes. Select one in Reader → Settings → Theme.

ThemeDescription
LightWhite background, dark text — classic day reading.
SepiaWarm cream background, dark text — easy on the eyes in bright rooms.
DarkDark grey background, light text — comfortable in dim light.
Sepia DarkWarm dark background, light text — combines warmth with low brightness.
MidnightPure black background, light text — maximum battery saving on OLED.
NordCool blue-grey palette inspired by the Nord colour scheme.
CustomPick your own background and text colour using colour pickers that appear when this theme is selected.

Override Book Styles

Enable Override book styles in the Theme tab to force the reader's fonts and colours on books that define their own CSS. Useful for books with hard-coded dark text that doesn't adapt to dark themes.

E-ink Mode

E-ink mode switches the entire interface to high-contrast black and white, disables colour transitions and shadows, and reduces animations. It is designed for e-ink display devices such as BOOX readers.

E-ink mode on a BOOX device
E-ink mode — desktop view
E-ink mode on mobile
E-ink mode — mobile

Enabling E-ink Mode

  • In the reader: Settings → Theme tab → enable E-ink mode.
  • Android app: toggle on the server URL input screen. The setting is persisted across restarts — no need to re-enable after closing the app.
  • From the library: tap the theme icon in the library header and select E-ink. This switches the library to black and white and also forces the reader into e-ink mode whenever a book is opened.

App Theme (Library)

The library interface follows the system's light/dark preference automatically. An Appearance selector at the bottom of the library sidebar lets you lock it to Light, Dark, System, or E-ink independently of the system setting. When E-ink mode is selected here, the reader automatically opens in e-ink mode as well — no need to configure it separately inside the reader.

Display Size

On large, high-resolution screens — 7–10″ e-ink readers (BOOX, ...), tablets, and even big desktop monitors — a standard interface can feel cramped. The Display size selector at the bottom of the library sidebar scales the whole library up so it's comfortable to read and tap, with an even, predictable progression. Larger sizes also flow into the touch-friendly layout (collapsible hamburger menu, full-width book grid) where there's room.

OptionEffect
AutoDefault. Uses the device's native size — no scaling.
LargeEnlarges the interface about 1.25×.
LargerEnlarges the interface about 1.5×.
LargestEnlarges the interface about 1.75× — the biggest comfortable step.

The setting applies instantly (no reload), is remembered per device, and is independent of the theme. It affects the library; the reader has its own size controls (font size, status-bar text, and header-button size in Reader → Settings).

Works everywhere Display size now works on desktop browsers too, not just phones, tablets, and the Android app — Codexa automatically picks the right scaling technique for each platform, so the control behaves the same wherever you read.
↑ Top

Supported Languages

The Codexa interface is available in 7 languages

LanguageCodeStatus
EnglishenDefault
GermandeAvailable
FrenchfrAvailable
ItalianitAvailable
SpanishesAvailable
PortugueseptAvailable
SlovenianslAvailable

How Language is Selected

Codexa detects the preferred language from your browser's Accept-Language header and loads the appropriate locale file automatically. If your browser language is not supported, English is used as the fallback.

Hyphenation Languages

The reader supports automatic word hyphenation for the following languages (configured in Settings → Text → Word hyphenation):

Slovenian, English, German, French, Italian, Spanish, Portuguese, Dutch, Polish, Czech, Croatian, Slovak, Russian, Ukrainian

Hyphenation dictionaries are selected per-book. If a book's language metadata matches one of the supported languages, it is pre-selected automatically.

↑ Top

Uploading Books

Add EPUB, CBZ, and CBR files to your library

Accepted Formats

FormatExtensionDescription
EPUB.epubStandard e-book format — reflowable or fixed-layout
CBZ.cbzComic Book ZIP — a ZIP archive of ordered image files
CBR.cbrComic Book RAR — automatically converted to CBZ on the server

Maximum file size is 300 MB per upload.

Upload Methods

File Picker

  1. Open the library.
  2. Click the Upload button (⇧ icon) in the toolbar.
  3. Select one or more .epub, .cbz, or .cbr files from your device.
  4. The files are uploaded, metadata is extracted, and covers are generated automatically.

Drag and Drop

Drag one or more files from your file manager and drop them anywhere on the library page. A drop overlay appears to confirm the action.

From Online Library

Navigate to a book or comic in the Online Library and click Add to library. EPUB, CBZ, and CBR files are all supported. CBR files are detected by their file signature and converted to CBZ automatically.

OPDS Folder Sync

Use Sync to Shelf in the OPDS browser to bulk-import an entire catalog folder. See Online library for details.

Duplicate Detection

Codexa computes a SHA-256 hash of each uploaded file. If the same content already exists in your library, the upload is rejected with a friendly message — no duplicates are stored. CBR files are converted to CBZ before hashing, so re-uploading the same comic as either format is correctly detected as a duplicate.

Metadata Extraction

EPUB

The following metadata is extracted automatically from the EPUB OPF file:

  • Title, author
  • Cover image
  • Series name and number (Calibre tags or EPUB3 belongs-to-collection)
  • Description, publisher, language, ISBN
  • Genre tags, page count

CBZ / CBR

If the archive contains a ComicInfo.xml file (the standard comic metadata format), Codexa extracts:

  • Title, series name and number
  • Writer and penciller (combined into the author field)
  • Summary (description) and genre
  • Cover image (first image in the archive, sorted by filename)
  • Page count

If ComicInfo.xml is absent, the filename is used as the title and the first image becomes the cover.

If a book is missing genres or other fields (for example because it was uploaded before a newer version of Codexa), use Settings → Admin → ↺ Refresh metadata for all books to re-extract everything from the files on disk.

↑ Top

Library

Browse, search, and organise your book collection

Library grid view with book covers
Library grid
Library search results
Real-time search

Browsing

Books are shown as a grid of covers. Below each cover the title, author, series (if any), and a reading progress bar are displayed.

Desktop (mouse): hover over a cover to reveal the action buttons. Click the cover or any empty area on the card to open the reader directly.
Touch: a single tap reveals the action buttons. A second tap on the card opens the reader.

The action buttons that appear on each card are:

  • 👁 Cover preview — shows the full-size cover image in a popup (only shown when the book has a cover).
  • ℹ Info — opens the book details dialog with metadata, shelves, KOSync status, and quick actions.
  • Download / Delete offline — caches the EPUB locally for offline reading, or removes it from the local cache if already downloaded. A ✓ badge on the cover indicates a book is cached.
  • Read — opens the book in the reader immediately, resuming from the last position.

A Peek button is also permanently visible in the bottom-right corner of every cover (shown on hover on desktop, always visible on touch). Peek opens the book without saving your reading position — useful for a quick preview.

A ⋮ quick menu is available at the bottom-right corner of every book card. Click or tap it to open a compact popup with the same four actions — Read, Peek, Info, and Download/Remove offline — without needing to hover over the cover first. This is particularly useful on touch devices where the hover actions are not always easy to reach.

The search bar at the top of the library filters books in real time by title and author. Results update as you type — no need to press Enter.

Sort Order

Click the sort menu (☰) in the library toolbar to change the sort order:

  • Recently Added — newest uploads first (default)
  • Last Opened — most recently read books first
  • Title — alphabetical by book title
  • Author — alphabetical by author name
  • Progress — sort by reading percentage
  • Series — group by series name and number

Density Toggle

Click the density button (▦) to cycle through three cover sizes: compact (more books per row), normal, and large. Your preference is saved.

Library Shelf Tabs

The sidebar shows three built-in views at the top of the Shelves section:

  • All Books — every book in your library.
  • Currently Reading — books you have opened at least once, not yet at 100%.
  • Downloaded — books cached for offline reading.

Edit Mode

Click the Edit button to enter edit mode. In edit mode you can:

  • Select multiple books by tapping their covers.
  • Assign selected books to one or more shelves.
  • Delete selected books (with confirmation).

Click Done to exit edit mode.

Reading Statistics

Codexa tracks your reading activity per book and in aggregate. Statistics include time read, pages turned, reading sessions, books started, and books finished. Access per-book statistics from the Book Details dialog → Reading tab.

↑ Top

Shelves

Organise your books into named collections

Shelves are custom collections that appear in the left sidebar. Use them to group books by genre, reading list, project, or any organisation that suits you.

Creating a Shelf

  1. In the sidebar, find the Shelves heading.
  2. Click the + icon next to it.
  3. Enter a name for the shelf and press Enter or click Save.

Adding Books to a Shelf

  • From edit mode: click Edit in the library toolbar, select the books you want to add, then click Add to Shelf and choose the target shelf.
  • From book details: open the Book Details dialog → Shelves tab → toggle the shelf checkboxes.

Editing and Deleting Shelves

Hover over a shelf name in the sidebar to reveal the edit (✎) and delete (×) buttons. Deleting a shelf removes the shelf but does not delete the books in it.

OPDS Folder Sync

Navigate to any folder in the Online Library and click the Sync to Shelf button. The folder's books are downloaded and added to a named shelf. Re-running the sync:

  • Downloads new books that appeared in the catalog since the last sync.
  • Skips books already in your library (duplicate detection by file hash).
  • Reports books that were removed from the catalog (stale books) — you decide whether to keep or remove them.

Linked Shelves

After a sync, the shelf becomes linked to the OPDS source folder. Linked shelves have a distinct icon in the sidebar and show a banner across the top of the library displaying the last sync time and two buttons:

  • Open in OPDS — jumps straight to the source folder in the Online Library without any manual navigation.
  • Sync again — reopens the sync dialog targeting this shelf. Even if you rename the shelf, the link is preserved — the sync always updates the correct shelf.

Opening a linked shelf also triggers a silent background sync. New books are downloaded automatically without any dialog. If new books arrive while you are browsing a different shelf, a badge on the sidebar entry shows the count of new books waiting. The background sync runs at most once per hour per shelf.

To remove the OPDS link, click the edit (✎) icon on the shelf and press Unlink from OPDS. The shelf and its books are kept; it simply becomes a regular shelf.

Manually-created shelves are never linked. Only shelves created (or updated) by an OPDS sync have the linked icon and banner.

↑ Top

Offline Reading

Read your books without an internet connection

Offline reading indicator
Offline indicator in the reader

How It Works

Codexa uses a Service Worker to cache files in your browser. There are three stores working together:

  • App shell cache — the HTML, CSS, JavaScript, and fonts that make up the Codexa interface. This is cached automatically on your first visit, so the app loads without a network connection even if you haven't downloaded any books.
  • Book cache — the book files (EPUB and comic CBZ/CBR) you download for offline use, together with their cover images. Each book is stored individually and can be removed without affecting other cached books.
  • On-device database (IndexedDB) — book metadata (title, author, cover, reading percentage) plus your bookmarks and highlights. This lets the library and reader show the right information while you're offline.

A book counts as available offline only when its file is genuinely in the book cache — the Downloaded shelf reflects what is actually on the device, so you never see a book you can't open.

Downloading a Book for Offline Use

  1. Tap a book cover in the library to open its details.
  2. Click Download for offline reading.
  3. Progress is shown in the dialog. When complete, the book is available offline.

You don't always have to do this manually: while you're online, Codexa quietly downloads the books you're currently reading in the background, so they're ready if you lose connectivity. Both the file and its cover are cached.

Reading Offline

When your device has no network connection, the library automatically switches to showing only downloaded books. All reader features work normally offline:

  • Your reading position is saved on the device as you turn pages and when you close the book.
  • Bookmarks and highlights are stored in IndexedDB (the on-device database).
  • Dictionary lookups work for dictionaries that are served from your server (available offline only if the server is reachable or the dictionary is cached).

What Happens When You Come Back Online

Any reading you did offline is synced automatically the moment Codexa can reach the server again — you do not have to reopen the book. Each position you read offline is held in a small on-device queue and then flushed:

  • It's written to your Codexa reading progress and pushed to KOReader sync (KOSync), so other devices and KOReader pick it up.
  • Syncing only ever moves progress forward. If you'd already read further on another device, that position is kept — your offline session won't roll it back.
  • The queue is reliable: if you reconnect while reading a different book, positions from earlier offline sessions still sync, and anything that can't be sent yet is retried on the next reconnect or app launch.

At the same time, OPDS catalog data refreshes and any new books added on the server appear in the library.

Removing a Downloaded Book

Open the book's details dialog and click Remove from device. The EPUB is removed from the local cache but remains in your server library.

You can also view all downloaded books in the Downloaded shelf in the library sidebar.

↑ Top

Book Details

View metadata, manage shelves, and access sync options

Book details dialog with tabs
Book details dialog

Open the book details dialog by tapping the ℹ Info button on a book card. It has four tabs and five quick-action buttons at the top.

Quick Actions

ButtonAction
ReadOpen the book in the reader, restoring your last position.
PeekOpen in read-only mode — your reading position is not saved. Useful for previewing a book without advancing your progress.
DownloadDownload the EPUB file to your device (Save As dialog).
OfflineCache the book for offline reading (or remove from cache).
DeletePermanently delete the book from your library (with confirmation).

Details Tab

Shows the book's full metadata:

  • Cover image
  • Title, author
  • Series name and number
  • Tags / genres
  • Publisher, publication language, ISBN
  • File size, date added to library
  • Current reading progress (percentage and last position)
  • Description (from EPUB metadata)

Shelves Tab

A list of all your shelves with checkboxes. Toggle a shelf to add or remove this book from it. Changes are saved immediately.

Book details dialog with shelves tab
Book details shelves dialog

KOSync Tab

Shows the reading progress last received from your KOReader device:

  • Current position (CFI) and percentage
  • Device name and sync timestamp

KOSync hash override: KOReader identifies books by an MD5 hash of the file. If your Codexa EPUB and KOReader's copy are slightly different (e.g. different editions), the hashes won't match. Enter the MD5 hash from KOReader here to link them manually.

Re-download from OPDS: if this book was originally imported from an OPDS source, you can force-download the latest version from that source URL.

Book details dialog with KOSync tab
Book details KOSync dialog

Reading Tab

  • Last read position and percentage
  • Total reading time and number of sessions
  • Annotation (highlight + note) count
  • Bookmark count
Book details dialog with Reading tab
Book details Reading dialog
↑ Top

Reader

Everything available inside the Codexa reader — EPUBs and comic books

Reader interface overview
Reader overview

Interface Overview

The reader has three main areas:

  • Header bar — buttons for TOC, bookmarks, highlights, search, jump, settings, fullscreen, and back to library. Can be set to auto-hide while reading. Search and annotation buttons are hidden when reading comics (image-only files have no text to select).
  • Reading area — book content rendered by CXReader, Codexa's custom engine. The left and right edges are tap/click zones for page navigation.
  • Status bar — configurable overlay slots at the top and bottom of the screen showing page numbers, progress, time estimates, and more.

Navigation

Tap / Click

  • Right half of the screen (configurable percentage) → next page
  • Left half of the screen (configurable percentage) → previous page

The centre of the screen is reserved for text selection and dictionary lookups.

Swipe (touch)

  • Swipe left → next page
  • Swipe right → previous page

Keyboard

KeyAction
/ Space / Page DownNext page
/ Page UpPrevious page
KToggle Table of Contents
IToggle Search
SToggle Settings
FToggle fullscreen
EscClose open panel — or return to library

Mouse Wheel

Enable mouse-wheel page turning in Settings → Device → Mouse wheel navigation.

Volume Keys (Android App)

Enable in Settings → Device → Volume key navigation. Swap the direction with Swap volume key direction.

Table of Contents

Table of contents sidebar
Table of contents

Press K or tap the TOC button (☰) in the header. The current chapter is highlighted. Tap any chapter to jump to it — the sidebar closes automatically.

Bookmarks

Bookmarks sidebar
Bookmarks panel
  • Tap the Bookmarks button (🔖) — the badge shows the count.
  • Click + to save your current position. The bookmark is labelled with the chapter title by default.
  • Tap any bookmark to jump to it; a Back / Accept button pair appears so you can return or confirm.
  • Rename a bookmark with the pencil icon; delete with ×.
  • Bookmarks are stored per user and available on all devices.

Highlights & Annotations

Annotation toolbar after text selection
Annotation toolbar
Annotations list sidebar
Annotations list

Creating a Highlight

  1. Select text by pressing and holding (mobile) or clicking and dragging (desktop).
  2. The annotation toolbar appears above or below the selection.
  3. Tap a colour button (yellow, green, blue, pink) to save the highlight.

Adding a Note

After selecting text, tap the pencil (✎) button in the toolbar. Type your note (up to 1000 characters) and click Save.

Viewing All Annotations

Tap the Highlights button in the header to open the annotations sidebar. All highlights are listed in reading order with colour indicator, highlighted text, and any attached note. Tap an entry to jump to its position.

Editing or Deleting a Highlight

Tap an existing highlight in the text. An edit sheet slides up from the bottom showing the highlighted text, a colour picker, an edit note button, and a delete button.

Dictionary Lookup from Selection

After selecting text, tap the magnifying glass (🔍) button in the toolbar to look up the selection without saving a highlight.

In-book search panel
Search panel

Press I or tap the search button. Type a word or phrase and press Enter. Results are grouped by chapter with surrounding context. Tap any result to jump to it. A Back / Accept button pair lets you return to your original position or confirm the jump.

Dictionary Lookup

Dictionary definition popup
Dictionary popup

Desktop: double-click a word to open the dictionary directly. To look up a selection, drag to select it and tap the dictionary icon in the bottom toolbar.
Mobile: long-press a word to open the bottom toolbar, then tap the dictionary icon. A bottom sheet shows definitions from all enabled dictionaries.

Footnotes

Footnote popup
Inline footnote popup

Tap any footnote or endnote marker. The note content appears in a popup at the bottom of the screen — you don't need to leave your reading position. Tap × or outside the popup to dismiss.

Reading Progress & Session Recovery

Your reading position is saved automatically as you read. If you close the browser or app mid-chapter, a resume banner appears the next time you open the library. Tap Resume to jump back, or Dismiss to ignore it.

Resume closed book
Resume closed book

Jump to Position

Jump to position slider
Jump to position

Tap the percentage button (%) in the header. Drag the slider to any position. Chapter markers on the slider show chapter boundaries. Use the Previous / Next chapter buttons to jump to adjacent chapters.

Fullscreen Mode

Press F or tap the fullscreen button (▢) to hide all browser chrome. Press F again or Esc to exit. A small exit button also appears in the corner.

Reading Settings

Reader settings panel with tabs
Settings panel (⚙ button or S key)

Press S or tap the settings button (⚙). Settings are saved globally and apply to all books. Use Reset for this book at the top of the panel to clear any per-book overrides.

Theme Tab

Theme settings tab
Theme settings
Header button toggles
Header button toggles
  • Theme: Light, Sepia, Dark, Sepia Dark, Midnight, Nord, Custom. Selecting Custom reveals a background colour picker and a text colour picker.
  • Override book styles: forces the reader's fonts and colours on books with their own CSS.
  • E-ink mode: high-contrast black-and-white for e-ink displays.
  • Page border (book spine): shows a thin shadow along the centre spine in two-page spread mode.

Header buttons

Toggle individual buttons in the reader toolbar on or off. Hidden buttons are simply removed from the header; their features remain accessible elsewhere (e.g. the bookmarks panel). Available toggles:

  • Highlights — show/hide the annotations button.
  • Search — show/hide the in-book search button.
  • Percentage — show/hide the reading-progress percentage button.
  • Sync — show/hide the KOSync/progress sync button.
  • Sleep timer — show/hide the sleep timer button.
  • Fullscreen — show/hide the fullscreen toggle button.
  • Bookmark count badge — shows a small number badge on the bookmark button indicating how many bookmarks the current book has.
  • Highlight count badge — shows a small number badge on the highlights button indicating how many highlights the current book has.

Classic reader (epub.js)

By default Codexa uses CXReader, its own purpose-built EPUB engine. Enabling Classic reader (epub.js) switches back to the original epub.js library. The book reloads immediately when you toggle this setting. Use this only if you encounter a rendering issue specific to CXReader; most features work better with CXReader off.

Text Tab

Text settings tab
Text settings
  • Font: system fonts + any custom fonts uploaded by an admin.
  • Font size: 12–36 px.
  • Line spacing: 1.0–3.0.
  • Letter spacing: 0–10 px.
  • Paragraph indentation: toggle + depth slider (0.5–4 em).
  • Paragraph spacing: 0–3 em extra space between paragraphs.
  • Chapter heading spacing: compresses whitespace before headings.
  • Hide empty lines: collapses blank paragraphs.
  • Left-align text: disables CSS justification.
  • Word hyphenation: automatic hyphenation at line breaks; language-aware.
  • Bionic reading: bolds the first ~40% of each word to guide the eye.

Page Tab

Page layout settings tab
Page settings
  • Page layout: Single page or Two pages (spread — side-by-side like an open book).
  • Margins: horizontal margin between text and screen edge (0–120 px).
  • Auto-hide toolbar: hides the header while reading; reveal by moving the pointer to the top or tapping the top edge.
  • Screen edge padding: insets for each side to avoid curved edges and notches.

Device Tab

Device settings tab
Device settings
  • Keep screen on: prevents sleep using the browser WakeLock API (requires HTTPS).
  • Mouse wheel navigation: scroll wheel turns pages.
  • Portrait lock: locks orientation to portrait.
  • Volume key navigation (Android app only): hardware volume buttons turn pages.
  • Swap volume key direction (Android app only): reverses which button goes forward.
  • Skip progress check on open: opens the book from the beginning instead of the last position.
  • Skip auto-save on close: prevents position from being saved when leaving the reader.

Status Bar Tab

Status bar settings tab
Status bar settings

Place information overlays in up to six positions around the reading area: top-left, top-centre, top-right, bottom-left, bottom-centre, bottom-right.

[ top-left ]   [ top-centre ]   [ top-right ]
─────────────────────────────────────────────  ← separator (optional)

         [ book text ]

─────────────────────────────────────────────  ← separator (optional)
[ bot-left ]   [ bot-centre ]   [ bot-right ]

Available information items:

ItemDescription
Chapter page (X/Y)Current page and total pages in the current chapter
Book page (X/Y)Absolute page number across the whole book
Pages left in chapterRemaining pages until the end of the chapter
Pages left in bookRemaining pages in the entire book
Chapter progress %Percentage through the current chapter
Book progress %Percentage through the entire book
Time to end of chapterEstimated time to finish the chapter (from your reading speed)
Time to end of bookEstimated time to finish the book
Current timeSystem clock
Book titleTitle of the current book
Book authorAuthor of the current book
Chapter titleTitle of the current chapter
Chapter numberCurrent spine index and total spine items (e.g. 3/24)
BatteryDevice battery level as a percentage; icon changes to a charging symbol when plugged in (requires browser Battery Status API)
ConnectionShows Online or Offline depending on network connectivity

Additional options: Book progress bar and Chapter progress bar (thin lines at top or bottom), separator lines above/below the status area.

Status bar overlays in action
Status bar overlays

Dictionaries Tab

Dictionaries settings tab
Dictionary settings

Lists all installed dictionaries with their word count. Toggle each on/off, and use the up/down arrows to change lookup priority. Admins see an additional Upload button.

KOReader Sync

Two tap areas in the bottom corners of the reading screen trigger a manual sync:

  • Bottom-left corner — pull the latest position from the sync server.
  • Bottom-right corner — push your current position to the sync server.

If the server position differs from your local position (e.g. you read on another device), a conflict resolution dialog asks which position to use: Stay here or Jump to X%.

Tap zones for KOReader Sync
Tap zones for KOReader Sync

Peek Mode

Open a book in Peek mode (from the Book Details dialog) to read without saving your position. Useful for reviewing a book without advancing your progress tracker.

↑ Top

CXReader Engine

Codexa's own custom-built EPUB and comic rendering library

CXReader is an EPUB reading engine developed entirely within Codexa. It replaces the third-party epub.js library that Codexa originally used and is responsible for parsing, rendering, and paginating all books — EPUBs, fixed-layout EPUBs, CBZ, and CBR comics.

Why We Built It

epub.js is a mature library, but it has known compatibility issues on older Android WebView versions (notably Chrome 83, found on many older e-ink Android devices). On those devices, epub.js's virtual pagination — which relies on translateY transforms and clip-path masking — clips lines at page boundaries and causes fetch() calls to silently hang after a MutationObserver interaction. CXReader was designed from the ground up to avoid these problems.

Additionally, epub.js does not support CBZ/CBR comic files at all. Codexa's CBZ and CBR support is built directly into CXReader.

What's Improved Over epub.js

Areaepub.jsCXReader
Pagination engine Virtual pagination using translateY transforms and CSS clip-path — clips lines on some e-ink WebViews Native CSS multi-column layout — the browser fragments content correctly, no clipping
E-ink compatibility Chrome 83 WebView: fetch() hangs after MutationObserver interactions; requires workarounds Built with legacy WebView quirks in mind; per-path workarounds baked in
Position restore accuracy Restores to approximate percentage; exact page not saved Saves exact page number per chapter; reopens on the precise page with % fallback if layout changes
Fixed-layout EPUB Supported via epub.js's own fixed-layout renderer Supported: detects rendition:layout=pre-paginated, scales each spine item to fit the viewport with CSS transform
Comic books (CBZ/CBR) Not supported Full support: image-only ZIP/RAR archives rendered full-screen with two-page spread on desktop
Annotation CFI precision Full DOM-range CFIs via epub.js's built-in generator Full DOM-range CFIs via CXReader's own generator/resolver — highlights land on the exact word, not just a text search fallback
Font reflow Requires full re-render on font swap Detects layout shifts from late-loading fonts and re-measures only when content height changes
Dependency Third-party npm package Zero external dependencies — all EPUB parsing done client-side with JSZip and the browser's DOMParser

Exact Position Restore

When you turn a page, CXReader saves both the spine index (chapter) and the exact page number within that chapter to localStorage. On reopen, it restores to that precise page.

If the layout changes between sessions — for example because you changed the font size or the window was resized — the saved page may be out of range for the new layout. In that case CXReader falls back to the reading percentage, which lands close to the right place. Once you are reading again, the exact page is re-saved for the next open.

Fixed-layout EPUBs

Fixed-layout EPUBs are books where each spine item (page) has a declared pixel size and precise coordinate-based CSS — typical for manga, children's picture books, art books, and graphic novels in EPUB format. Standard reflowable rendering completely breaks these.

CXReader detects fixed-layout books via the rendition:layout = pre-paginated OPF metadata tag. When detected:

  • Each spine item is rendered in an iframe at its declared pixel dimensions (e.g. 1200 × 1600 px).
  • The iframe is scaled with CSS transform: scale() to fit the viewport — centred horizontally and vertically.
  • The reader's own CSS (fonts, margins, column layout) is not injected so the book's precise styling is preserved.
  • Every page advance moves to the next spine item — one item equals one page.
  • Reflowable EPUBs are completely unaffected.
↑ Top

Comic Books

Read CBZ and CBR comic files alongside your EPUB library

Codexa supports the two most common digital comic formats. They appear in your library exactly like books and can be downloaded for offline reading, organised into shelves, and imported from OPDS servers.

Formats

FormatExtensionContainerNotes
CBZ .cbz ZIP archive of images Preferred format — stored directly on the server
CBR .cbr RAR archive of images Automatically converted to CBZ on the server at upload or import time. The original RAR is never stored.

Both formats are detected by their file signature (magic bytes), not just the file extension — so files with an incorrect extension are still handled correctly.

Supported image types inside the archive: JPEG, PNG, WebP, GIF, AVIF. Images are sorted by filename using natural (numeric) ordering, so page10.jpg sorts after page9.jpg.

Uploading & Importing

Direct Upload

Use the Upload button (⇧) in the library toolbar and select .cbz or .cbr files. Multiple files can be uploaded at once. CBR files are converted to CBZ automatically before being stored — you always get a CBZ in the library.

From OPDS

Navigate to a comic in the Online Library and click Add to library. Codexa downloads the file, detects CBR by its RAR signature even if the server reports the wrong content-type, and converts it to CBZ if needed. Folder sync works the same way — an entire OPDS comic folder can be synced to a shelf in one action.

Reading Comics

Open a comic the same way as any book. CXReader detects the CBZ format automatically and switches to image-display mode.

Single-Page Mode

By default one page is shown at a time, filling the reading area. Navigation works identically to books: tap/click the right half for the next page, left half for the previous page, or swipe left/right on touch screens.

Two-Page Spread (Desktop)

When Two pages layout is selected in Reader Settings → Page, two consecutive comic pages are shown side by side — just like a physical comic book spread. Each navigation step advances by two pages and always stays aligned to even-numbered boundaries (0+1, 2+3, 4+5, …) so spreads never get out of sync.

Background Colour

The background behind the image uses the same colour as the selected reader theme. In the default Light theme this is white; in Dark or Midnight themes it is dark/black. Switch to any theme you prefer — the comic background follows automatically.

Download Progress

Comic files are large. While downloading, Codexa shows the actual download percentage (Downloading file… 45%) instead of an animated ellipsis. On e-ink mode, the percentage updates at wider intervals (every 10%) to reduce screen refreshes.

What's Not Available for Comics

Because comic pages are images, the following text-based features are hidden when reading a comic:

  • In-book text search
  • Highlights & annotations
  • Dictionary lookup
  • Bionic reading
  • Font and text settings

Bookmarks, reading progress, offline download, shelves, and KOReader sync all work normally.

Metadata (ComicInfo.xml)

CBZ files can include a ComicInfo.xml file at the root of the archive. This is a widely-supported standard used by comic management tools such as Mylar3, ComicTagger, and Komga. Codexa reads the following fields from it:

ComicInfo.xml tagCodexa field
TitleBook title
SeriesSeries name
NumberSeries number (issue/volume)
SummaryDescription
Writer + PencillerAuthor (combined)
GenreGenre tags

The metadata is extracted both at upload time (server-side) and when the comic is opened in the reader (client-side). If ComicInfo.xml is absent, the archive filename is used as the title.

↑ Top