Newformae Cloud is live! Fully managed by us, $25/month flat for a limited time.
formaeGet in touch

formae vs. OpenTofu

formae is an OpenTofu alternative built for day 2 and beyond. OpenTofu works well for day 1 provisioning; formae continuously discovers what is actually running, keeps your code as the source of truth instead of a state file, and applies changes at any granularity with minimal blast radius. It can fully replace OpenTofu, or run alongside it.

OpenTofu is an open source infrastructure as code tool, forked from Terraform, licensed under the MPL and accepted into the CNCF in April 2025. It has diverged in real ways since the fork: client-side state encryption, early evaluation of variables in backends and module sources, the ability to exclude resources from a run, and distribution of providers and modules through OCI registries. What has not changed is the model underneath. Configuration is written in HCL, changes go through a plan and an apply, and a state file still stands between the code and the infrastructure.

OpenTofu state vs. formae state

OpenTofu keeps a state file, and its own documentation calls that file a source of truth for your environment. Encryption stops the wrong people reading it; it does not keep it current. Changes made by other tools, automation, APIs and clickops are absent until somebody refreshes, so the code and the state can both drift away from what exists.

formae uses a different state model. It continuously discovers live infrastructure and versions it into an internal state that reflects reality, however the change was made and whoever made it, so nobody has to remember to refresh and nothing accumulates between refreshes. There is no file to protect, because there is no file that claims to know.

OpenTofu workflows vs. formae workflows

OpenTofu applies changes holistically and fits GitOps-style workflows. The exclude flag added after the fork lets you leave resources out of a run, which is finer control over what a single rollout touches, and every change still arrives as a run over the whole state.

formae supports the same GitOps workflows and does not need the rollout at all. A change can be one property on one resource or a whole environment, applied directly, so the blast radius is what you asked for rather than whatever the run happens to contain. Nothing else in the stack has to be re-planned to move one value.

OpenTofu language vs. formae language

OpenTofu is written in HCL, a language built for this one job. It reads well for a flat description of resources and gets uncomfortable as soon as logic is needed: conditionals, loops and generated names arrive as meta-arguments and functions rather than as language. Early evaluation widened where variables may be used, which is a convenience rather than a change to the language.

formae uses Pkl, a configuration language with types, validation and inheritance. A resource is declared through a class and checked before anything runs, so a mistake is a failure in your editor rather than a half-applied change in production. A variant is made by deriving from the class instead of copying a module and editing the copy, which is why the tenth environment costs what the second one did. What you read is what is validated.

OpenTofu drift handling vs. formae drift handling

OpenTofu treats drift as an anomaly to be found and corrected. A refresh asks the providers what is there and a plan shows how far reality has moved from the file, but both are steps somebody has to remember, and putting it back is decided by hand each time.

formae treats drift as a normal outcome of infrastructure changing, and continuously absorbs it. The change is recorded as it happens, whatever made it, so the fix somebody applied by hand at 2am is already codified by morning. Keeping it or reverting it is decided afterwards, with the history in front of you, rather than during the incident.

OpenTofu extensibility vs. formae extensibility

OpenTofu providers are built with the Terraform Plugin SDK and carry the complexity that comes with it. OCI registry support, added after the fork, changes how providers and modules are distributed, which helps supply chain and air-gapped installs and does not change what it takes to write one.

formae is designed to be extended directly by infrastructure builders. A new system is a plugin against a schema-safe interface, with no wrapper to keep in step and no vendor roadmap to wait on. Many are built in under an hour with an AI agent helping, which is what puts extensibility within reach of one engineer.

OpenTofu cloud options vs. formae cloud options

OpenTofu is the engine and nothing more. The project ships no hosted service, so the runner is yours to choose and operate, whether that is your own CI or one of the commercial platforms built around it. Either way the configuration is yours to author and keep current.

formae Cloud requires no code from you and no runner of yours to operate. There is nothing to write and no repository to keep in step, because formae describes what is already running and changes it in place. We operate it, and it reaches your account through a role you grant and can revoke.

OpenTofu AI integration vs. formae AI integration

The OpenTofu MCP server is a registry server. An agent can search providers and modules and read their documentation, which makes the configuration it writes more accurate. It does not run anything: the code still has to be written, and somebody still applies it.

