Oct 23, 20269 min read

Terragrunt Alternatives in 2026

Tools for managing infrastructure across environments and accounts without a Terragrunt layer, from Terraform orchestrators to replacing the Terraform code itself.

Terragrunt is a wrapper around Terraform and OpenTofu that keeps configuration DRY across environments and accounts, by generating backend and provider blocks, passing inputs to shared modules and running root modules in dependency order with run --all. It is useful once a repository has a dozen environment folders that differ by a few variables, and it gets harder to work with as the terragrunt.hcl files, include chains and dependency blocks become a second configuration language that only one or two people on the team can debug, with mocked outputs in plans that hide what will really change. This article compares the tools teams tend to move to, which are Encore, Terramate, Atmos, Terraform Stacks, plain Terraform or OpenTofu and Pulumi. For how Terragrunt itself works next to Terraform, see Terragrunt vs Terraform.

Reasons teams look for Terragrunt alternatives:

  • Nested include and dependency blocks make it hard to see which values a module actually receives.
  • Plans that depend on other modules' outputs rely on mocks until the dependency is applied.
  • run --all across many modules is slow and fails in ways that are hard to retry partially.
  • It is one more tool with its own release cycle on top of Terraform or OpenTofu and the providers.
  • Much of the Terraform being orchestrated describes the same application infrastructure, such as a database, a queue and a service, repeated per environment.

Terragrunt alternatives at a glance

AlternativeApproachBest fit
EncoreApplication infrastructure declared in code and provisioned per environment, replacing the Terraform for itProduct teams whose Terraform mostly describes their own services, databases and queues
TerramateGenerates plain Terraform and runs only the stacks a change affectsTeams that want to keep Terraform or OpenTofu with less duplication
AtmosYAML stacks that configure Terraform components per account and regionPlatform teams with large multi-account estates
Terraform StacksComponents and deployments managed as one unit in HCP TerraformTeams already on HCP Terraform
Plain Terraform or OpenTofuModules, one root module per environment and a CI pipelineSmall estates with a handful of environments
PulumiInfrastructure in TypeScript, Python, Go or other languages, with stacks per environmentTeams that prefer a general-purpose language for infrastructure
Compare features across all six alternatives
CapabilityEncoreTerramateAtmosTerraform StacksPlain Terraform or OpenTofuPulumi
Replaces Terraform codeYesfor application infrastructureNoNoNoNoYes
Environment modelEnvironments created in the Encore dashboard, resources from the same codeStacks with generated codeYAML stacks inheriting from catalogsDeployments in a StackFolders, workspaces or tfvars filesStacks with config files
Cross-module dependenciesDerived from the codeOrdered stack runsOrdered component runsComponents in one StackRemote state or data sourcesStack references
Change detectionHandled by each deploy from the codeGit-basedGit-based (describe affected)Per deploymentManual or CI scriptsPer stack
Local developmentencore run starts the resources locallyNot applicableNot applicableNot applicableNot applicableNot applicable
Where it runsYour AWS or GCP accountAny Terraform or OpenTofu backendAny Terraform or OpenTofu backendHCP Terraform or Terraform EnterpriseAny backendPulumi Cloud or a self-managed backend

Encore: replace the Terraform instead of orchestrating it

Encore

Encore combines the application and its infrastructure in one codebase, so the Postgres databases, Pub/Sub topics, buckets, cron jobs and secrets a service needs are declared in TypeScript or Go, encore run starts them locally (Postgres runs in Docker), and each environment you create gets the same resources provisioned in your own AWS or GCP account. Encore takes the place of the Terraform modules for that application infrastructure rather than running alongside them, which removes the per-environment folders, backends and dependency blocks that Terragrunt exists to manage.

Application code passes through Encore and infrastructure guardrails to resources provisioned in your own AWS or GCP account.
Encore provisions the infrastructure your application needs in your own AWS or GCP account.

A Terragrunt setup for one service often has a terragrunt.hcl per environment that includes a root config and points at a shared module:

