Release notes
0.82.3
New features and improvements
- Pkl extraction: Shared types are now imported during
formae extractresolving issues where extracted Pkl code referenced types that weren't in scope.
Bug fixes
- FIXED: Container image did not include cloud provider plugin binaries due to a missing dependency in the build process. All resource plugins (AWS, Azure, GCP, OCI, OVH) are now correctly packaged.
- FIXED:
formae applyin certain cases incorrectly rejected changes when modifications were already absorbed in the forma (e.g. viaextract). - FIXED: Empty arrays
[]and maps{}were incorrectly treated as missing values during patch comparison. This caused commands that remove all remaining items from a collection to silently leave items behind, and prevented drift detection from catching out-of-band additions to fields not present in the user's Pkl. - FIXED:
CommandStatusAPI endpoint was not reading the command ID from the path parameter. - FIXED: API returned incorrect HTTP status codes for no-op and simulate commands.
- FIXED: Agent could fail to start after a forced termination (
SIGKILL, crash, or system reboot) because the stale PID file was not cleaned up. The agent now verifies the recorded PID is a live process and removes stale or corrupt PID files automatically. - FIXED: Resolvables referencing nonexistent resources were silently skipped during translation, only surfacing at runtime. Simulate would show a clean plan while the actual apply would fail. These are now caught early and reported as a clear error.
- FIXED:
formae extractaccepted a directory path as target, failing later with a confusing error. It now validates the target path upfront and returns a clear message.
0.82.2
Bug fixes
- FIXED: Simulation output now shows the actual value being removed from arrays instead of displaying "(empty)".
- FIXED: Several Pkl union types with nullable alternatives were incorrectly declared.
Documentation
- Installation guide restructured: Installation documentation is now split into dedicated pages for local, Docker, and Helm deployments.
- Collection handling: New section in Apply Modes explaining how reconcile and patch modes differ when updating collections.
Plugin release notes
Official plugin release notes have moved to dedicated pages under each plugin's documentation. See AWS, Azure, GCP, OCI, and OVH.
0.82.1
Bug fixes
- FIXED: Running
formae extracton discovered resources could crash when all results were unmanaged or when results included a mix of managed and unmanaged resources. The$unmanagedstack doesn't exist in the database, so it was silently dropped during serialization, leaving the PKL generator with missing stack data. Both cases are now handled correctly. - FIXED: Conformance tests could fail for resources that have Resolvable references nested inside SubResource maps. The test runner was comparing these maps as flat strings instead of recognizing the nested references. The framework now recursively walks maps and correctly compares Resolvable fields at any depth.
0.82.0
New features and improvements
- Policies (Beta): formae now supports
policies—configurable behaviors that you attach to stacks, that allow you to choose different automation strategies for different sets of resources and use cases. This release
introduces TTL policies for automatic cleanup after a duration, and
auto-reconcile policies for automatic reversal of out-of-band and incremental changes at regular
intervals. Policies can be inline (owned by a stack) or reusable (shared
across stacks via
.resreference). See the Policy documentation for details. - AI assistant integration (Beta): formae now ships with an MCP server and 13 skills that teach AI coding assistants how to manage infrastructure and open the way to partly or fully agentic, safe, IaC-centric workflows. Deploy, query, detect drift in your own codebase, and build plugins — all through natural conversation. Available as a Claude Code plugin via the formae marketplace. See the AI assistants documentation for details.
- New
formae inventory policiescommand to list all reusable policies. See the CLI documentation for details. - The
formae inventory stackscommand now shows attached policies for each stack. - HasProviderDefault field hint: New
hasProviderDefaultannotation for fields where cloud providers assign default values. When a field with this hint exists in actual state but is not specified by the user, formae accepts the provider's default instead of generating a "remove" operation. This prevents oscillation during reconcile for fields like S3 bucket encryption or SQS visibility timeout. See the schema reference for details. - How-to guides: documentation now includes a growing number of concrete guides how to use formae in different situations and for various use cases.
0.81.0
New features and improvements
- Stack improvements: Stack descriptions are now correctly stored and updated when reapplying. Stacks are automatically deleted when their last resource is removed.
- New
formae inventory stackscommand to query and list all stacks managed by formae. See the CLI documentation for details. - Aurora Data API datastore: New datastore option for AWS deployments using AWS RDS Data API. See the configuration documentation for details.
- Empty targets can now be deleted using
formae destroy. See the target documentation for details. - Non-interactive plugin init: The
formae plugin initcommand now supports non-interactive mode for automation, CI pipelines, and LLM-assisted workflows. Use the--no-inputflag with CLI flags to provide all required values. See the plugin tutorial for details. - Plugin dashboard: A new Grafana dashboard for monitoring plugin metrics is available in the formae-grafana-dashboards repository.
- Plugin log messages now show the plugin name instead of the namespace.
Bug fixes
- FIXED: Resources with fields that are arrays of resolvables are now handled properly.
- FIXED: Plugin shutdown no longer produces spurious error messages.
- FIXED: Improved import declaration generation when using
formae extract.
0.80.1
Bug fixes
- FIXED: The
extractcommand would fail for plugins where the plugin name differed from the namespace.
0.80.0
Breaking Changes
- Plugin SDK: Complete overhaul of the
ResourcePlugininterface, the formae Pkl schema and plugin distribution. See the plugin SDK documentation for details. - Formae Pkl schema:
nonprovisionableandpersistresource annotations have been removed. Tags are no longer a first-class citizen in formae and will be superseded by plugin-specific implementations. For AWS,formae.Tagwill be supported for three more releases before being removed. Please update tag definitions in your AWS Pkl files to useaws.Taginstead offormae.Tag.
New features and improvements
- Official Release of the Plugin SDK: formae now has a plugin SDK for building custom resource plugins. See the plugin SDK documentation for details.
- Beta support for Azure: Initial open source release of the Azure plugin. See the Azure documentation for supported resources.
- Beta support for GCP: Initial open source release of the Google Cloud plugin. See the GCP documentation for supported resources.
- Beta support for OCI: Initial open source release of the Oracle Cloud plugin. See the OCI documentation for supported resources.
- Beta support for OVH: Initial open source release of the OVH/OpenStack plugin. See the OVH documentation for supported resources.
- Local schema support for project init command: The
formae project initcommand now supports initializing projects with local schemas for plugin developers using the@localsuffix. See the CLI documentation for details.
0.76.5
Bug fixes
- FIXED: In some cases updates for AWS Tags were generated incorrectly, causing commands to fail.
- FIXED: If there were unfinished commands on agent startup, the agent would some times try to resume those commands before the plugins were fully initialized.
- FIXED: Commands would fail when a read operation failed with a recoverable error (like a rate limit).
- FIXED: AWS::EC2::TaskSet was incorrectly marked as discoverable causing noise in the logs during discovery.
0.76.0
Breaking Changes
- Plugin Architecture Migration: Plugins must now be built as standalone
executables instead of shared libraries (
.sofiles). Existing custom plugins need to be updated with amain()function that callsplugin.Run(). See the AWS plugin implementation for reference.
New features and improvements
- Plugin Architecture Overhaul: Plugins now run as separate executables in their own processes rather than as shared libraries, enabling independent dependency graphs and multi-host deployment.
- Major Performance Improvements: Significantly improved command processing performance. Previously limited to around 500 resources, the agent now handles up to 20,000 resources. See the agent sizing recommendations for resource requirements.
- Enhanced Observability: The agent now exports comprehensive telemetry via OpenTelemetry including metrics, structured logs with trace correlation, and distributed traces for API requests, resource operations, and database queries.
- Grafana Dashboards: Pre-built Grafana dashboards for monitoring formae are now available in the new formae-grafana-dashboards repository.
- New
temporalityconfiguration option for OTLP metrics export, supporting both delta (OTel-native) and cumulative (Prometheus/Mimir) temporality.
Bug fixes
0.75.5
New features and improvements
- Shell auto-completion is now supported for
formaecommands in bash and zsh. The installer can now install the necessary completion scripts - Sync commands that did not pull in any changes are now automatically removed from the database
Bug fixes
- FIXED: AWS::IAM::RolePolicy was missing Resolvable in the Pkl schema
- FIXED: Resources resolving a property of an unmanaged resource were rendered incorrectly
0.75.4
Bug fixes
0.75.3
Bug fixes
0.75.2
New features and improvements
- Watch output prints useful hints at the end of the output
- Targets are now discoverable by default
- When creating a target, discovery is automatically initiated
- Discovery now traverses multuple levels of parent-child relationships in resource hierarchies
- Discovery can now handle multiple namespaces
- Discovery creates resolvables to parent properties in child resources
- Destroy queries no longer accept "managed" as a field parameter, as it does not apply to destroy operations
Bug fixes
- FIXED: Bringing resources under management that do not support tags does not work
- FIXED: Nested resources are not being discovered when no new parent resource is found
- FIXED: Extracted targets do not contain the discoverable property
- FIXED: Deletion of certain resources in the cloud fails to propagate to the inventory
- FIXED: Multiple race conditions where resources were discovered or synchronized during an apply operation (with very aggressive discovery and sync intervals configured)
0.75.1
New features and improvements
- Implemented database migration for future changes
- Discovery is enabled now by default in the configuration
- Targets are now discoverable by default
- Default discovery interval is now at 10 minutes instead of previously 1 hour
Bug fixes
0.75.0
New features and improvements
- New
formae cancelcommand that allows to cancel any apply or destroy command already being executed by the agent. - New
formae inventory targetscommand to query and list targets with filtering by label, namespace, and discoverability. - Targets now support a
discoverablefield for granular control over which targets participate in discovery scans. - Pkl: Nested fields are now being parsed.
- The
lifelineexample now uses more idiomatic PKL code.
Breaking changes
- We are deprecating configuration of discovery targets through the agent config. Instead, targets need to be configured through forma application now.
Bug fixes
0.74.0
Public launch.