The Docker Compose stack Lemonfiber orchestrates: indexers, download clients, the *arr automation apps, Jellyfin and Seerr — 19 services, all open-source, all pinned.
Status: scaffold. The manifest (
stack.toml) is complete;compose.ymlis a validating subset. See the spec and roadmap (this repo is milestone M1).
This is the load-bearing property: it's a standalone Compose project. Clone
it, set .env, and run it with plain Docker — no lemonfiber binary anywhere:
cp .env.example .env # set DATA_ROOT, and VPN creds if using torrents
docker compose --profile search --profile usenet --profile tv up -d
That's what makes adopting Lemonfiber a reversible decision.
Every service gets exactly one ${DATA_ROOT}:/data mount. Downloads and
media live as subdirectories under it, on one filesystem, so imports hardlink
instead of copy. Splitting them into separate mounts silently breaks hardlinks —
CI rejects it. See spec
ADR-0006.
| File | What |
|---|---|
stack.toml |
The manifest Lemonfiber consumes — services, profiles, forms |
compose.yml |
The stack itself |
.env.example |
Every variable, documented |
stacks/ |
Overlays: NAS/copy mode, Caddy proxy |
config/ |
Seeded service config templates |
Three data edits, no code: a service block in compose.yml, a [[service]] in
stack.toml, and its profile added to the relevant forms. CI holds it to every
rule. See spec
30-repos/media-stack.md.
The spec is canonical — every change cites a spec identifier. Read AGENTS.md and the contributing guide.
Hippocratic License 3.0. The bundled services are each independently open-source (GPL/MIT/Apache); this repo distributes configuration, not their code.