Terraform Cloud alternatives and Terraform automation tools, compared

Terraform automation and collaboration software, often called TACOS, runs plan and apply for a team: on pull requests, with locks, approvals and a record of what ran. These tools differ most on three things: where Terraform runs, who holds your cloud credentials, and how they order dependent stacks. This page compares 9 tools on those and 13 other features, with a source for every cell.

Stackorder, an open-source orchestrator for Terraform and OpenTofu on GitHub Actions, is one of them. Its server never runs Terraform and never holds cloud credentials; your GitHub Actions runners do the work.

Last reviewed . Every cell about another tool was checked against that tool's own repository, documentation or pricing page.

Feature matrix

A dash means we have not verified that fact, not that the tool lacks it. Prices are as published on . Scroll sideways to see every tool; each tool's page cites the source of each cell.

FeatureStackorderAtlantisHCP Terraform (formerly Terraform Cloud)Stategraph (formerly Terrateam)Spaceliftenv zero (formerly env0)ScalrTerrakubeOpenTaco (formerly Digger)
LicenseApache-2.0, open sourceApache-2.0, open source; a CNCF Sandbox projectProprietary, commercial; the Terraform CLI itself is under BSL 1.1 since version 1.6.0MPL-2.0; Enterprise features need a commercial licenseProprietary platform; open-source tooling such as spacectl and the Terraform provider under MITProprietary SaaS; its Terraform provider, Terratag and MCP server are open sourceProprietary SaaS; its Terraform provider is MPL-2.0 and its GitHub Action MITApache-2.0, open sourceOpen core: MIT at the root, and a proprietary Digger Enterprise license for the ee/ directory
DeploymentSelf-hosted; setup mode creates the GitHub App from a manifestSelf-hosted only: Helm chart, Kubernetes manifests or Kustomize, OpenShift, an AWS Fargate module, GKE or GCE, or DockerSaaS, with a separate HCP Europe region; Terraform Enterprise is the self-hosted distributionStategraph Cloud (SaaS), self-hosted (open source or Enterprise), or in your own AWS, GCP or Azure accountSaaS, now called Spacelift Deploy; self-hosted on AWS, Azure, GCP or on-premises Kubernetes only on the Enterprise+ tierSaaS only, optionally with self-hosted agents; the control plane cannot be self-hostedSaaS only, at scalr.io on Google Cloud in the United States; agents can run jobs in your networkSelf-hosted only: a Helm chart on Kubernetes, or Docker ComposeHosted app at otaco.app, or self-hosted with Docker Compose, Railway or Helm charts
PricingFree and open source; you run the serverFree; no paid tier or hosted offeringPer managed resource, billed hourly: Free up to 500 resources; Essentials from $0.10, Standard from $0.47 and Premium from $0.99 per resource a month; Terraform Enterprise customCloud Free: 3 users, 50 runs a month, 1 worker. Pro: $12,000 a year with unlimited users, runs and workers. Self-hosted open source: $0, up to 3 active users a month per installationFree: 2 users, 1 public worker. Starter+: $20,000 a year, unlimited users. Business, Enterprise and Enterprise+ by quoteFree: 250 runs a month, 30 active environments, 1 concurrent run, 1 self-hosted agent. Cloud Navigator and Cloud Pilot: custom, priced per successful apply or environmentPer run. Free: 50 runs a month with unlimited users, SAML SSO and agents. Business: $0.99 a run. Enterprise: custom, from 20,000 runs a yearFree; no paid tier, hosted service or commercial edition advertisedNo public pricing page; Enterprise features by per-seat subscription, through contact or a demo
Maturityv0.1.0, first released 2026-09-30; tested end to end against LocalStack, not yet against real AWS or a real GitHub organization by defaultA CNCF Sandbox project, actively released; v0.48.0 added slim images—The vendor reports daily releases and more than 20,000 automated tests per change———Actively maintained: 2.33.2 released on 2026-09-14, with 2.34.0 in betaActively released: v0.6.151 on 2026-09-13, after roughly monthly releases through 2026
Where Terraform runsYour GitHub Actions runners, GitHub-hosted or self-hosted; it manages no runners or agentsOn the Atlantis server itself, not on CI runnersDisposable VMs in HashiCorp's cloud by default, or self-hosted agents that need only outbound access; a workspace can also run locallyYour GitHub Actions or GitLab CI runners; the server dispatches workflows and does not run TerraformA fresh Docker container per job, on Spacelift's public workers or on private workers you runenv zero-hosted agents by default, or self-hosted Kubernetes or Docker agents in your infrastructureScalr's shared runners by default, or any number of self-hosted agents, each adding 5 concurrent runsIts own executors: a persistent pod pool, ephemeral Kubernetes Jobs, or self-hosted agentsYour CI, GitHub Actions by default, for pull request automation and drift; Remote Runs (beta) in E2B sandbox VMs
State backendBring your own S3; never takes or releases the state lockBring your own; any backend except local stateBuilt in: HCP Terraform is the state backendYour existing backend; Stategraph's database-backed state is a separate commercial product. Plan files stay in the server's database by defaultOptional Spacelift-managed state on S3, with history and rollback, chosen when a stack is created; or your own backendOptional env zero remote backend with locking and versioning, which can store state in your own S3 bucket; or a standard backend such as S3Built in, in a Scalr-owned encrypted bucket; your own bucket through storage profiles on Enterprise; other backends with limitsBuilt in, per workspace, in Azure Storage, S3, Google Cloud Storage or MinIO; implements the TFE remote backend and cloud blockYour existing backend; or OpenTaco's HCP Terraform-compatible state service on S3-compatible storage
ModulesNo registry; lists each module's consumers, and for git modules the version each pins and how far behind it isNo registry; the opt-in --autoplan-modules plans the projects that use a changed local moduleBuilt-in private registry versioned by Git tags; the Explorer shows module usage across workspacesNo registry; a module-aware indexer, off by default, plans the directories that use a changed local modulePrivate module registry on paid accounts, with tests per version; module trigger policies see each module's consumersPrivate module and provider registry, with download counts and the environments using each moduleBuilt-in private registry, published from VCS or OCI; a Modules report shows versions across workspaces and flags outdated onesBuilt-in private registry for modules and providers; a new SemVer tag imports a module versionNo registry; include_patterns globs trigger projects when a module path changes
Self-hosted footprintOne container of about 30 MB and Postgres; actions that use no DockerOne Go binary or container with no external database; a persistent disk for plans and BoltDB locks, or Redis for locksSaaS. Terraform Enterprise runs as containers with PostgreSQL, S3-compatible storage and Vault, plus Redis for active-activeServer and PostgreSQL behind a public HTTPS URL; a GitHub Action that runs as a Docker containerSaaS. Self-hosted: server and drain services on Kubernetes or ECS, PostgreSQL, object storage buckets, a queue and an optional MQTT brokerSaaS control plane. Kubernetes agent: Kubernetes 1.24 or later, one pod per deployment requesting at least 460m CPU and 1500Mi memorySaaS control plane. Agent: at least 2 GB of memory and 1 CPU per run, 20 GB of disk, and outbound HTTPS to scalr.ioAPI, executor, registry, UI, Dex and OpenLDAP (on by default), with MinIO, PostgreSQL and Valkey subcharts that can be swapped for external servicesUI, orchestrator, drift, drift trigger, state, token and sidecar services; three Postgres databases, S3-compatible storage and WorkOS
Cross-stack dependenciesA graph of stacks and modules from depends_on, module sources and terraform_remote_state reads, including cross-repository edges; applies in wavesexecution_order_group for a global plan or apply, and depends_on between projects in one atlantis.yamlRun triggers between workspaces, up to 20 sources each; Stacks, with linked Stacks, on RUM plansLayered runs: depends_on between directories in one repository, optionally on specific outputsStack dependencies form a DAG, across repositories, and pass outputs downstream as inputsWorkflows, in which each environment lists what must deploy first under needs; Workflow Triggers chain deploysExplicit run triggers between workspaces, up to 50 upstreams, also across federated environments; not inferredStable 2.33: shared state through terraform_remote_state. Run triggers with a dependency graph only in 2.34.0 pre-releasesdepends_on between projects and numeric layers in digger.yml; Terragrunt dependency parsing
Cloud credentialsNot held by the server; the runner assumes your IAM role with its own GitHub OIDC tokenHeld by the server, which runs Terraform: instance or workload roles, environment variables, credential files or VaultHeld by the service: static credentials as variables, or short-lived OIDC credentials it receives for each runNot held by the server; the runner uses OIDC or secrets stored in GitHub or GitLabSpacelift assumes your AWS role, or a private worker does and the credentials never reach Spacelift; Spacelift-signed OIDC as an alternativeOn hosted agents, env zero authenticates to your cloud: assume-role, stored keys, or OIDC tokens it issues; self-hosted agents read your own secret storeHeld by default in encrypted provider configurations: keys, an IAM role, or per-run OIDC with Scalr as the identity provider; agents can keep them in your networkHeld by the platform: static credentials as sensitive variables, or short-lived tokens from Terrakube's own OIDC issuerNot held for pull request automation: credentials stay in your CI, with OIDC recommended; not documented for Remote Runs
Human sign-inGitHub OAuth through the App, read:org scope only———SAML 2.0 single sign-on from the Enterprise tier—SAML single sign-on, included on the free planDex connectors with groups, such as Azure AD, Google, Cognito, Keycloak, GitHub, GitLab or LDAPWorkOS, required when self-hosting
Git hostsGitHub only, by designGitHub, GitLab, Gitea and Forgejo, Bitbucket Cloud and Server, Azure DevOpsGitHub, GitLab, Bitbucket and Azure DevOps, hosted and self-managed; an API-driven workflow for othersGitHub, including GitHub Enterprise Server, and GitLabGitHub (including GitHub Enterprise), GitLab, Azure DevOps, Bitbucket Cloud and Data Center, and raw GitGitHub, GitLab, Bitbucket and Azure DevOps; self-hosted GitHub Enterprise Server, Bitbucket Data Center and GitLab through an agentGitHub, GitHub Enterprise, GitLab, Azure DevOps, Bitbucket Cloud and Data Center; VCS agents for private networksGitHub (including Enterprise), GitLab, Bitbucket, Azure DevOps, and SSH repositories without webhooksGitHub is the documented path; GitLab pipelines need an Enterprise license key
OpenTofuYes, with tool: tofu; tested end to end with OpenTofu 1.12Yes, with --default-tf-distribution=opentofu or terraform_distribution per projectNot documented; it runs the Terraform CLIYes, with engine: tofu; also Terragrunt, CDKTF and PulumiYes, first-class; all OpenTofu versionsYes; OpenTofu is the default binaryYes, first-class, billed the same as TerraformYes, chosen per workspaceYes, per project with opentofu: true; Terragrunt and Pulumi too
Drift detectionScheduled per stack with drift.schedule; with open_issue, one GitHub issue per drifted stack, closed when the drift is gone; never applies to fix driftAlpha API endpoints since v0.45.0, off by default; no built-in scheduler, so an external job has to call themHealth assessments on Standard and Premium, for workspaces in remote or agent executionScheduled hourly to monthly, off by default; can open an issue or apply fixes with reconcile; one schedule in the open-source editionScheduled proposed runs with optional reconciliation; private workers only; Starter+ and aboveScheduled per environment, with alerts; optional automatic remediation by redeploying or opening a pull requestScheduled daily or weekly per environment, with ignore, sync-state or revert actions; drift runs are not billedA documented pattern: a plan template with an OPA check and a Slack notice, run on a workspace scheduleA drift service on a cron schedule, or a backendless Actions workflow, reporting to Slack or GitHub Issues
Policy checksNot a policy engine; run OPA, conftest, Checkov or Infracost in hooks, and stackorder check records a named check the apply gate honorsBuilt-in Conftest (OPA) checks with policy-owner approval; custom_policy_check for other toolsBuilt in: Sentinel, OPA, and HCL-based Terraform policy in betaOPA/Rego, Conftest and Checkov on every plan in every edition; Gatekeeper approval gates in Stategraph Cloud and self-hosted EnterpriseBuilt-in OPA/Rego policy engine with several policy typesOPA approval policies after plan and cost estimation, not enforced on pull request plans; cost estimates through InfracostBuilt-in OPA before and after plan, with three enforcement levels; Checkov before planOPA through extensions and templates in stable releases; native policy governance in 2.34.0 pre-releasesOPA through Conftest, run as a workflow step against the plan
Pull request workflowA check per stack, one sticky comment, and stackorder plan, apply and unlock comments; applies before merge by default, or on mergeatlantis plan and atlantis apply comments and autoplan on each commit; applies before merge by default; a lock per directory and workspace until the pull request merges or closesSpeculative plans posted as pull request checks; merges trigger plans; manual or automatic apply per workspaceAutoplan on each push, against the merge with the destination branch; a stategraph apply comment applies the reviewed plan; applies before merge by default, or on mergeProposed runs on pushes, reported as commit statuses; opt-in plan comments and /spacelift commands; deploying before merge is supportedPlans on pull requests as a comment and status checks; plan and apply from comments, open to any commenter unless RBAC enforcement is turned onA dry run on every pull request; /scalr plan and /scalr apply comments allow apply before merge; GitHub checksWebhooks on push, pull request or release; an optional plan comment and terrakube plan and terrakube apply commands, except on Azure DevOpsdigger plan, apply, lock and unlock comments; applies before merge by default, on merge if configured; pull request locks

