Stack Signal.
Technical news & guides across AI, programming and the open-source world
SATURDAY, NOVEMBER 07, 2026 · 101 articles · RSS

DevOps & Self-HostingOct 25, 2026533 words
How-To Guide

OpenTofu 1.13: A Deliberately Lean Release With Linting and Symbol Libraries

OpenTofu 1.13.0 landed at the end of September, and the team is upfront that it is a small release. That is deliberate. They shortened the development cycle to line up with Go's release cadence, which stretches how long the 1.13 series stays under security support — through August 2027. For a tool that provisions your infrastructure, a support window is more than paperwork.

Even a lean release carries signal. Two experiments in 1.13 point at where this Terraform fork wants to go, and one batch of compatibility changes will catch a few teams off guard.

Plan with fewer unknowns

OpenTofu's whole workflow depends on predicting apply before it happens, so anything that reduces "(known after apply)" matters. Version 1.13 adds functions that let module authors tell OpenTofu what they already know. There is convert, plus the assume... family — assumestringprefix being the example in the release notes — which assert a value's shape up front. The trade-off is honest: if the guarantee breaks, apply fails. But when a vendor API documents a contract that the provider itself won't model, you can encode that once in a shared module instead of repeating the workaround everywhere.

Linting, built in

Built-in linting is the most-voted feature request in the OpenTofu repository. Version 1.13 ships the first slice of it as an experiment. tofu validate, plan, and apply now accept a -lint flag, so tofu plan -lint=all works. The initial rule set is small — core:unused-variable, core:count-instead-enabled, core:no-type-variable, and core:unused-local. The long-term plan is bigger: one ruleset checked at every phase of the workflow, folding in policy checks and eventually letting rules reach out through provider plugins.

Symbols for reusable logic

Shared modules exist to manage stateful resources; they are awkward for sharing logic. The Symbol Libraries experiment sketches a fix: .sym.hcl libraries that export functions, types, and constants, imported the same way you import a module. A library cannot touch resources or providers — that is intentional, and it keeps libraries pure and easy to test. You opt in with a language block experiment flag. If the design survives feedback, the goal is to stabilize it for 1.14.

Read the compatibility notes

A few things changed under the hood. Windows on ARM64 now gets official packages. macOS requires 13 Ventura or newer. WinRM is gone from provisioners, after being deprecated in 1.12. And this is the last series with official 32-bit builds: v1.14 will drop them, and older tooling now warns at tofu init. Also note that base64gzip output is equivalent but not byte-for-byte identical after a Go upgrade, so any hashes derived from it may shift.

Stay patched while you think

Since 1.13.0, the project has pushed two patch releases. The notable one is 1.13.2, from 21 October: it fixes a potential CPU-exhaustion issue when tofu init talks to an attacker-controlled HTTP/2 server while installing dependencies, and filters out compromised intermediate certificates. If you are still on an earlier build, moving to 1.13.1 or 1.13.2 is worth doing now.

OpenTofu in 2026 keeps being defined by shipping what Terraform never did — from encrypted state and dynamic prevent_destroy to these two experiments. Version 1.13 is a quiet release, but the roadmap behind it is not.