Terragrunt v1.0.7: Optional tfr Versions, CAS Beyond Git, and Stack Dependency Cleanup

   |   4 minute read   |   Using 678 words

Terragrunt v1.0.7 shipped on 2026-06-01 with one ergonomic change to tfr:// source URLs, a meaningful expansion of the content addressing experiment, four bug fixes that stop crashes and hangs, and a cleanup pass on the stack-dependencies experiment.

The full release notes and downloads are on the GitHub release page.

Optional version on tfr:// source URLs

The version query parameter on tfr:// URLs is now optional. When a config omits it, Terragrunt queries the registry’s list versions endpoint and downloads the latest stable release, matching how OpenTofu and Terraform resolve a module reference with no version constraint.

terraform {
  source = "tfr:///terraform-aws-modules/vpc/aws"
}

Prereleases are skipped during resolution. A registry that publishes 4.0.0-rc1 next to 3.3.0 pins to 3.3.0. If reproducible builds matter, or a prerelease is desired on purpose, pass ?version= explicitly. This came in via #6112.

CAS now covers more than git

The cas experiment grew two ways in this release.

First, non git sources are content addressed: http(s), Amazon S3, Google Cloud Storage, and Mercurial. Before pulling bytes, CAS issues a cheap remote probe (HTTP HEAD, S3 object attributes, GCS metadata read, or hg identify) to derive a cache key. On a hit, the cached tree is linked directly. On a miss, CAS downloads, ingests, and keys the tree by its content hash. A remote that republishes under the same address pins to a new entry, so a stale cache cannot serve outdated bytes.

Second, tfr:// sources are content addressed too. CAS asks the registry where the archive lives and uses the resolved URL as the cache key. Two runs that pin the same version share one entry; a republish under the same version pins to a new entry. Both changes landed under #6076.

Bug fixes that stop crashes and hangs

Four fixes worth calling out:

  • update_source_with_cas now preserves //subdir on a unit’s terraform.source. Previously, rewrites dropped the tail and the synthetic tree only contained the leaf module, so a sibling reference like source = "../bar" could not resolve after materialization. Fix in #6218.
  • terragrunt find --filter '[origin/main...HEAD]' now detects affected units on Windows. Filter globs are always written with forward slashes, but the comparison was happening against backslash paths, so nothing matched. Paths are now normalized everywhere. Reported in #6214.
  • startswith, endswith, strcontains, and run_cmd no longer panic on malformed calls. Wrong arg counts on the string functions, or run_cmd("--terragrunt-quiet") with no command, used to crash. They now return a clear configuration error. Fix in #5984.
  • --parallelism=0 (or the equivalent $TG_PARALLELISM=0) used to hang forever. The flag is now validated as a positive integer and the command exits with an error otherwise. Reported in #6211.

stack-dependencies experiment cleanup

Three changes land on the experiment, mostly tightening the surface area.

unit.<name>.path and stack.<name>.path now resolve inside the values attribute of a unit or stack block, not only inside autoinclude. A parent stack can pass the generated path of a sibling down into a child stack:

unit "vpc" {
  source = "../catalog/units/vpc"
  path   = "vpc"
}

stack "app" {
  source = "../catalog/stacks/app"
  path   = "app"

  values = {
    vpc_path = unit.vpc.path
  }
}

A unit inside the app stack reads values.vpc_path and uses it as the config_path of an autoinclude dependency, wiring a cross level relationship at generation time.

At the same time the reference shape was simplified. stack.<name>.<unit_name>.path and stack.<name>.<nested_stack>.path are gone. Only the top level stack.<name>.path and unit.<name>.path forms remain. The name echo attributes are also gone. To depend on a generated unit inside a stack, compute the path directly as ${stack.<name>.path}/<unit-relative-path>.

Finally, the .terragrunt-stack-origin file is no longer written when generating nested stacks. If relative paths in a catalog need to resolve correctly after generation, set update_source_with_cas = true on the unit and stack blocks instead.

Upgrade notes

Two things to check before bumping:

  • If a config relied on stack.<name>.<unit_name>.path style refs, rewrite those callsites to ${stack.<name>.path}/<unit-relative-path>. The old form is removed in this release.
  • If automation passes --parallelism=0 anywhere, that command will now error instead of hanging. Set a real positive value.

Where to get it



denis256 at denis256.dev