<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.tenzir.com/changelog/tenzir-ship</id>
    <title>Tenzir Ship Changelog</title>
    <updated>2026-03-12T00: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/tenzir-ship"/>
    <link rel="self" href="https://docs.tenzir.com/changelog/tenzir-ship.xml"/>
    <subtitle>Release notes and changelog for Tenzir Ship</subtitle>
    <icon>https://docs.tenzir.com/favicon.svg</icon>
    <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>
        <published>2026-03-12T00: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>
        <published>2026-03-11T00: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>
        <published>2026-03-04T00: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>
        <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>
        <published>2026-02-28T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.1.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-1-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-1-2"/>
        <updated>2026-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes bugs in changelog entry processing and version detection. The `authors` field now correctly normalizes single string values, and the `show` command no longer misidentifies entry IDs as release versions.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes bugs in changelog entry processing and version detection. The <code>authors</code> field now correctly normalizes single string values, and the <code>show</code> command no longer misidentifies entry IDs as release versions.</p>

<h2>Bug Fixes</h2>

<h3>Fix overly broad version string detection in show command</h3>
<p><small>Jan 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>show</code> command no longer misidentifies changelog entry IDs as release versions. Previously, entries with IDs containing version-like patterns (e.g., <code>v1...</code>) were incorrectly treated as releases.</p>

<h3>Fix authors field normalization when using a single string value</h3>
<p><small>Jan 26, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Changelog entries with <code>authors: "name"</code> (a single string) are now correctly normalized to a list. Previously, only the singular <code>author</code> key was normalized, which could cause rendering issues when <code>authors</code> was used with a string value.</p>
]]></content>
        <published>2026-01-26T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.1.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-1-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-1-1"/>
        <updated>2026-01-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes two bugs: the multi-project `show` command now displays entries in consistent chronological order, and release recovery instructions show the actual branch name instead of a placeholder.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes two bugs: the multi-project <code>show</code> command now displays entries in consistent chronological order, and release recovery instructions show the actual branch name instead of a placeholder.</p>

<h2>Bug Fixes</h2>

<h3>Consistent entry ordering in multi-project show command</h3>
<p><small>Jan 22, 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/6">#6</a></small></p>
<p>The multi-project <code>show</code> command now displays changelog entries in chronological order, with the newest entry at the bottom of the table where users expect it. Previously, entries were sorted newest-first, which was inconsistent with single-project behavior and user expectations. This brings the multi-project display in line with the rest of the application's sorting behavior.</p>

<h3>Release recovery instructions show actual branch name</h3>
<p><small>Jan 22, 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/5">#5</a></small></p>
<p>When a release fails during the branch push step, the recovery instructions now
display the actual branch name instead of a placeholder:</p>
<pre><code>╭──────────────────── Release Progress (2/5) ────────────────────╮
│ ✔ git commit -m "Release v1.2.0"                               │
│ ✔ git tag -a v1.2.0 -m "Release v1.2.0"                        │
│ ✘ git push origin main:main                                    │
│ ○ git push origin v1.2.0                                       │
│ ○ gh release create v1.2.0 --repo tenzir/ship ...              │
╰────────────────────────────────────────────────────────────────╯
</code></pre>
<p>Previously, the failed step showed <code>git push origin &#x3C;branch>:&#x3C;branch></code> instead
of the actual branch name.</p>
]]></content>
        <published>2026-01-23T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.1.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-1-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-1-0"/>
        <updated>2026-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release improves the user experience when `release publish` encounters
