Just one more chapter.
A reader for your books and comics, wherever you keep them.
Get it on the App Store · Website · Docs · Report a problem
▶ Thirty seconds of Chek: widescreen · vertical
Chek is free on the App Store for iPhone and iPad. It's the successor to Chibi Manga, rebuilt from the ground up. Manga and manhwa are at its heart, alongside e-books and every other kind of comic.
- Your own files. EPUB, PDF, CBZ, CBT, MOBI, AZW3, FictionBook, Markdown and plain text. No account needed, and everything works offline.
- Your own server. Read from Chek server, or from Komga and Kavita through it. Your place follows you between devices.
- Quiet by design. No ads, no tracking, no analytics.
This is Chek server, an open-source, self-hosted library server written in Rust. It's optional: the app reads your own files without it.
- Scans folders of books and comics, and reads their metadata: EPUB, ComicInfo, PDF, MOBI, AZW3, FB2, plain text and Markdown.
- Serves files, comic pages and covers, including RAR and 7-Zip comics.
- Syncs each reader's place, bookmarks and highlights between devices.
- Reads Komga and Kavita libraries as its own.
- Runs source extensions built as WebAssembly components.
- Speaks OPDS 2, so apps like Thorium and KOReader can browse it too.
The Chek docs cover installing and running the server, its API, and writing source extensions. Server design covers what's settled and what comes next, and the API contract lives in openapi.yaml.
| Repository | What it is |
|---|---|
| app | The Chek apps for iPhone, iPad and the web |
| chek-reader | The Swift reading engine behind the app |
| chek.page | The website |
The install guide walks through a full setup. The short version:
CI publishes an image for amd64 and arm64:
docker run -d --name chek -p 8080:8080 \
-v chek-data:/data -v /path/to/comics:/library:ro \
ghcr.io/readchek/chek:latest| Tag | What you get |
|---|---|
latest |
The newest release |
edge |
The newest commit on main |
Any tag with -browser, such as latest-browser |
The same, with Chromium for browser-backed extensions |
For a full setup with browser-backed extensions and an optional outbound proxy, use the server Compose deployment. To run a demo instance with the reader test corpus, see deploying a demo instance.
Install libvips for cover thumbnails and libarchive for RAR and 7-Zip comics, then run the server:
apt install libvips-dev libarchive-dev # Debian or Ubuntu
brew install vips libarchive # macOS
cargo run --bin chekOpen http://<server>:8080/admin in a browser. The admin panel asks for the
setup token from the log, creates your admin account, and helps you add a
library and the people who read it. Then read at http://<server>:8080/,
which is the Chek web app. Both are bundled in the Docker image; from a
source build, set CHEK_WEB_DIR to a build of the
web app's
bun run build:server. If the server has an https address,
app.chek.page reaches it too.
To set up without a browser, use the API:
-
Find the setup token. On first start the server has no accounts and logs a one-time token. With Docker, read it from
docker logs chek. -
Create the admin. You get a session token back.
curl -X POST localhost:8080/api/v1/setup \ -H 'content-type: application/json' \ -d '{"setupToken": "<from the log>", "name": "admin", "password": "<password>"}'
-
Add a library. Send the token as
Authorization: Bearer <token>on every other request.curl -X POST localhost:8080/api/v1/libraries -H "Authorization: Bearer $TOKEN" \ -H 'content-type: application/json' \ -d '{"name": "Comics", "path": "/path/to/comics"}' curl localhost:8080/api/v1/libraries/1/publications -H "Authorization: Bearer $TOKEN"
-
Add readers.
POST /api/v1/userscreates an account and chooses which libraries it may open.
Then connect from the app, or point an OPDS 2 reader at
http://<server>:8080/opds/v2/catalog and sign in with a Chek name and password.
Everything is set with environment variables. All of them are optional.
Basics
| Variable | Default | What it does |
|---|---|---|
CHEK_BIND |
127.0.0.1:8080 |
Address to listen on |
CHEK_DATA_DIR |
./data |
Where the database and covers live |
CHEK_SCAN_WORKERS |
cores − 1 | How many files to scan at once |
CHEK_SETUP_TOKEN |
logged at start | Your own setup token, 32 characters or more, so you don't need the log |
CHEK_WEB_DIR |
none; the image sets it | The web app's build, served at / with the admin panel at /admin. CHEK_ADMIN_DIR still works as its old name |
CHEK_MAX_UPLOAD_BYTES |
2 GiB | Largest file an admin can upload with PUT /api/v1/libraries/{id}/files/{path}; the folder must be mounted read-write |
Reaching it from outside
The server speaks plain HTTP. Put it behind a reverse proxy with HTTPS before opening it beyond your home network.
| Variable | Default | What it does |
|---|---|---|
CHEK_TRUSTED_PROXIES |
none | Your proxy's addresses or ranges, comma-separated, such as 10.0.0.0/8, so sign-in limits apply per client |
CHEK_CLIENT_IP_HEADER |
none | Set to CF-Connecting-IP behind Cloudflare |
CHEK_WEB_ORIGINS |
https://app.chek.page |
Origins of the web app allowed to call the API |
Sign-in
| Variable | What it does |
|---|---|
CHEK_PUBLIC_URL, CHEK_OIDC_PROVIDERS, CHEK_OIDC_<ID>_* |
Sign in through OpenID Connect providers such as Authentik, Authelia or Google; see Sign-in providers |
CHEK_DEMO_USERS |
Shared demo accounts with a public password, which can't be changed and keep no reading places |
Sources and extensions
| Variable | Default | What it does |
|---|---|---|
CHEK_SOURCE_SYNC_MINUTES |
60 |
How often Komga and Kavita libraries sync |
CHEK_EXTENSION_IMAGE_CACHE_MB |
2048 |
Disk cache for covers and pages from extensions; 0 turns it off |
CHEK_BROWSER_SOLVER_URL |
none | A FlareSolverr-compatible service, for sites behind Cloudflare |
CHEK_BROWSER_EXECUTABLE |
none | Absolute path to Chromium, for interactive pages |
CHEK_OUTBOUND_PROXY_URL |
none | An HTTP CONNECT proxy for extension traffic; see Extension host |
Logs
| Variable | What it does |
|---|---|
RUST_LOG |
Log level |
OTEL_EXPORTER_OTLP_ENDPOINT |
Sends logs and traces to an OpenTelemetry collector over OTLP/HTTP; the standard OTEL_* variables apply |
A release is a tag on main named by its version, such as 0.3.0, and CI
publishes its image. Run the Release workflow in the Actions tab with the
version, or tag it yourself:
git tag 0.3.0 && git push origin 0.3.0To build the image locally, run docker build -t chek ..
Chek server is licensed under the GNU Affero General Public License v3.0. If you run a changed copy as a service for other people, you share your changes with them under the same license.
The extension SDK in extensions and the contract in
crates/chek-sources/wit are MIT,
so source extensions can use any license.