With formae the agent calls the product's own operations. It discovers what is running, changes one property or a whole environment, applies it, and the change is versioned as it happens - so asking for a change and the change happening are one step, and what it leaves behind is a version rather than a pull request.

Capability comparison

CapabilityOpenTofuformae
Infrastructure code is the source of truthnoyes

OpenTofuno

  • after the initial rollout the state file is the source of truth

  • OpenTofu's own documentation calls it a source of truth for your environment

  • state encryption protects that file from being read, it does not keep it current

formaeyes

  • user works exclusively through code in and out

  • always up-to-date

Why this matters

There is a reason why it is called Infrastructure as code. You should be able to see your current infrastructure as code at any time, always up-to-date, without having to manually update it.

Day 1 operationyesyes

OpenTofuyes

built for holistic code management and rollouts

formaeyes

built for Day 1 and Day 2+ operations

Why this matters

On Day 1, everything is simple, but a properly structured approach with IaC is needed - ClickOps doesn't work on Day 1 at scale, for example. Repeatability of initial rollout into different environments always plays an important role.

Day 2+ operationnoyes

OpenTofuno

  • built for holistic code management and rollouts

  • additional tools and offerings are needed to support more Day 2+ workflows and use cases

formaeyes

built for Day 1 and Day 2+ operations

Why this matters

Starting on Day 2, the reality is complicated, and the so-called "drift" is inevitable. Small changes are common, and also different tools will almost certainly be in use to manage infrastructure. Even ClickOps is a legitimate tool in some cases - there is no reason to avoid powerful tools such as Cloud Web Consoles just to satisfy a rigid process that is implemented for Day 1 operations.

Cloud providers make updates without updating or even knowing about your infrastructure code. All sorts of autoscaling rules and technologies constantly change the topology. Security tools and teams make urgent and planned changes often bypassing infrastructure code as well. Different teams follow different processes and implement different workflows for maximum speed. It is necessary to stay in control of drift and automate your response to it, not only be able to detect it.

Support for every engineer's use casesnoyes

OpenTofuno

  • designed to serve the highly skilled engineers who already know Terraform

  • the same expertise is the entry price, because the language and the workflow did not change

formaeyes

supports all use cases and workflows of operations and platform teams

Why this matters

Empowering every engineer to work with the tool enables faster change at lower cost. Infrastructure experts can focus on low-level detail such as networks, while less experienced engineers can still make targeted/small changes without going too deep. Developers - who barely operate systems - can consume or request infrastructure without knowing any low-level detail. All these roles have their own nuances, too, depending on the team setup, skills and situations. For example, being an expert and having to fix an urgent problem at 2a.m. is a different use case than preparing a new team environment, and requires different focus, blast radius control and sometimes even tools.

Simple configuration languagenoyes

OpenTofuno

  • HCL is complex

  • its support for conditionals and loops is very uncomfortable

  • early evaluation widened where variables may be used, it did not simplify the language

formaeyes

  • uses Pkl, which is a simple configuration language with minimalistic, but comfortable elements of programming

  • open to further schemas

Why this matters

