terraform
The licence changed under the state file

On the tenth of August, HashiCorp relicensed. On Wednesday, the fork that followed was accepted by the Linux Foundation and renamed OpenTofu. In between there were six weeks of the loudest argument the infrastructure-as-code world has had in years.
I hold a Terraform certification and every environment I have worked on in the
last several years is described in .tf files, including the
runner fleet I wrote
about last autumn. So this is not an abstract industry story for me. It took a
weekend of reading to work out what, if anything, I actually had to do.
The short answer is: much less than the volume of the argument suggested. The long answer is worth writing down, because the parts that matter are not the parts that got quoted.
What changed, precisely
HashiCorp moved future releases of its products from the Mozilla Public License 2.0 to the Business Source License 1.1. Not just Terraform — Vault, Consul, Nomad, Boundary, Packer, Waypoint and Vagrant as well.
The BUSL is not an open-source licence. It permits copying, modification and redistribution, and it permits production use, with one carve-out: you may not offer the licensed work to third parties on a hosted or embedded basis in a way that competes with HashiCorp's own products. It also carries a change date — each release converts to the MPL after four years.
And here is the sentence that most of the first week of commentary skipped: the APIs, the SDKs, and the providers stay under the MPL 2.0.
That last one deserves a moment, because the providers are where the actual surface area is. The AWS provider is the thing that knows how to create a security group. If that had moved, the argument would be about something else entirely. It did not.
So what does it mean for a team that just runs Terraform
Nothing. I want to be blunt about it, because the gap between the licence text and the temperature of the discussion was wide enough to mislead people.
If you use Terraform to manage your own infrastructure — you run plan, you run
apply, the state lives in your bucket, nobody outside your company touches your
pipeline — you are not offering the licensed work to third parties on a hosted or
embedded basis, and BUSL permits what you are doing. Your existing releases are
unaffected in any case, because a licence change applies to future releases and
not retroactively to versions already published.
Who it does hit is the ecosystem: companies whose product runs Terraform on behalf of customers, or embeds it. Which is precisely why the fork came from that direction, and why the list of organisations signing the manifesto looked the way it did.
The six weeks
Worth recording the sequence, because it moved unusually fast for something of this kind.
The manifesto went out on the fifteenth of August, asking HashiCorp to reverse the decision, and collected tens of thousands of GitHub stars and pledges from well over a hundred companies. On the twenty-fifth it stopped being a request and became an announced fork. The repository went public on the fifth of September. On the twentieth, the Linux Foundation accepted the project and the name changed from OpenTF to OpenTofu, for trademark reasons that are not hard to guess.
That is three days ago. It is worth being clear-eyed about what exists at this moment: a governance structure, a foundation home, a great deal of goodwill, and no release. Choosing OpenTofu today is choosing a promise made by people with good reason to keep it — which is not nothing, and is also not a binary you can pin in a pipeline.
What I am actually doing on Monday
Nothing dramatic, and I think that is the correct answer rather than a lazy one.
Terraform 1.5 is the last release under the MPL, so that is a line worth knowing where it falls. Everything at or below it stays exactly as available as it was.
I pin the CLI version in CI already, which turns out to be the whole of my mitigation. A pipeline that resolves "latest" at run time is a pipeline that can have its terms changed without a pull request; a pinned version is a decision somebody has to make deliberately. That was good practice for reproducibility before any of this happened, and it is the same good practice now for a different reason.
Beyond that: modules and providers are MPL and unaffected, and the state file is a JSON document that both tools understand, so the thing I would be migrating is a binary rather than an estate.
The part I find genuinely interesting
The value was never in the CLI.
A fork can copy the CLI. It is a substantial program, but it is a known and
bounded one, and the people doing the forking are the people who already know it
well. What a fork cannot unilaterally copy is the ecosystem around it — the
provider registry, the module registry, the thousands of modules that assume a
particular tool is reading them, the tutorials, the certifications, the fact that
terraform is what the documentation of every other product tells you to run.
So the question that decides this is not "is the fork any good". It is whether providers and registries end up publishing to both. If they do, the fork is a drop-in and the licence stops mattering to people like me. If they do not, the fork is a very good program that reads a slightly different world.
That is a supply-chain question rather than a moral one, and it is the one I will be watching. In the meantime I have a pinned version, a state file that is just JSON, and no urgent problem — which is a more comfortable position than the last six weeks of reading suggested I would be in.
Written by
Deyan Peev
Founding Engineer · Sofia, Bulgaria