What to look for in a Terraform Cloud alternative

Each of these is a row of the matrix above.

Where Terraform runs
On the vendor's workers, on the tool's own server or executors, or on your own CI runners.
Who holds cloud credentials
The platform, a server you run, or your CI runner, which can assume a role with its own OIDC token.
State and modules
Whether the tool hosts state and a private module registry, or works with the backend and Git repositories you already have.
Git hosts
GitHub only, or GitLab, Bitbucket and Azure DevOps as well.
OpenTofu
Supported as a first-class tool, chosen per project or workspace, or not documented.
Cross-stack dependencies
Run triggers between workspaces, ordering within one repository, or a graph that also follows modules and state reads.
Pricing model
Free and open source, per managed resource, per run, per seat, or by quote.

Which tool fits which team

Your code is not on GitHub, or is on several Git hosts
Atlantis, Stategraph, HCP Terraform, Spacelift, env zero, Scalr and Terrakube all work beyond GitHub; OpenTaco's GitLab pipelines need an Enterprise license key. Stackorder is GitHub only, by design.
You want Terraform to run on your own CI runners, with cloud credentials in your CI
Stackorder runs on your GitHub Actions runners, Stategraph on your GitHub Actions or GitLab CI runners, and OpenTaco in your CI, GitHub Actions by default.
You want plan and apply from pull request comments on one server, with no CI runners involved
Atlantis runs Terraform on its own server, which holds your cloud credentials.
You want to self-host a platform that stores state and hosts a private registry
Terrakube is Apache-2.0 and does both. Terraform Enterprise, the self-hosted edition of HCP Terraform, is the commercial option.
You want a policy engine built in
Spacelift, Scalr, HCP Terraform, Stategraph and env zero evaluate OPA or Sentinel policies themselves, and Atlantis runs Conftest. Stackorder records the verdicts of the tools you run in hooks.
You want a managed service with no control plane to run
HCP Terraform, Spacelift, env zero and Scalr are SaaS, and Stategraph and OpenTaco also offer hosted editions.
You have many stacks on GitHub that depend on each other and on shared modules, with state in S3
Stackorder plans every stack a change reaches and applies them in dependency waves, from a graph of depends_on, module sources and terraform_remote_state reads.

