tinfoil-containers-template. The template ships with a pre-built hello-world image, so you can run through the full flow end-to-end before swapping in your own.
Prerequisites
- An organization in the Tinfoil Dashboard (Containers is an org-level feature).
1. Create a repo from the template
Usetinfoil-containers-template to make a new repo: click Use this template → Create a new repository.
Give it any name you’d like, and make sure it’s public. The tinfoil-config.yml needs to be public so the deployment can be independently verified — Tinfoil fetches it at deploy time to compute the enclave measurement, and your users’ SDKs fetch it (via the Sigstore transparency log) to check that the running enclave matches what you published. The Docker image itself can still be private — see Private images.
2. Read the tinfoil-config.yml
This is the file that defines your deployment. It’s already wired up:
tinfoil-config.yml
containers section defines a hello-world container, which points to a prebuilt Tinfoil image, tinfoil-containers-hello-world. This image takes in an environment variable, and a secret, and on an HTTP request it returns the message & the presence of the secret.
For now, leave it alone — we’ll customize it later. See the configuration reference for the full schema (paths, healthchecks, GPUs, multi-container setups, etc.).
3. Release a version
Trigger the Tinfoil Release workflow with a version. This creates the Git tag, measures the image, signs the attestation, and publishes a GitHub release:v0.0.1.
Two workflows run back-to-back:
tinfoil-release.yml creates the tag, then auto-dispatches tinfoil-release-publish.yml, which runs measure-image-action to compute the enclave measurement and publish the release. Wait for both to finish (~1 min) before deploying — the tag won’t appear in the dashboard’s picker until then.4. Add the GREETING_TOKEN secret
The config declares a GREETING_TOKEN secret. That means we’ll have to add a value for it before deploying. Tinfoil Dashboard will refuse to deploy unless this secret exists. To add the value:
- Open the Tinfoil Dashboard
- Navigate to Tinfoil Containers → Secrets
- Click Add Secret, enter the name
GREETING_TOKENand any value - Save
5. Deploy
In the dashboard:- All Containers tab → New Container
- Enter a container name (lowercase, hyphens allowed — e.g.
hello-world) - Select your new repository (enter
owner/repomanually or pick from connected repos) - The
v0.0.1tag will auto-select - Confirm the env vars and secrets shown match your config
- Click Deploy Container
6. Make a request
Your container is live athttps://<name>.<org>.containers.tinfoil.dev. To test it out:
Making your own
The template you just used deployed a pre-built Docker image. If you have another pre-built Docker image, you can use that by referencing it in thetinfoil-config.yml
However, if you have some code in a repository and want to deploy it, you’ll have to build an image for it first. How you do this depends on the visibility of the repository:
- Public source code → use
tinfoil-public-containers-template. When deploying public code you can do it all in one repo. Thepublic-containerstemplate contains one workflow that builds the image, updates the local config with the new digest, and releases a new version. Essentially, it consolidates thetinfoil-containers-hello-worldrepo & thetinfoil-containers-templaterepo. - Private source code → keep your code in its own private repo and use
tinfoil-containers-hello-worldas the build-and-publish pattern (Dockerfile + workflow that pushes to GHCR). Then reference the published image from atinfoil-containers-templatefork like this quickstart.
If the published image is private (not just the source), Tinfoil needs registry credentials to pull it at deploy time. See Private images. Public images work without any configuration.
Updating
To roll out a change — new image digest, new env var, new path — edittinfoil-config.yml, commit, then release a new version:
For example, change the MESSAGE env var:
tinfoil-config.yml
v0.0.2.
In the dashboard, click Update on your container and select v0.0.2. This triggers a blue-green update (no downtime). curl again to see the new message.