The language of the infrastructure code needs to be simple. Of course, "simple" is highly subjective. But for example, Ops teams usually don’t do full-blown software development, which most ecosystems such as TypeScript, Java or Python require. Scripting is as far as people go in Ops. So far, YAML is the widely used common denominator that every engineer accepts, but it requires extra tools for templating, conditionals, functions and other means borrowed from programming. And these are needed for flexibility and DRY (don't repeat yourself).

Schema safetyyes, butyes

OpenTofuyes, but

  • schema is implemented per provider

  • provider mocking helps you test against a schema, it does not make one uniform

formaeyes

strong, uniform schema

Why this matters

Schema safety is essential to avoid human error. Understanding the schema without having to navigate through each provider's source code makes configuration of resources simple and allows team-specific derivatives. On the other hand, using such low-level languages such as YAML currently comes at the cost of not having any schema safety at all, with a high risk of human error - sometimes catastrophic.

Schema-based resource and dependency declarationyes, butyes

OpenTofuyes, but

  • resource definition through the provider schema

  • dependencies are static and cannot be derived from what is actually running

formaeyes

  • simple resource declaration through classes and inheritance

  • hints on resource types that are used to automatically identify and resolve dependencies

  • provides a so-called res, which is a simple yet powerful referencing construct

Why this matters

When all data-specific, mechanical aspects, as well as dependencies of the resource are defined through schema, target infrastructure is easy to maintain and adjust, and it allows you to keep the infrastructure code clear and the providers / plugins lean and simple to maintain. Too often, relationship and dependency logic is hiding inside already complicated provider code, which unnecessarily complicates the resource lifecycle management and the usage of the tool.

Low provider complexitynoyes

OpenTofuno

  • providers are built with the Terraform Plugin SDK and carry its complexity

  • OCI registries changed how providers are distributed, not what it takes to write one

formaeyes

  • plugins are simple and uniform

  • every technology plugin implements CRUD+

  • workflow, state transitions, retries etc. are implemented through the agent, so the plugin just works with data without managing state

Why this matters

Low provider (or plugin) complexity means easy update cycle, reliability and ability for anyone in the community to quickly implement their own plugins and provide bugfixes to existing ones. In the classic IaC, providers are often full-blown programs with workflow and lifecycle logic which can usually only be adjusted by its creators. There are also big differences in provider quality that are difficult to deal with. Lightweight plugins also relax that issue.

Active agentnoyes

OpenTofuno

  • pure client-side runtime

  • the backend is a storage definition, not something that keeps working after you close the laptop

formaeyes

  • active agent

  • takes care of state management and automation

  • picks up unfinished work after failures

Why this matters

Engineers shouldn’t need extra tools to compensate for the inability of their IaC tool to support automation. Classic IaC tools attempt to work exclusively on the local machine, following the minimalistic philosophy of the original UNIX tools. This hinders the ability to work in teams or multiple teams, and puts the user in the middle of the process as yet another tool. True automation is only possible by handing off work to an active agent, removing toil for users.

Asynchronous change executionnoyes

OpenTofuno

  • every provider is responsible for its own state transitions

  • asynchronous execution is left to each one

formaeyes

  • executes every stack and resource change asynchronously

  • the agent makes sure every resource change is going through a set of finite state machines that eventually finish

Why this matters

Applying infrastructure changes asynchronously makes them reliable and repeatable. Some infrastructure modifications in some technologies can take a long period of time and follow a complicated workflow. This doesn't mean that a full-blown workflow engine is the solution though - it only means that infrastructure changes need to run asynchronously, without the initiating user process having to wait for the result. And that unfinished work can be picked up after crashes without the risk of state corruption.

Automatic state managementnoyes

OpenTofuno

  • manual refresh of state through the user at unpredictable points in time

  • encryption secures the file, it does not maintain it

formaeyes

  • automatically manages state

  • stored in an RDBMS for strong durability and consistency

Why this matters

State management is a highly manual process in the classic IaC, and constantly requires human attention and intervention. Even if some tools manage the state data in cloud offerings, the point in time when the state is updated is still up to the engineer, making them part of the tool. Engineers should not have to tell their IaC tool when to persist or update its state. Having to manually maintain state introduces an additional layer of complexity and possible human and technical error.

Minimal lockingnoyes

OpenTofuno

  • locks the state globally

  • additional tools and offerings are needed to relax the problem

formaeyes

locks per resource

Why this matters

Global locking is how classic IaC tools make sure their state doesn't get corrupted by parallel mutations, but only a single resource can be locked in the majority of cases. Global locking is causing slowdowns and waterfall-like team workflows, while minimal locking makes sure teams and engineers can move independently and fast.

Arbitrary change granularityyes, butyes

OpenTofuyes, but

  • can target single resources, and the exclude flag can leave resources out of a run

  • both still work through a run over the whole state

formaeyes

single property, single resource, full stack and even whole cloud estate granularity of changes

Why this matters

Being able to apply changes in any granularity allows you to massively reduce risks, limit the blast radius of those changes and maintain focus, resulting in much less human error. Holistic Day-1-style rollouts on Day 2 create cognitive overload and more toil in cases where small changes are made, for example urgent fixes. Changing a single property of a single resource shouldn't feel like touching the whole infrastructure code.

Patchingnoyes

OpenTofuno

  • does not provide patching: the configuration still has to carry every value, or the ones left out are lost

  • targeting and the exclude flag narrow what a run touches, not what you have to write

  • changing one property still goes through a plan and an apply

formaeyes

  • allows you to patch even single properties on single resources

  • no need to see or provide irrelevant fields or resources at patch time

Why this matters

Being able to incrementally apply changes to single resources without dealing with irrelevant details is crucial for safety and speed. Blast radius control is a big and central topic in IaC. The less detail is needed to make an infrastructure change, the more confident you can be. Also, incremental changes are very common in many environments starting on Day 2. There are many situations where a patch is the simplest, quickest solution, and the IaC tool needs to support these.

Automatic drift detectionnoyes

OpenTofuno

  • does not automatically detect drift

  • a refresh and a plan are manual steps somebody has to take

formaeyes

  • detects every change and automatically absorbs it

  • turns every change into versioned code

Why this matters

The term "drift" has been massively bloated in the classic IaC world. Since classic IaC tools are not able to automatically catch up on changes happening outside or their own idea of state, these changes have been declared as something very bad. Some tools even go so far that they automatically reconcile from their own state, undoing changes that happened outside of the tool. The reality in any reasonably complex environment is much more nuanced though. Multiple tools will be used, and changes of all kinds happen through all kinds of actors. Enforcing a single process and a single tool is often impossible, and also not reasonable. Drift as such should not be a concern - state and real infrastructure need to be always in perfect sync, with changes coming from both ends.

Automatic drift correctionnoyes

OpenTofuno

  • does not automatically correct drift

  • putting reality back is a decision made by hand each time

formaeyes

automatically corrects drift both ways - to infrastructure and from infrastructure

Why this matters

Once drift has been automatically detected, it is crucial to also automatically correct it. It doesn't mean to restore infrastructure from the state one way - this would be only one of the possible strategies, and it shouldn't be applied uniformly. A more reality-friendly strategy is to accept changes coming from both ends. After all, when a change already happened in the target infrastructure, the state needs to be first updated, so there is no drift. After that, the user is free to decide if they want to undo the change. Or the change can be undone automatically according to some policy, but even after it has been registered and versioned.

Automatic resource discoverynoyes

OpenTofuno

  • does not automatically discover resources

  • adopting what already runs means importing it, resource by resource

formaeyes

  • automatically discovers new resources

  • automatically tracks and versions changes even on unmanaged resources

Why this matters

Automatic discovery of new resources makes use cases possible that are unthinkable or difficult to implement with the classic IaC tools. For example, you are able to analyse existing infrastructure immediately, even when there is no infrastructure code available. Also, patches on existing resources can be made quickly when these are discovered and turned into code - completely without the need to look at the rest of the infrastructure. On the other hand, classic IaC tools would send you through a manual process of importing existing resources that is prone to error. Automatic resource discovery also allows you to have a full inventory of existing resources for further processing entirely without manual work.

Automatic change synchronizationnoyes

OpenTofuno

  • does not synchronize changes made outside the tool

  • a manual refresh is the only way they arrive

formaeyes

captures and versions every change that happens outside of the tool

Why this matters

Changes happen all the time outside of the IaC tool in a reasonably complex environment. It is a good idea to capture them automatically, not manually. Classic IaC tools require the user to update their state explicitly and manually, which inevitably leads to drift. On the other hand, state that is automatically up-to-date with the infrastructure makes changes predictable and reliable, and allows you to make explicit decisions to keep or to undo changes that happened outside of the tool.

Automatic change versioningnoyes

OpenTofuno

  • does not version changes

  • additional tools and offerings provide versioning to some extent

formaeyes

automatically versions all changes, no matter where they came from - be it from other tools, or even through ClickOps

Why this matters

When every change is automatically versioned, no matter where it came from, infrastructure is fully auditable. Also, versioning of changes allows you to review and to restore previous states at any time. Git is usually used for this in GitOps, but it comes at the price of code in Git being decoupled from state and from infrastructure. If the IaC tool takes care of change versioning, it is also one tool less to deal with in situations where change history needs to be analysed or used.

Automatic change codificationnoyes

OpenTofuno

  • does not automatically codify changes

  • deriving code from state is a manual exercise

formaeyes

  • every change is automatically codified

  • the user extracts resources or stacks exclusively as code

Why this matters

Users should communicate with the IaC tool exclusively through code. This requires every change to be codified automatically, no matter where it came from, so that the user can retrieve any current or past resource state as code. Classic IaC tools on the other hands Classic IaC tools, on the other hand, make users absorb their highly technical, low-level state format such as JSON and go through a complicated, manual procedure to turn it into actual infrastructure code.

Automatic policy enforcementnoyes

OpenTofuno

  • lacks an active backend to provide it natively

  • requires extra tools and offerings

formaeyes

  • offers TTL, auto-reconcile out of the box

  • easy to extend with further policies

Why this matters

Automatic policy enforcement brings piece of mind and guardrails that prevent overspend, drift and toil.

Easily extensiblenoyes

OpenTofuno

  • requires deep provider framework expertise

  • schema, state and lifecycle logic must be implemented by hand

formaeyes

  • simple, uniform Plugin SDK with minimal boilerplate

  • extensibility accessible to many engineers

  • easily combined with AI code assistance

Why this matters

Extensibility should not be gated behind specialist expertise. When adding integrations is hard, it becomes a bottleneck: teams wait on scarce provider engineers and somebody else's roadmaps, product teams can’t self-serve, and platform evolution slows. Making extensions easy and safe unlocks broader contribution, faster iteration, and reduces dependency on scarce experts.

Fast and safe plugin developmentnoyes

OpenTofuno

  • cycles are slow because of complex lifecycle code

  • subtle state and diff bugs need expert debugging

formaeyes

  • many plugins can be built in under an hour with AI help

  • safety enforced by uniform schema and lifecycle conventions

  • agent does all the heavy lifting, making plugins simple

  • no manual state machine or diff implementation required

Why this matters

Speed only matters if you can trust the result. Integrations that take weeks to build or are risky to validate get deferred, copied manually, or shipped with latent correctness issues. Rapid, safe plugin development means teams can add and evolve integrations continuously - without increasing operational risk or creating long-term maintenance debt.

Hosted with no code to author or repository to maintainnoyes

OpenTofuno

  • the project ships no hosted service of its own

  • whichever runner you choose, the configuration is yours to write and keep current

formaeyes

no code from you: nothing to write, and no repository to keep in step

Why this matters

A repository of infrastructure code is a second system to keep alive. Somebody writes it, somebody reviews it, and somebody keeps it in step with infrastructure that changes without asking it, which is work that never ends and never ships anything. Hosting the runs or the state elsewhere moves none of it. Not needing the repository at all is what removes it.

AI integration through the product's own operationsnoyes

OpenTofuno

  • the MCP server is a registry server: it searches providers and modules and reads their documentation

  • it does not run anything, so the code still has to be written and applied by somebody

formaeyes

the agent calls the product's operations: discover, apply, patch, set a lifetime or auto-reconcile

Why this matters

An agent is only as useful as the surface it is handed. Given a codebase and a run pipeline, its work arrives as a code change that somebody still has to read, approve and release. Given the operations themselves, asking for a change and the change happening are one step, and the record of it is a version rather than a commit.

Frequently asked questions

Which edition fits you
  • Is formae an OpenTofu alternative?

    Yes. formae can be used anywhere OpenTofu is used and can fully replace it for managing infrastructure as code. It can also run alongside OpenTofu when teams choose to adopt it incrementally.

  • Do I need to migrate my OpenTofu code or state to use formae?

    No. formae does not require importing OpenTofu state or rewriting existing code. It discovers existing infrastructure directly.

  • Can formae work with infrastructure that OpenTofu manages?

    Yes. formae can discover and track infrastructure managed by OpenTofu, without relying on its configuration or state files.

  • Is OpenTofu the same as Terraform?

    Not any more. OpenTofu began as a fork and has since added client-side state encryption, early evaluation of variables in backends and module sources, the ability to exclude resources from a run, and distribution through OCI registries. The model is still the same: HCL, a plan and an apply, and a state file between the code and the infrastructure.

  • How does formae handle out-of-band changes and drift?

    formae continuously discovers all infrastructure changes, including out-of-band changes, and absorbs them into its internal state. Drift does not accumulate.

  • Can formae be adopted incrementally?

    Yes. formae can be enabled in read-only mode and introduced gradually, without disrupting existing workflows.