| Release Number | 1.5.0 |
|---|---|
| Release Date | November 10th, 2025 |
| Tag | infrahub-v1.5.0 |
We're excited to announce the latest version of Infrahub, v1.5.0!
This release delivers major enhancements focused on data lifecycle management, significant performance gains, and operational maturity.
We've made extensive architectural refactors across the board: HFIDs and Profiles are now computed at write time for faster reads, and the display_label property has been modernized to use Jinja2 templating, supporting relationships for richer context.
For automation, we introduced controls to disable Generator runs during CI/merge events to eliminate redundancy. We also delivered a crucial new Backup & Restore Tool to orchestrate consistent recovery procedures across Neo4j, PostgreSQL, and artifact storage (initially supporting Docker Compose).
Finally, we've ensured Webhooks are more consistent by aligning custom webhook data formats with standard events, and improved overall efficiency via memory optimizations in multi-branch setups.
Main changes
Disable Generator in Infrahub's CI pipeline and after a branch merge operationβ
To provide a cleaner experience when setting up event-based Generators, we've introduced the capability to selectively disable Generators during specific lifecycle events: CI pipeline execution and branch merge operations.
Previously, Generators could be triggered multiple times, leading to redundant processing: once by their configured event trigger rules, again during the Proposed Change (CI) phase, and finally after merging into the main branch.
You can now prevent this overlap by optionally disabling Generator execution on a per-Generator basis directly within your repository configuration file, .infrahub.yml. This ensures your automation runs only when you explicitly intend it to, giving you finer control over when your generation logic executes.
Benefit: Eliminates redundant Generator runs
Requirement: This feature requires using version 1.15.0 or newer of the Infrahub Python SDK.
New Infrahub backup and restore toolβ
We are introducing a new tool to ease the backup and restore process of Infrahub.
Infrahub stores critical state for your infrastructure in multiple systems: the Neo4j graph database, the PostgreSQL database that powers the task manager, and external artifact storage. If any piece is lost or corrupted, you can end up with drifted configurations, orphaned tasks, or a completely unusable deployment. Regulatory requirements and business continuity plans often demand auditable recovery procedures, so "having some dumps around" is rarely enoughβyou need consistent, verifiable recovery points.
The Infrahub Backup & Restore Tool orchestrates backup and restore workflows across deployment targets. It coordinates quiescing and snapshotting services, pulls data out with the right credentials, and packages everything so restores are deterministic. During restore, the tool brings services back in dependency order, reapplies data, and captures logs so you can prove the operation succeeded.
Installation instructions for the infrahub-backup tool can be found in the documentation.
At this stage the tool only support Docker Compose based deployments, in the future we will be adding support for other deployment methods, such as Kubernetes.
Refactor HFID of objectsβ
Weβve refactored how HFIDs are handled internally to improve performance and scalability.
Previously, HFIDs were computed on-the-fly at read time and were not stored in the database. On objects with many relationships, this could lead to slower queries and higher CPU usage.
With this release, Infrahub now computes the HFID at write time (on create and update) and persists it in the database. Reads no longer need to derive HFIDs dynamically, resulting in faster object retrieval and more predictable query performance.
Refactor the display_labels of objectsβ
Weβve modernized how object display labels are defined and resolved, adding support for templating and relationships. Previously, display_labels were evaluated dynamically at read time, which impacted query performance at scale and prevented us from supporting relationships.
Whatβs new:
- Computed at write time: display_label is now computed on create/update and stored, improving read performance.
- Templating with Jinja2: define display_label using the same Jinja2 syntax available for computed attributes, including first-level relationships.
- Single-attribute shorthand remains supported, i.e.
attribute__value - For multi-field labels, use Jinja2:
{{ relationship__attribute__value }}-{{ attribute__value }}
Deprecation and migration:
- The display_labels property is deprecated in favor of display_label.
- Infrahub automatically migrates existing schema nodes:
display_labels: ["name__value"]βdisplay_label: name__valuedisplay_labels: ["type__value", "name__value"]βdisplay_label: {{ type__value }} {{ name__value }}
You can review the result on each schema nodeβs detail page (Menu > Object Management > Schemas).
β Required action after migration:
Update your schema files to use the new display_label property and remove deprecated display_labels after verifying the automatic migration.
In the documentation you can find specific instructions to migrate existing schema nodes to the new display_label.
Today, in some places in the UI, we are using the HFID of objects to display them with useful context. This was mostly done to overcome the restriction of not supporting relationships in the display_label. In a future release we will use the display_label for this instead.
Refactor Profilesβ
Profiles have been reworked for performance and future flexibility. Previously, attribute values derived from Profiles were resolved dynamically at read time, which could impact performance at scale. With 1.5.0:
- Attribute values influenced by Profiles are now computed and stored at write time (create/update object or Profile).
- Reads no longer have to compute derived values, improving query performance and predictability.
- This refactor lays groundwork to expand Profile capabilities, such as adding relationships to Profiles in future versions of Infrahub.
Memory optimizationsβ
We reduced the memory footprint of the GraphQL schema in multi-branch setups:
- Branches that use the exact same schema now share the same in-memory GraphQL schema.
- Individual GraphQL types can be shared across schema versions across branches where compatible.
This lowers memory consumption and improves runtime efficiency.
Webhook improvementsβ
Aligned the format of custom webhooks with the schema of standard webhooksβ
The format of the event data that custom webhooks receive in a Python transform, is now aligned with the format of events in standard webhooks. This allows users of custom webhooks to have access to the same data as standard webhooks.
An example of the format of the event data:
{
'data': {
'kind': 'BuiltinTag',
'action': 'created',
'fields': ['name', 'description'],
'node_id': '1869ad37-fb84-8958-58d8-1746970be2f5',
'changelog': {
'node_id': '1869ad37-fb84-8958-58d8-1746970be2f5',
'node_kind': 'BuiltinTag',
'attributes': {
'name': {'kind': 'Text', 'name': 'name', 'value': 'Green', 'properties': {'is_visible': {'name': 'is_visible', 'value': True, 'value_type': 'Boolean', 'value_previous': None, 'value_update_status': 'added'}, 'is_protected': {'name': 'is_protected', 'value': False, 'value_type': 'Boolean', 'value_previous': None, 'value_update_status': 'added'}}, 'value_previous': None, 'value_update_status': 'added'},
'description': {'kind': 'Text', 'name': 'description', 'value': None, 'properties': {'is_visible': {'name': 'is_visible', 'value': True, 'value_type': 'Boolean', 'value_previous': None, 'value_update_status': 'added'}, 'is_protected': {'name': 'is_protected', 'value': False, 'value_type': 'Boolean', 'value_previous': None, 'value_update_status': 'added'}}, 'value_previous': None, 'value_update_status': 'unchanged'}
},
'display_label': 'Green',
'relationships': {}
}
},
'id': 'fe0172b4-8b69-4597-b0f5-17294de85882',
'branch': 'main',
'account_id': '1869ab9e-873b-1908-58d0-1746a8ed315d',
'occured_at': '2025-09-29 06:33:05.523563+00:00',
'event': 'infrahub.node.created'
}
β !!! *WARNING this is a breaking change, existing Python Transformations for custom webhooks will need to be adapted to handle this new format.
Artifact definition name has been added to the webhook payload for artifact eventsβ
For artifact events, the webhook payload now includes the artifact definition name.
Events affected:
infrahub.artifact.createdinfrahub.artifact.updated
This makes it easier to interpret artifacts in downstream systems without additional API queries and simplifies integration with configuration deployment frameworks.
Web interface improvementsβ
- Bulk select objects in list view β select multiple rows to apply bulk actions more efficiently.
- Better navigation for large diffs β improvements to the branch and proposed change diff views help you navigate big changes faster.
- Task list: direct access to related nodes β from each task, you can jump directly to the related nodes for quicker investigation.
Convert between object typesβ
You can now convert an object from one schema type to another without recreating it. This is especially useful when evolving objects as their type changesβfor example, transforming a Layer 2 interface into a Layer 3 interface on a device.
Conversion of object type is available via: GraphQL API, Infrahub Python SDK and the Web interface
To streamline conversions, Infrahub proposes a field mapping that aligns attributes and relationships from the source type to the destination type. You can review and adjust the suggestions and provide values for any fields where no suggestion is available.
The following query has been added to the GraphQL API:
FieldsMappingTypeConversionreturns suggested mapping between source and destination types
The following mutations have been added to the GraphQL API:
ConvertObjectTypeconverts an object using the provided mapping
The following methods have been added to the Infrahub Python SDK:
convert_object_typeconverts an object using the provided mapping
SDK improvementsβ
Version 1.5.0 of Infrahub requires the usage of infrahub-sdk version v1.15.0, which has been published to PyPi.
Diff based on timestampβ
create_diffβ manually create a diff between two timestamps on a branch.get_diff_summarynow accepts start/end timestamps to retrieve that diff.
Object type conversionβ
new convert_object_type method β converts an object to a different type using field mappings.