On the morning of September 10, 2026, secret-scan jobs started failing across GitHub — not with findings, but with a refusal to scan at all. The log line, now familiar to anyone running an org-owned repo, reads:
[your-org] is an organization. License key is required.
missing gitleaks license. Go grab one at gitleaks.io and store it as a
GitHub Secret named GITLEAKS_LICENSE.No secrets were found because no scan ran. The scanner had not been breached, deprecated, or relicensed in some sweeping rug-pull — the gitleaks binary is still MIT-licensed open source at v8.30.1. What changed, for a wave of teams hitting it in mid-September, is that the official gitleaks/gitleaks-action wrapper (v2 and newer) requires a GITLEAKS_LICENSE key for organization-owned repositories, while staying free for personal accounts. Your CI did not rot; it crossed a licensing boundary the day the repo moved under an org, the action auto-updated a major, or the trial key expired.
The stakes for getting the replacement right are at an all-time high: GitGuardian's State of Secrets Sprawl 2026 report counted 28.65 million new hardcoded secrets in public GitHub commits during 2025, a 34% year-over-year increase and the largest single-year jump ever recorded, with AI-service keys up 81%. This post gives you the three-option decision up front, then the two things you need to choose well: how the gate actually works, and what pattern-matching versus verified-only detection changes for a pipeline that scans on every push.
Your three options, up front
| # | Path | Cost | False-positive profile | Maintenance burden | Fits |
|---|---|---|---|---|---|
| 1 | Get a GITLEAKS_LICENSE from gitleaks.io and keep the official action | Free trial available; paid for orgs past that | Unchanged — full pattern-rule recall, including example/dummy-key noise | Lowest: keep the wrapper, add one secret | Teams happy with gitleaks rules who just want green CI back today |
| 2 | Drop the wrapper: run the pinned MIT CLI directly, or via a license-free community action (gacts/gitleaks, fairmoney/gitleaks-action) | Free | Same engine as option 1, so identical findings | Small: you own the pin, checksum, and flags instead of the action | Self-hosted and git-push pipelines that want zero commercial gates in the build path |
| 3 | Swap to TruffleHog in verified mode (--results=verified,unknown) | Free (Apache-2.0, no gate at any layer) | Lowest noise: only live credentials plus unverifiable unknowns fail the build | Medium: new detector set, new config, verification needs build-time network egress | Pipelines where every false positive pages someone — or blocks a tenant's deploy |
There is no wrong answer here, only a mismatch between the tool's detection philosophy and your pipeline's tolerance for noise. The rest of this post is the evidence for that table.
How a free scanner grew a license gate
The surprise is understandable, but the gate is not new. When Gitleaks LLC was formed, gitleaks-action v2 moved from MIT to a commercial license — the 2022 announcement from maintainer Zachary Rice explains the monetization reasoning — while the scanner itself stayed MIT. Prior v1 action versions remain MIT; everything from v2.0.0 on carries the commercial wrapper license. The U.S. CMS Open Source Program Office's own guidance page now documents the split plainly: the official action v2+ needs a license key for org repos, and the community-maintained gacts/gitleaks action exists precisely as the no-license-key alternative.
So why did September 2026 produce a visible failure wave? Three triggers converged. Teams moved repos under organizations (the gate keys on repo ownership, not plan tier). Teams floated on @v2 tags that picked up stricter enforcement. And trial licenses obtained during initial setup expired silently — the failure mode is a hard error, not a warning, so the first symptom is a red gate on every PR. The public trail tells the story: a scaffold generator filed "secret-scan is permanently red on every organisation-owned scaffold," a Jamf contributor documented the fork-PR variant (fork PRs receive no secrets on the pull_request event, so even a paid key cannot reach the job — the action fails hard with an empty license), and team after team — Shipkit, OpenHikmah, mdloop, Verdikta — landed the same fix within days of each other: delete the action step, download the pinned CLI release, verify its SHA-256, and run gitleaks git directly.
That fix works because the gate lives in exactly one place: the Action wrapper's startup check (if (shouldValidate && !process.env.GITLEAKS_LICENSE) in the action's own source). The binary has no license phone-home. Pinning 8.30.1 and running it yourself is not a circumvention — it is the MIT-licensed tool used as MIT-licensed tools are meant to be used.
But "run the binary" answers the license question, not the detection question. Several of those same teams used the incident to ask whether pattern matching was still the right sensor at all. Which brings us to Porsche.
Pattern matching vs verified-only: the real tradeoff
Gitleaks and TruffleHog both find secrets, but they disagree about what counts as a finding — and that disagreement is the whole decision.
Gitleaks is a pattern engine: hundreds of regex rules plus entropy checks fire on anything shaped like a credential. Its strength is recall. A low-entropy internal token, a custom API key format covered by a bespoke rule, a secret for a provider nobody wrote a verifier for — pattern matching catches all of it. Its weakness is precision. Example keys in docs, dummy placeholders in tests, and revoked-but-still-present strings all fail the build identically to a live production key. Every one of those is a human triage event, or in a git-push pipeline, a blocked deploy with a confused tenant on the other end.
TruffleHog's verified mode inverts the tradeoff. With --only-verified (or the newer --results=verified,unknown selector), each candidate is probed against its issuing service — AWS, GitHub, Stripe, hundreds more across 700+ detectors — and only credentials confirmed live fail the gate. Hugging Face, which runs TruffleHog over every model and dataset upload, puts it crisply: you only get emailed for verified secrets, "the ones that have been confirmed to work for authentication against their respective providers." Signal-to-noise improves dramatically.
Each side has an honest caveat the other side's fans like to skip. Verified-only scanning lets revoked credentials pass — a leaked-and-rotated key is not a live risk, so the gate stays green, which is correct for gating but means the gate is not an audit trail. Verification also needs network egress at scan time: a sandboxed build step with no outbound access cannot confirm anything, and every unknown becomes the whole result set. And "unverified" is not "safe" — as Hugging Face also notes, verification can fail for boring technical reasons like a network error, so unknowns deserve the verified,unknown conservative default rather than verified-only absolutism. Conversely, pattern matching's recall advantage is real but priced in triage labor, and that price compounds on every PR of every repo under the gate.
Neither philosophy dominates. The question is which failure mode your pipeline can afford: triage toil on noise, or silence on dead-but-present secrets.
Case study: Porsche's ADR-0011
The cleanest public record of a team working through exactly this decision is Porsche Digital's technology radar, whose ADR-0011 — accepted April 21, 2026 — swapped gitleaks for TruffleHog as its check:sec:secrets sensor.
What makes the ADR worth reading in full is its honesty about causation. The license gate was the trigger: the official action "turns the secrets gate into a 'contact us' step the moment the repo moves under an organization," friction the team refused to pass on to contributors and fork maintainers. But the license was not the reason for the destination. The ADR explicitly lists "run the gitleaks binary directly in CI" as the clean, zero-cost fix — and rejects it, because "TruffleHog's secret verification is a real upgrade and worth the swap. The license issue was the trigger; TruffleHog's verification is the reason we didn't just patch around it."
The decision details are concrete enough to copy. Apache-2.0 with no license gate at any layer, binary or Action. A larger detector set than gitleaks at 700+ detectors. Local invocation as trufflehog git file://. --no-update --fail --results=verified,unknown, CI via the official trufflesecurity/trufflehog action with no token required for OSS use. The --results=verified,unknown default is deliberate: verified hits plus detectors with no verification path, excluding the unverified matches against example keys that generate the churn. Rejected alternatives are documented too: Detect-secrets (slower, no verification), GitHub native secret scanning (no local parity, no fork gating — kept as belt-and-braces, not the sensor).
And the ADR accepts the caveat outright: "a leaked-but-revoked credential won't fail the gate... it means the gate does not double as an audit trail." The complementary signal is GitHub native scanning on public repos. That is what a complete decision looks like — the tradeoff named, priced, and covered by a second sensor rather than wished away.
What a git-push PaaS should standardize on
Now translate all of this to a platform that scans tenant repos at build time, where the person triaging a finding is often not the person who committed it. Two facts dominate.
First, false positives are priced differently here. When a pattern rule fires on a tenant's test fixture, the tenant's deploy blocks and your support queue grows — the toil lands on the platform, not the committer. That pushes hard toward verified mode for the blocking gate: only live credentials stop a deploy. Keep the high-recall pattern scan, but run it advisory — surfaced in build logs, not gating the release — so low-entropy and custom-format secrets still get noticed without holding deploys hostage.
Second, the vendored-CLI lesson generalizes. The September wave proved that any third-party action wrapper is a renewal-gated dependency smuggled into the build path: it can start failing for commercial rather than technical reasons, on fork PRs it can fail even when paid, and its update cadence is someone else's business decision. For a pipeline you operate for others, the scanner invocation should be a pinned binary with a verified checksum, full-history depth, and explicit flags — infrastructure you own, not a marketplace step you rent. The community actions (gacts/gitleaks, the fairmoney fork) are fine answers for a team's own repo; for a platform build path, vendoring the binary removes the wrapper question entirely, including the supply-chain question of who maintains the fork.
Concretely, the baseline to standardize looks like this:
- name: Secret scan (vendored, pinned)
run: |
curl -sSL -o gitleaks.tar.gz \
"https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz"
echo "<sha256-from-release-notes> gitleaks.tar.gz" | sha256sum -c -
tar -xzf gitleaks.tar.gz gitleaks
./gitleaks git --redact --exit-code 1 --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Pin the version, verify the checksum against the release notes, scan full history (fetch-depth: 0 on checkout), redact findings in logs. Then layer TruffleHog verified mode as the blocking gate wherever the build step has egress, with the pattern scan kept advisory. License renewals, fork-PR secret starvation, and wrapper enforcement changes all stop being your incidents — because there is no wrapper left to gate you.
None of this diminishes Gitleaks itself. An MIT scanner with this rule set, free forever as a binary, remains one of the best deals in supply-chain security — 28.65 million leaked secrets a year is the cost of scanning nothing. The lesson of September is narrower and more durable: know which layer of your pipeline you own, and make sure the layer that can block every deploy is one of them.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.



