Install with Docker Compose
LatestArr runs as one container: the backend and the web UI together, with a SQLite database in a Docker volume. There’s no separate database or cache to run.
Before you start
- Docker with Docker Compose.
- At least one supported source that the container can reach.
- An SMTP server or provider to send from. Read Deliverability before sending to real people, or your digests may land in spam.
Quick start
Get the Compose files
Grab docker-compose.yml and .env.example from the
repository , or clone it.
Create your .env
cp .env.example .envSet ENCRYPTION_KEY. It encrypts source credentials, SMTP credentials, and your alert webhook
URL at rest. Generate one with:
openssl rand -base64 32Back this key up somewhere other than the .env file. If you lose it, every encrypted
credential in the database becomes unreadable and you’ll have to re-enter them all.
Everything else is optional. See Environment variables.
Start it
docker compose pull
docker compose up -dOpen it
Go to http://localhost:3000, create the admin account, and follow the
first-run checklist.
What Compose sets up
| Image | ghcr.io/jshields-ca/latestarr:${LATESTARR_VERSION:-latest} |
| Container | latestarr, restart: unless-stopped |
| Port | ${PORT:-3000} on the host → 3000 in the container |
| Volume | latestarr-data mounted at /app/data (the SQLite database) |
| Runtime | Node 24 on Alpine New in 0.11 |
The container answers GET /health with {"status":"ok"} without authentication, which is handy
for your own uptime checks. The image doesn’t define a Docker HEALTHCHECK itself.
Image tags
| Tag | What it is |
|---|---|
latest | The most recent release. The default. |
vX.Y.Z | A specific release, e.g. v0.11.2. Set LATESTARR_VERSION=v0.11.2 to pin. |
dev | The upcoming release, rebuilt whenever the dev branch is updated. For testers. |
To try the upcoming release, set LATESTARR_VERSION=dev in .env, then pull and restart:
docker compose pull
docker compose up -dDon’t point an instance you depend on at dev. Back up first, and expect to find bugs. That’s
what it’s for.
Without Compose
docker run -d \
--name latestarr \
-p 3000:3000 \
-e ENCRYPTION_KEY="your-generated-key" \
-v latestarr-data:/app/data \
--restart unless-stopped \
ghcr.io/jshields-ca/latestarr:latestPass any other environment variables the same way.
Don’t generate the key inline with $(openssl …): you’d get a new key every time you recreate
the container, and lose access to everything encrypted with the old one.
Building from source
docker compose up -d --build builds from docker/Dockerfile instead of pulling. For a
development setup, see Contributing.