Codex
A self-hosted library server for comics, manga and ebooks.
Codex is a digital library server for comics, manga and ebooks that you run yourself. It scans your folders, reads the metadata inside each file, and serves your collection to a web reader, to apps, and to e-readers.
- Formats: CBZ, CBR, EPUB and PDF, with ComicInfo.xml metadata.
- Reading: a built-in comic reader with continuous scroll and an EPUB reader with typography settings. Progress follows you across devices.
- Apps and readers: a REST API, OPDS 1.2 and 2.0 for e-readers, and a Komga-compatible API for third-party apps. Codex Reader is the iOS app.
- Many users: accounts, roles, API keys and sharing tags.
- From homelab to cluster: SQLite for a single box, PostgreSQL and stateless workers when you need to scale out.
Start with the documentation.
Updates
October 2026
Keep agent worktrees out of the Docker build context; Stop a session that moved nothing from rewriting reading progress; Report a concurrently replayed reading session as a duplicate
September 2026
State scoped imports as coverage, and carry want-to-read across
Let an import actually use external ids, and scope it to a library
Show reading of deleted books, and a confirmed way to delete it; Add a Reading Progress settings page for export and import; Count reading of deleted books, and let a reader purge it
Validate a hand-written filter condition against the field catalog; Add a JSON view of the filter rule, with copy and paste; Show the rule JSON panel under the filter builder
Stop a parked tab from clobbering progress read elsewhere
Honor the sort parameter on unsearched book lists
Codex 2.4.14 released.
Gate progress endpoints on the progress permissions; Require series:read on want-to-read, recommendations, and series exports; Unify the permission wire format and expose plugins-manage in the picker
Move the plugin publish jobs to npm 12
Use the lockfile in the cross-build image too
Install the frontend from the lockfile, not a live re-resolve
Size the webtoon seam overlap to a full device pixel under zoom-out
Measure the away gap from the pause, not the last page turn
Keep 8-bit alpha in the favicon's 16px frame
Switch the app icon to the ice+ember branding
August 2026
Bucket reading activity by the viewer's day instead of UTC
Overlap webtoon pages 1px to stop sub-pixel seams at zero gap
Let a reader drop a series reading direction back to the inherited one
Stop losing the renumber pass a book was waiting on
Give the sorts with guaranteed ties a defined order; Finish giving every ordered list a defined total order; Order on-deck and the error list past their ties
Store per-user reader settings for a series; Carry per-series reading directions over to the account; [breaking] Sync only reading direction per series, not every reader setting
[breaking] Report live scan progress, and purge in seconds not days; Stop book search multiplying its page offset by the page size; Lock every series metadata field the write endpoints touch
Stop per-book analysis racing on positional book numbers
Serve the archive entry the page row names, not the one at that index; Stop dropping AVIF pages at the extension gate; Stop webtoon pages deadlocking on their own lazy load
Remove the duplicate header left by the 2.2.1 release; Make the auth pages follow the color scheme instead of forcing dark; Stop borrowing the book count as a volume or chapter numerator
Make the reading-session rules a shared file instead of test code; Document the preference keys that exist and stop mocking ones that don't
Make the book file endpoint range-capable and conditional; Describe the full response shapes as their own routes; Describe series pages, library book params, and the filter grammar correctly
Keep OIDC login state in the database so any replica can complete it; Stop plugin OAuth and entity events from being trapped in one process
[breaking] Layer configuration with figment and nest env vars with __; Accept the environment value shapes the override layer allowed; [breaking] Make the ad-hoc environment reads real configuration keys
Make webtoon page requests honour the downscale setting; Stop the webtoon reader mutating the DOM when a scroll settles
Disclose sittings that reported no page count
Let the reading dashboard measure pages and books finished; Add calendar-year and all-time ranges to the reading dashboard; Stop the reading dashboard misnaming and mis-ranking series
Keep the activity calendar populated on the one-year range
Make reading statistics work on PostgreSQL
Derive reading progress from an append-only session log; Add a batched endpoint for recording reading sessions; Measure reading time and pages read in all three readers
Retry the initial connection when running migrations
Stop starting processes from exhausting the connection limit
Scaffold the mangabaka recommendations plugin; Generate mangabaka recommendations from library seeds; Keep franchise spam out of mangabaka recommendations
Show a real label for every active task
Serve collection and read list covers as image bytes
July 2026
Reorder filter builder conditions by dragging; Honour the sort parameter on a collection's series; Honour the sort parameter on a read list's books
Explain each release action in its tooltip; Add rating filters and multi-library selection; Resolve rule-backed collection membership at read time
Migrate mangabaka to the api.mangabaka.org host
Expose the want-to-read queue as a virtual collection and read list
Make the mobile search sheet scrollable above the iOS keyboard
Add summary as a filterable field for series and books; Add webLinks manifest capability schema; Add plugins/web-links endpoint resolving webLinks templates
Add collection and read-list membership fields to data exports; Show all catalog fields in the export modal field groups
Shared media grid with sort selectors and drag-and-drop reorder; Manual ordering everywhere, collection summaries, persisted queue sort; Honor the ordered flag when listing collection and read list members
Drop unsafe optional chaining flagged by biome in tests
Persist incognito mode across chapter boundaries
Keep book completion sticky in double-page mode
Bound concurrent image decode to prevent serve OOM
Bridge task progress across processes via LISTEN/NOTIFY
Add --progress and default row-count verification; Add --full-verification report for import and copy; Cap insert batches to the destination bind-parameter limit
Read SQLite UUIDs stored as text, not just blobs
Add entity-driven data transfer engine; Add portable export archive with artifact bundling; Add export, import, and copy database commands
Decode mislabeled Windows-1252 ComicInfo.xml
June 2026
Mark the last book of a series read at the end-of-book overlay
Enable swipe navigation to and on the chapter overlay
Add opt-in page downscaling for smoother turns; Warn that page downscaling is slow and not a flicker fix
Decode preloaded pages to stop swipe-in black flicker; Only decode neighbor pages to prevent mobile OOM crash; Drive swipe track transform imperatively to kill commit flash
Fix swipe page-turn flash and missing snap-back
Swipe down to exit the comic reader; Prevent swipe page-turn from flashing the previous page
Add swipe-paging gesture helpers and setting; Add finger-drag swipe pager and drag input; Enable swipe paging in the comic reader
Make auto-advance countdown configurable and fix webtoon loop; Lock page scroll while the mobile nav menu is open; Keep webtoon scroll restore from drifting backward on reload
Enrich adjacent-book data for chapter-transition panels; Add chapter-transition panel and auto-advance countdown; Show chapter-transition panels in the webtoon reader
Use npm ci for web job and harden cron /n parsing; Use npm ci across web and plugin jobs, harden cron /n parsing
Add detail hover cards to series and book cards
Refresh want-to-read cards and reading feeds without reload
Add multi-select and bulk actions to advanced search; Add Want to Read toggle to card menu; Add bulk add endpoint and toolbar action
Add collections, read lists, and want-to-read schema; Add collection/read-list permissions and repositories; Add want-to-read queue endpoints
Add paginated ReadingFeedSection for keep-reading and on-deck; Add Keep Reading and On Deck tabs with See all links; Show hasUserRating and bookType in active filter chips
Share existing_books_map via Arc to stop scan OOM; Bound image memory to prevent decode OOM
Add IdP bearer token validator and per-provider accepted audiences; Accept IdP bearer tokens on the API and resolve linked users
Anchor webtoon scroll position when images load above the viewport
Add host-configurable plugin log level; Add debug logging across network-backed plugins; Per-plugin log level override, default to server level
Break reverse-RPC deadlock during plugin initialize
Scaffold tsundoku release-source plugin; Add tsundoku feed fetcher and cursor persistence; Add tsundoku external-id matching and candidate mapping
Codex 1.36.1 released.
Add data layer for scheduled user-plugin sync; Fan out scheduled user syncs on a plugin's cron; API for admin sync cron and per-user auto/manual sync
Send library context with sync and recommendation entries; Scope sync push and pull to a plugin's allowed libraries; Scope recommendation generation to a plugin's allowed libraries
Issue refresh tokens for OIDC logins; Store OIDC refresh token to keep SSO sessions alive
Make DB fan-out bound and background pool size configurable; Eliminate list N+1 and SSE-driven refetch storm; Bound per-request DB query fan-out to prevent pool exhaustion
Serve API docs for bare /docs path under active service worker
Delete series external links by ID instead of source name
Add created_at and external ratings to LLM presets
May 2026
Sortable inbox columns and split observed/released dates
Make sidebar scroll when libraries overflow the navbar
Add slim series external-index endpoint for discovery tools; Update openapi-sync paths for crate-split layout
Repair advanced search and filters on mobile
Add per-group search input for long chip lists
Add schema, entities, and repository for sharing-tag access groups; Merge group grants into ContentFilter; Add admin API for access group management
Decouple browser RUM proxy endpoint from SDK exporter
Point rust-embed at workspace-root web/dist
Add opt-in OTLP traces and metrics scaffolding; Instrument plugin RPCs, repositories, scanner, and task worker with OTel spans; Emit OTel counters, histograms, and gauges alongside in-app metrics
Unwire sccache from repo config to keep CI/Docker green; Enable sccache wrapper and document fast-build tooling
Keep session through transient refresh-token failures
Show global presets, allow saving from draft, and offer replace on duplicate
Add unified filter-preset storage for saved filters and advanced search; Add path, format, year, page count, date, and author filter variants; Compose fuzzy index with /list endpoints and add relevance sort
Trust-list external-ID sources, hydrate members in list endpoint; Align series duplicate mocks with hydrated members schema; Stabilize EPUB pointer test against extra ReactReader renders
Detect series duplicates by external ID or normalized title; Add Series tab to duplicate detection UI; Show book title on duplicate cards and prevent overflow
Batch DTO hydration in fuzzy search path
Add in-memory fuzzy index over series and books; Keep fuzzy index live via event-driven incremental updates; Route global search through the fuzzy index behind a runtime flag
Persist refresh tokens with rotation and theft detection; Add /auth/refresh and wire refresh tokens into login/logout; Refresh access tokens transparently on 401 in the web client
Structured tracing for PDF page render path; Add in-memory open-document handle cache service; Route page renders through in-memory handle cache
Expose Ignore and Reset as per-row actions
Add motion provider, easings, useDelayedFlag, and depth tokens; Shadow-based depth and translucent mobile surfaces; Motion layer with press, stagger, theme toggle, and reduced-motion guard
Foundation pass — xs breakpoint, drawer auto-close, overflow fixes; Full-screen search sheet below the xs breakpoint; Reader polish with overflow menu and bottom navigation bar
Show tracking badge and toggle on series cards
Add async BulkTrackForReleases task type and handler; Wire bulk track/untrack endpoints to async task; Switch bulk track/untrack toolbar to queue-then-await pattern
Support shift+click range selection in release tracker
Configurable RPC request timeout per call and per plugin
Auto-ignore releases on disabled axes
Add tri-state isTracked filter for release-tracking series; Plugin progress reporting + aggregated release toasts
Poll-all + reset-all admin actions, plugin FK cascade
Embed frontend in installer-built binaries
Hide Releases nav entry when no release-source plugin is enabled
Harden release-tracking and library-jobs scenarios; Preserve search title in get() responses
Add series_tracking sidecar and series_aliases schema; Add backfill task, tracking API, and UI surface; Add release ledger schema, repos, and HTTP API
Emit progress events from nine more task handlers; Show target titles and live elapsed time in active-tasks badge; Render progress bar and message for live tasks in active-tasks badge
Add per-library scheduled refresh config storage; Add scheduled per-library refresh task type and handler; Add field-group resolver and dry-run mode to series metadata apply
Split total_book_count into separate volume and chapter counts; Add total_volume_count and total_chapter_count to plugin protocol; Apply total_volume_count and total_chapter_count via MetadataApplier
Add series_exports data model, migration, and repository; Add ExportStorage service for atomic file writes; Add series export data collector and bulk rating helpers
April 2026
Add Continue/Read button to series detail page; Add metadata fields, plugin-side filters, and frontend filter UI
March 2026
Fix cross-app progress sync when within-resource progression is zero
Add KOReader sync API for reading progress synchronization; Add R2Progression support for cross-device EPUB reading sync; Add server-side Readium positions for cross-app progression sync
Prevent webtoon progress stuck at 99% when navigating to next volume
February 2026
Add separate fit mode for webtoon vs comic reader
Make webtoon boundary nav arrow-key-only and hide layout toggle; Mark book as read when navigating to next volume
Add IANA timezone support for cron job scheduling; Add accent-insensitive Unicode search via search_title column; Prevent panic on series list with readStatus condition filter
Add book context support for custom metadata templates; Add inline helpers, improved error feedback, and interactive help section; Add select all and fix selection persistence across navigation
Add application.base_url as unified external URL setting; Add centralized data_dir config and plugin file storage; Add admin plugin storage management page
Handle SQLite blob UUIDs and PostgreSQL INT8 in consolidate_authors
Make consolidate_authors migration idempotent for partial failure recovery
Add many-to-many genre/tag support, custom metadata editor, and title_sort_lock; Enrich BookDetail page with full metadata and generic badge chips; Add externalIds support to PluginBookMetadata for book cross-references
Redesign recommendation cards with float-based grid layout; Add hasUserRating filter and fix rating sort for PostgreSQL; Add user-scoped plugin task endpoint for sync status visibility
Move settings to server-side with per-user seed curation; Remove duplicate "Based on" text in recommendation cards; Only exclude read series and enrich instead of filtering local matches
Add glob pattern support for rate limit exempt paths; Display description preview in metadata search results; Correct series download button endpoint URL
Add searchURITemplate to plugin manifests with external search link in metadata modal; Add dynamic document titles to series, book, reader, and search pages; Add collapsible overflow for tags and alternate titles on series detail page
Rewrite plugin scenarios for official store and update docs; Clamp mangabaka search limit to 50, add sort_by config, handle null JSON-RPC result
Add series metadata reset endpoint with bulk support and UI; Add official plugin store with 3D flip card carousel
Make GET and dismiss endpoints non-blocking with SSE task tracking; Add internal_config with search results limit and external ID lookup in search modal; Add series external ID CRUD endpoints and edit modal for series/books
Add configurable task timeout via DB settings; Add private and hiddenFromStatusLists visibility controls to AniList sync; Renumber series books on delete and restore, clear deleted book numbers
Sort search results by title similarity scoring; Stop recording reading progress on v1 page fetch, move to OPDS-only endpoint; Swap sort by and page size positions in library toolbar
Add user plugin system database schema and core infrastructure; Add OAuth authentication flow and user plugin API endpoints; Add plugin storage system with bidirectional RPC and SDK support
Use COALESCE for title sort in v1 series endpoints to handle NULL title_sort values
Set page to last page on mark-as-read and sort on-deck by recency; Correct progress bar click mapping in RTL mode; Use COALESCE for title sort to handle NULL title_sort values
Auto-detect book completion when current page reaches page count
Add OIDC configuration and data model; Implement OIDC service core; Add OIDC API endpoints
Populate genres, tags, links, authors, and alternate titles in series endpoint; Populate book metadata fields (authors, tags, summary, dates)
Improve double-page spread handling and RTL progress bar; Fix double-page spread initialization and page jump on load
Enhance plugin details with two-column layout, metadata targets, and search config indicators
Codex 1.8.1 released.
Add comprehensive book metadata system with plugin support; Add sidecar metadata support for OPF and Mylar series.json; Correct credential_delivery CHECK constraint values for PostgreSQL
Add sort fields, condition filters, and integration tests for Komic compatibility
Handle rate-limited tasks with rescheduling instead of retries
Add missing series read-progress endpoints; Prevent navigation when triggering library menu actions
Book and series search with library filter
Use package.json version in manifests instead of hardcoded values
Change default books per page to 50 in series detail; Add book count to metadata search results; Add cover lock to preserve user cover selection during auto-fetch
Add GET /api/v1/user endpoint for current user profile; Add ZeroPages error type for books with no pages; Add komga-sync tool for reading progress migration
Add external source ID filter and improve metadata display; Add config schema support and improve plugin logging; Handle claim race condition gracefully instead of logging error
Add SSE events for plugin configuration changes; Add preprocessing rules, search templates, auto-match conditions, and external ID tracking; Support custom user directive in docker-compose
January 2026
Upgrade Mantine to v8 and refine card styling; Add series completion filter; Update title_sort automatically when title changes via plugin
Add plugin system for external metadata providers; Add plugin metrics tracking and scheduled thumbnail generation; Add bulk operations and info modals for books and series
Add automated screenshot capture system with Playwright; Show focus ring only for keyboard navigation; Fix PDF fit modes not working on initial page load
Multi-format support: CBZ, CBR (with UnRAR), EPUB, and PDF; Dual database support: SQLite for simplicity, PostgreSQL for scale; Library management: Multiple libraries with customizable scanning strategies