This guide explains how the documentation for Daemonless images and the daemonless.io website is managed. We use an automated, template-driven approach to ensure consistency across 50+ repositories.
Our documentation follows a "Single Source of Truth" pattern:
- Metadata (
compose.yaml): Each image repository contains acompose.yamlfile with anx-daemonlesssection. This is the Brain of the image. It defines the title, description, ports, volumes, and AppJail-specific options. - Central Template (
README.j2): The logic for how documentation looks (tabs, code blocks, interactive placeholders) is defined in a single file located in the dbuild repository atdbuild/templates/README.j2. - Local README (
README.md): Runningdbuild generatein an image repo renders the template using that repo's metadata to create theREADME.mdyou see on GitHub. - The Website (
daemonless.io): The website is automatically generated by pulling the metadata and READMEs from all repositories and rendering them using the same central template.
If you find a typo in a description, a missing environment variable, or want to update a port:
- Action: Edit
compose.yamlin the specific image repository. - Sync: Run
dbuild generateto update the localREADME.md. - Result: Once merged, both GitHub and the website will be updated automatically.
If you want to add support for a new tool across the entire fleet:
- Action: Edit the central template in the
dbuildrepository:dbuild/templates/README.j2. - Result: Every image in the Daemonless project will instantly receive a new documentation tab for that tool.
To enable the AppJail Director tab for a specific image, add the appjail section to its compose.yaml:
x-daemonless:
appjail:
director:
options:
- "alias:"
- "ip4_inherit:"For complex stacks (like Immich), you can define dependencies:
x-daemonless:
appjail:
depends_on:
- name: database
image: ghcr.io/daemonless/postgres:latest
env:
POSTGRES_PASSWORD: "!ENV '${DB_PASSWORD}'"If an image requires a completely custom README that doesn't fit the template:
- Action: Set
docs: manualin thex-daemonlesssection ofcompose.yaml. - Result: The automation will stop overwriting your
README.md, and the website will pull your manual file as-is.
- dbuild: The primary tool for building images and generating documentation.
dbuild generate: Reconcilescompose.yamlmetadata intoREADME.mdandContainerfile.
- generate_docs.py: The script that builds the website. It imports
dbuildto ensure identical parsing logic.
Don't edit .md files directly unless the repo is marked as docs: manual. Always edit the compose.yaml or the central README.j2 template.