Managed Versions
Use version in atmos.yaml to manage software versions with Atmos-native tracks, policies, groups, and lock files.
Managed versions are for software versions Atmos needs to resolve consistently. That includes local tools Atmos can install and run through Toolchain, plus versions Atmos only needs to track and render into files: GitHub Actions refs, OCI and Docker images, Helm charts, Terraform or OpenTofu-related constraints, release tags, and other package versions. Human-authored policy lives in atmos.yaml; resolved versions live in versions.lock.yaml.
This is separate from version.use, version.check, and version.constraint, which manage the Atmos CLI itself.
Configuration
Core Concepts
| Field | Description |
|---|---|
ecosystem | Dependency domain, such as toolchain, github/actions, docker, oci, helm, terraform, or opentofu. |
datasource | Version lookup strategy, such as toolchain, github-tags, github-releases, docker-tags, oci-tags, or helm. |
provider | Concrete backend or auth target, such as github, dockerhub, ecr_prod, or ghcr. |
track | Named version lane, such as dev, staging, or prod. |
group | Batch of related updates with shared match rules and policy. |
dependencies | Base catalog of software versions tracked by Atmos. Track-level dependencies override the base catalog. |
lock_file | File that stores resolved versions. Defaults to versions.lock.yaml. |
files | Rules mapping file managers to the project files they maintain. |
Ecosystem names alias to their default datasource: github and github/actions resolve via github-tags, docker via docker-tags, and oci via oci-tags. Set datasource explicitly to override (for example, github-releases to follow published releases instead of tags).
Update Policy
The update policy inherits through version.defaults → track defaults → entry → group:
strategy- How far
atmos version track updatemay advance a locked version:major,minor, orpatch.pin(alias:digest) never advances the version and only refreshes digests. cooldown- Minimum age of a release before it is eligible, checked against the upstream release timestamp:
14d,2w, or Go durations such as36h. pin- Artifact form emitted for the entry:
digest(alias:sha) locks and renders the immutable identifier — the git commit SHA for GitHub datasources, thesha256:manifest digest for OCI registries — alongside the human-readable version.noneor empty keeps plain version references. Strategy decides how far updates may advance; pin decides which form is written. Configuring a pin on a datasource that cannot provide immutable identifiers fails loudly. include- Candidate version patterns to allow. When set, versions must match at least one include pattern.
exclude- Candidate version patterns to block. Excluded versions cannot be selected, even when requested directly.
prerelease- Whether prerelease candidates are eligible. Defaults to
false.
Update vs. Lock
lock and update answer different questions:
lockresolves each entry'sdesiredexpression as-is and writes the lock file. Use it to bootstrap a catalog or repair a lock.updatestarts from the locked state and advances only as far as the policy allows. Every newer candidate held back by a strategy cap or cooldown produces a structured reason.
Status reporting is policy-aware: update-available means an update the policy would actually take. A newer upstream version held back by policy reports newer-available (blocked) with the blocking reason — and still passes verify, because the locked version is exactly what the policy wants deployed.
Tracks
Tracks let different environments converge at different speeds without putting version definitions in every stack.
When a stack asserts a track, !version and {{ .version.name }} resolve from that track. If a stack does not assert a track, Atmos uses version.track from atmos.yaml, then falls back to default.
Runtime Usage
Use !version when the value is YAML data:
dependencies:
tools:
opentofu: !version opentofu
Use .version in Go templates when the value is embedded inside a string:
vars:
image:
uri: "public.ecr.aws/datadog/lambda-extension:{{ .version.dd_forwarder }}"
For pinned entries, {{ .version.name }} emits the pinned form (the digest), while {{ .version.name.Version }} and {{ .version.name.Digest }} are individually addressable. !version always returns the version, never the digest.
GitHub Actions workflow files need literal refs (GitHub parses them before Atmos runs). Maintain them with the github-actions file manager, or author *.tmpl templates and apply them with atmos version track apply.
File Managers
version.files declares which project files carry managed versions, so a single atmos version track apply (alias: sync) sweeps everything, and verify fails in CI when any of them drifts from the lock. Each rule maps a manager to the glob paths it maintains:
version:
files:
- manager: github-actions
paths:
- .github/workflows/*.yaml
- manager: marker
paths:
- Dockerfile
- scripts/**/*.sh
- manager: template
paths:
- "**/*.tmpl"
When files is empty, managers with default paths (github-actions, template) run over those defaults.