Start
Pull the image, open Ledger, run the first review.
Pull two images. Start the API with host network and the Docker socket. Open Ledger on loopback.
DATA="$HOME/gegenlesen-data"
mkdir -p "$DATA" "$HOME/gegenlesen-config"
docker pull ghcr.io/pmdroid/gegenlesen:main
docker pull ghcr.io/pmdroid/gegenlesen/runner:main
docker run --rm --name gegenlesen \
--network host \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$DATA:$DATA" \
-v "$HOME/gegenlesen-config:/app/config" \
-e GEGENLESEN_DATA_DIR="$DATA" \
-e GEGENLESEN_OPENCODE_IMAGE=ghcr.io/pmdroid/gegenlesen/runner:main \
ghcr.io/pmdroid/gegenlesen:main
Open http://127.0.0.1:8080. Use setup to pick the two reviewers, the judge, and paste an OpenRouter key. That writes gegenlesen.json in the mounted config dir.
--network host and the matching data path are required. The API starts runner containers and talks to OpenCode on 127.0.0.1. Details: Docker.
Start a review
From the repo you want read, on the host:
gegenlesen review
That packs the working tree with scripts/pack-repo.sh and POSTs /api/jobs. Incremental:
gegenlesen review --parent <job-id>
The CLI talks to http://127.0.0.1:8080 unless you set GEGENLESEN_URL.
From source
On a Mac, Docker Desktop does not share loopback the way a Linux box does. Build with Xcode’s Swift. Mixing it with Command Line Tools /usr/bin/swift produces a module version error. ./scripts/swift and make set DEVELOPER_DIR for you.
scripts/build-runner.sh
make run
make run starts the API on 127.0.0.1:8080 and the Ledger Vite app on port 5173.
API only:
./scripts/swift run GegenlesenAPI serve --data-dir ./var --bind 127.0.0.1 --port 8080
gegenlesen