# live/prod/orders-db/terragrunt.hcl include "root" { path = find_in_parent_folders("root.hcl") } terraform { source = "../../../modules/rds" } dependency "vpc" { config_path = "../vpc" } inputs = { name = "orders" subnet_ids = dependency.vpc.outputs.private_subnet_ids }

In Encore the same database, plus the queue and bucket the service uses, is declared once in Go next to the code that uses it, and every environment gets its own copy:

package orders import ( "encore.dev/pubsub" "encore.dev/storage/objects" "encore.dev/storage/sqldb" ) var db = sqldb.NewDatabase("orders", sqldb.DatabaseConfig{ Migrations: "./migrations", }) type OrderPlaced struct{ OrderID int64 } var Placed = pubsub.NewTopic[*OrderPlaced]("order-placed", pubsub.TopicConfig{ DeliveryGuarantee: pubsub.AtLeastOnce, }) var Receipts = objects.NewBucket("receipts", objects.BucketConfig{ Versioned: false, })
On AWS this becomes RDS, SNS/SQS and S3, inside a VPC that Encore creates, with an IAM role per service.

Key features

  • Every environment, including per-PR preview environments, is provisioned from the same declarations, so there is nothing to copy between environment folders.
  • Services run on ECS Fargate or EKS in AWS and Cloud Run or GKE in GCP, each with its own scoped IAM role.
  • Existing RDS databases, S3 buckets and SNS topics can be imported rather than recreated.
  • The same declarations run locally with encore run, which Terraform and Terragrunt do not cover at all.
  • When an AI coding agent needs a new queue or bucket, it writes one Go declaration in the same change as the code, with no module or terragrunt.hcl to add for each environment.

Good to know

Encore covers the infrastructure your application uses, and resources outside that scope, such as organization-level IAM, DNS zones you manage elsewhere or a data warehouse, stay where they are today. Moving an existing service means adopting the Encore SDK in TypeScript, Go, Python or Rust, and teams usually start with one service.

Get started
brew install encoredev/tap/encore &&
encore app create
Copy

Run in your terminal to get started locally.

Terramate: orchestration and code generation for plain Terraform

Terramate

Terramate organizes a repository into stacks, generates repeated backend and provider blocks from shared globals and runs commands only in the stacks that a Git change touched.

~/infra
# Plan only the stacks changed since main$ terramate run --changed -- terraform plan

Key features

  • Git-based change detection keeps CI fast as the repository grows.
  • Generated files are plain Terraform or OpenTofu, so removing Terramate later is straightforward.
  • It works with Terraform, OpenTofu and existing Terragrunt setups.

Good to know

Terramate is the closest replacement for Terragrunt's orchestration, and the Terraform it runs is still yours to write and maintain for every environment.

Atmos: YAML stacks for multi-account estates

Atmos

Atmos treats Terraform root modules as components and describes which components run in which account, region and environment in YAML stacks that import shared catalogs and override only what changes.

~/infra
$ atmos terraform plan rds -s prod-us-east-1

Key features

  • Deep-merged YAML inheritance across accounts, regions and environments.
  • Backend generation, vendoring of modules and workflows that chain commands.
  • atmos describe affected lists the stacks a change touches.

Good to know

Atmos suits platform teams that manage many accounts, and the YAML inheritance model and its conventions take time to learn for a team with three environments.

Terraform Stacks: environments as deployments in HCP Terraform

Terraform Stacks

Terraform Stacks group several modules as components and repeat them as deployments for each environment, account or region, managed as one unit in HCP Terraform.

Key features

  • Components share a lifecycle and pass outputs to each other without remote state lookups.
  • Deployment blocks describe each environment in one file.
  • Deployment groups can auto-approve changes that pass checks.

Good to know

Stacks run in HCP Terraform and are not available on legacy HCP Terraform team plans, and HashiCorp documents limits such as 20 deployments and 100 components per Stack.

Plain Terraform or OpenTofu

OpenTofu

