<?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-05-07T00: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.36.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-36-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-36-0"/>
        <updated>2026-05-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release makes int64/uint64 column merging lossless during parsing, so fields like `flow_id` that mix signed and unsigned values no longer cause unnecessary table-slice splits. It also extends ocsf::derive to handle list-valued enum fields for full bidirectional OCSF enum normalization.]]></summary>
        <content type="html"><![CDATA[<p>This release makes int64/uint64 column merging lossless during parsing, so fields like <code>flow_id</code> that mix signed and unsigned values no longer cause unnecessary table-slice splits. It also extends ocsf::derive to handle list-valued enum fields for full bidirectional OCSF enum normalization.</p>

<h2>Features</h2>

<h3>OCSF enum list derivation</h3>
<p><small>Apr 30, 2026 · <a href="https://github.com/jachris">@jachris</a>, <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a> · <a href="https://github.com/tenzir/tenzir/pull/5354">#5354</a></small></p>
<p><code>ocsf::derive</code> now derives OCSF enum sibling fields for lists, not just scalar enum fields. For example, DNS answers with <code>flag_ids: [1, 3, 4]</code> now also get <code>flags: ["Authoritative Answer", "Recursion Desired", "Recursion Available"]</code>, and the reverse direction works for <code>flags</code> to <code>flag_ids</code> as well.</p>

<h2>Changes</h2>

<h3>Lossless int64/uint64 merging during parsing</h3>
<p><small>May 5, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Parsing data that mixes <code>int64</code> and <code>uint64</code> values in the same field no longer
produces unnecessary table-slice splits, improving batching performance. Fields
like <code>flow_id</code> that are always non-negative but occasionally exceed the signed
integer limit of  <code>2^63 − 1</code> are now merged into a single <code>uint64</code> column where
possible, instead of being emitted as separate slices.</p>

<h2>Bug Fixes</h2>

<h3>Empty if branches in the new executor</h3>
<p><small>May 6, 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/6128">#6128</a></small></p>
<p>Empty <code>if</code> branches no longer crash when running pipelines with the new executor. For example, <code>if false {}</code> now behaves like an empty pass-through branch instead of triggering an internal assertion failure.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-05-07T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.35.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-35-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-35-2"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes two package-related bugs: startup pipelines can now reliably reference operators from static packages, and UDOs with slash-delimited string defaults (e.g. "/tmp-data/") load correctly without internal errors.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes two package-related bugs: startup pipelines can now reliably reference operators from static packages, and UDOs with slash-delimited string defaults (e.g. "/tmp-data/") load correctly without internal errors.</p>

<h2>Bug Fixes</h2>

<h3>Configured pipelines with package operators</h3>
<p><small>May 4, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Configured startup pipelines can now reference operators from static packages reliably. Previously, such pipelines could fail during node startup with <code>module &#x3C;package> not found</code>, even though the same package operator worked when run manually after startup.</p>

<h3>Slash-delimited UDO defaults</h3>
<p><small>May 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/6108">#6108</a></small></p>
<p>Package UDOs now load correctly when a typed string default looks like a TQL pattern, such as <code>default: "/tmp-data/"</code>.</p>
<p>Previously, loading such a package could abort with an unexpected internal error before any pipeline ran.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-05-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-3"/>
        <updated>2026-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release makes hook debug diagnostics consistent with the rest of the harness debug trace, so users get uniform output when diagnosing hook behavior.]]></summary>
        <content type="html"><![CDATA[<p>This release makes hook debug diagnostics consistent with the rest of the harness debug trace, so users get uniform output when diagnosing hook behavior.</p>

<h2>Bug Fixes</h2>

<h3>Consistent hook debug diagnostics</h3>
<p><small>May 5, 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/40">#40</a></small></p>
<p>Hook diagnostics emitted with <code>--debug</code> now use the same formatting as the rest of the harness debug trace. Previously, hook invocation messages used ad-hoc <code>debug:</code> lines, which made debug output inconsistent.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-05-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.7.3]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-7-3</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-7-3"/>
        <updated>2026-05-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release tightens changelog validation so unknown entry metadata keys are reported before they can be ignored by release workflows.]]></summary>
        <content type="html"><![CDATA[<p>This release tightens changelog validation so unknown entry metadata keys are reported before they can be ignored by release workflows.</p>

<h2>Bug Fixes</h2>

<h3>Validation for unknown entry metadata keys</h3>
<p><small>May 4, 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/23">#23</a></small></p>
<p>The <code>validate</code> command now reports unknown changelog entry metadata keys instead of silently accepting them. This catches misspelled fields such as <code>co-authors</code> early, before they are ignored by release workflows.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-05-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.35.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-35-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-35-1"/>
        <updated>2026-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release restores correct retention for metrics and diagnostics in mixed-age partitions and brings back actionable TLS hints when ClickHouse connections fail due to a TLS/plaintext mismatch.]]></summary>
        <content type="html"><![CDATA[<p>This release restores correct retention for metrics and diagnostics in mixed-age partitions and brings back actionable TLS hints when ClickHouse connections fail due to a TLS/plaintext mismatch.</p>

<h2>Bug Fixes</h2>

<h3>ClickHouse TLS mismatch diagnostics</h3>
<p><small>Apr 29, 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/6098">#6098</a></small></p>
<p>ClickHouse connection errors caused by TLS/plaintext mismatches now include the TLS notes and hint again. This helps identify when <code>to_clickhouse</code> is using TLS against a plaintext ClickHouse endpoint and suggests setting <code>tls=false</code> when appropriate.</p>

<h3>Retention for mixed-age metrics partitions</h3>
<p><small>Apr 28, 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/6086">#6086</a></small></p>
<p>Default retention policies now continue deleting metrics and diagnostics as their timestamps age into the retention window, even when older and newer events share a partition.</p>
<p>Previously, a partition that still contained newer events after retention could be skipped by later retention runs, leaving those events behind after they expired.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-30T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.35.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-35-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-35-0"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tenzir can now consume from and publish to NATS JetStream subjects with from_nats and to_nats. This release also fixes crashes in static musl builds when evaluating deeply nested generated TQL expressions.]]></summary>
        <content type="html"><![CDATA[<p>Tenzir can now consume from and publish to NATS JetStream subjects with from_nats and to_nats. This release also fixes crashes in static musl builds when evaluating deeply nested generated TQL expressions.</p>

<h2>Features</h2>

<h3>NATS JetStream operators</h3>
<p><small>Apr 17, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Tenzir can now consume from and publish to NATS JetStream subjects with
<code>from_nats</code> and <code>to_nats</code>.</p>
<p>Use <code>from_nats</code> to receive one event per message. The raw payload appears in the
<code>message</code> blob field, and <code>metadata_field</code> attaches NATS metadata:</p>
<pre><code class="language-tql">from_nats "alerts", metadata_field=nats
parsed = string(message).parse_json()
</code></pre>
<p>Use <code>to_nats</code> to publish one message per event. By default, the operator
serializes the whole event with <code>this.print_ndjson()</code>:</p>
<pre><code class="language-tql">from {severity: "high", alert_type: "suspicious-login"}
to_nats "alerts"
</code></pre>
<p>Both operators support configurable connection settings, authentication, and
the standard Tenzir <code>tls</code> record.</p>

<h2>Bug Fixes</h2>

<h3>Static musl builds no longer crash on deep TQL expressions</h3>
<p><small>Apr 27, 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/6082">#6082</a></small></p>
<p>Static musl builds of <code>tenzir</code> no longer crash on deeply nested generated TQL
expressions.</p>
<p>This affected generated pipelines with deeply nested expressions, for example
rules or transformations that expand into long left-associated operator chains.</p>
<p>The <code>tenzir</code> binary now links with a larger default thread stack size on musl,
which brings its behavior in line with non-static builds for these pipelines.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-2"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes suite-level requirement checks so they apply consistently across every test runner. Mixed TQL, shell, Python, and custom test suites now evaluate required Tenzir operators independently of runner order.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes suite-level requirement checks so they apply consistently across every test runner. Mixed TQL, shell, Python, and custom test suites now evaluate required Tenzir operators independently of runner order.</p>

<h2>Bug Fixes</h2>

<h3>Runner-independent suite requirements</h3>
<p><small>Apr 29, 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/39">#39</a></small></p>
<p>Suite-level <code>requires.operators</code> checks now apply consistently to every test runner. Mixed suites that combine TQL, shell, Python, or custom tests no longer depend on the first runner type to decide whether required Tenzir operators are available.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-04-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-1"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves suite fixture failure handling so setup and teardown errors are reported as regular test failures. The harness now continues running independent queued tests instead of aborting with a Python traceback.]]></summary>
        <content type="html"><![CDATA[<p>This release improves suite fixture failure handling so setup and teardown errors are reported as regular test failures. The harness now continues running independent queued tests instead of aborting with a Python traceback.</p>

<h2>Bug Fixes</h2>

<h3>Suite fixture failure reporting</h3>
<p><small>Apr 29, 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/38">#38</a></small></p>
<p>Suite-scoped fixture setup and teardown failures now appear as regular test failures instead of aborting the entire run with a Python traceback.</p>
<p>This lets the harness continue with independent queued tests after a fixture assertion or cleanup error.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-04-29T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.8.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-8-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-8-0"/>
        <updated>2026-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds project lifecycle hooks that let projects prepare their environment before tests run. Use hooks to select local Tenzir binaries, configure project-scoped environment variables, and collect diagnostics without custom wrapper scripts.]]></summary>
        <content type="html"><![CDATA[<p>This release adds project lifecycle hooks that let projects prepare their environment before tests run. Use hooks to select local Tenzir binaries, configure project-scoped environment variables, and collect diagnostics without custom wrapper scripts.</p>

<h2>Features</h2>

<h3>Project lifecycle hooks</h3>
<p><small>Apr 27, 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/36">#36</a></small></p>
<p>Projects can now register Python hooks that run at stable <code>tenzir-test</code> lifecycle points, including before settings discovery:</p>
<pre><code class="language-python">from tenzir_test import hooks

@hooks.startup
def use_local_build(ctx):
    ctx.path.insert(0, str(ctx.root / "build" / "bin"))
    ctx.env["TENZIR_BINARY"] = str(ctx.root / "build" / "bin" / "tenzir")
    ctx.env["TENZIR_NODE_BINARY"] = str(ctx.root / "build" / "bin" / "tenzir-node")
</code></pre>
<p>This makes it possible to select local Tenzir binaries, prepare project-scoped environment variables, and collect diagnostics for failed tests without wrapping the test command in custom shell scripts. Use <code>--no-hooks</code> or <code>TENZIR_TEST_DISABLE_HOOKS=1</code> to bypass hooks when debugging.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-04-28T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.34.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-34-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-34-0"/>
        <updated>2026-04-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds OData pagination support to the from_http operator, enabling seamless iteration over Microsoft Graph and other OData v4 collection responses.]]></summary>
        <content type="html"><![CDATA[<p>This release adds OData pagination support to the from_http operator, enabling seamless iteration over Microsoft Graph and other OData v4 collection responses.</p>

<h2>Features</h2>

<h3>OData pagination for from_http</h3>
<p><small>Apr 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>from_http</code> operator now supports <code>paginate="odata"</code> for
<a href="https://www.oasis-open.org/standard/odata-v4-01-os/">OData</a> collection
responses such as Microsoft Graph:</p>
<pre><code class="language-tql">from_http "https://graph.microsoft.com/v1.0/users",
  headers={"ConsistencyLevel": "eventual"},
  paginate="odata" {
  read_json
}
</code></pre>
<p>This mode emits the objects from the response body's top-level <code>value</code> array
and follows top-level <code>@odata.nextLink</code> URLs until no next link is present. The
next link can be absolute or relative to the current response URL.</p>

<h2>Bug Fixes</h2>

<h3>SentinelOne Data Lake sink support in the new executor</h3>
<p><small>Apr 24, 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/6081">#6081</a></small></p>
<p>The <code>to_sentinelone_data_lake</code> operator now works in pipelines that run on the new executor. Previously, using it there failed before the pipeline could send events.</p>
<pre><code class="language-tql">from {message: "hello"}
to_sentinelone_data_lake "https://example.com", token="TOKEN"
</code></pre>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.33.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-33-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-33-0"/>
        <updated>2026-04-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release makes the subnet function work directly with typed and string IP addresses, which removes boilerplate in TQL pipelines. It also fixes several stability issues in where, unroll, files, context::enrich, and collection indexing.]]></summary>
        <content type="html"><![CDATA[<p>This release makes the subnet function work directly with typed and string IP addresses, which removes boilerplate in TQL pipelines. It also fixes several stability issues in where, unroll, files, context::enrich, and collection indexing.</p>

<h2>Features</h2>

<h3>IP address support in subnet</h3>
<p><small>Apr 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>subnet</code> function now accepts typed IP addresses, plain IP strings, and
existing subnet values with an optional prefix length:</p>
<pre><code class="language-tql">from {source_ip: 10.10.1.124}
net = subnet(source_ip, 24)
</code></pre>
<p>This returns <code>10.10.1.0/24</code> without converting the IP address to a string first.
When you omit the prefix, IPv4 addresses become <code>/32</code> host subnets and IPv6
addresses become <code>/128</code> host subnets.</p>

<h2>Bug Fixes</h2>

<h3>Large unroll output stability</h3>
<p><small>Apr 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>unroll</code> operator no longer crashes when expanding very large lists into output that exceeds Arrow's per-array capacity.</p>

<h3>Recursive files traversal of unreadable directories</h3>
<p><small>Apr 24, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>files</code> operator now skips unreadable child directories during recursive traversal, emits a warning for each skipped directory by default, and continues listing accessible siblings. Set <code>skip_permission_denied=true</code> to ignore permission-denied paths silently: this suppresses warnings for skipped child directories and still makes an unreadable initial directory produce no events instead of an error. Non-permission filesystem errors continue to fail the pipeline.</p>

<h3>Fixed unbounded memory growth `context::enrich`</h3>
<p><small>Apr 23, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a></small></p>
<p>We fixed an issue in the <code>context::enrich</code> operator that did cause unbounded
memory growth.</p>

<h3>Crash fix for deep left-associated where expressions</h3>
<p><small>Apr 23, 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/6068">#6068</a></small></p>
<p>Tenzir no longer segfaults on some very deep left-associated boolean
expressions in <code>where</code> clauses due to source-location handling.</p>

<h3>Unsigned integer indexing in TQL</h3>
<p><small>Apr 22, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>Both list and record indexing in TQL now work with signed and unsigned integer indices.
This also applies to record field-position indexing and to the <code>get</code> function for records and lists.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.7]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-7</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-7"/>
        <updated>2026-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tests can now skip only the cases that require an unavailable optional fixture instead of skipping an entire suite. This keeps unrelated tests running and makes parameterized fixture setups more reliable.]]></summary>
        <content type="html"><![CDATA[<p>Tests can now skip only the cases that require an unavailable optional fixture instead of skipping an entire suite. This keeps unrelated tests running and makes parameterized fixture setups more reliable.</p>

<h2>Bug Fixes</h2>

<h3>Per-test fixture-unavailable skips</h3>
<p><small>Apr 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/35">#35</a></small></p>
<p>The test harness now honors <code>skip: {on: fixture-unavailable}</code> for fixtures that are selected by individual tests:</p>
<pre><code class="language-yaml">skip:
  on: fixture-unavailable
fixtures:
  - optional-service
</code></pre>
<p>This lets parameterized per-test fixtures skip only the tests that need the unavailable service. Suite fixtures still require the opt-in in directory-level <code>test.yaml</code>, so one test's frontmatter cannot control the whole suite.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-04-22T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.32.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-32-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-32-1"/>
        <updated>2026-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release fixes two correctness issues in stateful pipeline execution. Partition rebuilds now complete after writing replacement partitions, and periodic summarize output remains deterministic for delayed or sparse streams.]]></summary>
        <content type="html"><![CDATA[<p>This patch release fixes two correctness issues in stateful pipeline execution. Partition rebuilds now complete after writing replacement partitions, and periodic summarize output remains deterministic for delayed or sparse streams.</p>

<h2>Bug Fixes</h2>

<h3>Partition rebuild completion</h3>
<p><small>Apr 20, 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/6059">#6059</a></small></p>
<p>Partition rebuilds now finish after persisting rebuilt partitions. Previously, rebuild jobs could remain stuck indefinitely even though the replacement partitions were written successfully.</p>

<h3>Deterministic periodic summarize output</h3>
<p><small>Apr 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>summarize</code> operator now starts <code>frequency</code>-based emission with the first
input event and emits overdue periodic results before later events are
aggregated. This makes periodic output deterministic in <code>reset</code>,
<code>cumulative</code>, and <code>update</code> modes for delayed or sparse streams.</p>
<p>For example:</p>
<pre><code class="language-tql">from {ts: 0ms.from_epoch(), x: 1},
     {ts: 90ms.from_epoch(), x: 1},
     {ts: 360ms.from_epoch(), x: 1}
delay ts
summarize count=count(), options={frequency: 300ms, mode: "cumulative"}
</code></pre>
<p>The first periodic result now consistently reports a count of <code>2</code> before the
third event arrives.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.31.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-31-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-31-0"/>
        <updated>2026-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces organizations to the Tenzir Platform, giving teams a shared home for collaborating across workspaces with admin and member roles. Workspace management has also been enhanced with rename support and a unified Users tab for managing access.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces organizations to the Tenzir Platform, giving teams a shared home for collaborating across workspaces with admin and member roles. Workspace management has also been enhanced with rename support and a unified Users tab for managing access.</p>

<h2>Features</h2>

<h3>Workspace management improvements</h3>
<p><small>Apr 21, 2026 · <a href="https://github.com/lava">@lava</a>, <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>Workspace management has been enhanced with new capabilities for administrators. You can now rename workspaces directly from the workspace settings, and the Users tab now provides a unified interface for managing workspace access. Administrators can view all users with access to a workspace in a single table and easily change user roles between member and admin roles using dropdown controls.</p>

<h3>Organizations</h3>
<p><small>Apr 21, 2026 · <a href="https://github.com/lava">@lava</a>, <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>The Tenzir Platform now supports organizations, giving teams a shared home for collaborating across workspaces. Organization admins can invite members, assign admin or member roles, and manage which workspaces belong to the organization. Members get access to all workspaces owned by the organization and can leave from their user settings at any time.</p>
<p>Learn more in the <a href="https://docs.tenzir.com/guides/platform-management/manage-organizations/">organization management guide</a>.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.32.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-32-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-32-0"/>
        <updated>2026-04-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tenzir nodes now honor standard HTTP proxy environment variables when connecting to the Tenzir Platform, and hash functions produce correct checksums for binary values.]]></summary>
        <content type="html"><![CDATA[<p>Tenzir nodes now honor standard HTTP proxy environment variables when connecting to the Tenzir Platform, and hash functions produce correct checksums for binary values.</p>

<h2>Features</h2>

<h3>Platform websocket proxy support</h3>
<p><small>Apr 16, 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/6039">#6039</a></small></p>
<p>Tenzir nodes now honor standard HTTP proxy environment variables when connecting to Tenzir Platform:</p>
<pre><code class="language-sh">HTTPS_PROXY=http://proxy.example:3128 tenzir-node
</code></pre>
<p>Use <code>NO_PROXY</code> to bypass the proxy for selected hosts. This helps deployments where outbound connections to the Platform websocket gateway must go through an HTTP proxy.</p>

<h2>Changes</h2>

<h3>Add `accept_http` operator for receiving HTTP requests</h3>
<p><small>Apr 15, 2026 · <a href="https://github.com/lava">@lava</a></small></p>
<p>We added a new operator to accept data from incoming HTTP connections.</p>
<p>The <code>server</code> option of the <code>from_http</code> operator is now deprecated.
Going forward, it should only be used for client-mode HTTP operations,
and the new <code>accept_http</code> operator should be used for server-mode
operations.</p>

<h2>Bug Fixes</h2>

<h3>Raw-byte hashing for binary values</h3>
<p><small>Apr 16, 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/6022">#6022</a></small></p>
<p>The <code>hash_*</code> functions now hash <code>blob</code> values by their raw bytes. This makes checksums computed from binary data match external tools such as <code>md5sum</code> and <code>sha256sum</code>.</p>
<p>For example:</p>
<pre><code class="language-tql">from_file "trace.pcap" {
  read_all binary=true
}
md5 = data.hash_md5()
</code></pre>
<p>This is useful for verifying file contents and round-tripping binary formats without leaving TQL.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Test v1.7.6]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-test/v1-7-6</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-test/v1-7-6"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes misleading aggregate test summary percentages in the CLI. Runs with a small number of failures now report non-perfect pass and fail rates, so mixed outcomes no longer appear as `100%` passed and `0%` failed.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes misleading aggregate test summary percentages in the CLI. Runs with a small number of failures now report non-perfect pass and fail rates, so mixed outcomes no longer appear as <code>100%</code> passed and <code>0%</code> failed.</p>

<h2>Bug Fixes</h2>

<h3>Accurate aggregate pass and fail percentages</h3>
<p><small>Apr 16, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The final aggregate summary now reports non-perfect pass and fail percentages whenever at least one executed test fails. Previously, rounding could show <code>100%</code> passed and <code>0%</code> failed for runs with a small number of failures, even though the overall result was not a full success.</p>
<p>For example, a run like <code>586 passed / 1 failed / 152 skipped</code> now renders the executed-test percentages as <code>99%</code> passed and <code>1%</code> failed. This makes mixed outcomes easier to spot at a glance in the CLI output.</p>
]]></content>
        <category label="Tenzir Test"/>
        <published>2026-04-16T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.7.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-7-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-7-2"/>
        <updated>2026-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release removes the Node 20 deprecation warning from the reusable release workflow when it generates GitHub App tokens on GitHub-hosted runners. Repositories that call the shared release workflow now get clean release logs without extra configuration.]]></summary>
        <content type="html"><![CDATA[<p>This patch release removes the Node 20 deprecation warning from the reusable release workflow when it generates GitHub App tokens on GitHub-hosted runners. Repositories that call the shared release workflow now get clean release logs without extra configuration.</p>

<h2>Bug Fixes</h2>

<h3>Node 24 GitHub App tokens in reusable workflows</h3>
<p><small>Apr 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The reusable release workflow no longer emits the Node 20 deprecation warning when it generates GitHub App tokens on GitHub-hosted runners.</p>
<p>Repositories that call <code>tenzir/ship/.github/workflows/release.yaml</code> now get clean release logs without extra configuration.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-04-15T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.7.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-7-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-7-1"/>
        <updated>2026-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release updates locked Python dependencies to patched upstream versions and aligns generated release commits with `v`-prefixed tags. It keeps release publishing, local development, and CI installs on maintained versions without changing normal `tenzir-ship` usage.]]></summary>
        <content type="html"><![CDATA[<p>This release updates locked Python dependencies to patched upstream versions and aligns generated release commits with <code>v</code>-prefixed tags. It keeps release publishing, local development, and CI installs on maintained versions without changing normal <code>tenzir-ship</code> usage.</p>

<h2>Bug Fixes</h2>

<h3>Patched locked Python dependencies</h3>
<p><small>Apr 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The repository's locked Python dependencies now use patched upstream releases, including fixes for the open security advisories reported by Dependabot.</p>
<p>This refresh keeps local development and CI installs on maintained versions without changing normal <code>tenzir-ship</code> usage.</p>

<h3>Release commit messages matching v tags</h3>
<p><small>Apr 15, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>release publish --commit</code> workflow now uses the tag-form version in generated release commits and annotated tag messages.</p>
<p>For example, publishing <code>v1.1.0</code> now creates <code>Release v1.1.0</code> instead of <code>Release 1.1.0</code>:</p>
<pre><code class="language-sh">tenzir-ship release publish v1.1.0 --commit --tag --yes
</code></pre>
<p>This keeps generated release commits aligned with the corresponding Git tag and avoids mismatches in automation that expects the <code>v</code>-prefixed release identifier.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-04-15T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Node v5.31.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir/v5-31-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir/v5-31-0"/>
        <updated>2026-04-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tenzir now unifies live and retrospective context matching with the new `context::lookup` operator, and it adds pipeline names to diagnostics and metrics for easier operational correlation. This release also improves export reliability under load and fixes Azure transport errors, HTTP Host headers for non-standard ports, and rebuilt-partition export correctness.]]></summary>
        <content type="html"><![CDATA[<p>Tenzir now unifies live and retrospective context matching with the new <code>context::lookup</code> operator, and it adds pipeline names to diagnostics and metrics for easier operational correlation. This release also improves export reliability under load and fixes Azure transport errors, HTTP Host headers for non-standard ports, and rebuilt-partition export correctness.</p>

<h2>Features</h2>

<h3>Unified context lookups with `context::lookup` operator</h3>
<p><small>Apr 1, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a> · <a href="https://github.com/tenzir/tenzir/pull/5964">#5964</a></small></p>
<p>The <code>context::lookup</code> operator enables unified matching of events against contexts
by combining live and retrospective filtering in a single operation.</p>
<p>The operator automatically translates context updates into historical queries
while simultaneously filtering all newly ingested data against any context updates.</p>
<p>This provides:</p>
<ul>
<li><strong>Live matching</strong>: Filter incoming events through a context with <code>live=true</code></li>
<li><strong>Retrospective matching</strong>: Apply context updates to historical data with <code>retro=true</code></li>
<li><strong>Unified operation</strong>: Use both together (default) to match all events—new and historical</li>
</ul>
<p>Example usage:</p>
<pre><code class="language-tql">context::lookup "feodo", field=src_ip
where @name == "suricata.flow"
</code></pre>

<h3>Include pipeline names in diagnostics and metrics</h3>
<p><small>Mar 30, 2026 · <a href="https://github.com/IyeOnline">@IyeOnline</a>, <a href="https://github.com/claude">@claude</a> · <a href="https://github.com/tenzir/tenzir/pull/5959">#5959</a></small></p>
<p>The <code>metrics</code> and <code>diagnostics</code> operators now include a <code>pipeline_name</code> field.</p>
<p>Previously, output from these operators only identified the source pipeline by its ID.
Now the human-readable name is available too, making it straightforward to filter
or group results by pipeline name without needing to look up IDs separately.</p>
<p>Please keep in mind that pipeline names are not unique.</p>

<h2>Bug Fixes</h2>

<h3>Fix crash on Azure SSL/transport errors during read and write operations</h3>
<p><small>Apr 8, 2026 · <a href="https://github.com/claude">@claude</a></small></p>
<p>Bumped Apache Arrow from 23.0.0 to 23.0.1, which includes an upstream fix
for unhandled <code>Azure::Core::Http::TransportException</code> in Arrow's
<code>AzureFileSystem</code> methods. Previously, transport-level errors (e.g., SSL
certificate failures) could crash the node during file listing, reading, or
writing. Additionally, the direct Azure SDK calls in the blob deletion code
paths now catch <code>Azure::Core::RequestFailedException</code> (the common base of
both <code>StorageException</code> and <code>TransportException</code>) instead of listing
specific exception types.</p>

<h3>Reliable export for null rows in rebuilt partitions</h3>
<p><small>Apr 7, 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/5988">#5988</a></small></p>
<p>The <code>export</code> operator no longer emits partially populated events from rebuilt partitions when a row is null at the record level. Previously, some events could appear with most fields set to <code>null</code> while a few values, such as <code>event_type</code> or interface fields, were still present.</p>
<p>This makes exports from rebuilt data more reliable when investigating sparse or malformed-looking events.</p>

<h3>Fix HTTP Host header missing port for non-standard ports</h3>
<p><small>Mar 31, 2026</small></p>
<p>The <code>from_http</code> and <code>http</code> operators now include the port in the <code>Host</code> header
when the URL uses a non-standard port. Previously, the port was omitted, which
caused requests to fail with HTTP 403 when the server validates the <code>Host</code>
header against the full authority, such as for pre-signed URL signature
verification.</p>

<h3>Reliable recent exports during partition flushes</h3>
<p><small>Mar 30, 2026 · <a href="https://github.com/tobim">@tobim</a>, <a href="https://github.com/codex">@codex</a></small></p>
<p>The <code>export</code> command no longer fails or misses recent events when a node is flushing active partitions to disk under heavy load. Recent exports now keep the in-memory partitions they depend on alive until the snapshot completes, which preserves correctness for concurrent import and export workloads.</p>
]]></content>
        <category label="Tenzir Node"/>
        <published>2026-04-14T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.3]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-3</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-3"/>
        <updated>2026-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This patch release fixes an issue with the container build of the bundled seaweedFS image.]]></summary>
        <content type="html"><![CDATA[<p>This patch release fixes an issue with the container build of the bundled seaweedFS image.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.2]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-2</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-2"/>
        <updated>2026-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue where the pipeline table stayed filtered after navigating away from a pipeline's detail page. It adds thousands separators to numeric values in the Insights tab for better readability. It also updates dependencies to address security issues.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue where the pipeline table stayed filtered after navigating away from a pipeline's detail page. It adds thousands separators to numeric values in the Insights tab for better readability. It also updates dependencies to address security issues.</p>

<h2>Changes</h2>

<h3>Readable numbers in the Insights tab</h3>
<p><small>Apr 7, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added thousands separators to numeric values in the pipeline Insights tab, making large numbers easier to read at a glance.</p>

<h2>Bug Fixes</h2>

<h3>Fix pipeline table filter not clearing</h3>
<p><small>Apr 7, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where the pipeline table stayed filtered after viewing a pipeline's detail page and navigating away to another tab. Returning to the Pipelines page would show only the previously viewed pipeline, and clearing the search had no effect.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.7.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-7-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-7-0"/>
        <updated>2026-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The reusable release workflow now works out of the box in external repositories without requiring Tenzir-org-specific secrets.]]></summary>
        <content type="html"><![CDATA[<p>The reusable release workflow now works out of the box in external repositories without requiring Tenzir-org-specific secrets.</p>

<h2>Changes</h2>

<h3>Simplify reusable release workflow and decouple Tenzir org secrets</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>The reusable GitHub Actions release workflow now works in external repositories by default. It falls back to the caller repository's <code>GITHUB_TOKEN</code>, makes GitHub App authentication optional, and only enables GPG signing when a caller provides a signing key and opts into commit and/or tag signing. The single <code>release.yaml</code> workflow now also exposes the advanced hooks and release controls directly, including <code>skip-publish</code> for dry runs and smoke tests. Tenzir repositories can still opt into the existing bot identity, GitHub App token flow, and signed commits and tags by passing those settings explicitly.</p>
]]></content>
        <category label="Tenzir Ship"/>
        <published>2026-04-03T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.1]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-1</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-1"/>
        <updated>2026-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes an issue that prevented users from accessing the public Tenzir Platform instance at app.tenzir.com.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes an issue that prevented users from accessing the public Tenzir Platform instance at app.tenzir.com.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-02T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Platform v1.30.0]]></title>
        <id>https://docs.tenzir.com/changelog/platform/v1-30-0</id>
        <link href="https://docs.tenzir.com/changelog/platform/v1-30-0"/>
        <updated>2026-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a new Stream view in the Explorer that displays pipeline results as a continuous, expandable event list. It also adds a time range selector, sortable table columns, and copyable inspector values, alongside several bug fixes for package management and the library view.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a new Stream view in the Explorer that displays pipeline results as a continuous, expandable event list. It also adds a time range selector, sortable table columns, and copyable inspector values, alongside several bug fixes for package management and the library view.</p>

