OpenTofu is the Linux Foundation's open-source fork of Terraform — forked from Terraform 1.5.x in August 2023 after HashiCorp moved the upstream to the Business Source Licence, and shipping v1.11.6 (April 8, 2026) under MPL 2.0 with v1.12.0-rc1 already in the wild. The stakes are concrete: the BSL forbids building competing products on top of Terraform, OpenTofu does not, which is why every managed IaC platform you can name — Spacelift, env0, Scalr, Gruntwork — defaulted to tofu within months of the relicense. The HCL hasn't changed since the fork, but the two projects have visibly diverged: state encryption, ephemeral values, early variable evaluation, and provider for_each ship in OpenTofu first and have no Terraform equivalent in 2026.
This page is the field guide. What OpenTofu actually is, what changed when IBM closed the HashiCorp acquisition in December 2024, the version-by-version feature timeline, a 60-second install, the binary-swap migration path from Terraform, and where OpenTofu still loses. For the broader IaC landscape including Pulumi see the Pulumi vs Terraform vs OpenTofu primer, and for the variable model that OpenTofu inherits intact see the Terraform variables guide.
TL;DR
- OpenTofu 1.11 (MPL 2.0) is a drop-in fork of Terraform 1.5.x under Linux Foundation governance. Same HCL, same providers, same state format, different licence and binary (
tofuinstead ofterraform). - CNCF Sandbox since April 23, 2025; granted a special MPL 2.0 licence exception by the CNCF Governing Board (Apache 2.0 is CNCF default).
- State encryption (1.7, April 2024) is the headline divergence — AES-GCM with PBKDF2, AWS KMS, GCP KMS, Azure Key Vault, or OpenBao key providers. Terraform has had “encrypt sensitive state” in the backlog since 2016.
- Migration is a binary swap for most teams:
brew install opentofu,tofu init -upgrade,tofu plan, done. State files are interchangeable as long as you don't turn on OpenTofu-only features. - When OpenTofu loses: HCP Terraform/Terraform Cloud features (Sentinel, no-code modules, run tasks), proprietary HashiCorp partner integrations, and any toolchain that hard-codes the
hashicorp/registry namespace without a mirror.
What Is OpenTofu?
OpenTofu is an infrastructure-as-code tool that reads HCL configuration files, talks to a provider plugin, diffs your desired state against a state file, and applies the difference. If that sentence reads like the Terraform tagline, that is the entire point — OpenTofu is the same thing, with the same .tf files, the same providers, the same terraform.tfstate, and the same plan/apply verbs. The CLI binary is named tofu.
What is different is who owns it. HashiCorp owns Terraform; the Linux Foundation hosts OpenTofu under a Technical Steering Committee drawn from Gruntwork, Spacelift, env0, Harness, Scalr, and independent maintainers. No single vendor controls the roadmap. The OpenTF Manifesto — the document that triggered the fork — sits in a GitHub repo with 35.8k stars and signatures from over a hundred companies. The first independent release, OpenTofu 1.6.0, shipped January 9, 2024. CNCF accepted the project at Sandbox maturity on April 23, 2025.
Why Did OpenTofu Get Forked in the First Place?
The timeline is short and the stakes were enormous for a slice of the ecosystem most users never see — the platform vendors.
| Date | Event | Why it mattered |
|---|---|---|
| Aug 10, 2023 | HashiCorp relicenses Terraform from MPL 2.0 to BSL 1.1 | Restricts “competitive use”; reverts to MPL after 4 years per release. Platform vendors lose the right to ship Terraform inside their products. |
| Sep 5, 2023 | OpenTF Manifesto published, 100+ signatories within days | Gruntwork, Spacelift, env0, Harness, Scalr, and others demand HashiCorp revert or commit to the fork. |
| Sep 20, 2023 | Linux Foundation accepts the fork as OpenTofu | Neutral home; no single vendor can re-licence the project. Forked from Terraform 1.5.x — the last MPL version. |
| Jan 9, 2024 | OpenTofu 1.6.0 released | First fully-independent release. Drop-in Terraform replacement. |
| Apr 30, 2024 | OpenTofu 1.7.0 — state encryption ships | First major feature that Terraform did not have. The functional gap begins. |
| Dec 16, 2024 | IBM closes HashiCorp acquisition for $6.4B | Terraform now owned by IBM. Several enterprises with IBM-licensing friction accelerate OpenTofu evaluation. |
| Apr 23, 2025 | CNCF accepts OpenTofu at Sandbox maturity | Governance signal: cloud-native ecosystem recognises OpenTofu as the IaC standard going forward. |
| Dec 9, 2025 | OpenTofu 1.11.0 | Ephemeral values, write-only attributes, new enabled meta-argument, S3 object tagging. |
| Apr 8, 2026 | OpenTofu 1.11.6 (latest stable) | Security patches GO-2026-4341 / 4340; v1.12.0-rc1 already in the release pipeline. |
OpenTofu vs Terraform: What Actually Differs?
For most teams running apply against their own infrastructure, almost nothing differs. The HCL is identical, the providers are identical, the state format is interchangeable. The differences live at the edges: licence, governance, and a growing set of OpenTofu-exclusive features.
| Dimension | OpenTofu 1.11 | Terraform 1.13 |
|---|---|---|
| Licence | MPL 2.0 (OSI-approved open source) | BSL 1.1 (source available, converts to MPL after 4 years) |
| Governance | Linux Foundation TSC; multi-vendor | HashiCorp / IBM, single vendor |
| Binary | tofu | terraform |
| HCL version | Same as Terraform 1.5+ | Same |
| Provider protocol | Compatible — Terraform providers work | Compatible — OpenTofu providers work |
| Provider registry | registry.opentofu.org (mirror of HashiCorp registry + community) | registry.terraform.io |
| State format | Interoperable (until you enable OpenTofu-only features) | Interoperable (same caveat) |
| State encryption | Built-in (AES-GCM, 5 key providers) | Not natively supported |
| Ephemeral values / write-only attrs | Yes (1.10/1.11) | Yes (1.10+) — implementations differ |
| Early variable evaluation | Yes (1.8) — vars in backend config + module sources | No |
| Provider for_each | Yes (1.9) | Yes (1.10) |
| Loopable import blocks | Yes (1.7) | Yes (1.7) — diverging since |
| enabled meta-argument | Yes (1.11) | No |
| Sentinel / OPA-as-a-service | Use OPA / Conftest directly | Sentinel (HCP Terraform paid tier) |
| Managed cloud | env0, Spacelift, Scalr, Terramate, Atlantis, Pulumi Cloud (state) | HCP Terraform (HashiCorp/IBM) |
The compatibility line is sharp. As soon as you turn on encryption, ephemeral resources, or the enabled meta-argument, the state and configuration are no longer round-trippable with Terraform. Decide upfront whether your team wants OpenTofu compatibility or OpenTofu features — you cannot have both on the same stack.
What Did Each OpenTofu Release Add?
OpenTofu's minor-version cadence is roughly every six months, mirroring the Terraform support policy: three concurrent release lines supported at any time (latest plus two prior). Each release line gets a year of security patches.
1.6 — Jan 9, 2024
First independent release. Drop-in replacement for Terraform 1.5.x. Built-in test framework (tofu test) graduates from experimental.
Forked baseline1.7 — Apr 30, 2024
State encryption (AES-GCM, PBKDF2 / AWS KMS / GCP KMS / OpenBao). Provider-defined functions. removed block. Loopable import blocks.
Largest single-release jump1.8 — Jul 29, 2024
Early variable evaluation: variables and locals usable in backend configuration and module sources. Static module expansion.
Dynamic backends1.9 — Jan 9, 2025
Provider iteration with for_each (multi-region / multi-account in a single configuration). cidrsubnets improvements.
Multi-region native1.10 — Jun 24, 2025
Ephemeral input variables and outputs. PostgreSQL backend locking change (do not mix with 1.9 against the same DB).
Memory-only secrets1.11 — Dec 9, 2025
Ephemeral resources and write-only managed-resource attributes. New enabled meta-argument (0 or 1 instances). S3 backend object tagging. Azure Vault key provider.
Current stable line1.12 — RC1 Apr 29, 2026
Smaller-enhancements release: lifecycle destroy meta-argument, prevent_destroy can reference module symbols, concurrent provider downloads, WinRM deprecation.
In release candidate1.13 — main branch
WinRM connection type removed. local-exec sets TRACEPARENT for W3C OpenTelemetry. contains() accepts null as second argument.
Supported until Aug 1, 2027How Do You Install OpenTofu?
There is no installer wizard, no signup, no licence key. OpenTofu ships a single static binary for every major OS and architecture, signed with cosign. The fastest path on a developer machine is a package manager; the repeatable path for CI is the official install script.
# macOS / Linux (Homebrew)
brew install opentofu
# Linux (Snap)
sudo snap install --classic opentofu
# Debian / Ubuntu (apt repository)
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install.sh
chmod +x install.sh
./install.sh --install-method deb
# Windows (Winget)
winget install OpenTofu.Tofu
# Standalone binary (any platform)
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install.sh
chmod +x install.sh
./install.sh --install-method standalone
# Container image (CI, locked version)
docker run --rm -v "$PWD:/src" -w /src ghcr.io/opentofu/opentofu:1.11.6 initVerify the install: tofu version should print the major version line plus the platform tuple. From there the workflow is identical to Terraform: tofu init, tofu plan, tofu apply, tofu destroy.
How Do You Migrate From Terraform?
For a single stack the migration is a five-minute swap. The cost scales with the number of stacks, the cleanliness of your registry references, and how many CI pipelines hard-code the terraform binary name.
- Land a clean plan first. Run
terraform applyso the state matches the configuration. Thenterraform planmust report no changes — if it does not, fix that before switching tools. - Back up the state file. Local: copy
terraform.tfstateand.terraform.lock.hcl. Remote: snapshot or version the backend object and confirm restore. - Match versions. Migrating from Terraform 1.5.x or older? Install OpenTofu 1.6.x first, then upgrade. From Terraform 1.8.x or 1.9.x? Install matching OpenTofu 1.8.x / 1.9.x and step forward one minor at a time.
- Install OpenTofu. See above. Keep the
terraformbinary installed in parallel until you have validated the firsttofu apply. - Re-initialise.
tofu init -upgradedownloads providers fromregistry.opentofu.orginstead of HashiCorp's registry. The providers themselves are byte-identical mirrors for the common ones (AWS, Azure, GCP, Cloudflare, Kubernetes). - Plan, then apply, then rest.
tofu planmust produce zero changes. If it does not, roll back (re-runterraform init) and investigate before applying.tofu applya small non-critical change to confirm the round-trip. - Patch CI. Swap
terraformfortofuin your GitHub Actions / GitLab CI / Jenkins steps. Replacehashicorp/setup-terraformwithopentofu/setup-opentofu.
- - name: Setup Terraform
- uses: hashicorp/setup-terraform@v3
- with:
- terraform_version: 1.10.0
-
- - run: terraform init
- - run: terraform plan -out=plan.tfplan
- - run: terraform apply plan.tfplan
+ - name: Setup OpenTofu
+ uses: opentofu/setup-opentofu@v1
+ with:
+ tofu_version: 1.11.6
+
+ - run: tofu init
+ - run: tofu plan -out=plan.tfplan
+ - run: tofu apply plan.tfplanIf teams need to coexist — half on Terraform, half on OpenTofu, same modules — use .tofu file extensions for OpenTofu-only divergence. OpenTofu reads both .tf and .tofu; Terraform ignores .tofu.
How Does State Encryption Work?
State encryption is OpenTofu's flagship feature and the one Terraform users have asked for since 2016. Without it, your state file holds database passwords, private keys, IAM credentials, and instance IPs in plaintext — anyone with read access to the state backend has read access to every secret your IaC ever touched. With it, that file is an opaque AES-GCM blob.
terraform {
encryption {
key_provider "aws_kms" "primary" {
kms_key_id = "arn:aws:kms:us-east-1:111122223333:key/abc-..."
region = "us-east-1"
key_spec = "AES_256"
}
method "aes_gcm" "encrypt_state" {
keys = key_provider.aws_kms.primary
}
state {
method = method.aes_gcm.encrypt_state
enforced = true
}
plan {
method = method.aes_gcm.encrypt_state
}
}
}The five supported key providers — each maps to a different ops trade-off:
PBKDF2
Local passphrase + iterations + hash. Zero infra dependencies; the operator types the passphrase or sets an env var. Fine for solo / lab / bootstrap. Painful for teams — the passphrase has to live somewhere.
key_provider "pbkdf2"AWS KMS
CMK in AWS Key Management Service. IAM controls who can decrypt; CloudTrail logs every use. Default pick when you already run on AWS.
key_provider "aws_kms"GCP KMS
Google Cloud Key Management. Same model as AWS KMS — IAM gating, audit log. Default pick on GCP.
key_provider "gcp_kms"Azure Key Vault
Symmetric or asymmetric keys in Azure Key Vault. Added in v1.11. RBAC gates decrypt; Azure Monitor logs each access.
key_provider "azurevault"OpenBao (beta)
OSS Vault fork via Transit Secret Engine; Vault 1.14-compatible. The cloud-agnostic option — self-host on any kube cluster.
key_provider "openbao"External (experimental)
Any executable that returns a JSON-formatted key on stdout. Escape hatch for HSMs, custom KMS, sealed-secrets workflows.
key_provider "external"Three production rules: rotate the key on a schedule (AES-GCM saturates after ~2³² messages with the same key — AWS/GCP KMS automate this), set enforced = true so a misconfigured CI run cannot accidentally write plaintext state, and configure a fallback key during rotations so in-flight plans don't break.
When Should You Not Use OpenTofu?
- You depend on HCP Terraform / Terraform Cloud features. Sentinel policy-as-code, no-code modules, run tasks, drift detection, ephemeral workspaces — those are HashiCorp commercial products, not OpenTofu features. Replace with OPA + Conftest, Spacelift, env0, Scalr, or Terramate before you migrate.
- Your tooling hard-codes the hashicorp/ registry. Any module that uses fully-qualified
source = "hashicorp/..."references needs a registry mirror or a search-and-replace pass. The OpenTofu registry resolves bare provider names automatically, but FQN strings don't auto-rewrite. - You need a specific HashiCorp partner integration. A small set of providers — mostly HashiCorp's own (Vault, Boundary, Waypoint) — get features in Terraform first and may take a release or two to land on the OpenTofu registry. Check
registry.opentofu.orgbefore you assume parity. - You're mid-migration on multiple stacks at once. A single stack flips in minutes. Hundreds of stacks need a migration program — registry audits, CI patching, state-file snapshotting, rollback plans. The technical cost is small per stack; the coordination cost compounds.
- You want a different language entirely. If you're leaving Terraform because of HCL fatigue, see the Pulumi primer — same provider ecosystem, TypeScript / Python / Go / C# instead.
Frequently Asked Questions
Is OpenTofu a drop-in replacement for Terraform?
Yes for the common case — same HCL, same providers, same state format, same CLI verbs (init, plan, apply, destroy). The binary is named tofu instead of terraform, the registry is registry.opentofu.org instead of registry.terraform.io, and a small set of newer features (encryption, ephemeral resources, enabled meta-argument, early variable evaluation) exist in OpenTofu only.
What is the latest OpenTofu version in 2026?
OpenTofu 1.11.6, released April 8, 2026. It is the latest stable in the v1.11 line (supported until August 1, 2026). The first release candidate of v1.12 (v1.12.0-rc1) was published April 29, 2026; v1.13 is on the main branch with support through August 1, 2027.
Is OpenTofu CNCF or Linux Foundation?
Both. The Linux Foundation hosts the project; CNCF accepted OpenTofu at Sandbox maturity on April 23, 2025. The CNCF granted a special licence exception so the project could keep its MPL 2.0 licence rather than relicensing to Apache 2.0, the CNCF default.
Can OpenTofu and Terraform share the same state file?
Yes, as long as you do not enable OpenTofu-only features. Vanilla state files are interchangeable in both directions — a Terraform team and an OpenTofu team can operate against the same backend during migration. The moment you turn on state encryption, ephemeral resources, or the enabled meta-argument, the state and configuration stop being round-trippable.
Does OpenTofu support state encryption?
Yes, since v1.7 (April 30, 2024). AES-GCM with six key providers: PBKDF2 (local passphrase), AWS KMS, GCP KMS, Azure Key Vault (1.11+), OpenBao (beta), and an experimental external command provider. Set enforced = true on the state block to prevent accidental plaintext writes.
How do I migrate from Terraform to OpenTofu?
Apply pending changes so terraform plan reports zero diff, back up the state file, install OpenTofu, run tofu init -upgrade, run tofu plan and verify zero changes, then tofu apply a small non-critical change. Match versions one minor at a time when migrating from Terraform 1.6.x or newer. Swap the binary name in CI pipelines (hashicorp/setup-terraform → opentofu/setup-opentofu).
Does OpenTofu work with existing Terraform providers?
Yes. The provider protocol is unchanged — every Terraform provider works with OpenTofu, and vice versa. The OpenTofu registry mirrors HashiCorp providers and adds community publishes. Custom in-house providers continue to work without recompilation.
References
- OpenTofu official site — project home, docs entry point, and download links
- What's new in OpenTofu 1.11 — official changelog summary for the current stable line
- OpenTofu install guide — per-platform install commands, container image, and standalone binary
- OpenTofu migration guide — official Terraform-to-OpenTofu migration with per-version sub-guides
- OpenTofu state & plan encryption — every key provider, configuration block, and fallback / rotation pattern
- OpenTofu releases (GitHub) — full release notes, signed artifacts, and pre-release tags
- The OpenTF Manifesto — the September 2023 document that triggered the fork, with signatory list
- Linux Foundation — OpenTofu 1.7 press release — the state-encryption launch announcement (April 30, 2024)
- CNCF — OpenTofu project page — Sandbox-maturity acceptance details and ongoing CNCF participation
- endoflife.date — OpenTofu — release dates and security-support timeline for every minor version