Early Access • Zero Monthly Subscriptions • Pay-Per-Scan Credits

Budget-driven code security.
Set your price in PR/MR. We optimize the audit.

No seat licenses or monthly subscriptions. Simply comment @budgetscan $0.50 --max-delay 5m on any PR/MR. That is what we are building: BudgetScan plans how deep to scan so it fits your cap and deadline, then deducts only what the scan actually cost.

Early access, still in development. The open-source scanner (nano-analyzer) works today from the command line, and you can call it from your own CI (see the how-to). A GitLab merge-request job and a GitHub Action are in private testing and shared during early access. The @budgetscan comment command, budget and deadline caps, and prepaid credits shown on this page are what we are building next. Nothing here can be purchased yet, and all examples and numbers are illustrative. Questions or want early access? Email us. Thanks for taking a look.

Illustrative example — mock output showing the intended flow, not a real scan result.

GitLab MR #418 — @budgetscan $0.50 --max-delay 5m
Example
reviewer-jane Looking at the C++ changes. @budgetscan $0.50 --max-delay 5m
BudgetScan Bot example
⚡

Use-After-Free Vulnerability in interpreter.cpp:142

Severity: High | Budget Cap: $0.50 | Max Delay: 5m

🏆 Execution & Credit Summary Cost: $0.161 / $0.50 Cap
LLM Context + Scan Changed files $0.041 Within Cap
Skeptical Triage 5 rounds $0.120 Completed
Team Credit Deduction Prepaid Pool -$0.161 Remaining: $248.34

Granular PR/MR Command Control

Developers, reviewers, and PMs control the scan budget and deadline right from the comment thread.

Basic Quick Scan
@budgetscan $0.25

Lightweight Sanity Audit

Ideal for quick developer sanity checks. BudgetScan scans the changed files with a single, fast triage pass.

Real per-scan costs: published after benchmarks
@budgetscan $0.50 --max-delay 5m

Deep Audit with a Deadline

Perfect for release candidate PRs. Aims to finish within 5 minutes while spending up to $0.50 on deeper context, scanning and multi-round triage. If time runs out, you get a partial report instead of a stuck pipeline.

Real per-scan costs: published after benchmarks
High-Security Release
@budgetscan $5.00 --depth deep

Deepest Audit Your Budget Allows

Used for critical core changes. Spends the larger cap on wider context and more triage rounds, and the report lists what was covered.

Real per-scan costs: published after benchmarks

Why Pay Per Scan Instead of Per Seat

No idle seats. You pay for the scans that actually run.

Zero Waste

Credit Deducted Only on Execution

No seat licenses for developers who rarely open a PR. Credits are deducted only when a scan runs, based on what it actually cost. Failures are rare, and when one happens, nothing is charged.

Bring Your Own LLM Backend

By default, hosted scans run on our partner Kosmik Compute (EU, zero data retention). The open-source scanner works with OpenAI and OpenRouter today; our early-access build adds Google Gemini / Vertex AI and any OpenAI-compatible endpoint such as vLLM or Ollama. Your code goes only to the provider you pick. Automatic routing to the cheapest backend is on the roadmap, not live yet. Where does my code go?

Deadline-Aware Scans

With --max-delay 5m, BudgetScan is designed not to hold up CI pipelines: when the deadline approaches, it stops starting new work and posts a partial report listing what was covered.

Skip Unchanged Files (roadmap)

Skipping unchanged files on re-scan, so you don’t pay twice for the same code, exists today in a community Go port and is planned for the main scanner.

Built for GitHub & GitLab

Today you can run the open-source scanner from any CI job. A GitLab merge-request job and a GitHub Action that run it on every MR/PR are in private testing. Triggering it from a comment with @budgetscan is what we are building next.

Simple Prepaid Credits

Top up a prepaid balance and each scan deducts only its actual cost. Team-level budget caps may come later.

A note on accuracy. AI-based scanners can flag things that turn out to be harmless (false positives) and can miss real issues (false negatives). Findings of medium severity and above go through a skeptical, multi-round triage step, and we work hard on keeping false positives to a minimum. Please treat results as strong leads for a human reviewer, not as verdicts.

Success Stories

Real results on real open-source projects, with links you can verify. Findings are leads for maintainers, checked by a person before we report them.

Released upstream • October 2026

oauth2 for Ruby: secrets followed redirects and leaked into errors

