Source for the container images that back StreamSpace templates. Each
subdirectory is a single image; the build workflow at
.github/workflows/build-images.yml discovers them automatically and
publishes to ghcr.io/streamspace-dev/<image-name>.
| Image | Platforms | Streaming |
|---|---|---|
chrome-selkies |
linux/amd64 | Selkies-GStreamer (WebRTC) on :8080 |
Each image directory may contain a PLATFORMS file (one platform per
line, e.g. linux/amd64) declaring which architectures the build
workflow should produce. Without it, the workflow defaults to
linux/amd64,linux/arm64.
chrome-selkies is amd64-only because the upstream Selkies project's
v1.6.2 release ships its gstreamer-selkies_gpl tarball for
ubuntu24.04_amd64 only — there is no arm64 variant. Once upstream
ships arm64 binaries, drop the file (or add linux/arm64) to enable
multi-arch.
Streaming protocol. Selkies-GStreamer (WebRTC). VNC paths were removed
in mid-2026; do not introduce a Dockerfile that exposes anything other
than the Selkies HTTP/WebRTC endpoint on port 8080.
Port. Always 8080. The control plane's HTTP proxy expects this.
Environment knobs. Every image must accept these so users can resize the desktop without rebuilding:
| Variable | Default | Purpose |
|---|---|---|
DISPLAY_SIZEW |
1920 |
Display width |
DISPLAY_SIZEH |
1080 |
Display height |
DISPLAY_DPI |
96 |
Display DPI |
SELKIES_ENCODER |
auto-detected | Override the GStreamer encoder |
SELKIES_ENABLE_AUDIO |
true |
Toggle audio pipeline |
TZ |
UTC |
Container timezone |
OCI labels. Required so the supply-chain attestations land cleanly:
LABEL org.opencontainers.image.title="StreamSpace <App Name>"
LABEL org.opencontainers.image.description="<Description>"
LABEL org.opencontainers.image.vendor="StreamSpace"
LABEL org.opencontainers.image.source="https://github.com/streamspace-dev/streamspace-templates"Health check. The control plane treats the absence of one as a session that never becomes ready:
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1cd images/chrome-selkies
docker build -t ghcr.io/streamspace-dev/chrome-selkies:dev .
docker run -d -p 8080:8080 --name chrome-selkies-test \
ghcr.io/streamspace-dev/chrome-selkies:dev
# Open http://localhost:8080 in a browser
docker rm -f chrome-selkies-testThe workflow builds every image whose Dockerfile changed in the PR and
publishes on push to main or on tagged releases. It produces multi-arch
images (linux/amd64, linux/arm64), signs them with cosign, and
attaches a SPDX SBOM.
Tag conventions (per docker/metadata-action):
latest— only on default branch<branch>— branch name (e.g.main)pr-<num>— pull request buildssha-<short>— commit SHA fallback<semver>/<major>.<minor>/<major>— when avX.Y.Ztag is pushed
- Create
images/<name>/with aDockerfileand any helper scripts. - Add a row to the table above.
- Add a corresponding template manifest under the matching category
directory (e.g.
selkies/<name>.yaml) so the catalog can serve it. - Open the PR — CI will build the image automatically and the workflow will fail loudly if the standards above aren't met.