<h2>Features</h2>

<h3>Field selection in the table view</h3>
<p><small>Mar 27, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now choose which fields are visible in the Explorer's table view. When you select a schema in the sidebar, its fields are listed below. Click a field to hide its column from the table. Shift+click a field to show only that field. A "fields hidden" indicator in the table header lets you clear all hidden fields at once. Field selections are remembered per schema and reset when you run a new pipeline.</p>

<h3>Schema filtering in the Stream view</h3>
<p><small>Mar 26, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now filter events in the Stream view by clicking schemas in the sidebar. The schemas panel shows color-coded dots matching each schema's badge color, and selecting one or more schemas limits the view to only those events. Same-name schema variants are merged into a single entry in the sidebar for easier navigation.</p>

<h3>Stream view in the Explorer</h3>
<p><small>Mar 26, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We added a new Stream view to the Explorer that shows all pipeline results as a continuous list of expandable events. You can switch between the Table, Chart, and Stream views using the view selector in the toolbar. The Stream view displays events from all schemas together, with color-coded badges to distinguish between them. Each row shows a one-line preview that you can expand to inspect the full event. The view remembers your selection across pipeline runs, and the event list scrolls horizontally as a whole, with schema badges staying pinned on the left.</p>

<h3>Sortable columns in the Explorer table</h3>
<p><small>Mar 13, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now sort the Explorer table by clicking column headers. Sortable columns show a sort indicator, and clicking cycles through ascending, descending, and unsorted states. Sorting works for both top-level and nested fields.</p>