oauth2 is the Ruby OAuth 2.0 client gem behind omniauth-oauth2, with over 280 million downloads. A cross-origin redirect replayed the token request body, with the authorization code and possibly the client secret, to the new host, and a response without a token was dumped whole into the error message. Maintainer Peter Boling merged both our fixes, hardened them and released them the same day.

  • 24–25 Oct 2026. We opened pull requests #775 and #776 with fixes and regression tests.
  • 25 Oct. Both merged, followed up in #777 and released in v2.0.26 and v2.1.0, credited to us in the changelog.

How to read this. The redirect leak needs a compromised or misconfigured token endpoint or proxy, and the error leak needs a token-less response, so these are hardening fixes, not remote exploits. Findings are leads for people, not verdicts.

Benchmark Report • Hacktoberfest 2026

The ARMv9 Speed Paradox: Auditing Real-World Code with Gemma 4 on Bare Metal

What happens when you audit real-world codebases with a 65,536-token context window on bare-metal ARM64 CPUs? We benchmarked Google's Gemma 4 family across 7 model configurations on Neoverse-V2 silicon, uncovering an unexpected SIMD unpacking paradox where 4-bit runs twice as fast as 2-bit, and evaluating 3-round skeptical triage against verified ground-truth zero-days.

  • 24 Oct 2026. Headless execution of 7 local model configurations and Google Vertex AI MaaS on real-world targets (yopass and curlie).
  • 25 Oct. Published for the DEV Hacktoberfest 2026 Open-Source AI Challenge (Best Use of Gemma).
Fixed upstream • October 2026

Orca: reading an SSH identity file could freeze the app

Orca is a desktop app for running a fleet of coding agents. It read SSH keys from IdentityFile paths with no check on file type or size, so a path pointing to a named pipe froze the app and a huge file was loaded whole. Maintainer Neil built a broader fix on our pull request, kept our tests and credited us as co-author.

  • 22 Oct 2026. We filed issue #31965 and pull request #31966 with a fix and tests.
  • 23 Oct. The maintainer merged #32274, which builds on ours, with us as co-author; not in a release yet.

How to read this. The key paths come from the user’s own SSH configuration, so this is a robustness fix, not a vulnerability. Findings are leads for people, not verdicts.

Released upstream • October 2026

mise: unterminated string in an aqua template hung the lexer

mise manages versions of developer tools and installs many of them from aqua registry entries. Its template lexer looped forever on a string literal without a closing quote, so a broken registry template hung mise instead of failing. Maintainer Jeff Dickey added tests to our fix and merged it the same day; it shipped in v2026.10.17.

  • 20 Oct 2026. We opened pull request #14752 with the fix and a regression test; Jeff Dickey merged it the same day.
  • 21 Oct. Released in mise v2026.10.17.

How to read this. Triage imagined a malicious registry; in practice the templates come from the bundled or user-chosen registries, so it is a hang on a broken entry. Findings are leads for people, not verdicts.

Released upstream • October 2026

KDE Connect: unbounded Bluetooth packet buffer on Android

KDE Connect links phones with desktops to share notifications, files and the clipboard. Its Android Bluetooth backend buffered incoming packets with no size limit, so a paired device that never sent a line terminator could make the app run out of memory. Bluetooth support is an opt-in beta. Creator and maintainer Albert Vaca Cintora merged our fix, which reuses the 32 MB limit the LAN backend already had.

  • 4 Oct 2026. A scan of KDE Connect for Android flagged the unbounded buffer in BluetoothLink.kt; triage rated it valid.
  • 8 Oct. We opened merge request !696 with the fix and a unit test. Albert Vaca Cintora merged it the same day; released in v1.36.0.

How to read this. The scanner’s triage called the attacker remote; reading the code narrowed it to an opt-in backend and an already paired device. Findings are leads for people, not verdicts.

Merged upstream • October 2026

ProFTPD: keyboard-interactive answers matched to the wrong PAM prompts

ProFTPD is a widely deployed FTP and SFTP server. Its mod_sftp_pam module matched keyboard-interactive answers to PAM prompts by the wrong index. When a PAM module sent an info message before a prompt, as pam-krb5 does during a password change, login failed or the session process read past the end of the answers array. Maintainer TJ Saunders merged our fix.

  • 30 Sep 2026. A scan of the ProFTPD tree flagged sftppam_converse(); three triage rounds rated it valid.
  • 2 Oct. We confirmed it with an AddressSanitizer harness and opened pull request #2355.
  • 7 Oct. TJ Saunders merged it into master; not in a tagged release yet.

