Installation

Lector is distributed as a Docker image. The recommended way to run it is with Docker Compose.

Docker Compose

Create a docker-compose.yml file:

services:
  lector:
    image: ghcr.io/heuwels/lector:latest
    container_name: lector
    restart: unless-stopped
    ports:
      - "3400:3000"   # web UI
      - "3457:3457"   # API (the browser talks to it directly)
    volumes:
      - ./data:/app/data
    environment:
      - NODE_ENV=production
      - API_URL=http://your-server:3457

Then start it:

docker compose up -d

Lector will be available at http://your-server:3400. All data is stored in a SQLite database inside the data directory.

The UI and the API are separate. Lector's web app runs in your browser and calls its API (Hono, on port 3457) directly — there's no server-side proxy. So you must publish port 3457 alongside the UI, and set API_URL to the address your browser uses to reach the API: the same host you open Lector on, port 3457 (e.g. http://your-server:3457). Don't use 127.0.0.1/localhost here unless you only ever open Lector on the server itself — it resolves on the browser's machine, not the server. Behind a reverse proxy, set it to your HTTPS origin instead (see Reverse proxy).

Updating

# Pull the latest image
docker compose pull

# Restart with the new version
docker compose up -d

Your data is stored in a bind mount and will persist across updates. Releases are tagged — pin a version instead of latest if you prefer explicit upgrades (see Compose + env vars).

Next steps