mrkeyoor.com_
Wed 16 Sept 05:30 UTC
Dev Toolsevaluationupdated 26 Aug 2026

opentofu review

OpenTofu is an open-source command-line tool for describing cloud and data-center infrastructure in code, previewing changes, and applying them. It gives Terraform users a community-governed implementation with its own registry while preserving a familiar configuration workflow.

+55stars / 7d
Verdict

Our OpenTofu build succeeded in 181 seconds, but 3 of 130 Go package tests failed, so the CLI is credible for an evaluated migration rather than a blind swap. Use it if community governance and an open registry matter, and your team can compare plans, protect state, and test providers before applying. Stay with Terraform when exact vendor behavior or commercial support is more important than governance.

We ran it

Lab card: what happened when we ran opentofuScreenshot of opentofu (opentofu.org)
Install✓ · 82s492 packages
Build✓ · 181s
Tests✗ · 279s127 passed · 3 failed of 130 (go test)
Repo5107 files~575,910 lines of source · 24.3 MB · 11 CI workflows · Dockerfile

Answers from our run

Does opentofu build from source?

Dependencies installed in 82 seconds (492 packages), and the build succeeded in 181 seconds. We cloned commit f831fa1 into a clean Debian container with 3 CPUs and no project-specific setup.

Do opentofu's tests pass?

Not all of them: 127 of 130 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use opentofu?

Organizations that require every clean checkout to pass its full test suite: 3 of 130 Go package tests failed in our sandbox.

What are the alternatives to opentofu?

Terraform, Pulumi, Crossplane. Our OpenTofu build succeeded in 181 seconds, but 3 of 130 Go package tests failed, so the CLI is credible for an evaluated migration rather than a blind swap.

Setup4/5Build passed; full tests had 3 failing package results
Docs4/5Clear install, migration, rollback, and nightly-build guidance
Community5/529,927 stars and active pushes with public meetings
Maturity4/5Frequent releases, though our checked commit failed 3 tests

Discussed on

  1. hnOpenTF is now OpenTofu438 points
  2. hnOracle dumps Terraform for OpenTofu255 points
  3. hnOpenTofu Response to HashiCorp's Cease and Desist Letter149 points
  4. hnOpenTofu 1.7.0 is out with State Encryption, Dynamic Provider-defined Functions118 points
  5. hnWhy should I care about OpenTofu?74 points

Who it’s for

Infrastructure teams that want a community-governed, MPL-2.0 tool for declarative provisioning.
Terraform users willing to back up state and compare plans before changing engines.
Operators who need providers for public clouds, SaaS services, or internal systems.
Teams that want nightly builds for pre-release testing while keeping stable releases in production.

Who it’s NOT for

Organizations that require every clean checkout to pass its full test suite: 3 of 130 Go package tests failed in our sandbox.
Terraform users who cannot back up state or run both CLIs during migration: OpenTofu's guide requires both and says to stop if plans differ.
Users whose network originates in a country blocked by the OpenTofu registry under its sanctions policy.
Production teams tempted to deploy nightly builds: the README calls them experimental, unsuitable for production, and deletes each after 30 days.

Setup reality

Our sandbox install succeeded in 82 seconds with 492 Go packages, and the build succeeded in 181 seconds. Tests ended with exit code 1 after 279 seconds: 127 package results passed and 3 failed out of 130. The final failure shown was in internal/tracing/traceattrs, where the log warned about conflicting semantic-convention schema versions.

Building the CLI needs Go, while using it against real infrastructure needs provider downloads, backend access, and cloud or service credentials. Migrating from Terraform also requires access to state files, backups, both CLIs, initialization, and a plan comparison before any apply.

The checkout contained 5,107 files and about 575,910 source lines, so source work is substantial. Nightly builds expire after 30 days and are explicitly outside production use. Registry access is blocked from certain countries of origin under the project's sanctions policy.

OpenTofu manages infrastructure through plans and state

OpenTofu reads declarative configuration, builds a dependency graph, previews the intended work, and creates or changes infrastructure through providers. The workflow will be immediately familiar to Terraform users: initialize a directory, inspect a plan, then apply it. That familiarity is the main reason to consider OpenTofu. A team can evaluate a different implementation without first rewriting every module in a programming language or moving infrastructure control into Kubernetes.

The tool covers existing public providers as well as custom internal ones. Its MPL-2.0 license and community governance distinguish it from HashiCorp's current Terraform distribution, while the OpenTofu registry supplies provider and module packages. The registry is an operational dependency, not a footnote. The README says access is blocked from specified countries of origin to comply with sanctions, which can rule out the default distribution path for affected users.

Migration requires a backup and matching plans

OpenTofu's migration guide starts with state and configuration backups. It requires access to the existing Terraform state plus the ability to run both terraform and tofu. After tofu init, the guide expects tofu plan to show no changes or the same changes as Terraform. If the plans differ, its instruction is direct: do not apply. That is sensible advice because state is the record connecting configuration to real resources.