One page per tool

What Stackorder is, and what it is not

Stackorder is a GitHub App plus a small control-plane server that decides which stacks to run and in what order, then lets GitHub Actions do all of the running. Its server does two jobs: dependency resolution, and a record of every plan, apply and drift check. It is deliberately not a state backend, module registry, secrets store, policy engine or runner.

Read the comparison in the documentation for the reasoning row by row, or the overview of how Stackorder works.

When something else fits better

  • You are not on GitHub. Stackorder is GitHub only, by design.
  • You want the tool to host state or modules. Stackorder stores neither. Stack discovery looks for backend "s3" blocks, and state links assume S3.
  • You want a policy engine built in. Stackorder records the verdicts of the tools you run; it does not evaluate policy itself.
  • You want managed runners or agents. Use GitHub's own runner mechanisms; Stackorder does not manage them.

Frequently asked questions

What is the best open-source alternative to Terraform Cloud?

For teams on GitHub with state in S3, Stackorder (Apache-2.0) is an open-source Terraform Cloud alternative that runs plans and applies on your own GitHub Actions runners: see Stackorder as a Terraform Cloud alternative. Terrakube (Apache-2.0) is the closest self-hosted match if you need the tool to host state and a private registry, and Atlantis (Apache-2.0) runs plan and apply on its own server from pull request comments.

