<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chainsaw: guides, teardowns and changelog</title>
    <link>https://chain305.com/</link>
    <atom:link href="https://chain305.com/rss.xml" rel="self" type="application/rss+xml" />
    <description>Guides, comparisons and attack teardowns from Chain305, plus releases of Chainsaw, the package firewall.</description>
    <language>en</language>
    <lastBuildDate>Mon, 02 Nov 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>Install script attacks: postinstall, setup.py and build.rs</title>
      <link>https://chain305.com/learn/install-script-attacks/</link>
      <guid isPermaLink="true">https://chain305.com/learn/install-script-attacks/</guid>
      <pubDate>Mon, 02 Nov 2026 12:00:00 GMT</pubDate>
      <description>How npm, PyPI, Cargo and Composer run code at install time, the 2026 attacks that abused each hook, which settings help, and what those settings miss.</description>
    </item>
    <item>
      <title>Maintainer account takeover: hijacked releases and defences</title>
      <link>https://chain305.com/learn/maintainer-account-takeover/</link>
      <guid isPermaLink="true">https://chain305.com/learn/maintainer-account-takeover/</guid>
      <pubDate>Mon, 02 Nov 2026 12:00:00 GMT</pubDate>
      <description>How attackers publish malicious versions from hijacked accounts, stolen tokens and trusted publishing, the signals that give them away, and how a hold helps.</description>
    </item>
    <item>
      <title>pgserve npm compromise teardown: the CanisterSprawl worm</title>
      <link>https://chain305.com/teardowns/pgserve-canistersprawl-npm/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/pgserve-canistersprawl-npm/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>How pgserve 1.1.11 to 1.1.14 shipped a postinstall stealer that republished itself with stolen npm tokens, and whether Chainsaw refuses it on day 0.</description>
    </item>
    <item>
      <title>@velora-dex/sdk npm compromise teardown: macOS RAT on import</title>
      <link>https://chain305.com/teardowns/velora-dex-sdk-npm-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/velora-dex-sdk-npm-compromise/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>How @velora-dex/sdk 9.4.1 piped a base64 command to bash on import to plant a macOS backdoor, and whether Chainsaw refuses it on first download, on day 0.</description>
    </item>
    <item>
      <title>durabletask PyPI compromise teardown: a dropper on import</title>
      <link>https://chain305.com/teardowns/durabletask-pypi-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/durabletask-pypi-compromise/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>How malicious durabletask 1.4.1 to 1.4.3 reached PyPI, what the Linux dropper fetched and ran on import, and whether Chainsaw refuses them on day 0.</description>
    </item>
    <item>
      <title>laravel-lang tag rewrite teardown: old versions, new code</title>
      <link>https://chain305.com/teardowns/laravel-lang-tag-rewrite/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/laravel-lang-tag-rewrite/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>How the existing tags of four laravel-lang Composer packages were re-pointed at a credential stealer on 22 May 2026, and whether Chainsaw refuses it on day 0.</description>
    </item>
    <item>
      <title>onering crates.io teardown: a build.rs that leaked code</title>
      <link>https://chain305.com/teardowns/onering-crates-build-script/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/onering-crates-build-script/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>How malicious onering 1.4.1 reached crates.io, how its build.rs sent each build's latest commit and diff to Sentry, and whether Chainsaw refuses it on day 0.</description>
    </item>
    <item>
      <title>DepGate vs Chainsaw: two self-hosted package firewalls</title>
      <link>https://chain305.com/vs-depgate/</link>
      <guid isPermaLink="true">https://chain305.com/vs-depgate/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>DepGate is an MIT-licensed, self-hosted dependency gateway for 8 ecosystems. Where it is stronger, where Chainsaw differs, and how to test both on your code.</description>
    </item>
    <item>
      <title>Endor Labs vs Chainsaw: AppSec platform or open firewall</title>
      <link>https://chain305.com/vs-endor-labs/</link>
      <guid isPermaLink="true">https://chain305.com/vs-endor-labs/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>Endor Labs Package Firewall and Chainsaw both refuse bad packages at install. Where Endor is stronger, where Chainsaw differs, and how to test both yourself.</description>
    </item>
    <item>
      <title>Aikido Safe Chain vs Chainsaw: free install guards compared</title>
      <link>https://chain305.com/vs-aikido-safe-chain/</link>
      <guid isPermaLink="true">https://chain305.com/vs-aikido-safe-chain/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>Aikido Safe Chain and Chainsaw both block malicious npm and PyPI installs free, with no account. Where Safe Chain is stronger and where Chainsaw goes further.</description>
    </item>
    <item>
      <title>SafeDep PMG vs Chainsaw: local guard or team registry proxy</title>
      <link>https://chain305.com/vs-safedep-pmg/</link>
      <guid isPermaLink="true">https://chain305.com/vs-safedep-pmg/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>SafeDep PMG and Chainsaw block malicious packages at install. Where PMG is stronger, including its sandbox, where Chainsaw differs, and how to test both.</description>
    </item>
    <item>
      <title>Bytesafe vs Chainsaw: EU dependency firewall or open engine</title>
      <link>https://chain305.com/vs-bytesafe/</link>
      <guid isPermaLink="true">https://chain305.com/vs-bytesafe/</guid>
      <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
      <description>Bytesafe and Chainsaw both refuse risky packages on the install path. Where Bytesafe is stronger, where Chainsaw differs, and how to test both side by side.</description>
    </item>
    <item>
      <title>Telnyx PyPI compromise teardown: a stealer in a WAV file</title>
      <link>https://chain305.com/teardowns/telnyx-pypi-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/telnyx-pypi-compromise/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How malicious telnyx 4.87.1 and 4.87.2 reached PyPI, what the stealer hidden in a WAV file took on import, and whether Chainsaw refuses them on day 0.</description>
    </item>
    <item>
      <title>node-ipc npm compromise teardown: an expired email domain</title>
      <link>https://chain305.com/teardowns/node-ipc-expired-domain/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/node-ipc-expired-domain/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How an expired email domain likely handed a dormant node-ipc co-maintainer account to an attacker, what the DNS stealer took, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>Miasma npm worm teardown: Red Hat, binding.gyp and AsyncAPI</title>
      <link>https://chain305.com/teardowns/miasma-npm-worm/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/miasma-npm-worm/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How the Miasma worm hit 32 @redhat-cloud-services packages, ran through binding.gyp and then AsyncAPI imports, and whether Chainsaw would have stopped it.</description>
    </item>
    <item>
      <title>Mastra npm compromise teardown: a phished maintainer token</title>
      <link>https://chain305.com/teardowns/mastra-npm-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/mastra-npm-compromise/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How 140+ Mastra npm packages gained an easy-day-js dependency whose install script dropped a remote-access tool, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>SAP CAP npm compromise teardown: Mini Shai-Hulud wave 1</title>
      <link>https://chain305.com/teardowns/sap-cap-npm-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/sap-cap-npm-compromise/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How four SAP CAP and mbt npm versions were published with a stolen token and a hijacked workflow, what the Bun payload stole, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>How to block malicious PyPI packages with pip, uv and Poetry</title>
      <link>https://chain305.com/learn/block-malicious-pypi-packages/</link>
      <guid isPermaLink="true">https://chain305.com/learn/block-malicious-pypi-packages/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>The pip, uv and Poetry settings that stop most malicious PyPI packages: wheels only, hashes, release-age cutoffs, index order, and where a firewall fits.</description>
    </item>
    <item>
      <title>Dependency confusion: how it works and how to prevent it</title>
      <link>https://chain305.com/learn/dependency-confusion/</link>
      <guid isPermaLink="true">https://chain305.com/learn/dependency-confusion/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>Dependency confusion is a public package taking the place of your private one. How it works in npm, pip, Maven and NuGet, real cases, and the fixes.</description>
    </item>
    <item>
      <title>Maven, Go and Cargo settings against malicious packages</title>
      <link>https://chain305.com/learn/maven-go-cargo-package-security/</link>
      <guid isPermaLink="true">https://chain305.com/learn/maven-go-cargo-package-security/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>Maven mirrors and checksums, Go checksum database and GOPRIVATE, Cargo.lock and source replacement: what each setting stops and where a firewall fits.</description>
    </item>
    <item>
      <title>Sonatype Repository Firewall alternatives, compared</title>
      <link>https://chain305.com/sonatype-repository-firewall-alternative/</link>
      <guid isPermaLink="true">https://chain305.com/sonatype-repository-firewall-alternative/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>When Sonatype Repository Firewall fits, why teams look elsewhere, which alternatives block packages at install time, and how Chainsaw differs from it.</description>
    </item>
    <item>
      <title>LiteLLM PyPI compromise teardown: stolen token, .pth file</title>
      <link>https://chain305.com/teardowns/litellm-pypi-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/litellm-pypi-compromise/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How malicious litellm 1.82.7 and 1.82.8 reached PyPI with a token stolen via Trivy, what the payload stole at Python startup, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>Bitwarden CLI npm compromise teardown: a hijacked publish</title>
      <link>https://chain305.com/teardowns/bitwarden-cli-npm-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/bitwarden-cli-npm-compromise/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How a malicious @bitwarden/cli 2026.4.0 reached npm through Bitwarden's own CI, what its Bun-staged stealer took, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>Trivy tag hijack teardown: force-pushed tags and CI secrets</title>
      <link>https://chain305.com/teardowns/trivy-tag-hijack/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/trivy-tag-hijack/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How a malicious Trivy 0.69.4 and force-pushed trivy-action tags stole CI secrets from runner memory, and where Chainsaw would have stopped it.</description>
    </item>
    <item>
      <title>GlassWorm teardown: malware hidden in invisible Unicode</title>
      <link>https://chain305.com/teardowns/glassworm-hidden-unicode/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/glassworm-hidden-unicode/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How GlassWorm hid code in invisible Unicode variation selectors across npm, GitHub and VS Code, how the loader decodes it, and what Chainsaw stops.</description>
    </item>
    <item>
      <title>arrayref and proc-macro1 teardown: a crates.io typosquat</title>
      <link>https://chain305.com/teardowns/proc-macro1-crates-typosquat/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/proc-macro1-crates-typosquat/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>How a likely compromised account added the typosquat proc-macro1 to arrayref and two other crates, what its build.rs ran, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>2026 supply-chain attacks vs Chainsaw: 58 attacks tested</title>
      <link>https://chain305.com/attack-coverage-2026/</link>
      <guid isPermaLink="true">https://chain305.com/attack-coverage-2026/</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>We tested 58 public 2026 supply-chain attacks against production Chainsaw: 33 fully covered, 26 of them by default, 16 not stopped, every row listed.</description>
    </item>
    <item>
      <title>Axios npm compromise teardown: a hijacked maintainer account</title>
      <link>https://chain305.com/teardowns/axios-npm-compromise/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/axios-npm-compromise/</guid>
      <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
      <description>How malicious axios 1.14.1 and 0.30.4 were published from a hijacked maintainer account, what the dropper installed, and whether Chainsaw stops it.</description>
    </item>
    <item>
      <title>Learn package security: guides, comparisons, teardowns</title>
      <link>https://chain305.com/learn/</link>
      <guid isPermaLink="true">https://chain305.com/learn/</guid>
      <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
      <description>Guides to stopping malicious packages at install time: package firewalls, npm settings, typosquatting, slopsquatting, comparisons and real attack teardowns.</description>
    </item>
    <item>
      <title>How to block malicious npm packages with npm settings</title>
      <link>https://chain305.com/learn/block-malicious-npm-packages/</link>
      <guid isPermaLink="true">https://chain305.com/learn/block-malicious-npm-packages/</guid>
      <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
      <description>The npm settings that stop most malicious packages: ignore-scripts, min-release-age, npm ci, scoped registries and signatures, and where a firewall fits.</description>
    </item>
    <item>
      <title>Typosquatting: lookalike package names and how to catch them</title>
      <link>https://chain305.com/learn/typosquatting/</link>
      <guid isPermaLink="true">https://chain305.com/learn/typosquatting/</guid>
      <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
      <description>Typosquatting is publishing malware under a name close to a popular package. Real cases, the patterns attackers use, and how detection catches them.</description>
    </item>
    <item>
      <title>GitHub package firewall vs Chainsaw: npm firewall compared</title>
      <link>https://chain305.com/vs-github-package-firewall/</link>
      <guid isPermaLink="true">https://chain305.com/vs-github-package-firewall/</guid>
      <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
      <description>GitHub package firewall is an npm proxy for GitHub Enterprise Cloud, in preview. What it checks, where it is stronger, and where Chainsaw differs.</description>
    </item>
    <item>
      <title>Socket vs Chainsaw: two install-time package firewalls</title>
      <link>https://chain305.com/vs-socket/</link>
      <guid isPermaLink="true">https://chain305.com/vs-socket/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>Socket and Chainsaw both block malicious packages at install time. Where Socket is stronger, where Chainsaw differs, and how to test both on your own code.</description>
    </item>
    <item>
      <title>What is a package firewall? Install-time blocking explained</title>
      <link>https://chain305.com/what-is-a-package-firewall/</link>
      <guid isPermaLink="true">https://chain305.com/what-is-a-package-firewall/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>A package firewall decides on every npm, pip or Maven install whether the package may download. How it works, what it catches, and how it differs from SCA.</description>
    </item>
    <item>
      <title>What is slopsquatting? How to stop AI-invented package names</title>
      <link>https://chain305.com/slopsquatting/</link>
      <guid isPermaLink="true">https://chain305.com/slopsquatting/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>Slopsquatting is registering malware under package names that AI coding tools invent. How often models invent names, and how to refuse them at install time.</description>
    </item>
    <item>
      <title>JFrog Curation alternatives: install-time package blocking</title>
      <link>https://chain305.com/jfrog-curation-alternative/</link>
      <guid isPermaLink="true">https://chain305.com/jfrog-curation-alternative/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>When JFrog Curation fits and when teams look elsewhere: the alternatives that block packages at install time, and how Chainsaw differs from Curation.</description>
    </item>
    <item>
      <title>Self-hosted package firewall: on-prem and air-gapped setup</title>
      <link>https://chain305.com/self-hosted-package-firewall/</link>
      <guid isPermaLink="true">https://chain305.com/self-hosted-package-firewall/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>Why teams run a package firewall on their own infrastructure, what a self-hosted or air-gapped one must do, and how Chainsaw runs in your VPC or offline.</description>
    </item>
    <item>
      <title>Mini Shai-Hulud teardown: the TanStack npm compromise</title>
      <link>https://chain305.com/teardowns/mini-shai-hulud-tanstack/</link>
      <guid isPermaLink="true">https://chain305.com/teardowns/mini-shai-hulud-tanstack/</guid>
      <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
      <description>How 84 malicious @tanstack versions were published through hijacked trusted publishing, what the payload stole, and whether Chainsaw would have stopped it.</description>
    </item>
    <item>
      <title>v0.22.127: Four ways to fetch a download past enforcement are closed</title>
      <link>https://chain305.com/changelog/#2026-10-23-four-ways-to-fetch-a-download-past-enforcement-are-closed</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-23-four-ways-to-fetch-a-download-past-enforcement-are-closed</guid>
      <pubDate>Fri, 23 Oct 2026 12:00:00 GMT</pubDate>
      <category>Security</category>
      <description>A Range header sent RubyGems and Hugging Face downloads straight upstream, before policy and the malware check; ranged requests now take the same path as plain ones. Composer, CocoaPods and pub download paths must now match a URL the package's own metadata declares, so a hand-built path can no longer fetch one thing while another is judged. Legacy single-name Hugging Face ids and artifact-shaped paths that name no package are judged or refused. Policy exceptions now expire in every org, not only the default one.</description>
    </item>
    <item>
      <title>v0.22.123: A seeded rule for known-exploited vulnerabilities</title>
      <link>https://chain305.com/changelog/#2026-10-22-a-seeded-rule-for-known-exploited-vulnerabilities</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-22-a-seeded-rule-for-known-exploited-vulnerabilities</guid>
      <pubDate>Thu, 22 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>New organizations get a seeded rule that refuses any package carrying a CVE in the CISA Known Exploited Vulnerabilities catalog; existing organizations add it themselves. It applies at any CVSS score, and policies gain an inKev condition. The catalog ships in the image. With no catalog loaded the rule fails closed and refuses every package carrying an advisory. A quarantined version can now be released, and quarantining one needs the repository-manage permission.</description>
    </item>
    <item>
      <title>v0.22.122: Accept an existing vulnerable backlog in one step</title>
      <link>https://chain305.com/changelog/#2026-10-21-accept-an-existing-vulnerable-backlog-in-one-step</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-21-accept-an-existing-vulnerable-backlog-in-one-step</guid>
      <pubDate>Wed, 21 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>The exception baseline takes a vulnerability rule and creates one exception per repository, package and version it matches today, each expiring on a per-severity deadline, so turning on a CVE block rule does not break every build on day one. It is a dry run unless you say otherwise. Baseline exceptions never cover a package that is, or later becomes, known-malicious. Malware refusals now also say what matched, such as npm's security placeholder versions.</description>
    </item>
    <item>
      <title>v0.22.119: Helm chart for self-hosted installs</title>
      <link>https://chain305.com/changelog/#2026-10-19-helm-chart-for-self-hosted-installs</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-19-helm-chart-for-self-hosted-installs</guid>
      <pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Chainsaw now has a Helm chart, published at oci://registry-1.docker.io/chain305/chainsaw, with a single-node profile and a high-availability profile (Postgres leader election, S3 blob store, Redis). It never renders a Secret from values, and it includes a backup CronJob, a weekly restore check into a throwaway Postgres and, from chart 0.1.2, encrypted backups. A generic image flavour has no chain305.com URLs or keys baked in.</description>
    </item>
    <item>
      <title>v0.22.119: Fewer false typosquat blocks in the install guard</title>
      <link>https://chain305.com/changelog/#2026-10-19-fewer-false-typosquat-blocks-in-the-install-guard</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-19-fewer-false-typosquat-blocks-in-the-install-guard</guid>
      <pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>The offline guard now clears long-established packages before its name-similarity check, so npm install pug no longer blocks. The server uses the same clear rules from v0.22.120. On a 10,428-package inventory, false blocks fell from 28 to 13 and warnings from 345 to 88, with the malware lane unchanged. CHAINSAW_GUARD_MODE=monitor makes typosquat verdicts non-blocking while malware and homoglyph blocks stay on.</description>
    </item>
    <item>
      <title>v0.22.111: pr-scan blocks risky workflow changes a pull request adds</title>
      <link>https://chain305.com/changelog/#2026-10-17-pr-scan-blocks-risky-workflow-changes-a-pull-request-adds</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-17-pr-scan-blocks-risky-workflow-changes-a-pull-request-adds</guid>
      <pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>From v0.22.108 to v0.22.111, with the Guard Action in block mode, pr-scan fails a pull request that adds a step decoding a payload into a shell, a pull_request_target workflow that runs the PR's code, a comment trigger with no author check, a VS Code task that runs when the folder opens, or a third-party action referenced by tag or branch instead of a commit SHA. Only findings the pull request introduces count, so an existing repository does not fail on what it already has.</description>
    </item>
    <item>
      <title>v0.22.107: Default block rule for import-time execution</title>
      <link>https://chain305.com/changelog/#2026-10-17-default-block-rule-for-import-time-execution</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-17-default-block-rule-for-import-time-execution</guid>
      <pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>A new seeded rule refuses a package whose code runs a downloaded or decoded payload as soon as it is imported, required or loaded, with no install hook (npm, PyPI, Composer, RubyGems). On release it refused 0 of 860 top npm and PyPI packages. Orgs on chain305.com have it. Self-hosted orgs created before this release need to add it from configs/seed.yaml.</description>
    </item>
    <item>
      <title>v0.22.103: A monitor rule no longer switches off a block rule after it</title>
      <link>https://chain305.com/changelog/#2026-10-17-a-monitor-rule-no-longer-switches-off-a-block-rule-after-it</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-17-a-monitor-rule-no-longer-switches-off-a-block-rule-after-it</guid>
      <pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate>
      <category>Fixed</category>
      <description>Policy evaluation stopped at the first matching rule, even a monitor rule, so the seeded rule that monitors versions under 10 days old hid the hidden-Unicode and typosquat block rules ranked after it, for exactly the young versions an attack ships. A monitor match now records and evaluation continues.</description>
    </item>
    <item>
      <title>v0.22.100: Policy on git, URL and other non-registry sources</title>
      <link>https://chain305.com/changelog/#2026-10-16-policy-on-git-url-and-other-non-registry-sources</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-16-policy-on-git-url-and-other-non-registry-sources</guid>
      <pubDate>Fri, 16 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>The install guard and pr-scan now tell policy when a package comes from outside the public registry, whether it is pinned to a full commit SHA or content hash, and where it comes from. A tested two-rule recipe refuses unpinned sources and sources off an allow-list, or reports them in monitor mode. The lockfile scan also flags dependency-confusion risk: a package taken from an undeclared host, with no hash, whose name also exists on the public registry.</description>
    </item>
    <item>
      <title>v0.22.99: Release hold for Composer, and a longer hold on risky npm changes</title>
      <link>https://chain305.com/changelog/#2026-10-16-release-hold-for-composer-and-a-longer-hold-on-risky-npm-cha</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-16-release-hold-for-composer-and-a-longer-hold-on-risky-npm-cha</guid>
      <pubDate>Fri, 16 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>The release-age hold now covers Composer, so composer update resolves to a version that is old enough. An npm version that first gains an install script, or grows more than 20 times in unpacked size, is held longer. A Composer version older than 7 days whose tag is re-pointed to a different commit keeps the cached copy, and binding.gyp is treated as the install hook npm runs.</description>
    </item>
    <item>
      <title>v0.22.97: Registry mirrors judged by content hash</title>
      <link>https://chain305.com/changelog/#2026-10-15-registry-mirrors-judged-by-content-hash</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-15-registry-mirrors-judged-by-content-hash</guid>
      <pubDate>Thu, 15 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>A Cargo.lock package pulled through Artifactory, Nexus or another mirror used to read as unknown. The lockfile scan now compares its checksum with the public release: a match is scored as the public package, a mismatch is flagged high as tampering or dependency confusion. Orgs declare their mirror hosts in settings.</description>
    </item>
    <item>
      <title>v0.22.84: 48-hour release-age hold on by default for npm and PyPI</title>
      <link>https://chain305.com/changelog/#2026-10-10-48-hour-release-age-hold-on-by-default-for-npm-and-pypi</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-10-48-hour-release-age-hold-on-by-default-for-npm-and-pypi</guid>
      <pubDate>Sat, 10 Oct 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>For every org that has not set its own hold, the proxy now hides npm and PyPI versions published less than 48 hours ago, so version ranges resolve to the newest older version instead of breaking the build. A lockfile pin to a held version is refused with a message naming the newest allowed version. A version that fixes an advisory affecting the newest allowed one is released straight away. Opt out per org with release_min_age_hours: 0.</description>
    </item>
    <item>
      <title>v0.22.72: One command installs the CLI and turns the guard on</title>
      <link>https://chain305.com/changelog/#2026-10-06-one-command-installs-the-cli-and-turns-the-guard-on</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-06-one-command-installs-the-cli-and-turns-the-guard-on</guid>
      <pubDate>Tue, 06 Oct 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>install.sh and install.ps1 now run chainsaw guard init --install after installing, so the install guard is active without a second step. It is skipped when CHAINSAW_NO_GUARD or CI is set, and a guard failure never fails the install. On Windows, if the execution policy stops profiles loading, the installer says the guard is not active and prints the command to fix it, without changing the policy itself.</description>
    </item>
    <item>
      <title>v0.22.69: Per-seat Team plan replaces the flat Pro plan</title>
      <link>https://chain305.com/changelog/#2026-10-05-per-seat-team-plan-replaces-the-flat-pro-plan</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-10-05-per-seat-team-plan-replaces-the-flat-pro-plan</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>Team costs $25 per seat per month, or $240 per seat per year, for 5 to 100 seats. A seat is an org member; CI and service tokens are not counted. Storage and bandwidth are fair use with no overage charge. Enterprise starts from $24,000 a year.</description>
    </item>
    <item>
      <title>v0.22.55: Signed apt and yum/dnf indexes, with keys in your KMS</title>
      <link>https://chain305.com/changelog/#2026-09-29-signed-apt-and-yum-dnf-indexes-with-keys-in-your-kms</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-09-29-signed-apt-and-yum-dnf-indexes-with-keys-in-your-kms</guid>
      <pubDate>Tue, 29 Sep 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Hosted apt and yum/dnf repositories can now serve signed indexes, verified with apt-get update and dnf makecache. On the enterprise build, the signing key and the attestation key can live in AWS, Google Cloud or Azure KMS or in HashiCorp Vault, and never leave it. Vault was tested end to end; the three cloud providers are unit-tested. Signing fails closed: no signature, no index.</description>
    </item>
    <item>
      <title>v0.21.25: SIEM delivery to Elastic and OpenSearch</title>
      <link>https://chain305.com/changelog/#2026-09-13-siem-delivery-to-elastic-and-opensearch</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-09-13-siem-delivery-to-elastic-and-opensearch</guid>
      <pubDate>Sun, 13 Sep 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>A fourth SIEM provider delivers Chainsaw events to the Elasticsearch or OpenSearch bulk API, with either an API key or basic auth. CEF deliveries for Sentinel and QRadar are now framed as RFC 5424 syslog, and a destination URL with credentials embedded in it is refused.</description>
    </item>
    <item>
      <title>v0.21.24: Signed verification attestations for passed artifacts</title>
      <link>https://chain305.com/changelog/#2026-09-11-signed-verification-attestations-for-passed-artifacts</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-09-11-signed-verification-attestations-for-passed-artifacts</guid>
      <pubDate>Fri, 11 Sep 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Chainsaw can mint a signed SLSA Verification Summary Attestation for an artifact it passed, so an admission controller such as sigstore's policy-controller can refuse anything that carries no such record. It is off by default and signs with the operator's key.</description>
    </item>
    <item>
      <title>v0.21.22: Orgs can require MFA</title>
      <link>https://chain305.com/changelog/#2026-09-07-orgs-can-require-mfa</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-09-07-orgs-can-require-mfa</guid>
      <pubDate>Mon, 07 Sep 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>An org admin can now require multi-factor authentication for every member. Turning it on is refused unless the admin is enrolled. A new chainsaw policy show command prints a policy's full configuration, conditions included.</description>
    </item>
    <item>
      <title>v0.21.8: The Guard Action's block mode now blocks</title>
      <link>https://chain305.com/changelog/#2026-08-25-the-guard-action-s-block-mode-now-blocks</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-08-25-the-guard-action-s-block-mode-now-blocks</guid>
      <pubDate>Tue, 25 Aug 2026 12:00:00 GMT</pubDate>
      <category>Fixed</category>
      <description>Every finding pr-scan emitted was a warning, so the GitHub Action in mode: block left a comment on the pull request and never failed it. pr-scan findings now go through the policy rules, so a rule can block on a chosen finding while new dependencies stay at warn.</description>
    </item>
    <item>
      <title>v0.21.1: Made-up version pins caught on seven more ecosystems</title>
      <link>https://chain305.com/changelog/#2026-08-20-made-up-version-pins-caught-on-seven-more-ecosystems</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-08-20-made-up-version-pins-caught-on-seven-more-ecosystems</guid>
      <pubDate>Thu, 20 Aug 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>A version that does not exist on its registry, the kind an AI coding tool can invent, is no longer scored as if it were real. v0.21.0 caught this on four ecosystems; PyPI, Maven, Cargo, RubyGems, NuGet, Go and Docker now follow. When the registry cannot say whether the package exists, the old behaviour stays.</description>
    </item>
    <item>
      <title>v0.20.0: Optional fail-closed coverage gate on the proxy</title>
      <link>https://chain305.com/changelog/#2026-08-12-optional-fail-closed-coverage-gate-on-the-proxy</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-08-12-optional-fail-closed-coverage-gate-on-the-proxy</guid>
      <pubDate>Wed, 12 Aug 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Operators can name the data sources a verdict must have, and the proxy refuses a package when one of them could not be evaluated, instead of letting it through. The refusal says Chainsaw could not finish looking, not that it found something wrong, and a policy allow cannot override it. The gate is off by default; with it unset, nothing changes.</description>
    </item>
    <item>
      <title>Pinning, cooldowns, blocklists, SCA: where Chainsaw fits</title>
      <link>https://chain305.com/comparison/</link>
      <guid isPermaLink="true">https://chain305.com/comparison/</guid>
      <pubDate>Wed, 08 Jul 2026 12:00:00 GMT</pubDate>
      <description>The four common ways teams keep a bad package out of a build — conceded fairly — and where Chainsaw sits behind them. Written to survive a skeptical reader.</description>
    </item>
    <item>
      <title>v0.19.3: AI model scanning reads inside zip-container checkpoints</title>
      <link>https://chain305.com/changelog/#2026-07-07-ai-model-scanning-reads-inside-zip-container-checkpoints</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-07-07-ai-model-scanning-reads-inside-zip-container-checkpoints</guid>
      <pubDate>Tue, 07 Jul 2026 12:00:00 GMT</pubDate>
      <category>Security</category>
      <description>PyTorch has saved .pt/.bin as a zip archive since 2020, with the pickle nested at archive/data.pkl — the format ~99% of Hugging Face models ship in. Chainsaw now unwraps the container before the pickle scan, so a malicious os.system buried inside a real checkpoint is caught, not just hand-crafted raw .pkl files. The opcode walker also models the pickle stack and memo, closing STACK_GLOBAL and byte-encoded-module evasions that dodge a naive text scan.</description>
    </item>
    <item>
      <title>v0.18.0: One-command guard setup, plus an honest first run and doctor</title>
      <link>https://chain305.com/changelog/#2026-06-26-one-command-guard-setup-plus-an-honest-first-run-and-doctor</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-06-26-one-command-guard-setup-plus-an-honest-first-run-and-doctor</guid>
      <pubDate>Fri, 26 Jun 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>chainsaw guard init --install writes the guard hook into your shell rc in one command — no copy-paste. guard update now shows live download progress so a slow dataset pull doesn't read as a hang. The first-run telemetry prompt defaults to yes with a plain-language disclaimer of exactly what's shared, and stays silent in CI. doctor's manager table is realigned and now reports a 'shim' state, so a manager protected by the shell guard no longer reads as unprotected.</description>
    </item>
    <item>
      <title>Chainsaw vs JFrog Xray: keep Artifactory, move the refusal</title>
      <link>https://chain305.com/vs-jfrog-xray/</link>
      <guid isPermaLink="true">https://chain305.com/vs-jfrog-xray/</guid>
      <pubDate>Tue, 26 May 2026 12:00:00 GMT</pubDate>
      <description>Xray inspects what is already cached. Chainsaw refuses before the cache. Run both for 90 days, then retire Xray's policy surface. Artifactory storage stays.</description>
    </item>
    <item>
      <title>v0.18.0: Linux distro CVE detection — Alpine, Debian, Red Hat, Oracle Linux</title>
      <link>https://chain305.com/changelog/#2026-05-24-linux-distro-cve-detection-alpine-debian-red-hat-oracle-linu</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-24-linux-distro-cve-detection-alpine-debian-red-hat-oracle-linu</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Native CVE detectors per distro, with each stream updating on its own cadence — distinct from upstream OSV. A vendor advisory becomes a block-list entry the same hour the distro publishes it. Modular ingest means an Alpine stall doesn't hold up Red Hat coverage.</description>
    </item>
    <item>
      <title>v0.18.0: Bundled Hugging Face malware feed</title>
      <link>https://chain305.com/changelog/#2026-05-22-bundled-hugging-face-malware-feed</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-22-bundled-hugging-face-malware-feed</guid>
      <pubDate>Fri, 22 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Native HF coordinate-match feed shipped in-process — closes the gap where public SCA indexes lag on model-repo malware. Lookup is constant-time at resolve; a hit drops trust score to -100.</description>
    </item>
    <item>
      <title>v0.18.0: chainsaw doctor verify-hook and doctor logs</title>
      <link>https://chain305.com/changelog/#2026-05-21-chainsaw-doctor-verify-hook-and-doctor-logs</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-21-chainsaw-doctor-verify-hook-and-doctor-logs</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Two new CLI subcommands. verify-hook detects client-side install-hook bypasses — a developer skipping the proxy via .npmrc edits or env overrides now shows up in doctor output. doctor logs surfaces operator-actionable WARN lines from the server so on-call doesn't have to grep raw stdout.</description>
    </item>
    <item>
      <title>v0.17.1: Docker OCI inspector and Swift git-fallback ON by default</title>
      <link>https://chain305.com/changelog/#2026-05-20-docker-oci-inspector-and-swift-git-fallback-on-by-default</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-20-docker-oci-inspector-and-swift-git-fallback-on-by-default</guid>
      <pubDate>Wed, 20 May 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>Per-layer image inspection and Swift's git-tag fallback no longer need an opt-in flag. New deployments get container depth and Swift coverage out of the box. Existing installs keep their explicit config; the default only changes when the flag is unset.</description>
    </item>
    <item>
      <title>v0.17.0: Silent-success write telemetry + SQL tripwire</title>
      <link>https://chain305.com/changelog/#2026-05-15-silent-success-write-telemetry-sql-tripwire</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-15-silent-success-write-telemetry-sql-tripwire</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>published_to_inventory counters, drop counters, and a SQL tripwire fire when a write looks like it succeeded but didn't land. Six operator log lines were promoted DEBUG→WARN so the cases that used to need code-reading now show up in doctor logs.</description>
    </item>
    <item>
      <title>v0.17.0: VEX-aware exception CLI</title>
      <link>https://chain305.com/changelog/#2026-05-10-vex-aware-exception-cli</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-10-vex-aware-exception-cli</guid>
      <pubDate>Sun, 10 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>chainsaw exception create now accepts --cve, --decision, and --vex-note. Exceptions carry VEX semantics — not_affected, affected, fixed, under_investigation — so the audit log answers vendor questionnaires directly.</description>
    </item>
    <item>
      <title>v0.17.0: chainsaw cargo-credentials — credential provider for cargo 1.74+</title>
      <link>https://chain305.com/changelog/#2026-05-05-chainsaw-cargo-credentials-credential-provider-for-cargo-1-7</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-05-05-chainsaw-cargo-credentials-credential-provider-for-cargo-1-7</guid>
      <pubDate>Tue, 05 May 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Cargo's native credential-provider protocol now has a first-class Chainsaw integration. No more .cargo/config.toml token-in-plaintext patterns; the provider sources credentials from the OS keyring.</description>
    </item>
    <item>
      <title>SCA vs package firewall: report or refuse | Chainsaw</title>
      <link>https://chain305.com/vs-sca/</link>
      <guid isPermaLink="true">https://chain305.com/vs-sca/</guid>
      <pubDate>Fri, 24 Apr 2026 12:00:00 GMT</pubDate>
      <description>SCA tools report on exposure after the fact. Chainsaw is a control point that refuses non-compliant packages before they are consumed. Run both.</description>
    </item>
    <item>
      <title>Chainsaw vs Cloudsmith, JFrog Artifactory and Nexus</title>
      <link>https://chain305.com/vs-artifact-managers/</link>
      <guid isPermaLink="true">https://chain305.com/vs-artifact-managers/</guid>
      <pubDate>Fri, 24 Apr 2026 12:00:00 GMT</pubDate>
      <description>Artifact managers host your packages. Chainsaw decides what gets installed. Different layer, different problem. Keep your registry, add the policy layer.</description>
    </item>
    <item>
      <title>v0.16.0: Supply-chain attack signals catalogue</title>
      <link>https://chain305.com/changelog/#2026-04-18-supply-chain-attack-signals-catalogue</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-supply-chain-attack-signals-catalogue</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Install-script exfiltration, maintainer takeover, version anomalies, hidden Unicode, publish-velocity bursts, reserved-namespace dependency confusion, Docker malware feed, per-layer image enforcement, APT/Yum/DNF hash-chain provenance, typosquat across 15 ecosystems including Go, CocoaPods, and GitHub Actions, repo liveness plus ownership match, and checksum fail-closed enforcement — 25 signals total, composable in a single policy. Four run on every ecosystem (CVE, license, reserved namespaces, trust score); the rest light up where each registry exposes the metadata we need. See our per-ecosystem coverage matrix for the full grid.</description>
    </item>
    <item>
      <title>v0.16.0: Browser-based CLI login with Turnstile</title>
      <link>https://chain305.com/changelog/#2026-04-18-browser-based-cli-login-with-turnstile</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-browser-based-cli-login-with-turnstile</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>chainsaw auth login now opens a browser to the dashboard and uses a device-code flow with Cloudflare Turnstile to block automated login attempts. Works on headless shells via a short code; works on desktop via redirect. Tokens land in the OS keyring — macOS Keychain, Windows Credential Manager, Linux secret-service.</description>
    </item>
    <item>
      <title>v0.16.0: Cross-platform CLI binaries</title>
      <link>https://chain305.com/changelog/#2026-04-18-cross-platform-cli-binaries</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-cross-platform-cli-binaries</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Added</category>
      <description>Builds for macOS (Intel and Apple Silicon), Linux (x86_64, arm64), and Windows (x86_64), each with a published SHA-256 checksum for download verification. The server URL can be baked into the binary at build time for air-gapped shipping. Sigstore-signed releases follow once the release-signer bot is provisioned.</description>
    </item>
    <item>
      <title>v0.16.0: Strict JWT mode is now default</title>
      <link>https://chain305.com/changelog/#2026-04-18-strict-jwt-mode-is-now-default</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-strict-jwt-mode-is-now-default</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Changed</category>
      <description>Chainsaw refuses to boot without CHAINSAW_JWT_SECRET or a persistent store to hold a generated secret. Multi-replica deployments are safer out of the box. Single-process dev still works with CHAINSAW_STRICT_JWT=0.</description>
    </item>
    <item>
      <title>v0.16.0: FORCE_HTTPS scheme upgrade for CLI auth</title>
      <link>https://chain305.com/changelog/#2026-04-18-force-https-scheme-upgrade-for-cli-auth</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-force-https-scheme-upgrade-for-cli-auth</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Fixed</category>
      <description>The CLI login URL now honours FORCE_HTTPS. Reverse-proxied Chainsaw deployments with TLS termination upstream no longer emit http:// redirects.</description>
    </item>
    <item>
      <title>v0.16.0: Web UI URLs resolved via NEXT_APP_BASEPATH</title>
      <link>https://chain305.com/changelog/#2026-04-18-web-ui-urls-resolved-via-next-app-basepath</link>
      <guid isPermaLink="true">https://chain305.com/changelog/#2026-04-18-web-ui-urls-resolved-via-next-app-basepath</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <category>Fixed</category>
      <description>Dashboard URLs printed by the CLI during auth now respect NEXT_APP_BASEPATH and CHAINSAW_WEB_UI_URL, so Chainsaw deployments on a subpath or a custom domain get correct browser links.</description>
    </item>
  </channel>
</rss>
