Architecture
How daemonless container images are structured and built.
Image Layers
%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '16px' }}}%%
flowchart TB
subgraph base_layer["Base Layer"]
base["base<br/>s6, execline"]
end
subgraph intermediate["Intermediate Layers"]
arr-base["arr-base<br/><small>sqlite3, icu, libunwind...</small>"]
nginx-base["nginx-base<br/><small>nginx</small>"]
end
subgraph arr_apps[".NET Apps"]
lidarr["lidarr"]
prowlarr["prowlarr"]
radarr["radarr"]
readarr["readarr"]
sonarr["sonarr"]
end
subgraph nginx_apps["Nginx Apps"]
nextcloud["nextcloud"]
openspeedtest["openspeedtest"]
organizr["organizr"]
smokeping["smokeping"]
vaultwarden["vaultwarden"]
end
subgraph base_apps["Direct Apps"]
gitea["gitea"]
jellyfin["jellyfin"]
mealie["mealie"]
n8n["n8n"]
overseerr["overseerr"]
sabnzbd["sabnzbd"]
tailscale["tailscale"]
tautulli["tautulli"]
traefik["traefik"]
transmission["transmission"]
transmission-wireguard["transmission-wireguard"]
unifi["unifi"]
woodpecker["woodpecker"]
end
%% Connections
base --> arr-base
base --> nginx-base
arr-base --> radarr
arr-base --> sonarr
arr-base --> prowlarr
arr-base --> lidarr
arr-base --> readarr
nginx-base --> openspeedtest
nginx-base --> organizr
nginx-base --> smokeping
nginx-base --> nextcloud
nginx-base --> vaultwarden
base --> sabnzbd
base --> tautulli
base --> jellyfin
base --> transmission
base --> transmission-wireguard
base --> gitea
base --> tailscale
base --> traefik
base --> mealie
base --> n8n
base --> overseerr
base --> unifi
base --> woodpecker
%% Styling
classDef baseStyle fill:#ab2b28,stroke:#333,color:#fff
classDef intermediateStyle fill:#d35400,stroke:#333,color:#fff
classDef appStyle fill:#2980b9,stroke:#333,color:#fff
class base baseStyle
class arr-base,nginx-base intermediateStyle
class radarr,sonarr,prowlarr,lidarr,readarr,openspeedtest,organizr,smokeping,nextcloud,vaultwarden,sabnzbd,tautulli,jellyfin,transmission,transmission-wireguard,gitea,tailscale,traefik,mealie,n8n,overseerr,unifi,woodpecker appStyle
Layer Descriptions
Base Layer
The base image provides the foundation for all daemonless containers:
- FreeBSD 15 (or 14) minimal base
- s6 - Process supervision
- execline - Scripting language for s6
- FreeBSD-utilities - Core utilities
Intermediate Layers
| Image | Purpose | Key Packages |
|---|---|---|
| arr-base | .NET runtime for *arr apps | sqlite3, icu, libunwind, .NET compat |
| nginx-base | Web server base | nginx |
Application Layer
Final images that users run. Each inherits from either:
base- Direct apps (Python, Go, Node.js apps)arr-base- .NET applications (Radarr, Sonarr, etc.)nginx-base- PHP/web applications (Nextcloud, Organizr, etc.)
Build Order
When a base image changes, dependent images must be rebuilt:
- base changes → rebuild everything
- arr-base changes → rebuild *arr apps only
- nginx-base changes → rebuild nginx apps only
This is handled automatically by the cascade rebuild workflow.
Image Inheritance
FreeBSD 15 Base
└── base (s6, execline)
├── arr-base (sqlite3, icu, .NET compat)
│ ├── radarr
│ ├── sonarr
│ ├── prowlarr
│ ├── lidarr
│ └── readarr
├── nginx-base (nginx)
│ ├── nextcloud
│ ├── organizr
│ ├── openspeedtest
│ ├── smokeping
│ └── vaultwarden
├── transmission
├── tautulli
├── sabnzbd
├── jellyfin
├── gitea
├── traefik
├── tailscale
├── overseerr
├── mealie
├── n8n
├── unifi
└── woodpecker