How to read this. The scanner’s triage overstated the reach; reading the receiving code narrowed it to PAM stacks that mix messages and prompts. Findings are leads for people, not verdicts.

Released upstream • October 2026

Windmill: unbounded S3 downloads for AI attachments

Windmill is an open-source platform for scripts, workflows and internal tools. When an AI step referenced an S3 object, Windmill downloaded the whole object and base64-encoded it with no size limit, so one large object could exhaust a worker’s memory. Our size check came too late; maintainer Ruben Fiszel replaced it with a bounded download.

  • 2 Oct 2026. A scan of Windmill’s AI backend flagged the unbounded download in image_handler.rs.
  • 4 Oct. We opened pull request #11515 with a size check before encoding.
  • 5 Oct. Ruben Fiszel merged a bounded download in #11534, released in v1.824.0.

How to read this. Our patch was only a partial mitigation; the maintainer’s fix is better. Findings are leads for people, not verdicts.

Merged • Shared library hardening • October 2026

Himalaya: terminal escape injection and BiDi spoofing defense in Rust email tables

Himalaya is a popular CLI email client written in Rust. BudgetScan flagged that message metadata (subjects, sender names, attachment filenames) was printed into terminal tables without escaping control characters. An attacker could craft emails with OSC 52 sequences to silently overwrite the user's clipboard, manipulate terminal output, or use Unicode BiDi overrides to disguise executable attachments. Maintainer Clément Douin extracted our sanitization into the shared pimalaya-cli library with co-authorship credit, so its sister CLI tools can adopt it too.

  • 2 Oct 2026. BudgetScan flagged unescaped metadata rendering in Himalaya's table output. We opened pull request #771 on GitHub with an initial patch and test suite.
  • 2 Oct. Maintainer Clément Douin (soywod) recognized that sister CLI projects (cardamum, calendula) share the same tables. He moved the sanitization into pimalaya-cli 0.2.6 with BiDi override filtering, crediting Martin Vlach as co-author.
  • 3 Oct. We completed backend coverage across IMAP, JMAP, Gmail, Graph and pimdir backends and added unit tests. Maintainer Douin reviewed and merged pull request #771 into master.
  • 11 and 14 Oct. Separately, two patches by contributor SORALNV were merged: PR #782 (attachment downloads) and PR #783 (message view sanitization).

How to read this. Automated scanning detected an input-sanitization gap, and close collaboration with the maintainer turned a single bug fix into a shared function the other Pimalaya CLI tools can adopt. Findings are actionable leads for humans, not unquestioned verdicts.

Fixed in OpenBSD and tmux upstream • October 2026

tmux: server crash on copy-mode -S without attached client

tmux is the ubiquitous terminal multiplexer. When executing its copy-mode -S handler without an attached client (such as from a hook or background server queue), tmux dereferenced a NULL client pointer, crashing that tmux server with SIGSEGV and ending all of its sessions. Creator and lead maintainer Nicholas Marriott accepted our report and applied the fix to OpenBSD CVS.

  • 1 Oct 2026. BudgetScan flagged the unguarded client pointer in cmd-copy-mode.c. We verified the crash path via hooks and opened pull request #5670 on GitHub with the fix and an automated regression test.
  • 2 Oct. tmux lead maintainer Nicholas Marriott (nicm) reviewed the pull request, replied “Applied to OpenBSD now, will be in GitHub later. Thanks!”, and committed revision 1.55 to OpenBSD CVS credited to Martin Vlach. The same day it was synced to tmux on GitHub as commit 5932140.

How to read this. The scanner flagged the unguarded pointer as an actionable lead, and an engineer confirmed the control flow, isolated the hook trigger, wrote the test, and reported the fix. Upstream maintainer Nicholas Marriott validated and committed it to OpenBSD. Findings are leads for people, not verdicts.

Fixed upstream • October 2026

dnsmasq: stale SLAAC name records after a DHCP lease loses its hostname