Many teams drop the wrapper and use shared modules with one small root module per environment, run in order by their CI pipeline. OpenTofu also accepts variables in backend configuration, which removes one of the main reasons for generating backends.

# environments/prod/main.tf module "orders_db" { source = "../../modules/rds" name = "orders" subnet_ids = module.vpc.private_subnet_ids }

Key features

  • No extra tool, just Terraform or OpenTofu and your CI.
  • Easy for anyone who knows Terraform to read.
  • Works with any backend and any provider.

Good to know

The duplication Terragrunt removed comes back in small amounts, mainly provider and backend blocks per environment, which is manageable for a handful of environments. The Terraform alternatives guide covers options that go further.

Pulumi: environments as stacks in a general-purpose language

Pulumi

Pulumi describes infrastructure in TypeScript, Python, Go, C# or Java, and each environment is a stack with its own configuration file, so loops and functions take the place of Terragrunt's generation.

Key features

  • Real programming languages for conditions, loops and shared components.
  • Stack references pass outputs between projects.
  • State in Pulumi Cloud or a self-managed backend.

Good to know

Pulumi replaces Terraform as well as Terragrunt, which makes it a migration rather than a wrapper swap, and the infrastructure code still lives apart from the application code it supports.

How to choose

  • Encore if most of your Terraform describes your application's databases, queues and services and you would rather declare those in the application, with environments and local development handled from the same code.
  • Terramate to keep plain Terraform or OpenTofu with change detection and less duplication.
  • Atmos for platform teams managing many accounts and regions.
  • Terraform Stacks if you are already on HCP Terraform with a current plan.
  • Plain Terraform or OpenTofu for a small number of environments.
  • Pulumi if you want infrastructure in a general-purpose language and are ready to migrate.

Terragrunt solves the duplication that comes from describing the same infrastructure for every environment, and the orchestrators above solve it in other ways, while Encore takes the application part of that infrastructure out of the Terraform and into the application code.

Frequently asked questions

What is the best alternative to Terragrunt?

Terramate if you want change detection and code generation while keeping plain Terraform or OpenTofu, Atmos for YAML stacks across many accounts and regions, Terraform Stacks if you use HCP Terraform, and Pulumi for environments as code in a general-purpose language. Encore replaces the Terraform code for application infrastructure, so there is no multi-environment Terraform to orchestrate.

Is Terragrunt still needed in 2026?

Less than it used to be. OpenTofu now allows variables in backend configuration, and Terramate, Atmos and Terraform Stacks cover orchestration in other ways. Terragrunt is still useful for large estates with many root modules and explicit dependencies between them.

Terragrunt vs Terramate: what is the difference?

Terragrunt wraps Terraform and runs it with its own configuration files that generate backends, inputs and dependencies. Terramate generates plain Terraform code and orchestrates runs across stacks with Git-based change detection, so the code it produces can be used without Terramate.

Can I use plain Terraform instead of Terragrunt?

Yes. Modules, workspaces or one root module per environment, and a CI pipeline that runs them in order cover many setups. The cost is some repeated backend and provider configuration that Terragrunt would otherwise generate.

How does Encore replace Terraform and Terragrunt?

Encore reads the databases, Pub/Sub topics, buckets and cron jobs declared in TypeScript, Go, Python or Rust code and provisions them in each environment in your own AWS or GCP account. Each environment gets the same resources from the same code, so there are no per-environment Terraform modules or Terragrunt files for application infrastructure.

How do I get databases and queues without writing Terraform?

Declare them in Go with Encore's SDK, using sqldb.NewDatabase for Postgres, pubsub.NewTopic for Pub/Sub and objects.NewBucket for storage, next to the code that uses them. encore run starts them locally, and every environment gets the same resources provisioned in your own AWS or GCP account, with no Terraform modules or Terragrunt files for them.

Deploy to your cloud on AWS and Google Cloud
without managing infrastructure

Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.

~/orders — claude
Claude Code
Claude Code v2.1.180Opus 5.5~/orders