In August 2023, HashiCorp changed Terraform’s license from the Mozilla Public License (MPL) to the Business Source License (BSL). The community response was swift - OpenTofu was forked from Terraform 1.5 within weeks and accepted by the Linux Foundation. By 2026, both OpenTofu and Terraform have diverged significantly, and Pulumi’s growth has been accelerating.
Here is where things stand and which tool to use.
The License Situation
Terraform (HashiCorp/IBM): The BSL restricts competitive use. If you’re building a product that directly competes with HashiCorp’s commercial offerings, you need a commercial license. Individual teams using Terraform to manage their own infrastructure are generally fine under the BSL, but the ambiguity drove enterprises to re-evaluate.
HashiCorp was acquired by IBM in 2024. The practical impact on Terraform’s development trajectory and licensing terms is still playing out, but IBM’s track record with acquired developer tools is not universally positive.
OpenTofu: True open source, maintained by the Linux Foundation, backed by Spacelift, Gruntwork, Env0, and others. Fully compatible with Terraform HCL configurations. OpenTofu 1.8+ added features Terraform doesn’t have: provider-defined functions, earlier variable evaluation.
Pulumi: Never had a license controversy. Uses real programming languages (TypeScript, Python, Go, Java, .NET) instead of HCL. Strong commercial offering but the core SDK is Apache 2.0.
Terraform HCL vs. Real Programming Languages
This is the fundamental choice. HCL (HashiCorp Configuration Language) was designed to be declarative and readable by non-programmers. Pulumi uses actual programming languages.
HCL for a simple AWS S3 bucket:
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-unique-bucket-name"
}
resource "aws_s3_bucket_versioning" "my_bucket" {
bucket = aws_s3_bucket.my_bucket.id
versioning_configuration {
status = "Enabled"
}
}
Pulumi (TypeScript) for the same:
import * as aws from "@pulumi/aws";
const bucket = new aws.s3.Bucket("my-bucket", {
versioning: {
enabled: true,
},
});
The Pulumi code is shorter. More importantly, it uses the language’s type system, IDE autocomplete, existing testing frameworks, and package manager.
Where HCL wins: reviewability. A product manager or security engineer can read HCL and roughly understand what it’s doing. They cannot read TypeScript infrastructure code without engineering context.
Where real languages win: anything dynamic. Terraform/HCL’s for_each and count are workable for simple loops. For complex conditional logic, interpolated values, and programmatic resource creation - it degrades into unreadable HCL that fights against the language’s declarative intent.
Feature Comparison in 2026
| Feature | Terraform 1.9 | OpenTofu 1.9 | Pulumi 3.x |
|---|---|---|---|
| Language | HCL | HCL | TS/Python/Go/Java/.NET |
| State management | Remote/local | Remote/local | Pulumi Cloud/local |
| Provider ecosystem | ~3,000 | ~3,000 (same) | ~1,200 native + Terraform bridge |
| Import existing resources | Yes | Yes | Yes |
| Testing | terraform test |
tofu test |
Native language testing |
| Policy as code | Sentinel (paid) | OPA | CrossGuard |
| Stack dependencies | Workspaces | Workspaces | Stack references |
| Provider-defined functions | No | Yes (1.8+) | N/A |
| License | BSL | MPL 2.0 | Apache 2.0 |
The provider ecosystem is the most important row. Terraform’s 3,000 providers - built over 10 years - give it comprehensive coverage of every cloud and SaaS service. Pulumi has a Terraform bridge that lets it use any Terraform provider, but the experience is less polished than native providers.
Where Each Tool Wins
Terraform / OpenTofu:
- Teams with existing HCL codebase
- Organizations that need to document infrastructure for non-engineers
- Shops that want the widest provider coverage
- Teams where the primary audience for infra code is operations, not developers
Choose OpenTofu over Terraform for new HCL projects. The license is cleaner, development is active, and the feature set is at parity or ahead. The migration from Terraform to OpenTofu is typically a one-line change to your tooling.
Pulumi:
- Teams of software engineers who write TypeScript or Python daily
- Complex infrastructure with dynamic resource creation
- Organizations that want to use existing code review, testing, and package management for infra
- Projects that mix application and infrastructure code in the same repository
The trend among developer-forward teams: Pulumi is winning new projects. The “infrastructure as software” pitch lands well with engineers who are frustrated by HCL’s limitations.
The CDK Wildcard
AWS CDK (Cloud Development Kit) and CDK for Terraform occupy an interesting middle ground. CDK lets you write TypeScript/Python that generates CloudFormation (CDK) or Terraform HCL (cdktf). You get real language expressiveness with the proven Terraform provider ecosystem.
CDK for Terraform + OpenTofu is worth serious consideration for AWS-heavy shops that want TypeScript/Python semantics without fully committing to Pulumi’s state management model.
Practical Migration Guide
If you’re on Terraform and considering OpenTofu:
- Change your
terraformbinary reference totofu - Change the
required_providerssource for HashiCorp providers if needed - Run
tofu plan- it should produce identical output - The state file format is compatible
If you’re moving from Terraform to Pulumi:
- Use
pulumi convert --from terraformfor automated conversion - Expect 20-40% of resources to need manual cleanup
- Budget 2-3 weeks for a medium-sized codebase migration
- Consider running both in parallel during transition
Bottom Line
The IaC landscape settled into three camps: Terraform (BSL, IBM, mature ecosystem), OpenTofu (open source fork, active development, full HCL compatibility), and Pulumi (real languages, growing ecosystem, strong DX). For new HCL projects, choose OpenTofu over Terraform for licensing clarity. For engineering-led teams that find HCL limiting, Pulumi is the right direction. The “right answer” depends less on technical merit and more on your team composition and the complexity of your infrastructure logic.
Comments