failures mid-workflow. You now see a clear progress summary showing which steps
completed, which step failed, and what remains pending—making recovery
straightforward.]]></summary>
        <content type="html"><![CDATA[<p>This release improves the user experience when <code>release publish</code> encounters
failures mid-workflow. You now see a clear progress summary showing which steps
completed, which step failed, and what remains pending—making recovery
straightforward.</p>

<h2>Features</h2>

<h3>Progress tracking for release publish failures</h3>
<p><small>Jan 17, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>release publish</code> command now displays a progress summary when a step fails mid-workflow, showing which steps completed successfully and which step failed.</p>
<p>When using <code>--commit</code> or <code>--tag</code> flags, the publish workflow executes multiple git operations (commit, tag, push branch, push tag) before publishing to GitHub. If any step fails, you now see a panel with checkmarks for completed steps, an X for the failed step, and circles for pending steps. This helps you understand exactly where the workflow stopped and what manual commands you need to run to recover.</p>
<p>For example, if the branch push fails due to network issues, you'll see that the commit and tag were created successfully, the push failed, and the tag push and GitHub publish are still pending—making it clear you can safely retry after fixing the network issue.</p>
]]></content>
        <published>2026-01-17T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v1.0.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v1-0-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v1-0-0"/>
        <updated>2026-01-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This major release renames the package from `tenzir-changelog` to `tenzir-ship` and introduces several breaking changes to streamline the CLI interface. The `show` command now uses intuitive positional tokens (`unreleased`, `released`, `latest`, `all`) instead of flags, and the `release notes` command has been merged into `show --release`. A new `stats` command provides adaptive project statistics, and the table layout has been enhanced with better title formatting and inline component labels.]]></summary>
        <content type="html"><![CDATA[<p>This major release renames the package from <code>tenzir-changelog</code> to <code>tenzir-ship</code> and introduces several breaking changes to streamline the CLI interface. The <code>show</code> command now uses intuitive positional tokens (<code>unreleased</code>, <code>released</code>, <code>latest</code>, <code>all</code>) instead of flags, and the <code>release notes</code> command has been merged into <code>show --release</code>. A new <code>stats</code> command provides adaptive project statistics, and the table layout has been enhanced with better title formatting and inline component labels.</p>

<h2>Breaking Changes</h2>

<h3>Scope filtering flags replaced with positional tokens</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The show command now uses positional scope tokens instead of flags to filter entries. The <code>--all</code>, <code>--released</code>, <code>--unreleased</code>, and <code>--latest</code> flags have been removed in favor of cleaner positional identifiers.</p>
<p>Use <code>show unreleased</code>, <code>show released</code>, <code>show latest</code>, or <code>show all</code> to filter entries by scope. The <code>--release</code> flag now purely controls presentation (grouping and metadata display) rather than affecting which entries are shown.</p>
<p>This change provides clearer separation between <strong>what to show</strong> (scope) and <strong>how to show it</strong> (presentation), making the command interface more intuitive.</p>
<p><strong>Breaking change:</strong> <code>show --release</code> without identifiers now shows <strong>all</strong> entries grouped by release, whereas previously it defaulted to showing only the latest release. Use <code>show latest --release</code> to restore the previous behavior.</p>
<p><strong>Migration examples:</strong></p>
<ul>
<li><code>show --unreleased</code> → <code>show unreleased</code></li>
<li><code>show --released</code> → <code>show released</code></li>
<li><code>show --latest</code> → <code>show latest</code></li>
<li><code>show --all</code> → <code>show all</code> or just <code>show</code></li>
<li><code>show --release</code> → <code>show latest --release</code> (to get previous behavior)</li>
<li><code>show --release --latest</code> → <code>show latest --release</code></li>
</ul>

<h3>Package renamed from tenzir-changelog to tenzir-ship</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The project has been renamed from <code>tenzir-changelog</code> to <code>tenzir-ship</code>. This includes the package name, CLI command, Python module, and GitHub repository.</p>
<p><strong>Migration:</strong></p>
<pre><code class="language-bash"># Old
uvx tenzir-changelog add

# New
uvx tenzir-ship add
</code></pre>
<pre><code class="language-python"># Old
from tenzir_changelog import Changelog

# New
from tenzir_ship import Changelog
</code></pre>
<p>All command names remain unchanged (<code>add</code>, <code>show</code>, <code>validate</code>, <code>release</code>). The repository has moved from <code>tenzir/changelog</code> to <code>tenzir/ship</code>.</p>
<p>The old <code>tenzir-changelog</code> PyPI package will remain available for a transition period but will not receive further updates.</p>

<h3>Modules command replaced with global option</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>modules</code> command has been removed. Use the <code>--show-modules</code> global option instead to list discovered modules.</p>
<p>Migration:</p>
<pre><code class="language-bash"># Before
tenzir-changelog modules

# After
tenzir-changelog --show-modules
</code></pre>
<p>The PATH column now displays clean relative paths (for example, <code>plugins/brand/changelog</code>) instead of paths with <code>../</code> prefixes (for example, <code>../plugins/brand/changelog</code>).</p>

<h3>Unified show command replaces release notes</h3>
<p><small>Jan 7, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>release notes</code> command has been removed and replaced by the unified <code>show</code>
command with new <code>--release</code>, <code>--all</code>, and <code>--released-only</code> flags.</p>
<p>Previously, the CLI had two overlapping commands with different mental models:
<code>show</code> displayed entries in a flat list, while <code>release notes</code> formatted them
as release documents. This caused confusion because both produced similar JSON
output for single releases but had different defaults and use cases.</p>
<p>The new design follows a single principle: <strong>selection is always entry-centric,
and <code>--release</code> is a display modifier</strong>. Version identifiers like <code>v1.0.0</code> mean
"entries from release v1.0.0", and the <code>--release</code> flag changes how those
entries are presented—grouped by release with full metadata—rather than what
gets selected.</p>
<p><strong>Migration guide</strong>:</p>
<p>| Old command                   | New command                    |
| ----------------------------- | ------------------------------ |
| <code>release notes v1.0.0</code>        | <code>show v1.0.0 --release -m</code>     |
| <code>release notes v1.0.0 --json</code> | <code>show v1.0.0 --release --json</code> |
| <code>release notes -</code>             | <code>show --release -m</code>            |
| <code>release notes - --json</code>      | <code>show --release --json</code>        |</p>
<p><strong>New capabilities</strong>: The <code>--all</code> flag enables batch export of all releases in a
single invocation.</p>
<pre><code class="language-bash"># Export all releases as JSON (new)
tenzir-changelog show --all --release --json

# Export only released versions, excluding unreleased
tenzir-changelog show --all --release --released-only --json
</code></pre>
<p>This is particularly valuable for documentation sync scripts that previously
required invoking the tool once per release. With ~320 releases across 7
projects, the sync time drops from ~2 minutes to ~2-3 seconds.</p>
<p><strong>JSON output consistency</strong>: With <code>--release</code>, JSON output is always an array of
release objects, even for a single release. This ensures deterministic parsing
in scripts.</p>
<pre><code class="language-json">[
  {
    "version": "v1.0.0",
    "title": "Release Title",
    "intro": "Release introduction...",
    "entries": [...]
  }
]
</code></pre>
<p>Without <code>--release</code>, JSON remains a single object with a flat <code>entries</code> array.</p>

<h2>Features</h2>

<h3>Statistics command with adaptive view modes</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>stats</code> command replaces the <code>--stats</code> flag and automatically adapts its display based on project structure. For single projects, it shows a vertical card view with detailed statistics organized into sections (Project, Releases, Entry Types, Entry Status). For multi-module projects, it displays a compact table comparing all modules side-by-side.</p>
<p>The vertical view presents project metadata, release history with exponentially weighted cadence calculations, entry type distribution with percentages, and shipped vs unreleased counts. The table view uses emoji headers for consistent visual scanning across both formats.</p>
<p>Additional options include <code>--table</code> to force table view regardless of project structure, and <code>--json</code> to export structured data for programmatic consumption.</p>

<h2>Changes</h2>

<h3>Enhanced table layout for show command</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The title column now expands to fill available terminal width, ensuring optimal use of screen space. Component labels appear inline after the title in a dimmed green style, replacing the separate component column. The column order has been adjusted to show PR numbers before the entry type, and the column header changed from "PRs" to "PR". Empty PR values display as a dimmed dash for visual consistency.</p>

<h2>Bug Fixes</h2>

<h3>Markdown table formatting in release notes</h3>
<p><small>Jan 9, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Markdown tables in release notes and entry descriptions now render correctly. Previously, tables were collapsed into a single line because the <code>normalize_markdown()</code> function lacked GFM (GitHub Flavored Markdown) support.</p>
<p>The fix adds the <code>mdformat-gfm</code> plugin to enable proper table formatting. This ensures migration guides, comparison tables, and other tabular content display as intended in both CLI output and exported markdown files.</p>
]]></content>
        <published>2026-01-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.19.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-19-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-19-1"/>
        <updated>2026-01-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds initial release support with implicit version bumping and