dnsmasq is the DNS and DHCP server built into many routers and Linux systems. A DHCP lease that lost its hostname kept its SLAAC name records, so a later ICMPv6 reply handed a NULL hostname to a log call. We mailed a patch for the log line; author Simon Kelley fixed the underlying stale records instead and credited Martin Vlach in the commit. A second patch from the same scan was applied too.

  • 30 Sep 2026. A scan flagged the NULL hostname in slaac_ping_reply(); we mailed a patch to dnsmasq-discuss.
  • 1 Oct. Simon Kelley committed a broader fix that clears stale SLAAC-name data, and also committed our second patch from the same scan, for an allocation-failure bug in poll_listen().
  • 11 Oct. He replied to both patches on the list; neither is in a tagged release yet.

How to read this. The scanner found a symptom; the maintainer found the cause. Findings are leads for people, not verdicts.

First hit on open source • September 2026

Yopass: unverified emails could pass OIDC domain restrictions

Yopass is an open-source tool (over 3,000 GitHub stars) for securely sharing secrets, passwords and files. When it is set to allow logins only from certain email domains, its OIDC login trusted the email address returned by the identity provider without checking the email_verified claim. Someone with an unverified account at an identity provider under an allowed domain could therefore get past the domain restriction.

  • 23 Sep 2026. BudgetScan flagged the missing check. We opened a pull request with a fix and tests.
  • 24 Sep. An automated review asked for stronger tests, which we added. The maintainer pointed out that email_verified is an optional claim, so enforcing it blindly could break existing setups.
  • 25 Sep. Maintainer Johan Haals built on our patch in a new pull request: he kept our commit as the first one, with its authorship, and added an explicit opt-out for providers that omit the claim, a startup warning, configuration validation, tests and documentation.
  • 26 Sep. Merged into Yopass. By default, OIDC logins now require a verified email.

How to read this. Thanks to Johan Haals for the quick, careful handling. The scanner found the problem and a human maintainer decided how to fix it safely, which is how we want it to work: findings are leads for people, not verdicts. It is one data point, not a benchmark. We will publish measured results once we have them.

Interactive Budget-Scan Simulator

Select a PR scenario and test budget caps like @budgetscan $0.50 --max-delay 5m — a conceptual simulation with mock numbers, not a live scan.

> [simulation] Click "Execute PR Command" to see how a budget cap and deadline shape a scan (mock data)...

Pay-Per-Scan Credit Savings Calculator

Compare estimated pay-per-scan costs with per-seat pricing. The inputs and assumptions here are illustrative.

Annual Savings vs Flat Subscriptions $8,748 Estimate: ~28% of cap per PR vs $50/dev/mo seat fees
Actual Monthly Spend $21 / month
Traditional SAST Seat Cost $750 / month
Effective Cost Savings 97% saved

Illustrative: assumes an average scan costs about 28% of its cap and a seat price of $50 per developer per month. Real per-scan costs will replace this once we have measured them. The seat price is a placeholder, not a quote from any vendor.

Transparent Credit Packs • Zero Subscription Fees

Planned prepaid credit packs: no subscription, no seat fees. Prices and terms are a draft and may change before launch. Scans rarely fail, and a failed scan is never charged.

Developer Starter

For individuals & open-source contributors

$25/ prepaid credit
  • ✓ $0 Monthly Subscription Fee
  • ✓ Scans per pack depend on the caps you set; real costs published after benchmarks
  • ✓ Support for @budgetscan $X syntax
Request early access

Enterprise / Self-Hosted

Bring your own infrastructure

Custom Pool
  • ✓ Everything in Team Shared Pool
  • ✓ Connect your own LLM endpoint (OpenAI-compatible, vLLM, Ollama)
  • ✓ Zero compute markup (pay your provider’s rates)
  • ✓ On-premise runners
  • ✓ Custom invoicing
Contact us

Where Does My Code Go?

Short answer: only to the LLM provider you choose. For hosted scans that is EU inference with zero data retention; self-hosted against your own endpoint, nowhere outside your infrastructure.

Zero Data Retention by Default

Hosted BudgetScan scans run on inference from our partner Kosmik Compute, which operates with zero data retention: prompts and outputs are not stored and are never used to train models. Only operational metadata (such as request logs) is kept, for up to 30 days. Their privacy details.

Hosted in the EU

Kosmik’s servers are in Prague and the operator is a Czech company under GDPR. The inference API is OpenAI-compatible: see the API docs.

Or Keep It On-Prem

The scanner is open source (Apache-2.0) and runs on your own infrastructure. Pointing it at your own LLM endpoint (vLLM, Ollama or any OpenAI-compatible server), so your code never leaves your network, works in our early-access build and is coming to the open-source scanner, which today calls OpenAI or OpenRouter.