Which of these tools run Terraform on GitHub Actions?

Stackorder runs every plan and apply on your GitHub Actions runners. Stategraph Orchestration, formerly Terrateam, runs them on your GitHub Actions or GitLab CI runners, and OpenTaco, formerly Digger, runs its pull request automation in your CI, GitHub Actions by default. Atlantis runs Terraform on its own server, HCP Terraform on HashiCorp-hosted VMs or self-hosted agents, Spacelift in containers on its public workers or your private workers, env zero on its hosted or self-hosted agents, Scalr on its shared runners or self-hosted agents, and Terrakube on its own executors.

Which of these tools are open source?

Stackorder, Atlantis and Terrakube are Apache-2.0. Stategraph Orchestration is MPL-2.0, and its self-hosted open-source build allows up to 3 active users a month per installation. OpenTaco is open core: MIT at the root, with a proprietary license for its ee/ directory. HCP Terraform, Spacelift, env zero and Scalr are proprietary platforms.

Which of these tools hold cloud credentials?

The Stackorder and Stategraph servers never hold them: the CI runner does, and OpenTaco keeps them in your CI for its pull request automation too. The Atlantis server holds them because it runs Terraform. HCP Terraform, and env zero and Scalr by default, store credentials or receive short-lived ones for each run; Spacelift assumes your role unless a private worker does it; Terrakube stores static credentials or issues its own OIDC tokens.

Why are some cells a dash?

A dash means we have not verified that fact from the tool's own sources, not that the tool lacks the feature.

Try Stackorder on your own repositories

Free and open source under the Apache License 2.0. The getting started guide takes one repository from nothing to a first stackorder apply; the local demo runs on one machine with no GitHub App and no AWS account.