9e8f1bbeed
Dashboard / frontend (push) Failing after 0s
Dashboard / api (push) Failing after 0s
Lint PowerShell / powershell-lint (ubuntu-latest) (push) Failing after 1s
Python Lint / Lint Python with Ruff (push) Failing after 1s
ShellCheck / Lint shell scripts (push) Failing after 1s
Matrix Smoke / linux-smoke (push) Failing after 1s
Matrix Smoke / distro: cachyos (push) Failing after 15s
Matrix Smoke / distro: linux-mint-21.3 (push) Failing after 15s
Matrix Smoke / distro: debian-12 (push) Failing after 5m21s
Matrix Smoke / distro: fedora-41 (push) Failing after 4m56s
Matrix Smoke / distro: ubuntu-24.04 (push) Failing after 2m13s
Matrix Smoke / distro: rocky-9 (push) Failing after 10m39s
Matrix Smoke / distro: manjaro (push) Failing after 12m11s
Matrix Smoke / distro: opensuse-tw (push) Failing after 11m53s
Matrix Smoke / distro: archlinux (push) Failing after 20m3s
Matrix Smoke / distro: ubuntu-22.04 (push) Failing after 13m49s
Validate .env Schema / tier-1-env-validation (push) Successful in 52s
Validate .env Schema / tier-2-env-validation (push) Successful in 44s
Validate .env Schema / tier-3-env-validation (push) Successful in 52s
Validate .env Schema / tier-4-env-validation (push) Successful in 51s
Validate Extensions Catalog / Check catalog is up-to-date (push) Failing after 9m47s
Secret Scan / Scan for secrets (push) Failing after 21m4s
Validate Docker Compose / Validate Docker Compose files (push) Has been cancelled
Python Type Check / Type check with mypy (push) Has been cancelled
Validate .env Schema / tier-0-env-validation (push) Has been cancelled
Test Linux / integration-smoke (push) Has been cancelled
Lint PowerShell / powershell-lint (windows-latest) (push) Has been cancelled
Matrix Smoke / macos-smoke (push) Has been cancelled
Extension Templates
These files are starter patterns for downstream builders and service authors.
They are templates only; they are not loaded by the service registry until you
copy them into extensions/services/<your-service>/ and rename the manifest to
manifest.yaml.
Files
| Template | Use it when |
|---|---|
service-template.yaml |
You need a commented manifest.yaml starting point |
compose-template.yaml |
Your service has one normal Docker Compose definition |
compose-gpu-swap.yaml |
Your service has a CPU base image and GPU-specific image tags |
compose-gpu-only.yaml |
Your service only runs with a GPU and needs backend-specific compose files |
dashboard-plugin-template.js |
Your service needs a dashboard plugin entry point |
Copy Path
mkdir -p extensions/services/my-service
cp extensions/templates/service-template.yaml extensions/services/my-service/manifest.yaml
cp extensions/templates/compose-template.yaml extensions/services/my-service/compose.yaml
Then edit:
service.idservice.nameservice.container_nameservice.default_hostservice.portservice.external_port_envservice.external_port_defaultservice.healthservice.depends_onservice.env_vars- feature IDs and required services
- compose service name, image, ports, volumes, and healthcheck
The manifest service.id, compose service key, container_name, and data
directory should all use the same service identity.
Validation
From the ods/ directory:
python scripts/audit-extensions.py --project-dir . my-service
python scripts/audit-extensions.py --project-dir .
docker compose -f docker-compose.base.yml -f extensions/services/my-service/compose.yaml config
git diff --check
If your service has GPU overlays, run compose config with the relevant platform overlay as well:
docker compose -f docker-compose.base.yml -f docker-compose.nvidia.yml \
-f extensions/services/my-service/compose.yaml \
-f extensions/services/my-service/compose.nvidia.yaml config
Compatibility Notes
Extensions are most stable when they:
- keep persistent data under
./data/<service-id>/ - expose only the ports users need
- declare secrets in
service.env_vars - use healthchecks that work before login
- avoid broad host filesystem mounts
- avoid changing core service IDs or aliases
For broader downstream guidance, read
docs/BUILD-ON-ODS-SERVER.md.