The rollback path is equally concrete. Stop using OpenTofu, restore state if it changed, run Terraform initialization and planning, then confirm that no surprise changes appear. Interdependent configurations need extra care because terraform_remote_state can pass data between separate states. A simple module may migrate in a short session, but an estate with several state files needs an ordered rehearsal and a recovery point for each one.

What happened when we ran it

Our sandbox installed 492 Go packages in 82 seconds and built commit f831fa1 in 181 seconds. The fresh checkout had 5,107 files, about 575,910 lines of source, and occupied 24.3 MB before dependencies. That is a large compiler and infrastructure codebase, although its successful build means the standard source path worked in the supplied Go 1.24 Debian environment without privileged access or secrets.

The test command failed after 279 seconds with exit code 1. Go reported 127 passed package results and 3 failed out of 130. The tail identified internal/tracing/traceattrs and said that, if the preceding error concerned conflicting schema versions, the semantic-convention package imported by semconv.go should match the package imported elsewhere. The log excerpt does not prove why those versions conflicted, so we would reproduce the failure before changing dependencies.

Eleven CI workflow files and a Dockerfile were present, while there was no top-level tests directory. Go projects commonly keep tests beside source files, so that directory signal alone says little. The failed command matters more: anyone building this exact commit should expect investigation before treating a green local suite as a release gate. Our result covers the stated 3-CPU, 8 GB sandbox, not provider behavior against live cloud accounts.

Plans reduce surprise, but they do not remove credentials or risk

An execution plan shows proposed operations before an apply, and the resource graph can run independent changes in parallel. Those mechanics help reviewers see order and scope. They cannot verify every external effect. Provider credentials, backend permissions, account quotas, policy controls, and eventual API behavior still determine what happens when the plan reaches a service. Production adoption needs isolated credentials and a noncritical project for the first apply.

Source setup is also different from day-to-day CLI installation. Our 82-second dependency step and 181-second build describe contributors compiling the repository. Most operators should use a documented package or release artifact, verify it, then spend their time testing modules, providers, and backend access. Nightly builds are available for current main-branch behavior, but the README calls them experimental and removes each build after 30 days. They belong in compatibility checks, not pinned production automation.

Current maintenance is visible in pushes and security releases

GitHub showed 29,927 stars, 326 combined open issues and pull requests, and a last push on August 26, 2026. Those figures show attention and a substantial user base, but the combined count is not a defect total. Recent open work includes string-handling performance, legacy CLI restructuring, lifecycle expression support, and a report about mathematical functions surfacing an internal panic instead of a clean error. Buyers should inspect the issues that overlap their modules rather than judging by the headline count.

Release v1.12.6 arrived on August 19, 2026 with 2 security fixes. One concerned credentials being resent to an HTTP redirect target during OCI registry interactions. The other addressed high CPU or memory use triggered by crafted relative URLs from an attacker-controlled backend or registry. That release history is evidence of active response, and also a reason to keep infrastructure CLIs patched: initialization processes network responses and credentials before a plan ever changes a resource.

OpenTofu is best when governance justifies migration work

OpenTofu makes the strongest case to Terraform users who like the existing configuration model but want a community-run implementation and registry. The migration guide is careful, releases are current, and the 181-second build passed in our clean environment. The 3 failing package results keep us from calling commit f831fa1 clean, though they do not erase the 127 passing results or establish a production defect.

Choose Terraform when exact HashiCorp behavior, its hosted workflow, or vendor support is mandatory. Choose Pulumi when general-purpose languages are the main draw, and Crossplane when Kubernetes reconciliation should own infrastructure. For OpenTofu, back up state, compare both plans, test one low-risk change, and pin a stable release. That procedure is more important than whether replacing the executable itself feels easy.

Alternatives

ProjectWhat it isPick it when
Terraform gh↗The original declarative infrastructure CLI and the compatibility reference point for OpenTofu.pick this instead when vendor support, Terraform Cloud integration, or exact HashiCorp behavior is a firm requirement.
Pulumi gh↗Infrastructure as code written in general-purpose languages with a managed or self-hosted state service.pick this instead when your team wants TypeScript, Python, Go, or C# abstractions rather than HCL-first configuration.
Crossplane gh↗A Kubernetes control plane that manages cloud resources through custom resources and reconciliation.pick this instead when infrastructure should be exposed as Kubernetes APIs and continuously reconciled inside a cluster.

What people are saying

  1. [github-trending] opentofu/opentofu

Sources

  1. OpenTofu README
  2. OpenTofu migration guide
  3. OpenTofu v1.12.6 release
  4. OpenTofu issue 4520

More dev tools reviews

IKONA-Security · noty · forward-implementation-first · breakscale · black · ASC · the whole board →