Podman quadlet examples

Complete quadlet files for real self-hosted services, from a one-file test container to a five-app pod.

In short: a quadlet is a small file that podman turns into a systemd service. Rootless examples go in ~/.config/containers/systemd/ and run with systemctl --user; rootful ones go in /etc/containers/systemd/. Every file on these pages passes the quadlet generator and systemd-analyze verify on podman 5.0 and newer. Start with whoami if quadlets are new to you.

Want the big picture first? The homelab connections map shows how these services talk to each other, to your LAN and to the internet, with every protocol and port.

All examples at a glance
ExampleShapeRuns asFiles
whoami quadlet Standalone Rootless 1
Media stack pod: Radarr, Sonarr, Lidarr, Prowlarr, NZBGet, Bazarr Pod Rootless 13
Lidarr next to an existing media pod Standalone Rootless 3
Jellyfin with Intel Quick Sync Standalone Rootless 4
Seerr (Jellyseerr) media requests Standalone Rootless 3
UniFi Network Application and MongoDB pod Pod Rootless 7
AdGuard Home quadlet Standalone Rootful 3
Caddy reverse proxy quadlet Standalone Rootful 4
ntfy with systemd OnFailure alerts Standalone Rootless 9
Gatus status page Standalone Rootless 4
Homepage dashboard with login Standalone Rootless 6
NetAlertX network monitor quadlet Standalone Rootful 1
changedetection.io quadlet Standalone Rootless 2
Recyclarr v8 on a systemd timer Timer job Rootless 4
restic backups with an offsite cloud copy Timer job Rootful 6

Standalone containers

One .container file, usually with a .volume for its data. The simplest quadlet shape.

Pods: several containers as one unit

A .pod file groups containers that share one network namespace, so they talk over localhost.

Timer jobs: backups, syncs and alerts

A one-shot service that a systemd timer or an OnFailure= hook starts, runs once and exits.

Rootless or rootful: which one?

Run a container rootless unless it needs something only root has: a port below 1024 (DNS on 53, HTTP on 80 and 443) or direct access to the host's network interfaces. A compromised rootless container only gets the rights of your user, not root's. For rootless services, turn on loginctl enable-linger so they start at boot without a login.

Have a docker-compose file or a docker run command instead? Convert it with the compose to quadlet converter or the docker run to quadlet converter, and check any unit with the systemd unit explainer.