fixes row numbering in multi-project views.]]></summary>
        <content type="html"><![CDATA[<p>This release adds initial release support with implicit version bumping and
fixes row numbering in multi-project views.</p>

<h2>Features</h2>

<h3>Implicit base version for initial releases</h3>
<p><small>Jan 4, 2026 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>When creating the first release, you can now use <code>--major</code>, <code>--minor</code>, or
<code>--patch</code> flags without an existing release. The tool uses an implicit <code>0.0.0</code>
as the base version:</p>
<ul>
<li><code>--major</code> creates <code>1.0.0</code></li>
<li><code>--minor</code> creates <code>0.1.0</code></li>
<li><code>--patch</code> creates <code>0.0.1</code></li>
</ul>
<p>Previously, these flags required at least one prior release, forcing users to
always specify an explicit version for their first release.</p>

<h2>Bug Fixes</h2>

<h3>Correct row numbering in multi-project view</h3>
<p><small>Dec 22, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Row numbers in multi-project table view now count down from the newest entry, matching single-project behavior. The <code>show -c &#x3C;row></code> command also resolves row numbers correctly against the displayed table.</p>
]]></content>
        <published>2026-01-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.19.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-19-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-19-0"/>
        <updated>2025-12-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds configuration options to disable automatic PR and author detection, giving projects more control over changelog entry metadata.]]></summary>
        <content type="html"><![CDATA[<p>This release adds configuration options to disable automatic PR and author detection, giving projects more control over changelog entry metadata.</p>

<h2>Features</h2>

<h3>Disable automatic PR and author detection</h3>
<p><small>Dec 30, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Add <code>omit_pr</code> and <code>omit_author</code> configuration options to prevent automatic inference of PR numbers and authors. When these config options are set to <code>true</code>, the <code>add</code> command will not auto-detect PR numbers from git branches or infer authors from git commits. If users explicitly provide <code>--pr</code> or <code>--author</code> flags while the corresponding omit option is enabled, a warning message is emitted and the value is ignored. This gives projects fine-grained control over changelog entry metadata.</p>
]]></content>
        <published>2025-12-30T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.18.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-18-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-18-2"/>
        <updated>2025-12-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds persistent configuration support for explicit link formatting, allowing projects to set a default link rendering style in `config.yaml` that applies across all commands.]]></summary>
        <content type="html"><![CDATA[<p>This release adds persistent configuration support for explicit link formatting, allowing projects to set a default link rendering style in <code>config.yaml</code> that applies across all commands.</p>

<h2>Changes</h2>

<h3>explicit_links configuration option</h3>
<p><small>Dec 24, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>explicit_links</code> option can now be configured in <code>config.yaml</code>, allowing consistent link formatting across all commands that render release notes and changelog entries.</p>
<p>Previously, the <code>--explicit-links</code> flag only worked with the <code>release create</code> command and had no persistent setting. Now you can set <code>explicit_links: true</code> in your project's <code>config.yaml</code> to enable explicit Markdown link rendering by default for all commands (<code>release create</code>, <code>release notes</code>, and <code>show</code>). Individual command invocations can still override the config default with <code>--explicit-links</code> or <code>--no-explicit-links</code> flags.</p>
<p>This ensures consistent output across commands without requiring repeated flag usage, improving the user experience for projects that always want explicit link rendering.</p>
]]></content>
        <published>2025-12-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.18.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-18-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-18-1"/>
        <updated>2025-12-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds explicit Markdown link conversion for GitHub references, enabling better compatibility with external documentation sites and Markdown renderers that don't automatically link @mentions and #PR references.]]></summary>
        <content type="html"><![CDATA[<p>This release adds explicit Markdown link conversion for GitHub references, enabling better compatibility with external documentation sites and Markdown renderers that don't automatically link @mentions and #PR references.</p>

<h2>Features</h2>

<h3>explicit-links flag for release create command</h3>
<p><small>Dec 24, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Add <code>--explicit-links</code> flag to the <code>release create</code> command to convert GitHub shorthand (@mentions and #PR references) into explicit Markdown links.</p>
<p>This flag enables exporting release notes to documentation sites or other Markdown renderers that don't automatically link GitHub references. To maintain consistency across the CLI, the option is now shared between <code>release create</code>, <code>release notes</code>, and <code>show</code> commands via dedicated option decorators.</p>
<p>The Python API's <code>Changelog.release_create()</code> method now accepts an <code>explicit_links</code> parameter to support this feature programmatically.</p>
]]></content>
        <published>2025-12-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.18.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-18-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-18-0"/>
        <updated>2025-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces a version-agnostic release workflow that simplifies publishing and CI integration, allowing commands to default to the latest release version. It also improves changelog browsing by sorting module entries chronologically rather than grouping them by project.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces a version-agnostic release workflow that simplifies publishing and CI integration, allowing commands to default to the latest release version. It also improves changelog browsing by sorting module entries chronologically rather than grouping them by project.</p>

<h2>Features</h2>

<h3>Version-agnostic release workflow with default version resolution</h3>
<p><small>Dec 21, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>release publish</code> command now accepts the version as an optional argument, defaulting to the latest released version when omitted. This makes it easier to publish the most recent release without explicitly specifying its version.</p>
<p>A new <code>release version</code> command prints the latest released version. The <code>--bare</code> flag strips the <code>v</code> prefix, making it convenient for version-agnostic workflows that need to reference the release version in scripts or CI/CD pipelines.</p>
<p>Additionally, release version validation has been strengthened to ensure semantic versioning compliance.</p>

<h2>Changes</h2>

<h3>Chronological sorting for module-based changelogs</h3>
<p><small>Dec 21, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>show</code> command now sorts entries by date across all modules, placing the latest entries at the bottom of the table. Previously, entries were grouped by project first, which scattered recent changes throughout the output based on module name order.</p>
]]></content>
        <published>2025-12-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.17.2]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-17-2</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-17-2"/>
        <updated>2025-12-21T00:00:00.000Z</updated>
        <content type="html"><![CDATA[
<h2>Bug Fixes</h2>

<h3>Remove H1 heading from release notes markdown</h3>
<p><small>Dec 21, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Release notes no longer include an H1 heading in the markdown content. GitHub already displays the release title as a page header, so having it inside the notes caused duplication.</p>
]]></content>
        <published>2025-12-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.17.1]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-17-1</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-17-1"/>
        <updated>2025-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release fixes a critical bug where status messages were written to stdout instead of stderr, breaking GitHub workflows and scripts that capture version output from commands like `release create`.]]></summary>
        <content type="html"><![CDATA[<p>This release fixes a critical bug where status messages were written to stdout instead of stderr, breaking GitHub workflows and scripts that capture version output from commands like <code>release create</code>.</p>

<h2>Bug Fixes</h2>

<h3>Correct output stream for status messages</h3>
<p><small>Dec 21, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Status messages now emit to stderr, allowing scripts to capture machine output from stdout without ANSI-colored status lines interfering.</p>
<p>Previously, commands like <code>release create</code> wrote both status messages and the version string to stdout, breaking workflows that capture output via <code>VERSION=$(uvx tenzir-changelog release create ...)</code>.</p>
]]></content>
        <published>2025-12-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.17.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-17-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-17-0"/>
        <updated>2025-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release enhances shell scripting capabilities by making `release create` output the version to stdout. All Rich UI elements now go to stderr, enabling clean machine-readable results for automation workflows.]]></summary>
        <content type="html"><![CDATA[<p>This release enhances shell scripting capabilities by making <code>release create</code> output the version to stdout. All Rich UI elements now go to stderr, enabling clean machine-readable results for automation workflows.</p>

<h2>Features</h2>

<h3>Machine-readable version output from release create</h3>
<p><small>Dec 19, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>release create</code> command now outputs the created version to stdout, enabling shell scripting patterns like <code>VERSION=$(tenzir-changelog release create --minor --yes)</code>. All Rich output (tables, panels) now goes to stderr, keeping stdout clean for machine-readable results.</p>
]]></content>
        <published>2025-12-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.16.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-16-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-16-0"/>
        <updated>2025-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release introduces aggregated module changelog summaries in release notes, allowing parent projects to automatically include a summary of changes from their modules. It also fixes a minor issue with redundant version fields in JSON output.]]></summary>
        <content type="html"><![CDATA[<p>This release introduces aggregated module changelog summaries in release notes, allowing parent projects to automatically include a summary of changes from their modules. It also fixes a minor issue with redundant version fields in JSON output.</p>

<h2>Features</h2>

<h3>Aggregated module changelog summaries in release notes</h3>
<p><small>Dec 19, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>For projects with modules, parent releases now automatically include a summary
of module changes. Each parent release manifest records the module versions at
release time, enabling incremental tracking—subsequent releases only show new
module entries since the previous parent release.</p>
<p>Module summaries appear after the main changelog, separated by a horizontal
rule. Each module section shows its version and lists entries in compact format:
emoji prefix, title, and byline.</p>

<h2>Bug Fixes</h2>

<h3>Remove redundant version field from JSON entry objects</h3>
<p><small>Dec 19, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The JSON output of <code>release notes --json</code> previously included a redundant <code>version</code> field in each entry object. Since all entries in a release share the same version as the top-level manifest version, this duplication was unnecessary. The <code>version</code> field has been removed from individual entries, with the version information now available only at the top level of the JSON payload.</p>
]]></content>
        <published>2025-12-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.15.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-15-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-15-0"/>
        <updated>2025-12-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds new options to the `release publish` command for more flexible release automation. You can now prevent GitHub from marking a release as latest with `--no-latest` (useful for backport releases), and automatically commit staged changes before tagging with `--commit`.]]></summary>
        <content type="html"><![CDATA[<p>This release adds new options to the <code>release publish</code> command for more flexible release automation. You can now prevent GitHub from marking a release as latest with <code>--no-latest</code> (useful for backport releases), and automatically commit staged changes before tagging with <code>--commit</code>.</p>

<h2>Features</h2>

<h3>New `--no-latest` and `--commit` options for release publishing</h3>
<p><small>Dec 18, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>The <code>release publish</code> command now supports two new options for smoother release
automation:</p>
<ul>
<li><code>--no-latest</code> prevents GitHub from marking the release as latest, useful for
backport releases to older branches</li>
<li><code>--commit</code> commits staged changes before creating the tag, eliminating a
manual step in release workflows. The commit message defaults to
<code>Release {version}</code> but can be customized via <code>--commit-message</code> or the
<code>release.commit_message</code> config option.</li>
</ul>
]]></content>
        <published>2025-12-18T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tenzir Ship v0.14.0]]></title>
        <id>https://docs.tenzir.com/changelog/tenzir-ship/v0-14-0</id>
        <link href="https://docs.tenzir.com/changelog/tenzir-ship/v0-14-0"/>
        <updated>2025-12-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This release adds H1 headings to release notes output, making documents more structured and easier to navigate.]]></summary>
        <content type="html"><![CDATA[<p>This release adds H1 headings to release notes output, making documents more structured and easier to navigate.</p>

<h2>Features</h2>

<h3>H1 heading in release notes based on manifest title</h3>
<p><small>Dec 17, 2025 · <a href="https://github.com/mavam">@mavam</a>, <a href="https://github.com/claude">@claude</a></small></p>
<p>Release notes now include an H1 heading at the top of the document. The heading is derived from the manifest <code>title</code> field:</p>
<ul>
<li><strong>Custom title</strong>: If a title is set and differs from the default format, it's used directly (e.g., <code># Big Release</code>)</li>
<li><strong>Default</strong>: Otherwise, the heading uses <code>{project_name} {version}</code> (e.g., <code># Tenzir Changelog v1.0.0</code>)</li>
</ul>
<p>This applies to all release notes generation: <code>notes.md</code> files created during releases, the <code>release notes</code> command output, and markdown exports via <code>show --markdown</code>.</p>
]]></content>
        <published>2025-12-17T00:00:00.000Z</published>
    </entry>
</feed>