<h3>Copyable field names and values in the inspector</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now click on field names and values in the Explorer inspector to copy them to the clipboard. Field names copy the full dot-separated path, and values copy their TQL representation.</p>

<h3>Time range selector in the Explorer</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>You can now select a time range directly from the Explorer header. Choose from quick presets like 5 minutes or 12 hours, or open the custom popover to pick from a grid of relative durations or set an absolute date range. The selector is currently available for pipelines that start with the <code>export</code> operator.</p>

<h2>Changes</h2>

<h3>Unified package detail view in the library</h3>
<p><small>Mar 12, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We combined the 'About' and 'Install' tabs in the package detail drawer into a single scrollable view. Package information, examples, and configuration options are now shown on one page instead of requiring tab switches.</p>

<h2>Bug Fixes</h2>

<h3>Show custom packages in the library view</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed an issue where custom packages installed on a node were not visible in the library view. Previously, only packages from the official Tenzir library were shown. Custom packages are now included alongside library packages.</p>

<h3>Fix rotated text in package detail accordion</h3>
<p><small>Mar 24, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>We fixed a bug where operator description text on the package detail page appeared rotated 90 degrees, overlapping other content.</p>

<h3>Package installs for packages with user-defined operators</h3>
<p><small>Mar 17, 2026 · <a href="https://github.com/gitryder">@gitryder</a></small></p>
<p>Packages containing user-defined operators can again be installed through the
platform. Previously, installing such packages failed because the operator
arguments were serialized incorrectly. This only affected installs through the
platform UI—command-line package installs were not impacted.</p>
]]></content>
        <category label="Tenzir Platform"/>
        <published>2026-04-02T00:00:00.000Z</published>
    </entry>
    <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>
</feed>