<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.tenzir.com/changelog</id>
    <title>Tenzir Changelog</title>
    <updated>2026-03-31T00:00:00.000Z</updated>
    <generator>Tenzir Changelog</generator>
    <author>
        <name>Tenzir</name>
        <uri>https://tenzir.com</uri>
    </author>
    <link rel="alternate" href="https://docs.tenzir.com/changelog"/>
    <link rel="self" href="https://docs.tenzir.com/changelog/feed.xml"/>
    <subtitle>Release notes across all Tenzir projects</subtitle>
    <icon>https://docs.tenzir.com/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.30.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-30-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-30-0"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds OIDC web identity authentication for AWS operators, so you can assume AWS roles from external identity providers without long-lived credentials. It also speeds up logical and conditional expression evaluation and fixes several crashes and configuration diagnostics.]]></summary>
        <content type="html"><![CDATA[<p>This release adds OIDC web identity authentication for AWS operators, so you can assume AWS roles from external identity providers without long-lived credentials. It also speeds up logical and conditional expression evaluation and fixes several crashes and configuration diagnostics.</p>

<h2>Features</h2>

<h3>OIDC web identity authentication for AWS operators</h3>
<p><small>Feb 4, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5703">#5703</a></small></p>
<p>AWS operators now support OIDC-based authentication via the <code>AssumeRoleWithWebIdentity</code> API.</p>
<p>You can authenticate with AWS resources using OpenID Connect tokens from external identity providers like Azure, Google Cloud, or custom endpoints. This enables secure cross-cloud authentication without sharing long-lived AWS credentials.</p>
<p>Configure web identity authentication in any AWS operator by specifying a token source and target role:</p>
<pre><code>from_s3 "s3://bucket/path", aws_iam={
  region: "us-east-1",
  assume_role: "arn:aws:iam::123456789012:role/cross-cloud-role",
  web_identity: {
    token_file: "/path/to/oidc/token"
  }
}
</code></pre>
<p>The <code>web_identity</code> option accepts three token sources: <code>token_file</code> (path to a token file), <code>token_endpoint</code> (HTTP endpoint that returns a token), or <code>token</code> (direct token value). For HTTP endpoints, you can extract tokens from JSON responses using <code>path</code>.</p>
<p>Credentials automatically refresh before expiration, with exponential backoff retry logic for transient failures. This is especially useful for long-running pipelines that need persistent authentication.</p>

<h2>Changes</h2>

<h3>Faster evaluation of logical and conditional expressions</h3>
<p><small>Mar 30, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5954">#5954</a></small></p>
<p>Pipelines that use <code>and</code>, <code>or</code>, or <code>if</code>-<code>else</code> expressions run significantly faster in certain cases — up to <strong>30×</strong> in our benchmarks. The improvement is most noticeable in pipelines with complex filtering or branching logic. No pipeline changes are needed to benefit.</p>

<h3>OCSF 1.8.0 support in ocsf::derive</h3>
<p><small>Mar 23, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5939">#5939</a></small></p>
<p>The <code>ocsf::derive</code> operator now supports OCSF <code>1.8.0</code> events.</p>
<p>For example, you can now derive enum and sibling fields for events that declare
<code>metadata.version: "1.8.0"</code>:</p>
<pre><code class="language-tql">from {metadata: {version: "1.8.0"}, class_uid: 1007}
ocsf::derive
</code></pre>
<p>This keeps OCSF normalization pipelines working when producers emit <code>1.8.0</code>
events.</p>

<h3>Platform configuration error message</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5341">#5341</a></small></p>
<p>Platform configuration validation now provides clearer error messages when an invalid configuration is encountered, helping you quickly diagnose and fix configuration issues.</p>

<h2>Bug Fixes</h2>

<h3>Fix crash when connecting to unresolvable host</h3>
<p><small>Mar 26, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5827">#5827</a></small></p>
<p>Setting <code>TENZIR_ENDPOINT</code> to an unresolvable hostname no longer crashes the pipeline with a segfault.</p>

<h3>Spurious warning for Other (99) enum sibling in ocsf::derive</h3>
<p><small>Mar 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5949">#5949</a></small></p>
<p><code>ocsf::derive</code> no longer emits a false warning when an <code>_id</code> field is set
to <code>99</code> (Other) and the sibling string contains a source-specific value.</p>
<p>Per the OCSF specification, <code>99</code>/Other is an explicit escape hatch: the
integer signals that the value is not in the schema's enumeration and the
companion string <strong>must</strong> hold the raw value from the data source. For
example, the following is now accepted silently:</p>
<pre><code class="language-tql">from {
  metadata: { version: "1.7.0" },
  type_uid: 300201,
  class_uid: 3002,
  auth_protocol_id: 99,
  auth_protocol: "Negotiate",
}
ocsf::derive
</code></pre>
<p>Previously this produced a spurious <code>warning: found invalid value for 'auth_protocol'</code> because <code>"Negotiate"</code> is not a named enum caption.</p>

<h3>Fix crash on Azure SSL/transport errors</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The Azure Blob Storage connector now handles <code>Azure::Core::Http::TransportException</code>
(e.g., SSL certificate errors) gracefully instead of crashing. Previously, a
self-signed certificate in the certificate chain would cause an unhandled
exception and terminate the node.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-31T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-4"/>
        <updated>2026-03-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release hardens container manifest publishing in GitHub Actions by switching the reusable manifest workflow to the workflow token with correctly paired registry credentials. It also avoids exposing registry secrets on the command line by using stdin-based Docker logins.]]></summary>
        <content type="html"><![CDATA[<p>This patch release hardens container manifest publishing in GitHub Actions by switching the reusable manifest workflow to the workflow token with correctly paired registry credentials. It also avoids exposing registry secrets on the command line by using stdin-based Docker logins.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-3"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release keeps the 5.29 line moving with a small maintenance update and validates the refreshed release automation. It ships as a clean follow-up release without additional user-facing changes.]]></summary>
        <content type="html"><![CDATA[<p>This patch release keeps the 5.29 line moving with a small maintenance update and validates the refreshed release automation. It ships as a clean follow-up release without additional user-facing changes.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.6.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-6-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-6-1"/>
        <updated>2026-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes the release candidate workflow so that superseded release candidates are properly removed from changelog history after promotion to a stable release.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes the release candidate workflow so that superseded release candidates are properly removed from changelog history after promotion to a stable release.</p>

<h2>Bug Fixes</h2>

<h3>Release candidate cleanup after promotion</h3>
<p><small>Mar 20, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/20">#20</a></small></p>
<p>This fixes the release candidate workflow so RCs no longer remain in changelog history after they have been superseded. Creating a new <code>-rc.N</code> now replaces the previous RC for that cycle, and creating a stable release closes the RC cycle and removes its RC manifests from <code>releases/</code>.</p>
<p>For example:</p>
<pre><code class="language-sh"># Start an RC cycle for a later stable release.
tenzir-ship release create v1.2.3 --rc --yes
tenzir-ship release create v1.3.0 --yes

# Or promote the active RC to its matching stable release.
tenzir-ship release create v1.2.3 --rc --yes
tenzir-ship release create --yes
</code></pre>
<p>After the stable release is created, the RC is no longer kept in release history. Release candidates are also cumulative, so each new RC includes the previous RC's entries plus any newly added unreleased entries, while stable releases remain incremental.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-2"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release fixes several correctness and performance issues across parsing, querying, and storage, and completes Suricata 8 schema coverage.]]></summary>
        <content type="html"><![CDATA[<p>This patch release fixes several correctness and performance issues across parsing, querying, and storage, and completes Suricata 8 schema coverage.</p>

<h2>Features</h2>

<h3>Add store origin metadata to feather files</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a></small></p>
<p>Feather store files now include a <code>TENZIR:store:origin</code> key in the Arrow table
schema metadata. The value is <code>"ingest"</code> for freshly ingested data, <code>"rebuild"</code>
for partitions created by the rebuild command, and <code>"compaction"</code> for partitions
created by the compaction plugin. This allows external tooling such as <code>pyarrow</code>
to distinguish how a partition was produced.</p>

<h3>Improved Clickhouse Usability</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/codex">@codex</a>, <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/raxyte">@raxyte</a> · <a href="https://github.com/tenzir/tenzir/pull/5897">#5897</a></small></p>
<p>The <code>to_clickhouse</code> operator now supports dynamic table names via an expression
<code>table=...</code>, which must evaluate to a <code>string</code>. If the value is not a valid
table name, the events will be dropped with a warning.</p>
<p>With this change, the operator will also create a database if it does not exist.</p>
<p>The prime use-case for this are OCSF event streams:</p>
<pre><code class="language-tql">subscribe "ocsf"
ocsf::cast encode_variants=true, null_fill=true
to_clickhouse table=f"ocsf.{class_name.replace(" ","_")}", ...
</code></pre>

<h3>Install Tenzir via Homebrew on macOS</h3>
<p><small>Mar 8, 2026 · <a href="https://github.com/mavam">@mavam</a> · <a href="https://github.com/tenzir/tenzir/pull/5876">#5876</a></small></p>
<p>You can now install Tenzir on Apple Silicon macOS via Homebrew:</p>
<pre><code class="language-sh">brew tap tenzir/tenzir
brew install --cask tenzir
</code></pre>
<p>You can also install directly without tapping first:</p>
<pre><code class="language-sh">brew install --cask tenzir/tenzir/tenzir
</code></pre>
<p>The release workflow keeps the Homebrew cask in sync with the signed macOS
package so installs and uninstalls stay current across releases.</p>

<h2>Changes</h2>

<h3>Correct AWS Marketplace container image</h3>
<p><small>Mar 19, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5925">#5925</a></small></p>
<p>The AWS Marketplace ECR repository <code>tenzir-node</code> was incorrectly populated with
the <code>tenzir</code> image. It now correctly ships <code>tenzir-node</code>, which runs a Tenzir
node by default.</p>
<p>If you relied on the previous behavior, you can restore it by setting <code>tenzir</code>
as a custom entrypoint in your ECS task definition.</p>

<h3>Add Suricata schema types for IKE, HTTP2, PGSQL, and Modbus</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a> · <a href="https://github.com/tenzir/tenzir/pull/5914">#5914</a></small></p>
<p>The bundled Suricata schema now covers the remaining event types listed in the
Suricata 8.0.3 EVE JSON format documentation: IKE (IKEv1/IKEv2), HTTP/2,
PostgreSQL, and Modbus. This completes Suricata 8 schema coverage for Tenzir.</p>

<h2>Bug Fixes</h2>

<h3>Support long syslog structured-data parameter names</h3>
<p><small>Mar 19, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>read_syslog</code> operator and <code>parse_syslog</code> function now accept RFC 5424 structured-data parameter names longer than 32 characters, which some vendors emit despite the specification limit.</p>
<p>For example, this message now parses successfully instead of being rejected:</p>
<pre><code class="language-text">&#x3C;134>1 2026-03-18T11:00:51.194137+01:00 HOSTNAME abc 9043 23003147 [F5@12276 thx_f5_for_ignoring_the_32_char_limit_in_structured_data="thx"] broken example
</code></pre>
<p>This improves interoperability with vendor syslog implementations that exceed the RFC limit for structured-data parameter names.</p>

<h3>Fix batch timeout to flush asynchronously</h3>
<p><small>Mar 14, 2026 · <a href="https://github.com/aljazerzen">@aljazerzen</a> · <a href="https://github.com/tenzir/tenzir/pull/5906">#5906</a></small></p>
<p>The batch timeout was only checked when a new event arrived, so a single event
followed by an idle stream would never be emitted. The timeout now fires
independently of upstream activity.</p>

<h3>Fix parse_winlog batch splitting</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5901">#5901</a></small></p>
<p>The <code>parse_winlog</code> function could fragment output into thousands of tiny
batches due to type conflicts in <code>RenderingInfo/Keywords</code>, where events with
one <code>&#x3C;Keyword></code> emitted a string but events with multiple emitted a list.
Additionally, <code>EventData</code> with unnamed <code>&#x3C;Data></code> elements is now always emitted
as a record with <code>_0</code>, <code>_1</code>, etc. as field names instead of a list.</p>

<h3>Optimize `in` operator and fix eq/neq null semantics</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>The <code>in</code> operator for list expressions is up to 33x faster. Previously it
created and finalized entire Arrow arrays for every element comparison, causing
severe overhead for expressions like <code>EventID in [5447, 4661, ...]</code>.</p>
<p>Additionally, comparing a typed null value with <code>==</code> now returns <code>false</code> instead
of <code>null</code>, and <code>!=</code> returns <code>true</code>, fixing a correctness issue with null
handling in equality comparisons.</p>

<h3>Fix secret comparison bypass in `in` operator fast path</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>The <code>in</code> operator fast path now correctly prevents comparison of secret values.
Previously, <code>secret_value in [...]</code> would silently compare instead of returning
null with a warning, bypassing the established secret comparison policy.</p>

<h3>Fix pattern equality ignoring case-insensitive flag</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5900">#5900</a></small></p>
<p>Pattern equality checks now correctly consider the case-insensitive flag.
Previously, two patterns that differed only in case sensitivity were treated as
equal, violating the hash/equality contract.</p>

<h3>Fix over-reservation in partition_array for string/blob types</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5899">#5899</a></small></p>
<p>Splitting Arrow arrays for string and blob types no longer over-reserves memory.
Previously both output builders reserved the full input size each, using up to
twice the necessary memory.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.6.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-6-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-6-0"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[tenzir-ship now supports release candidates via release create --rc, letting you iterate on -rc.N builds before promoting one to the final stable release. The new flag works across both the CLI and the bundled GitHub Actions workflows.]]></summary>
        <content type="html"><![CDATA[<p>tenzir-ship now supports release candidates via release create --rc, letting you iterate on -rc.N builds before promoting one to the final stable release. The new flag works across both the CLI and the bundled GitHub Actions workflows.</p>

<h2>Features</h2>

<h3>Release candidate workflow</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p><code>tenzir-ship</code> now supports release candidates via <code>release create --rc</code>. Creating a release candidate snapshots the current unreleased entries without consuming them, so you can iterate on <code>-rc.N</code> releases before promoting one to the final stable release. The stable base is inferred automatically, and rerunning the command continues the matching RC series when one already exists.</p>
<p>When you are ready to ship the stable release, rerun <code>tenzir-ship release create</code> without <code>--rc</code> and the latest outstanding release candidate becomes the matching stable release automatically. Once an RC series exists, you either continue it with <code>release create --rc</code> or promote the latest candidate with the normal stable command.</p>
<p>Publishing a release candidate now automatically creates a GitHub prerelease and prevents it from being marked as latest. <code>release version</code> and <code>show latest</code> continue to resolve the latest stable release, while <code>release publish</code> without an explicit version now targets the latest release manifest, including RCs. The bundled GitHub Actions release workflows accept <code>rc</code> so you can keep creating RCs from CI, and the default stable workflow promotes the latest outstanding candidate automatically.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-1"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a scheduling issue introduced in v5.24.0 that could cause the node to become unresponsive when too many pipelines using detached operators were deployed simultaneously.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a scheduling issue introduced in v5.24.0 that could cause the node to become unresponsive when too many pipelines using detached operators were deployed simultaneously.</p>

<h2>Bug Fixes</h2>

<h3>Scheduling issue with detached operators</h3>
<p><small>Mar 16, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5895">#5895</a></small></p>
<p>Fixed a scheduling issue introduced in v5.24.0 that could cause the node to
become unresponsive when too many pipelines using detached operators like
<code>from_udp</code> were deployed simultaneously.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.29.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-29-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-29-0"/>
        <updated>2026-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves log ingestion by extracting structured data from legacy syslog messages and aligning the bundled schema with Suricata 8. It also republishes the previous release after an error in the earlier release process.]]></summary>
        <content type="html"><![CDATA[<p>This release improves log ingestion by extracting structured data from legacy syslog messages and aligning the bundled schema with Suricata 8. It also republishes the previous release after an error in the earlier release process.</p>

<h2>Features</h2>

<h3>Add Suricata schema types for IKE, HTTP2, PGSQL, and Modbus</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/tobim">@tobim</a> · <a href="https://github.com/tenzir/tenzir/pull/5914">#5914</a></small></p>
<p>The bundled Suricata schema now includes types for four previously missing event types: <code>ike</code>, <code>http2</code>, <code>pgsql</code>, and <code>modbus</code>.</p>
<p>The <code>ike</code> type supports both IKEv1 and IKEv2 traffic. Version-specific fields are contained within dedicated <code>ikev1</code> and <code>ikev2</code> sub-objects, covering key exchange payloads, nonce payloads, client proposals, vendor IDs, and IKEv2 role/notify information.</p>
<p>The <code>http2</code> type models HTTP/2 request and response streams including settings frames, header lists, error codes, and stream priority.</p>
<p>The <code>pgsql</code> type covers PostgreSQL session events with full request fields (simple queries, startup parameters, SASL authentication) and response fields (row counts, command completion, parameter status).</p>
<p>The <code>modbus</code> type captures industrial Modbus protocol transactions including function codes, access types, exception responses, diagnostic subfunctions, and MEI encapsulated interface data.</p>

<h3>Extract structured data from legacy syslog content</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5902">#5902</a></small></p>
<p><code>read_syslog</code> and <code>parse_syslog</code> now extract a leading RFC 5424-style
structured-data block from RFC 3164 message content.</p>
<p>This pattern occurs in practice with some VMware ESXi messages, where
components such as <code>Hostd</code> emit a legacy syslog record and prepend structured
metadata before the human-readable message text.</p>
<p>For example, this raw syslog line:</p>
<pre><code class="language-text">&#x3C;166>2026-02-11T18:01:45.587Z esxi-01.example.invalid Hostd[2099494]: [Originator@6876 sub=Vimsvc.TaskManager opID=11111111-2222-3333-4444-555555555555] Task Completed
</code></pre>
<p>now parses as:</p>
<pre><code class="language-tql">{
  facility: 20,
  severity: 6,
  timestamp: "2026-02-11T18:01:45.587Z",
  hostname: "esxi-01.example.invalid",
  app_name: "Hostd",
  process_id: "2099494",
  structured_data: {
    "Originator@6876": {
      sub: "Vimsvc.TaskManager",
      opID: "11111111-2222-3333-4444-555555555555",
    },
  },
  content: "Task Completed",
}
</code></pre>
<p>Events without extracted structured data keep the existing <code>syslog.rfc3164</code>
schema. Events with extracted structured data use
<code>syslog.rfc3164.structured</code>.</p>

<h3>Support for Suricata 8 schema</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/satta">@satta</a> · <a href="https://github.com/tenzir/tenzir/pull/5888">#5888</a></small></p>
<p>The bundled Suricata schema now aligns with Suricata 8, enabling proper parsing and representation of events from Suricata 8 deployments.</p>
<p>This update introduces support for new event types including POP3, ARP, and BitTorrent DHT, along with enhancements to existing event types. QUIC events now include <code>ja4</code> and <code>ja4s</code> fields for fingerprinting, DHCP events include <code>vendor_class_identifier</code>, and TLS certificate timestamps now use the precise <code>time</code> type instead of string representation.</p>
<p>These schema changes ensure that Tenzir can reliably ingest and process telemetry from Suricata 8 without data loss or type mismatches.</p>

<h2>Bug Fixes</h2>

<h3>Fix pipeline startup timeouts</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5893">#5893</a></small></p>
<p>In some situations, pipelines could not be successfully started, leading to
timeouts and a non-responsive node, especially during node start.</p>

<h3>Prevent where/map assertion crash on sliced list batches</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5886">#5886</a></small></p>
<p>Pipelines using chained list transforms such as <code>xs.where(...).map(...).where(...)</code> no longer trigger an internal assertion on sliced input batches.</p>

<h3>Graceful handling of Google Cloud Pub/Sub authentication errors</h3>
<p><small>Mar 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5877">#5877</a></small></p>
<p>Invalid Google Cloud credentials in <code>from_google_cloud_pubsub</code> no longer crash the node. Authentication errors now surface as operator diagnostics instead.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.5]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-5</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-5"/>
        <updated>2026-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.]]></summary>
        <content type="html"><![CDATA[<p>This release establishes the correct v1.7.5 version tag. A double-bump bug in the release automation caused the v1.7.4 git tag to point to a commit where pyproject.toml already read 1.7.5, so 1.7.4 was never published to PyPI and the git tag was misaligned with the actual package version. The automation has been fixed by removing a redundant post-create version bump that became a double-bump once tenzir-ship v1.3.0 added automatic version-file updates.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-03-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-2"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release upgrades dependencies to address known security vulnerabilities and fixes an issue where the Insights tab selection could get stuck in an invalid state.]]></summary>
        <content type="html"><![CDATA[<p>This release upgrades dependencies to address known security vulnerabilities and fixes an issue where the Insights tab selection could get stuck in an invalid state.</p>

<h2>Bug Fixes</h2>

<h3>Upgrade dependencies to fix known vulnerabilities</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We upgraded Python dependencies and added system-level package upgrades to the Docker images to address known vulnerabilities.</p>

<h3>Fix Insights tab guard not resetting tab selection</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/realllydan">@realllydan</a></small></p>
<p>We fixed an issue where switching away from a pipeline that has the Insights tab available to one that does not could leave the tab selection in an invalid state.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.5.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-5-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-5-0"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Release commands now handle mixed version formats consistently, making changelog automation more robust. The bundled GitHub Actions workflows are updated to Node 24-compatible action versions, keeping CI aligned with GitHub's runtime transition.]]></summary>
        <content type="html"><![CDATA[<p>Release commands now handle mixed version formats consistently, making changelog automation more robust. The bundled GitHub Actions workflows are updated to Node 24-compatible action versions, keeping CI aligned with GitHub's runtime transition.</p>

<h2>Changes</h2>

<h3>Node 24-ready GitHub Actions workflows</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>The bundled GitHub Actions workflows now use Node 24-compatible action versions, which keeps CI, release, and publishing automation aligned with GitHub's runtime transition. The release and sync workflows also mint GitHub App installation tokens without relying on a deprecated JavaScript action.</p>

<h2>Bug Fixes</h2>

<h3>More robust release version normalization</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>Release commands and the Python API now handle release versions more consistently when changelog data mixes tag-style versions such as <code>v1.2.3</code> with bare semantic versions such as <code>1.2.3</code>. This improves compatibility with existing changelog histories and makes release automation more reliable across commands that inspect, create, show, and publish releases.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.4]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-4</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-4"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes how skipped tests interact with baseline files. Existing baselines now stay untouched when you skip tests, which prevents unrelated baseline churn and avoids false failures when you toggle skip conditions.</p>

<h2>Bug Fixes</h2>

<h3>Skipped tests preserve existing baseline files</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Skipping a test no longer modifies its baseline file. Previously, running
with <code>--update</code> would overwrite the baseline of a skipped test with an empty
file, and running without <code>--update</code> would fail if the baseline was non-empty.
Skipped tests now leave existing baselines untouched, so toggling a skip
condition no longer causes unrelated baseline churn.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-03-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.4.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-4-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-4-0"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The new `init` command scaffolds changelog projects interactively or non-interactively, so you can set up a standalone or package-based project in less time. It also protects existing projects from accidental overwrites.]]></summary>
        <content type="html"><![CDATA[<p>The new <code>init</code> command scaffolds changelog projects interactively or non-interactively, so you can set up a standalone or package-based project in less time. It also protects existing projects from accidental overwrites.</p>

<h2>Features</h2>

<h3>Init command for changelog setup</h3>
<p><small>Mar 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/pi">@pi</a></small></p>
<p>A new <code>init</code> command allows for scaffolding a new changelog project interactively or with the <code>--yes</code> flag. It supports both standalone and package modes, and prevents accidental overwriting of existing projects.</p>
<pre><code class="language-sh">tenzir-ship init
</code></pre>
<p>This reduces the manual effort required to set up a new changelog.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-1"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where ephemeral nodes were causing the frontend to display a 500 error message or be displayed with incorrect connection status.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where ephemeral nodes were causing the frontend to display a 500 error message or be displayed with incorrect connection status.</p>

<h2>Features</h2>

<h3>Add PRIVATE_WEBSOCKET_GATEWAY_ENDPOINT environment variable</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The app container now supports a <code>PRIVATE_WEBSOCKET_GATEWAY_ENDPOINT</code> environment variable that overrides the existing <code>PUBLIC_WEBSOCKET_GATEWAY_ENDPOINT</code> for calls in the app backend. This allows configuring different endpoints when the frontend and backend live in different networks.</p>

<h3>Add experimental Insights tab to pipeline detail view</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/realllydan">@realllydan</a></small></p>
<p>The pipeline detail modal now includes an experimental Insights tab that visualizes per-operator backpressure, helping users identify bottlenecks in their pipelines. This tab is only available for pipelines running on the experimental new executor.</p>

<h2>Bug Fixes</h2>

<h3>Fix ephemeral nodes not showing correctly in the UI</h3>
<p><small>Mar 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We fixed an issue where ephemeral nodes were causing the frontend to fail to render or be displayed with incorrect connection status.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.28.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-28-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-28-0"/>
        <updated>2026-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for parsing Check Point syslog structured-data dialects that deviate from RFC 5424, improving out-of-the-box interoperability with Check Point exports. It also makes DNS hostname resolution in the load_tcp operator opt-in and fixes several parser bugs related to schema changes between events.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for parsing Check Point syslog structured-data dialects that deviate from RFC 5424, improving out-of-the-box interoperability with Check Point exports. It also makes DNS hostname resolution in the load_tcp operator opt-in and fixes several parser bugs related to schema changes between events.</p>

<h2>Features</h2>

<h3>Check Point syslog structured-data dialect parsing</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5851">#5851</a></small></p>
<p><code>parse_syslog()</code> and <code>read_syslog</code> now accept common Check Point structured-data variants that are not strictly RFC 5424 compliant. This includes <code>key:"value"</code> parameters, semicolon-separated parameters, and records that omit an SD-ID entirely.</p>
<p>For records without an SD-ID, Tenzir now normalizes the structured data under <code>checkpoint_2620</code>, so downstream pipelines can use a stable field path.</p>
<p>For example, the message <code>&#x3C;134>1 ... - [action:"Accept"; conn_direction:"Incoming"]</code> now parses successfully and maps to <code>structured_data.checkpoint_2620</code>. This improves interoperability with Check Point exports and reduces ingestion-time preprocessing.</p>

<h2>Changes</h2>

<h3>JSON parse error context</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>JSON parsing errors now display the surrounding bytes at the error location. This
makes it easier to diagnose malformed JSON in your data pipelines.</p>
<p>For example, if your JSON is missing a closing bracket, the error message shows
you the bytes around that location and marks where the parser stopped expecting
more input.</p>

<h3>DNS hostname resolution opt-in for load_tcp operator</h3>
<p><small>Mar 4, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5865">#5865</a></small></p>
<p>The <code>load_tcp</code> operator now makes DNS hostname resolution opt-in with the <code>resolve_hostnames</code> parameter (defaults to <code>false</code>).</p>
<p>Previously, the operator always attempted reverse DNS lookups for peer endpoints, which could fail in environments without working reverse DNS configurations. Now you can enable this behavior by setting <code>resolve_hostnames</code> to <code>true</code>:</p>
<pre><code class="language-tql">load_tcp endpoint="0.0.0.0:5555" resolve_hostnames=true {
  read_json
}
</code></pre>
<p>When enabled and DNS resolution fails, the operator emits a warning diagnostic (once) instead of failing. This allows the operator to continue functioning in environments where reverse DNS is unavailable or unreliable.</p>

<h2>Bug Fixes</h2>

<h3>Uncaught exception reporting</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>We improved the reporting for unexpected diagnostics outside of operator execution,
such as during startup. In these cases you will now get the diagnostic message.</p>

<h3>Parser bug fixes for schema changes</h3>
<p><small>Mar 6, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5805">#5805</a></small></p>
<p>Fixed multiple issues that could cause errors or incorrect behavior when the
schema of parsed events changes between records. This is particularly important
when ingesting data from sources that may add, remove, or modify fields over time.</p>
<p>Schema mismatch warnings for repeated fields in JSON objects (which Tenzir
interprets as lists) now include an explanatory hint, making it clearer what's
happening when a field appears multiple times where a single value was expected.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.29.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-29-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-29-0"/>
        <updated>2026-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[With this release, the Tenzir Platform preserves deep links through the login flow, so users are redirected to their original destination after signing in. It also includes several bug fixes and a performance improvement for loading across the platform.]]></summary>
        <content type="html"><![CDATA[<p>With this release, the Tenzir Platform preserves deep links through the login flow, so users are redirected to their original destination after signing in. It also includes several bug fixes and a performance improvement for loading across the platform.</p>

<h2>Features</h2>

<h3>Preserve deep links through login flow</h3>
<p><small>Mar 5, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>When you click a deep link in Tenzir Platform but aren't logged in, you're now redirected to your original destination after signing in, instead of landing on the home page.</p>

<h2>Changes</h2>

<h3>Faster loading across the platform</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We improved how the nodes list loads, making dependent views feel faster and more responsive across the platform.</p>

<h2>Bug Fixes</h2>

<h3>Fix blocked profile images for some login providers</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where profile images from Gravatar and Microsoft accounts were blocked by the content security policy, causing broken or missing avatars.</p>

<h3>Fix diagnostics showing data from the wrong pipeline</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the diagnostics pane could show diagnostics from a different pipeline than the one currently open in the detail modal.</p>

<h3>Fix unstable context list order</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the context list could appear in a random order when no search was active, causing items to jump around. The list now uses a stable alphabetical order so it stays consistent and easier to interact with.</p>

<h3>Fix unintended logout on inaccessible workspace links</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where opening a pipeline link for a workspace you don’t have access to would log you out. You are now redirected to the access page where you can open the link in your default workspace.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-03-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.3.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-3-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-3-1"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves clarity and efficacy of the releasing process in the tenzir-ship agent skill.]]></summary>
        <content type="html"><![CDATA[<p>This release improves clarity and efficacy of the releasing process in the tenzir-ship agent skill.</p>

<h2>Bug Fixes</h2>

<h3>Clarity and efficacy fixes in skill</h3>
<p><small>Mar 4, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>We improved clarity and efficacy of the releasing process in the <code>tenzir-ship</code> agent skill.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-3"/>
        <updated>2026-03-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a crash that could occur when reading JSON data. It also improves CEF parsing to handle non-conforming unescaped equals characters.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a crash that could occur when reading JSON data. It also improves CEF parsing to handle non-conforming unescaped equals characters.</p>

<h2>Bug Fixes</h2>

<h3>JSON reading crash fix</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5855">#5855</a></small></p>
<p>We fixed a bug that could cause a crash when reading JSON data.</p>

<h3>Fix CEF parsing for unescaped equals</h3>
<p><small>Mar 2, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5841">#5841</a></small></p>
<p>The CEF parser now handles unescaped <code>=</code> characters (which are not conforming to
the specification) by using a heuristic.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-03-03T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.3.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-3-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-3-0"/>
        <updated>2026-03-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds automatic version file updates during release creation and introduces tooling to keep release manifests in sync across package types.]]></summary>
        <content type="html"><![CDATA[<p>This release adds automatic version file updates during release creation and introduces tooling to keep release manifests in sync across package types.</p>

<h2>Features</h2>

<h3>Pi package and skill for release engineering</h3>
<p><small>Mar 1, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/11">#11</a></small></p>
<p>The <code>pi-tenzir-ship</code> package provides a skill for AI coding agents to perform
release engineering tasks. Install it in Pi with:</p>
<pre><code class="language-sh">pi install npm:pi-tenzir-ship
</code></pre>
<p>Then activate it with <code>/skill:tenzir-ship</code>.</p>
<p>The skill covers adding changelog entries, cutting standard and module releases,
triggering GitHub Actions release workflows, and publishing releases to GitHub.</p>

<h3>Automatic version file updates during release creation</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/10">#10</a></small></p>
<p>The release creation command now automatically updates version fields in package manifest files during release. When creating a release, <code>tenzir-ship</code> detects and updates <code>package.json</code>, <code>pyproject.toml</code>, <code>project.toml</code>, and <code>Cargo.toml</code> files in your project, including support for dynamic version files in monorepo workspaces.</p>
<p>You can control this behavior with the <code>release.version_bump_mode</code> configuration option in your <code>config.yaml</code>:</p>
<ul>
<li><code>auto</code> (default): Automatically detect and update version files</li>
<li><code>off</code>: Skip version file updates</li>
</ul>
<p>For more granular control, use the <code>release.version_files</code> option to explicitly specify which files to update. Auto-detection searches the project root and parent directory (for nested changelog projects) and gracefully skips files without static version fields.</p>
<p>Release version selection now defaults to automatic bumping when you run
<code>release create</code> without an explicit version and without <code>--patch</code>, <code>--minor</code>,
or <code>--major</code>. The next version is inferred from unreleased entry types:</p>
<ul>
<li>bugfix -> patch</li>
<li>feature or change -> minor</li>
<li>breaking -> major</li>
</ul>
<p>If no unreleased changelog entries exist, automatic bumping is not available.
In that case, provide an explicit version or a manual bump flag to create an
intro-only release.</p>
<p>The <code>stats</code> command now reports the computed next release version (or no value
when no automatic bump can be inferred), including in <code>stats --json</code>.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-03-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.2.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-2-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-2-0"/>
        <updated>2026-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for creating releases with only introductory text and no changelog entries, and splits the reusable release workflow into minimal and advanced variants. It also fixes changelog structure validation and release progress panel display issues.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for creating releases with only introductory text and no changelog entries, and splits the reusable release workflow into minimal and advanced variants. It also fixes changelog structure validation and release progress panel display issues.</p>

<h2>Features</h2>

<h3>Allow intro-only releases</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/ship/pull/9">#9</a></small></p>
<p>Create releases with only introductory text and no changelog entries by using the <code>--intro</code> or <code>--intro-file</code> flags with <code>release create</code>. This is useful when re-publishing a package after yanking a previous artifact or retrying a failed publish workflow—scenarios where you want to create a new release version without adding changelog entries.</p>
<p>Previously, you had to provide at least one changelog entry to create a release. Now the release creation allows you to skip the entries entirely if you supply intro text. The <code>--intro</code> flag accepts text directly, while <code>--intro-file</code> reads from a Markdown file.</p>

<h3>Split reusable release workflow into minimal and advanced variants</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p><code>reusable-release.yaml</code> now acts as a minimal opinionated wrapper around a new
<code>reusable-release-advanced.yaml</code> workflow.</p>
<p>The advanced workflow adds optional hooks and release controls for complex
consumers: pre/post publish scripts, non-main <code>--no-latest</code> publishing,
optional copy of release directories to <code>main</code>, <code>latest</code> branch updates, a
<code>skip-publish</code> dry-run mode, and workflow outputs for <code>version</code> and
<code>is_latest</code>.</p>

<h2>Bug Fixes</h2>

<h3>Enforce changelog structure for releases and command warnings</h3>
<p><small>Feb 28, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Release commands now validate changelog directory structure before they run and fail fast when it is invalid.</p>
<p><code>release create</code> and <code>release publish</code> now stop with explicit errors when stray files or directories are detected (for example, an unexpected <code>changelog/next/</code> directory). Other commands (<code>show</code>, <code>add</code>, <code>stats</code>, and <code>release version</code>) emit warnings so layout problems are visible earlier, while <code>validate</code> reports full structural issues as regular validation errors.</p>

<h3>Fix release progress panel truncating failed commands</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/ship/pull/7">#7</a></small></p>
<p>When a release step fails, the full command now prints below the progress panel so you can copy-paste it for manual recovery.</p>
<p>Previously, long commands would get truncated in the release progress panel, making it difficult to reproduce the failure manually. Now when a step fails, the complete command is displayed in full below the panel, giving you what you need to debug and retry the operation.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-02-28T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-2"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds the hmac function for computing Hash-based Message Authentication Codes over strings and blobs. It also fixes an assertion failure in array slicing that was introduced in v5.27.0.]]></summary>
        <content type="html"><![CDATA[<p>This release adds the hmac function for computing Hash-based Message Authentication Codes over strings and blobs. It also fixes an assertion failure in array slicing that was introduced in v5.27.0.</p>

<h2>Features</h2>

<h3>Add `hmac` function</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5846">#5846</a></small></p>
<p>The new experimental <code>hmac</code> function computes Hash-based Message
Authentication Codes (HMAC) for strings and blobs. It supports SHA-256
(default), SHA-512, SHA-384, SHA-1, and MD5 algorithms.</p>
<p>Note: The <code>key</code> parameter is currently a plain string because function
arguments cannot be secrets yet. We plan to change this in the future.</p>
<pre><code class="language-tql">from {
  signature: hmac("hello world", "my-secret-key"),
}
</code></pre>
<pre><code class="language-tql">{
  signature: "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad",
}
</code></pre>
<p>Specify a different algorithm with the <code>algorithm</code> parameter:</p>
<pre><code class="language-tql">from {
  signature: hmac("hello world", "my-secret-key", algorithm="sha512"),
}
</code></pre>

<h2>Bug Fixes</h2>

<h3>Fixed an assertion failure in slicing</h3>
<p><small>Feb 27, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5842">#5842</a></small></p>
<p>We fixed a bug that would cause an assertion failure <em>"Index error: array slice would exceed array length"</em>.
This was introduced as part of an optimization in Tenzir Node v5.27.0.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-3"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release improves parallel suite scheduling reliability and adds correctness guards via suite.min_jobs in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Improve parallel suite scheduling and correctness checks</h3>
<p><small>Feb 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Parallel suites are now scheduled more reliably when running with <code>--jobs > 1</code>, so interdependent tests (for example publisher/subscriber pairs) start together sooner instead of being delayed behind large backlogs of unrelated tests.</p>
<p>This update also adds an explicit correctness guard for parallel suites: you can set <code>suite.min_jobs</code> in <code>test.yaml</code> to declare the minimum job count required for valid execution. The run now fails fast if <code>--jobs</code> is lower than <code>suite.min_jobs</code>, and it also fails hard when a parallel suite cannot reserve at least <code>min_jobs</code> workers at runtime (for example under slot contention), instead of proceeding under-provisioned.</p>
<p>In addition, the harness now warns when a parallel suite has more tests than available jobs, making it easier to spot cases where effective suite parallelism is capped by worker count.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-1"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where the platform plugin did not correctly use the configured certfile, keyfile, and cafile options for client certificate authentication.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where the platform plugin did not correctly use the configured certfile, keyfile, and cafile options for client certificate authentication.</p>

<h2>Bug Fixes</h2>

<h3>Fix platform plugin not respecting `certfile` and `keyfile` options</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed in issue where the platform plugin did not correctly use the
configured <code>certfile</code>, <code>keyfile</code> and <code>cafile</code> options for client
certificate authentication, and improved the error messages for TLS
issues during platform connection.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-2"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes enum serialization errors when Python fixture tests use configuration values like mode: sequential in test.yaml.</p>

<h2>Bug Fixes</h2>

<h3>Enum serialization in Python fixture config</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/32">#32</a></small></p>
<p>Python fixture tests could fail with serialization errors when the test
configuration included enum values like <code>mode: sequential</code> in <code>test.yaml</code>.
These values are now properly converted to strings before being passed to
test scripts.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-1"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.]]></summary>
        <content type="html"><![CDATA[<p>This release adds parallel suite execution and fixes several bugs, including clean Ctrl+C handling, consistent default fixture options, and reliable shell runner defaults for .sh test files.</p>

<h2>Features</h2>

<h3>Parallel suite execution</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/29">#29</a></small></p>
<p>Test suites can now execute their members in parallel by specifying <code>mode: parallel</code> in the suite configuration. By default, suites continue to run tests sequentially for stability and predictability.</p>
<p>To enable parallel execution, set <code>mode: parallel</code> in the <code>test.yaml</code> file alongside the <code>suite</code> configuration:</p>
<pre><code class="language-yaml">suite:
  name: my-suite
  mode: parallel
fixtures:
  - node
</code></pre>
<p>Parallel suite execution is useful when tests within a suite are independent and can safely run concurrently. All suite members share the same fixtures and execute within the same fixture lifecycle, while test execution itself happens on separate threads. The suite thread pool is bounded by <code>--jobs</code>, so suite-level concurrency stays within the configured worker budget and does not scale unbounded with suite size.</p>
<p>Suite-level constraints like timeouts, fixture requirements, and capability checks still apply uniformly across all members, whether running sequentially or in parallel.</p>

<h2>Bug Fixes</h2>

<h3>Avoid Python backtraces on Ctrl+C interrupts</h3>
<p><small>Feb 25, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/31">#31</a></small></p>
<p>Interrupting test runs with Ctrl+C now exits cleanly without leaking Python tracebacks from subprocess or fixture startup/teardown paths. Interrupt-shaped errors (including nested causes with signal-style return codes such as 130) are treated as graceful cancellation so the CLI reports interrupted tests instead of crashing.</p>

<h3>Shell test files default to shell runner</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/30">#30</a></small></p>
<p>Shell test files (<code>.sh</code>) now always default to the "shell" runner, even when a directory-level <code>test.yaml</code> file specifies a different runner (for example, <code>runner: tenzir</code>). This makes shell scripts work reliably in mixed-runner directories without requiring explicit <code>runner:</code> frontmatter in each file. Explicit <code>runner:</code> declarations in test file frontmatter still take precedence and can override this behavior if needed.</p>

<h3>Fix default fixture options in manual fixture control</h3>
<p><small>Feb 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Manual fixture control now behaves consistently for fixtures that declare dataclass
options.</p>
<p>Previously, starting a fixture with <code>acquire_fixture(...)</code> could fail when no
explicit options were provided, even if the fixture defined defaults.</p>
<p>With this fix, <code>current_options(...)</code> returns default typed options in the
manual fixture-control path, so fixtures started manually and fixtures started
through normal test activation behave the same way.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.27.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-27-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-27-0"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release enhances the sort function with custom comparators and descending order support, and extends the slice function to work with lists.]]></summary>
        <content type="html"><![CDATA[<p>This release enhances the sort function with custom comparators and descending order support, and extends the slice function to work with lists.</p>

<h2>Features</h2>

<h3>Slice function extended to support lists</h3>
<p><small>Feb 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5819">#5819</a></small></p>
<p>The <code>slice</code> function now supports <code>list</code> types in addition to <code>string</code>. You can slice lists using the same <code>begin</code>, <code>end</code>, and <code>stride</code> parameters. Negative stride values are now supported for lists, letting you reverse or step backward through list data. String slicing continues to require a positive <code>stride</code>.</p>
<p>Example usage with lists:</p>
<ul>
<li><code>[1, 2, 3, 4, 5].slice(begin=1, end=4)</code> returns <code>[2, 3, 4]</code></li>
<li><code>[1, 2, 3, 4, 5].slice(stride=-1)</code> returns the list in reverse order</li>
<li><code>[1, 2, 3, 4, 5].slice(begin=1, end=5, stride=-2)</code> returns <code>[5, 3]</code></li>
</ul>

<h3>Enhance `sort` function with `desc` and `cmp` parameters</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5767">#5767</a></small></p>
<p>The <code>sort</code> function now supports two new parameters: <code>desc</code> for controlling
sort direction and <code>cmp</code> for custom comparison logic via binary lambdas.</p>
<p><strong>Sort in descending order:</strong></p>
<pre><code class="language-tql">from {xs: [3, 1, 2]}
select ys = sort(xs, desc=true)
</code></pre>
<pre><code class="language-tql">{ys: [3, 2, 1]}
</code></pre>
<p><strong>Sort records by a specific field using a custom comparator:</strong></p>
<pre><code class="language-tql">from {xs: [{v: 2, id: "b"}, {v: 1, id: "a"}, {v: 2, id: "c"}]}
select ys = sort(xs, cmp=(left, right) => left.v &#x3C; right.v)
</code></pre>
<pre><code class="language-tql">{
  ys: [
    {v: 1, id: "a"},
    {v: 2, id: "b"},
    {v: 2, id: "c"},
  ],
}
</code></pre>
<p>The <code>cmp</code> lambda receives two elements and returns a boolean indicating whether
the first element should come before the second. Both parameters can be combined
to reverse a custom comparison.</p>

<h2>Bug Fixes</h2>

<h3>Fix `read_lines` operator for old executor</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/tobim">@tobim</a></small></p>
<p>The <code>read_lines</code> operator was accidently broken while it was ported
to the new execution API. This change restores its functionality.</p>

<h3>HTTP header values can contain colons</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/lava">@lava</a> · <a href="https://github.com/tenzir/tenzir/pull/5693">#5693</a></small></p>
<p>HTTP header values containing colons are now parsed correctly.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.3]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-3</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-3"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the clarity and usability of Explorer charts with better legends, tooltips, and an expanded color palette. It also fixes several UI bugs including unresponsive pipeline lists and stale workspace cleanup.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the clarity and usability of Explorer charts with better legends, tooltips, and an expanded color palette. It also fixes several UI bugs including unresponsive pipeline lists and stale workspace cleanup.</p>

<h2>Changes</h2>

<h3>Improved Chart Legends, Tooltips, and Colors</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We improved the clarity and usability of Explorer charts. Legends are now collapsible, easier to read, and support filtering series directly. Pie chart legends adapt better to available space, and tooltips provide clearer information.</p>
<p>We also expanded the chart color palette for better visual distinction between series, fixed bar chart x-axis labels overlapping when there are many data points, and refined chart layout and behavior for a smoother overall experience.</p>

<h2>Bug Fixes</h2>

<h3>Fix workspace switcher not displaying Google profile pictures</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>Resolved an issue where your Google profile picture did not appear in the workspace switcher. The image now loads and displays correctly.</p>

<h3>Fix stale loop variables in static workspace cleanup</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed a bug where the static workspace synchronization used stale loop
variables during cleanup, causing stale workspaces to persist and the last
configured workspace to be incorrectly deleted.</p>

<h3>Fix pipeline list not responding after pressing ESC</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where pressing ESC to close a pipeline detail view caused the pipeline list to stop responding to clicks.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-0"/>
        <updated>2026-02-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.]]></summary>
        <content type="html"><![CDATA[<p>This release adds suite-level capability requirements, letting test suites declare required operators and skip gracefully when those capabilities are unavailable in the target build.</p>

<h2>Features</h2>

<h3>Suite-level capability requirements and conditional skipping</h3>
<p><small>Feb 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/28">#28</a></small></p>
<p>Test suites can now declare operator dependencies with a <code>requires</code> configuration key in <code>test.yaml</code>. When a required operator is unavailable in the target Tenzir build, you can gracefully skip the suite by pairing <code>requires</code> with <code>skip: {on: capability-unavailable}</code>.</p>
<p>The <code>skip.on</code> key now accepts either a single condition as a string or a list of conditions, letting you skip on either <code>fixture-unavailable</code> or <code>capability-unavailable</code> (or both). When a capability is unavailable and the suite doesn't opt into skipping, the test run fails with a clear error message listing the missing operators.</p>
<p>Example configuration in <code>test.yaml</code>:</p>
<pre><code class="language-yaml">requires:
  operators: [from_gcs, to_s3]
skip:
  on: capability-unavailable
  reason: requires from_gcs and to_s3 operators
</code></pre>
<p>This ensures test suites targeting specific capabilities only run when those capabilities are present, improving test reliability in heterogeneous build environments.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.6.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-6-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-6-0"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fixture assertion hooks that enable post-test validation of side effects while fixtures remain active. Assertion results are tracked separately in the run summary.</p>

<h2>Features</h2>

<h3>Fixture assertion hooks for post-test validation</h3>
<p><small>Feb 18, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/27">#27</a></small></p>
<p>Fixtures can now define assertion hooks that run after test execution completes while fixtures remain active. Define assertions using the <code>assertions</code> parameter with a frozen dataclass type, then pass fixture-specific assertion payloads under <code>assertions.fixtures.&#x3C;name></code> in test frontmatter. The framework automatically invokes the <code>assert_test</code> hook with assertion data before tearing down fixtures, letting you validate side effects like HTTP requests or log output.</p>
<p>Example usage with an HTTP fixture:</p>
<pre><code class="language-yaml">fixtures: [http]
assertions:
  fixtures:
    http:
      count: 1
      method: POST
      path: /api/endpoint
      body: '{"key":"value"}'
</code></pre>
<p>The HTTP fixture receives the typed assertion payload and validates that the expected request was received. Payload structure is fixture-defined, so fixtures can choose flat fields or nested schemas as needed.</p>
<p>Assertion checks are tracked separately from test counts in the run summary as pass/fail check metrics, so fixture-level validations are visible without changing total test counts.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-2"/>
        <updated>2026-02-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release brings the Platform's dependencies up to date with the latest CVE fixes.]]></summary>
        <content type="html"><![CDATA[<p>This release brings the Platform's dependencies up to date with the latest CVE fixes.</p>

<h2>Bug Fixes</h2>

<h3>Patch security vulnerabilities</h3>
<p><small>Feb 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We updated the Platform's underlying framework dependencies to include their latest security fixes.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-17T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-1"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.]]></summary>
        <content type="html"><![CDATA[<p>This release improves error handling by showing clean messages for unavailable fixtures and avoids unnecessary fixture initialization for fully skipped test suites.</p>

<h2>Bug Fixes</h2>

<h3>Skip fixture initialization for suites with all static skips</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/26">#26</a></small></p>
<p>The test harness no longer initializes fixtures for suites where all tests are statically skipped. Previously, fixtures were activated even when no tests would run, causing unnecessary startup overhead and potential errors.</p>

<h3>Clean error messages for unavailable fixtures</h3>
<p><small>Feb 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/25">#25</a></small></p>
<p>When a fixture becomes unavailable during test execution, the test harness now provides a clean error message instead of a Python traceback.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.5.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-5-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-5-0"/>
        <updated>2026-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.]]></summary>
        <content type="html"><![CDATA[<p>This release adds fine-grained controls for running skipped tests, including a new --run-skipped-reason flag with substring and glob matching semantics.</p>

<h2>Features</h2>

<h3>Add fine-grained run-skipped selectors</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/23">#23</a>, <a href="https://github.com/tenzir/test/pull/24">#24</a></small></p>
<p><code>tenzir-test</code> now supports both coarse and fine-grained controls for running skipped tests.</p>
<p>Use <code>--run-skipped</code> as a sledgehammer, or <code>--run-skipped-reason</code> with the same matching semantics as <code>--match</code> (bare substring or glob):</p>
<pre><code class="language-sh">tenzir-test --run-skipped
tenzir-test --run-skipped-reason 'maintenance'
tenzir-test --run-skipped-reason '*docker*'
</code></pre>
<p>If both options are provided, <code>--run-skipped</code> takes precedence.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.4.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-4-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-4-0"/>
        <updated>2026-02-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a standalone fixture mode for starting fixtures without running tests, adds a built-in docker-compose fixture with structured options, and provides shared container runtime helpers for writing custom fixtures.</p>

<h2>Features</h2>

<h3>Shared container runtime helpers for fixtures</h3>
<p><small>Feb 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/test/pull/22">#22</a></small></p>
<p>Writing container-based fixtures no longer requires duplicating boilerplate for
runtime detection, process management, and readiness polling.</p>
<p>The new <code>container_runtime</code> module provides reusable building blocks that handle
the common plumbing: detecting whether Docker or Podman is available, launching
containers in detached mode, polling for service readiness, and tearing down
cleanly. Custom fixtures can import these helpers and focus on their
service-specific logic instead.</p>
<p>The built-in <code>docker-compose</code> fixture and the example project now use these
shared helpers internally.</p>

<h3>Native docker-compose fixture with structured options</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a> · <a href="https://github.com/tenzir/test/pull/21">#21</a></small></p>
<p>Adds a built-in <code>docker-compose</code> fixture that starts and tears down Docker Compose services from structured fixture options.</p>
<p>The fixture validates Docker Compose availability, waits for service readiness (health-check first, running-state fallback), and exports deterministic service environment variables (including host-published ports).</p>

<h3>Standalone fixture mode with --fixture CLI option</h3>
<p><small>Feb 14, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/20">#20</a></small></p>
<p>You can now start fixtures in foreground mode without running any tests by using the <code>--fixture</code> option. This lets you provision services (like a database or message broker) and use them in your workflow.</p>
<p>Specify fixture names or YAML-style configuration:</p>
<pre><code class="language-sh">uvx tenzir-test --fixture mysql
uvx tenzir-test --fixture 'kafka: {port: 9092}' --debug
</code></pre>
<p>The harness prints fixture-provided environment variables like <code>HOST</code>, <code>PORT</code>, and <code>DATABASE</code>, then keeps services running until you press <code>Ctrl+C</code>. You can repeat <code>--fixture</code> to activate multiple fixtures. The option is mutually exclusive with positional TEST arguments.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-15T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.26.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-26-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-26-0"/>
        <updated>2026-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces the from_mysql operator for reading data directly from MySQL databases, with support for live streaming, custom SQL queries, and TLS connections. It also adds link-based HTTP pagination and optional field parameters for user-defined operators.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces the from_mysql operator for reading data directly from MySQL databases, with support for live streaming, custom SQL queries, and TLS connections. It also adds link-based HTTP pagination and optional field parameters for user-defined operators.</p>

<h2>Features</h2>

<h3>Optional field parameters for user-defined operators</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5753">#5753</a></small></p>
<p>User-defined operators in packages can now declare optional field-type parameters with <code>null</code> as the default value. This allows operators to accept field selectors that are not required to be provided.</p>
<p>When a field parameter is declared with <code>type: field</code> and <code>default: null</code>, you can omit the argument when calling the operator, and the parameter will receive a <code>null</code> value instead. You can then check whether a field was provided by comparing the parameter to <code>null</code> within the operator definition.</p>
<p>Example:</p>
<p>In your package's operator definition, declare an optional field parameter:</p>
<pre><code class="language-yaml">args:
  named:
    - name: selector
      type: field
      default: null
</code></pre>
<p>In the operator implementation, check if the field was provided:</p>
<pre><code class="language-tql">set result = if $selector != null then "field provided" else "field omitted"
</code></pre>
<p>When calling the operator, the field argument becomes optional:</p>
<pre><code class="language-tql">my_operator                    # field is null
my_operator selector=x.y       # field is x.y
</code></pre>
<p>Only <code>null</code> is allowed as the default value for field parameters. Non-null defaults are rejected with an error during package loading.</p>

<h3>Link header pagination for HTTP operators</h3>
<p><small>Feb 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>paginate</code> parameter for the <code>from_http</code> and <code>http</code> operators now supports link-based pagination via the <code>Link</code> HTTP header.</p>
<p>Previously, pagination was only available through a lambda function that extracted the next URL from response data. Now you can use <code>paginate="link"</code> to automatically follow pagination links specified in the response's <code>Link</code> header, following RFC 8288. This is useful for APIs that use HTTP header-based pagination instead of embedding next URLs in the response body.</p>
<p>The operator parses the <code>Link</code> header and follows the <code>rel=next</code> relation to automatically fetch the next page of results.</p>
<p>Example:</p>
<pre><code>from_http "https://api.example.com/data", paginate="link"
</code></pre>
<p>If an invalid pagination mode is provided (neither a lambda nor <code>"link"</code>), the operator now reports a clear error message.</p>

<h3>MySQL source operator</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5721">#5721</a>, <a href="https://github.com/tenzir/tenzir/pull/5738">#5738</a></small></p>
<p>The <code>from_mysql</code> operator lets you read data directly from MySQL databases.</p>
<p>Read a table:</p>
<pre><code class="language-tql">from_mysql table="users", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>List tables:</p>
<pre><code class="language-tql">from_mysql show="tables", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>Show columns:</p>
<pre><code class="language-tql">from_mysql table="users", show="columns", host="localhost", port=3306, user="admin", password="secret", database="mydb"
</code></pre>
<p>And ultimately execute a custom SQL query:</p>
<pre><code class="language-tql">from_mysql sql="SELECT id, name FROM users WHERE active = 1",
           host="localhost",
           port=3306,
           user="admin",
           password="secret",
           database="mydb"
</code></pre>
<p>The operator supports TLS/SSL connections for secure communication with MySQL
servers. Use <code>tls=true</code> for default TLS settings, or pass a record for
fine-grained control:</p>
<pre><code class="language-tql">from_mysql table="users", host="db.example.com", database="prod", tls={
  cacert: "/path/to/ca.pem",
  certfile: "/path/to/client-cert.pem",
  keyfile: "/path/to/client-key.pem",
}
</code></pre>
<p>The operator supports MySQL's <code>caching_sha2_password</code> authentication method and automatically maps MySQL data types to Tenzir types.</p>
<p>Use <code>live=true</code> to continuously stream new rows from a table. The operator
tracks progress using a watermark on an integer column, polling for rows above
the last-seen value:</p>
<pre><code class="language-tql">from_mysql table="events", live=true, host="localhost", database="mydb"
</code></pre>
<p>By default, the tracking column is auto-detected from the table's
auto-increment primary key. To specify one explicitly:</p>
<pre><code class="language-tql">from_mysql table="events", live=true, tracking_column="event_id",
           host="localhost", database="mydb"
</code></pre>

<h2>Bug Fixes</h2>

<h3>Improve write_lines operator performance</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a></small></p>
<p>We have significantly improved the performance of the <code>write_lines</code> operator.</p>

<h3>Secret type support for user-defined operator parameters</h3>
<p><small>Feb 12, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5752">#5752</a></small></p>
<p>User-defined operators in packages can now declare parameters with the <code>secret</code> type to ensure that secret values are properly handled as secret expressions:</p>
<pre><code>args:
  positional:
    - name: api_key
      type: secret
      description: "API key to use for authentication"
</code></pre>

<h3>merge() function recursive deep merge for nested records</h3>
<p><small>Feb 5, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5728">#5728</a></small></p>
<p>The <code>merge()</code> function now performs a recursive deep merge when merging two records. Previously, nested fields were dropped when merging, so <code>merge({hw: {sn: "XYZ123"}}, {hw: {model: "foobar"}})</code> would incorrectly produce <code>{hw: {model: "foobar"}}</code> instead of recursively merging the nested fields. The function now correctly produces <code>{hw: {sn: "XYZ123", model: "foobar"}}</code> by materializing both input records and performing a deep merge on them.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-2"/>
        <updated>2026-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the readability of configuration override log messages by using relative paths and human-friendly formatting.</p>

<h2>Bug Fixes</h2>

<h3>Improved config override log readability</h3>
<p><small>Feb 13, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/19">#19</a></small></p>
<p>Configuration override log messages now use relative paths and human-friendly formatting instead of absolute paths and raw Python repr output, making debug output easier to read.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-13T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-1"/>
        <updated>2026-02-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for nested dataclass hierarchies in fixture options, enabling multi-level structured configurations in test frontmatter.</p>

<h2>Features</h2>

<h3>Nested dataclass options for fixtures</h3>
<p><small>Feb 11, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/18">#18</a></small></p>
<p>Fixture options now support nested dataclass hierarchies, allowing you to structure complex configurations with multiple levels of organization.</p>
<p>Previously, fixture options were limited to flat fields. Now you can declare nested dataclasses as field types, and tests can pass deeply structured options through frontmatter:</p>
<pre><code class="language-yaml">fixtures:
  - node:
      server:
        message:
          greeting: world
</code></pre>
<p>Type safety is preserved across all nesting levels. Optional nested fields (declared with <code>Optional[T]</code> or <code>T | None</code>) are supported, and omitted nested records use their default values. The example server fixture demonstrates this capability with a <code>message.greeting</code> field that flows through to environment variables.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-11T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-1"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release upgrades pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.]]></summary>
        <content type="html"><![CDATA[<p>This release upgrades pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.</p>

<h2>Bug Fixes</h2>

<h3>Security update for pnpm CVE-2024-53866</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We upgraded pnpm to 9.15.0 in the frontend Docker image to address CVE-2024-53866.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.3.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-3-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-3-0"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.]]></summary>
        <content type="html"><![CDATA[<p>This release adds structured configuration options for fixtures, letting tests
pass typed parameters through YAML frontmatter using frozen dataclasses.</p>

<h2>Features</h2>

<h3>Structured options for fixtures</h3>
<p><small>Feb 10, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/17">#17</a></small></p>
<p>Fixtures can now receive typed configuration options passed from test YAML files.</p>
<p>Declare options on a fixture with <code>@fixture(options=MyDataclass)</code>, where <code>MyDataclass</code> is a frozen dataclass. Tests can then provide structured options in their frontmatter using either compact syntax (for simple cases) or expanded syntax (for clarity):</p>
<pre><code class="language-yaml">fixtures:
  - node:
      tls: true
      port: 8443
  - http:
      port: 9090
</code></pre>
<p>The <code>@fixture</code> decorator validates that option keys match the dataclass fields, and the fixture retrieves its typed instance using <code>current_options(name)</code>. When options aren't provided, fixtures receive a default-constructed instance of their options class.</p>
<p>The feature maintains backward compatibility with the existing <code>fixtures: [node, http]</code> syntax for fixtures without options.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.25.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-25-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-25-2"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes the sigma operator to correctly load all rule files from a directory.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes the sigma operator to correctly load all rule files from a directory.</p>

<h2>Bug Fixes</h2>

<h3>Fix sigma operator directory handling to load all rules</h3>
<p><small>Feb 3, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5715">#5715</a></small></p>
<p>The <code>sigma</code> operator now correctly loads all rules when given a directory containing multiple Sigma rule files. Previously, only the last processed rule file would be retained because the rules collection was being cleared on every recursive directory traversal.</p>
<pre><code class="language-tql">sigma "/path/to/sigma/rules"
</code></pre>
<p>All rules found in the directory and its subdirectories will now be loaded and used to match against input events.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.28.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-28-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-28-0"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release unifies the library's Available and Installed tabs into a single view, making package management more streamlined. It also adds pipeline activity sorting, series isolation in activity charts, a line wrap toggle in the Inspector, platform version display, and a backslash escaping fix.]]></summary>
        <content type="html"><![CDATA[<p>This release unifies the library's Available and Installed tabs into a single view, making package management more streamlined. It also adds pipeline activity sorting, series isolation in activity charts, a line wrap toggle in the Inspector, platform version display, and a backslash escaping fix.</p>

<h2>Features</h2>

<h3>Isolate series in pipeline activity chart</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/64">#64</a></small></p>
<p>You can now click on the Ingress or Egress legend item to isolate that series in the activity chart. Clicking again shows both series, making it easier to analyze each metric when lines overlap.</p>

<h3>Wrap lines in the Inspector</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added a toggle in the Explorer table Inspector that lets you wrap lines for easier reading.</p>

<h3>View the current platform version</h3>
<p><small>Feb 3, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/42">#42</a></small></p>
<p>We now display the current platform version at the bottom of the workspace switcher dropdown,️ making it easier to always see which version you’re on.</p>

<h3>Sort pipelines by activity</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/38">#38</a></small></p>
<p>We added sorting for the Live Activity column in the pipelines table, so you can easily order pipelines by their activity level.</p>

<h2>Changes</h2>

<h3>Unified library tabs</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/29">#29</a></small></p>
<p>We unified the Available and Installed library tabs into a single view, so you can see which packages are installed without switching tabs. You can also uninstall packages directly from the same page.</p>

<h2>Bug Fixes</h2>

<h3>Fixed backslash escaping in TQL string rendering</h3>
<p><small>Feb 9, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We fixed a bug in the Inspector where strings containing backslashes were not displayed correctly. Backslashes were not being escaped in TQL string rendering. For example, a string like <code>Hello \World\</code> was previously rendered as <code>"Hello \World\"</code> instead of <code>"Hello \\World\\"</code>. The fix ensures backslashes are properly escaped when displayed.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-2"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a serialization bug where Python fixture tests with `skip`
configurations in `test.yaml` failed with a JSON serialization error.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a serialization bug where Python fixture tests with <code>skip</code>
configurations in <code>test.yaml</code> failed with a JSON serialization error.</p>

<h2>Bug Fixes</h2>

<h3>Dataclass serialization in Python fixture configurations</h3>
<p><small>Feb 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Python fixture tests that use <code>skip</code> in their <code>test.yaml</code> no longer fail with
<code>Object of type SkipConfig is not JSON serializable</code>.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release improves the `-m`/`--match` flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.]]></summary>
        <content type="html"><![CDATA[<p>This patch release improves the <code>-m</code>/<code>--match</code> flag with automatic substring matching and centralizes skip handling in the engine for more consistent test reporting.</p>

<h2>Changes</h2>

<h3>Simpler substring matching for -m/--match flag</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/16">#16</a></small></p>
<p>The <code>-m</code>/<code>--match</code> flag now treats bare strings as substring matches automatically.</p>
<p>Previously, you had to use glob syntax like <code>tenzir-test -m '*mysql*'</code> to match tests by name. Now you can write <code>tenzir-test -m mysql</code> and it automatically matches any test path containing "mysql". This makes the common case of substring matching simpler and more intuitive.</p>
<p>Patterns that contain glob metacharacters (<code>*</code>, <code>?</code>, <code>[</code>) still use fnmatch syntax as before, so existing patterns with wildcards continue to work exactly as they did. This change is fully backwards-compatible.</p>

<h3>Centralize skip-handling logic in engine</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/15">#15</a></small></p>
<p>Skip handling now lives in the engine instead of individual runners. Skipped
tests are recorded consistently in summary stats regardless of which runner
executes them, so skip counts and paths in the test report are always accurate.</p>
<p>Previously, each runner duplicated the same skip-config parsing, which could
lead to inconsistent skip tracking. Custom runners no longer need to implement
skip logic because the engine evaluates the <code>skip</code> configuration before
dispatching to any runner.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.2.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-2-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-2-0"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds support for selecting tests by name using glob patterns via the new `-m`/`--match` CLI option.]]></summary>
        <content type="html"><![CDATA[<p>This release adds support for selecting tests by name using glob patterns via the new <code>-m</code>/<code>--match</code> CLI option.</p>

<h2>Features</h2>

<h3>Test selection by name pattern matching</h3>
<p><small>Feb 6, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/13">#13</a></small></p>
<p>Select tests by relative path using the new <code>-m</code>/<code>--match</code> option with fnmatch glob patterns. You can repeat the option to match multiple patterns, and tests matching any pattern are selected. When you combine TEST paths with <code>-m</code> patterns, the framework runs only tests matching both (intersection). If a matched test belongs to a suite configured via <code>test.yaml</code>, all tests in that suite are included automatically. Empty or whitespace-only patterns are silently ignored.</p>
<p>Example: <code>tenzir-test -m '*context*' -m '*create*'</code> runs all tests whose paths contain "context" or "create" anywhere in the name.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.1.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-1-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-1-1"/>
        <updated>2026-02-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the CLI help text with usage examples and a link to the documentation.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the CLI help text with usage examples and a link to the documentation.</p>

<h2>Changes</h2>

<h3>Improved CLI help with examples and documentation</h3>
<p><small>Feb 2, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/12">#12</a></small></p>
<p>The help text for the <code>tenzir-test</code> command now provides more context and guidance.</p>
<p>The command description now explains the baseline comparison behavior and shows how to regenerate baselines with the <code>--update</code> flag.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-02-06T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.27.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-27-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-27-1"/>
        <updated>2026-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a bug where users could experience authentication failures due to stale user keys in their session. The platform now proactively checks for expired keys and refreshes them automatically.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a bug where users could experience authentication failures due to stale user keys in their session. The platform now proactively checks for expired keys and refreshes them automatically.</p>

<h2>Bug Fixes</h2>

<h3>Fixed workspace switcher on pipeline detail page</h3>
<p><small>Feb 2, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/56">#56</a></small></p>
<p>We fixed an issue where the workspace switcher dropdown did not open on the pipeline detail page.</p>

<h3>User key expiration handling</h3>
<p><small><a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed a bug that could leave users with a stale user key in their session, causing authentication failures. The platform now proactively checks for expired user keys and refreshes them automatically.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-02-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.1.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-1-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-1-0"/>
        <updated>2026-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds stdin file support for piping data directly to tests, and improves satellite project display in project listings.]]></summary>
        <content type="html"><![CDATA[<p>This release adds stdin file support for piping data directly to tests, and improves satellite project display in project listings.</p>

<h2>Features</h2>

<h3>Stdin file support for piping data to tests</h3>
<p><small>Jan 31, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The test harness now supports <code>.stdin</code> files for piping data directly to test processes.</p>
<p>Place a <code>.stdin</code> file next to any test to have its contents automatically piped to the subprocess stdin. The harness also sets the <code>TENZIR_STDIN</code> environment variable with the file path. This is particularly useful for TQL tests where you can start a pipeline with a parser directly:</p>
<pre><code class="language-tql">read_csv
where count > 10
</code></pre>
<p>Instead of using <code>.input</code> files with <code>from_file env("TENZIR_INPUT")</code>. Both approaches remain valid—choose whichever fits your test better.</p>
<p>Shell and Python tests can also read from stdin or access <code>TENZIR_STDIN</code> when needed. Custom runners can use <code>get_stdin_content(env)</code> to read the file contents and pass them via the <code>stdin_data</code> parameter to <code>run_subprocess()</code>.</p>

<h2>Changes</h2>

<h3>Satellite projects show relative paths in project listing</h3>
<p><small>Jan 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>When listing projects in the execution plan, satellite projects now display their path relative to the root project instead of just their directory name. This makes satellite projects with identical directory names distinguishable. Additionally, project markers have been refined: root projects use a filled marker (● for packages, ■ for regular projects), while satellite projects use an empty marker (○ for packages, □ for regular projects).</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-01-31T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.25.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-25-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-25-1"/>
        <updated>2026-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release includes several bug fixes for the JSON parser, `where`, `replace`, and `if` operators, along with Kafka decompression support and a new `raw_message` option for the `read_syslog` operator.]]></summary>
        <content type="html"><![CDATA[<p>This release includes several bug fixes for the JSON parser, <code>where</code>, <code>replace</code>, and <code>if</code> operators, along with Kafka decompression support and a new <code>raw_message</code> option for the <code>read_syslog</code> operator.</p>

<h2>Features</h2>

<h3>Raw message field support for read_syslog operator</h3>
<p><small>Jan 27, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5687">#5687</a></small></p>
<p>The <code>read_syslog</code> operator now supports a <code>raw_message</code> parameter that preserves the original, unparsed syslog message in a field of your choice. This is useful when you need to retain the exact input for auditing, debugging, or compliance purposes.</p>
<p>When you specify <code>raw_message=&#x3C;field></code>, the operator stores the complete input message (including all lines for multiline messages) in the specified field. This works with all syslog formats, including RFC 5424, RFC 3164, and octet-counted messages.</p>
<p>For example:</p>
<pre><code class="language-tql">read_syslog raw_message=original_input
</code></pre>
<p>This stores the unparsed message in the <code>original_input</code> field alongside the parsed structured fields like <code>hostname</code>, <code>app_name</code>, <code>message</code>, and others.</p>

<h2>Bug Fixes</h2>

<h3>Fix overzealous constant evaluation in `if` statements</h3>
<p><small>Jan 30, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5701">#5701</a></small></p>
<p>The condition of <code>if</code> statements is no longer erroneously evaluated early when
it contains a lambda expression that references runtime fields.</p>

<h3>Support decompression for Kafka operators</h3>
<p><small>Jan 30, 2026 · <a href="https://github.com/raxyte">@raxyte</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5697">#5697</a></small></p>
<p>Kafka connectors now support decompressing messages with <code>zstd</code>, <code>lz4</code> and <code>gzip</code>.</p>

<h3>Fix intermittent UTF-8 errors in JSON parser</h3>
<p><small>Jan 29, 2026 · <a href="https://github.com/jachris">@jachris</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5698">#5698</a></small></p>
<p>The JSON parser no longer intermittently fails with "The input is not valid UTF-8"
when parsing data containing multi-byte UTF-8 characters such as accented letters
or emojis.</p>

<h3>Fix assertion failure in replace operator when replacing with null</h3>
<p><small>Jan 29, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5696">#5696</a></small></p>
<p>The <code>replace</code> operator no longer triggers an assertion failure when using
<code>with=null</code> on data processed by operators like <code>ocsf::cast</code>.</p>
<pre><code class="language-tql">load_file "dns.json"
read_json
ocsf::cast "dns_activity"
replace what="", with=null
</code></pre>

<h3>Where operator optimization for optional fields</h3>
<p><small>Jan 28, 2026 · <a href="https://github.com/jachris">@jachris</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>where</code> operator optimization now correctly handles optional fields marked with <code>?</code>. Previously, the optimizer didn't account for the optional marker, which could result in incorrect query optimization. This fix ensures that optional field accesses are handled properly without affecting the optimization of regular field accesses.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-01-30T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.25.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-25-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-25-0"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds periodic emission to the summarize operator, enabling real-time streaming analytics with configurable intervals and accumulation modes. It also introduces AWS IAM authentication across SQS, S3, and Kafka operators, and fixes memory instability in from_http when used with slow downstream consumers.]]></summary>
        <content type="html"><![CDATA[<p>This release adds periodic emission to the summarize operator, enabling real-time streaming analytics with configurable intervals and accumulation modes. It also introduces AWS IAM authentication across SQS, S3, and Kafka operators, and fixes memory instability in from_http when used with slow downstream consumers.</p>

<h2>Features</h2>

<h3>Periodic emission for summarize operator</h3>
<p><small>Jan 22, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5605">#5605</a></small></p>
<p>The <code>summarize</code> operator now supports periodic emission of aggregation results at fixed intervals, enabling real-time streaming analytics and monitoring use cases.</p>
<p>Use the <code>options</code> named argument with <code>frequency</code> to emit results every N seconds:</p>
<pre><code class="language-tql">summarize count(this), src_ip, options={frequency: 5s}
</code></pre>
<p>This emits aggregation results every 5 seconds, showing the count per source IP for events received during each interval:</p>
<pre><code class="language-tql">{src_ip: 192.168.1.1, count: 42}
{src_ip: 192.168.1.2, count: 17}
// ... 5 seconds later ...
{src_ip: 192.168.1.1, count: 38}
{src_ip: 192.168.1.3, count: 9}
</code></pre>
<p>The <code>mode</code> parameter controls how aggregations behave across emissions:</p>
<p><strong>Reset mode</strong> (default) resets aggregations after each emission, providing per-interval metrics:</p>
<pre><code class="language-tql">summarize sum(bytes), options={frequency: 10s}
// Shows bytes per 10-second window
</code></pre>
<p><strong>Cumulative mode</strong> accumulates values across emissions, providing running totals:</p>
<pre><code class="language-tql">summarize sum(bytes), options={frequency: 10s, mode: "cumulative"}
// Shows total bytes seen so far
</code></pre>
<p><strong>Update mode</strong> emits only when values change from the previous emission, reducing output noise in monitoring scenarios:</p>
<pre><code class="language-tql">summarize count(this), severity, options={frequency: 1s, mode: "update"}
// Emits only when the count for a severity level changes
</code></pre>
<p>The operator always emits final results when the input stream ends, ensuring no data is lost.</p>

<h3>AWS IAM authentication for load_sqs, save_sqs, from_s3, to_s3, from_kafka, and to_kafka</h3>
<p><small>Jan 21, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5675">#5675</a></small></p>
<p>The <code>load_sqs</code>, <code>save_sqs</code>, <code>from_s3</code>, <code>to_s3</code>, <code>from_kafka</code>, and <code>to_kafka</code> operators now support AWS IAM authentication through a new <code>aws_iam</code> option. You can configure explicit credentials, assume IAM roles, use AWS CLI profiles, or rely on the default credential chain.</p>
<p>The <code>aws_iam</code> option accepts these fields:</p>
<ul>
<li><code>profile</code>: AWS CLI profile name for credential resolution</li>
<li><code>access_key_id</code>: AWS access key ID</li>
<li><code>secret_access_key</code>: AWS secret access key</li>
<li><code>session_token</code>: AWS session token for temporary credentials</li>
<li><code>assume_role</code>: IAM role ARN to assume</li>
<li><code>session_name</code>: Session name for role assumption</li>
<li><code>external_id</code>: External ID for role assumption</li>
</ul>
<p>Additionally, the SQS and Kafka operators accept a top-level <code>aws_region</code> option:</p>
<ul>
<li>For <code>load_sqs</code> and <code>save_sqs</code>: Configures the AWS SDK client region for queue URL resolution</li>
<li>For <code>from_kafka</code> and <code>to_kafka</code>: Required for MSK authentication (used to construct the authentication endpoint URL)</li>
</ul>
<p>You can also combine explicit credentials with role assumption. This uses the provided credentials to call STS AssumeRole and obtain temporary credentials for the assumed role:</p>
<pre><code class="language-tql">load_sqs "my-queue", aws_iam={
  access_key_id: "AKIAIOSFODNN7EXAMPLE",
  secret_access_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  assume_role: "arn:aws:iam::123456789012:role/my-role"
}
</code></pre>
<p>For example, to load from SQS with a specific region:</p>
<pre><code class="language-tql">load_sqs "my-queue", aws_region="us-east-1", aws_iam={
  access_key_id: "AKIAIOSFODNN7EXAMPLE",
  secret_access_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
</code></pre>
<p>To use an AWS CLI profile:</p>
<pre><code class="language-tql">load_sqs "my-queue", aws_iam={
  profile: "production"
}
</code></pre>
<p>To assume an IAM role:</p>
<pre><code class="language-tql">from_s3 "s3://bucket/path", aws_iam={
  assume_role: "arn:aws:iam::123456789012:role/my-role",
  session_name: "tenzir-session",
  external_id: "unique-id"
}
</code></pre>
<p>For Kafka MSK authentication, the <code>aws_region</code> option is required:</p>
<pre><code class="language-tql">from_kafka "my-topic", aws_region="us-east-1", aws_iam={
  profile: "production"
}
</code></pre>
<p>When no explicit credentials or profile are configured, operators use the AWS SDK's default credential provider chain, which checks environment variables (<code>AWS_ACCESS_KEY_ID</code>, <code>AWS_SECRET_ACCESS_KEY</code>), AWS configuration files (<code>~/.aws/credentials</code>), EC2/ECS instance metadata, and other standard sources. This applies both when <code>aws_iam</code> is omitted entirely and when <code>aws_iam</code> is specified without <code>access_key_id</code>, <code>secret_access_key</code>, or <code>profile</code>.</p>

<h3>RFC 6587 octet-counting support for syslog parsing</h3>
<p><small>Jan 21, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>parse_syslog</code> function now supports RFC 6587 octet-counted framing, where syslog messages are prefixed with their byte length (for example, <code>65 &#x3C;syslog-message></code>). This framing is commonly used in TCP-based syslog transport to handle message boundaries.</p>
<p>The new <code>octet_counting</code> parameter for <code>parse_syslog</code> offers three modes:</p>
<ul>
<li><strong>Not specified (default)</strong>: Auto-detect. The parser strips a length prefix if present and valid, otherwise parses the input as-is. This prevents false positives where input coincidentally starts with digits and a space.</li>
<li><strong><code>octet_counting=true</code></strong>: Require a length prefix. Emits a warning and returns null if the input lacks a valid prefix.</li>
<li><strong><code>octet_counting=false</code></strong>: Never strip a length prefix. Parse the input as-is.</li>
</ul>

<h3>Per-actor memory allocation tracking</h3>
<p><small>Jan 12, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5646">#5646</a></small></p>
<p>We have added support for per-actor/per-thread allocation tracking. When enabled, these stats will track which actor
(or thread) allocated how much memory. This gives much more detailed insights into where memory is allocated.
By default these detailed statistics are not collected, as they introduce a cost to every allocation.</p>

<h2>Changes</h2>

<h3>Preserve original field order in ocsf::derive</h3>
<p><small>Jan 20, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5673">#5673</a></small></p>
<p>The <code>ocsf::derive</code> operator now preserves original field order instead of
reordering alphabetically. Derived enum/sibling pairs are inserted at the
position of the first field, ordered alphabetically within each pair (e.g.,
<code>activity_id</code> before <code>activity_name</code>). Non-OCSF fields remain at their original
positions.</p>
<p>For example, given the input:</p>
<pre><code class="language-tql">{foo: 1, class_uid: 1001}
</code></pre>
<p>The output is now:</p>
<pre><code class="language-tql">{foo: 1, class_name: "...", class_uid: 1001}
</code></pre>
<p>Previously, the output was alphabetically sorted:</p>
<pre><code class="language-tql">{class_name: "...", class_uid: 1001, foo: 1}
</code></pre>

<h3>Cleanup of existing directory markers in from_s3 and from_abs</h3>
<p><small>Jan 19, 2026 · <a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5670">#5670</a></small></p>
<p>The <code>from_s3</code> and <code>from_azure_blob_storage</code> operators now also delete existing
directory marker objects along the glob path when <code>remove=true</code>. Directory
markers are zero-byte objects with keys ending in <code>/</code> that some cloud storage
tools create. These artifacts can accumulate over time, increasing API costs and
slowing down listing operations.</p>

<h2>Bug Fixes</h2>

<h3>Stable memory usage for `from_http` server</h3>
<p><small>Jan 23, 2026 · <a href="https://github.com/raxyte">@raxyte</a> · <a href="https://github.com/tenzir/tenzir/pull/5677">#5677</a></small></p>
<p>The <code>from_http</code> server now has a stable memory usage when used with a slow
downstream, especially in situations where the client timeouts and retries
requests.</p>

<h3>Phantom pipeline entries with empty IDs</h3>
<p><small>Jan 22, 2026 · <a href="https://github.com/jachris">@jachris</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5680">#5680</a></small></p>
<p>In rare cases, a phantom pipeline with an empty ID could appear in the pipeline list that couldn't be deleted through the API.</p>

<h3>Correct multi-partition commits in `from_kafka`</h3>
<p><small>Jan 12, 2026 · <a href="https://github.com/raxyte">@raxyte</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5654">#5654</a></small></p>
<p>The <code>from_kafka</code> operator now commits offsets per partition and tracks partition
EOFs based on the current assignment, preventing premature exits and
cross-partition replays after restarts.</p>

<h3>No more directory markers for S3 and Azure</h3>
<p><small><a href="https://github.com/jachris">@jachris</a> · <a href="https://github.com/tenzir/tenzir/pull/5669">#5669</a></small></p>
<p>Deleting files from S3 or Azure Blob Storage via <code>from_s3</code> or
<code>from_azure_blob_storage</code> with the <code>remove=true</code> option no longer creates empty
directory marker objects in the parent directory when the last file of the
directory is deleted.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-01-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.0.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-0-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-0-2"/>
        <updated>2026-01-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the debugging experience by making the `--debug` flag automatically enable verbose output, so you see all test results when diagnosing failures.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the debugging experience by making the <code>--debug</code> flag automatically enable verbose output, so you see all test results when diagnosing failures.</p>

<h2>Changes</h2>

<h3>Debug mode implies verbose output</h3>
<p><small>Jan 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/test/pull/9">#9</a></small></p>
<p>The <code>--debug</code> flag (or <code>TENZIR_TEST_DEBUG=1</code> environment variable) now automatically enables verbose output. When debugging test failures, you now see all test results (pass/skip/fail) instead of only failures, making it easier to diagnose issues. This provides more context without requiring users to pass both <code>--debug</code> and <code>--verbose</code> flags separately.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-01-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.27.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-27-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-27-0"/>
        <updated>2026-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the pipeline detail view with faster loading and a convenient close button for quick navigation. Error messages are now cleaner with collapsible technical details, and we fixed issues where the UI could hang or become unresponsive. This release also includes security hardening for standalone deployments, including server-side token storage, configurable security headers, and Content Security Policy support.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the pipeline detail view with faster loading and a convenient close button for quick navigation. Error messages are now cleaner with collapsible technical details, and we fixed issues where the UI could hang or become unresponsive. This release also includes security hardening for standalone deployments, including server-side token storage, configurable security headers, and Content Security Policy support.</p>

<h2>Features</h2>

<h3>Add security headers and CSP for standalone deployment</h3>
<p><small>Jan 22, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The platform frontend now supports configurable response headers and Content Security Policy (CSP) for standalone deployments.</p>
<p>Set <code>TENZIR_PLATFORM_UI_ENABLE_RESPONSE_HEADERS_DEFAULT=true</code> to enable default security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Opener-Policy, Cross-Origin-Resource-Policy). Use <code>TENZIR_PLATFORM_UI_RESPONSE_HEADERS_DEFAULT</code> with a JSON object to override with custom headers.</p>
<p>Set <code>TENZIR_PLATFORM_UI_ENABLE_RESPONSE_HEADERS_HSTS=true</code> to enable HTTP Strict Transport Security for HTTPS deployments.</p>
<p>Set <code>TENZIR_PLATFORM_UI_ENABLE_RESPONSE_HEADERS_CSP=true</code> to enable Content Security Policy, which helps prevent XSS and other injection attacks.</p>

<h3>Faster pipeline detail view</h3>
<p><small>Jan 21, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/19">#19</a></small></p>
<p>We improved how pipeline details load, making the view faster than before when navigating between pipelines. We also added a close button next to the overflow menu on the right so you can quickly exit a pipeline while browsing pipeline details.</p>

<h3>Store authentication tokens server-side</h3>
<p><small>Jan 20, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Authentication tokens (idToken and userKey) are now stored in the server-side session database instead of browser cookies. This improves security by keeping sensitive tokens accessible only via the session cookie identifier, preventing direct client-side access to authentication credentials.</p>

<h3>Add optional Caddy reverse proxy for seaweed S3 storage</h3>
<p><small>Jan 19, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>The seaweed S3 storage component now supports an optional Caddy reverse proxy that improves S3 error handling. Set <code>TENZIR_ENABLE_CADDY=true</code> to enable it. The reverse proxy intercepts 404 responses and returns proper S3-style error messages.</p>

<h2>Changes</h2>

<h3>Cleaner error messages</h3>
<p><small>Jan 21, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/37">#37</a></small></p>
<p>We now hide technical error details in error messages. You can click "Show error details" to expand them anytime, and use the copy button to share with support.</p>

<h2>Bug Fixes</h2>

<h3>Fix hangup in UI</h3>
<p><small>Jan 26, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>Fixed a potential infinite hang in the Tenzir UI that could
be triggered by a rare race condition where the Tenzir Node
returned duplicate pipeline ids.</p>

<h3>Fixed pipeline deletion</h3>
<p><small>Jan 21, 2026 · <a href="https://github.com/gitryder">@gitryder</a> · <a href="https://github.com/tenzir/platform/pull/19">#19</a></small></p>
<p>We fixed an issue where deleting a pipeline could cause the interface to become unresponsive.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-01-26T00:00:00.000Z</published>
    </entry>
</feed>