v0.3.0Rustywoof v0.3.0 is out — local OSV lockfile auditing and browser WASM secret scanning.Read the release notes
Back to Blog

Rustywoof: Dev's Best Friend

I was coding when the March 2026 attacks hit, and it humbled me. So I built one small tool that checks your code for leaked passwords and keys, and checks the libraries you use for known problems. It scans 21,000 files in 2.42 seconds.

Ian Ramy avatarIan RamyMaintainer· 9th Nov 2026· 8 min read
Happy dog smiling warmly at its owner outdoors

Happy dog smiling warmly at its owner outdoors · Photo via Unsplash

In March 2026 I was in the middle of a normal coding session when the news started coming in. Popular packages had been hijacked. Developer accounts were taken over. Keys that someone had pasted into a file by mistake were being found and used within minutes. I closed my laptop lid and just sat there for a while. I kept asking myself one thing: how many of my own projects had the same problem and I just didn't know?

If you are not a developer, here is the short version. Software is built from thousands of small pieces written by strangers. If one piece goes bad, everything built on top of it can go bad too. And developers sometimes leave secret passwords sitting inside their code, a bit like leaving your house key under the doormat. Attackers know exactly where to look.

I went looking for tools to check my work. There are good ones, but each does one small job. For a project that mixes Rust, TypeScript and Python, I needed three or four different tools (npm audit, cargo audit, pip-audit) just to check my dependencies. I wanted one tool that does it all in a single run, so I built it.

“A security tool only works if it is faster than your patience. If checking takes 15 seconds, people skip it with --no-verify. I have done it myself.”

Why Most Scanners Feel Slow

Most secret scanners take a long list of patterns and test every single line of every file against all of them. Add more files or more patterns and the wait grows. But here is the thing. Nearly every real key starts with a fixed beginning. AWS keys start with AKIA, GitHub tokens start with ghp_, and Stripe keys start with sk_live_.

So Rustywoof does not read everything closely. It first sweeps your files once, looking only for those known beginnings, using a method called Aho-Corasick. Think of scanning a whole library for a handful of book titles instead of reading every page. If a file has none of them, I skip it. If one shows up, I look closer. I also measure how random the text looks (this is called Shannon entropy), because real keys look messy and fake ones like AKIA_EXAMPLE_TOKEN don't. That keeps the false alarms down.

Here is the kind of mistake it catches. Someone pastes a GitHub token straight into a file to “just test something quickly” and forgets about it. Every developer has done this at least once. Line 4 below is the problem.

src/auth.tsTypeScript
import { createClient } from "./client"; // Hardcoded token committed by mistakeexport const GITHUB_PAT = "ghp_0th1sI54n3X4MPL3F0rAg1th4BPAt0k3nK3y";export const api = createClient({ token: GITHUB_PAT });

Now I run woof scan . on the project. It reads 21,341 files, about 577 MiB, and it still finishes in 2.42 seconds. It tells you the file, the line, the column, and what kind of secret it found. It also hides the key in its own report, so the scanner never becomes the next leak.

Scanwoof scan . across 21,341 files (577.58 MiB)
$ woof scan .[INFO] Indexing repository...Scanning ├── [████████████] 100% | 577.58 MiB @ 238.51 MiB/s | 21,341 files[INFO] Sweep complete. Analyzed 21,341 files in 2.42s.[CRITICAL] Secret scan failed! Found 1 exposed secret.× [CRITICAL] Secret Detected: GitHub Personal Access Token╭─[./src/auth.ts:4:27]4 │ export const GITHUB_PAT = ****************************************;·                           ╰── Exposure found here╰────

If you are not technical, think of it as a metal detector for your code. It beeps when it finds something that should never have been there, and it points to the exact spot. It works the same way for Rust and Python projects, and it knows about AWS keys and Google Cloud keys too.

Checking Your Libraries Against Known Problems

The dangerous stuff is rarely the library you picked yourself. It is usually something three or four layers down that you have never heard of. So woof audit does not guess from loose version ranges in package.json or Cargo.toml. It reads the exact versions you are really using from Cargo.lock, package-lock.json, pnpm-lock.yaml, uv.lock and poetry.lock. Then it asks api.osv.dev, a public list of known vulnerabilities, about all of them in one request.

Here is a real run on a tiny shop project with just three libraries. All three had known problems. For each one you get the version you are on, how serious it is, and the exact command to fix it.

Auditwoof audit on a package.json with 3 dependencies
$ woof audit[INFO] Initiating multi-ecosystem lockfile audit...[INFO] Extracted 3 dependencies across 1 ecosystems.Cross-referencing CVEs: querying OSV for 3 packages Package    axiosVersion    1.5.0Ecosystem  npmSeverity   8.7 (HIGH)Threats    CVE-2026-44494, GHSA-35jp-ww65-95wh, CVE-2026-44495, GHSA-3g43-6gmg-66jw (+ more)Published  29 May 2026Status     Upgrade available (1.16.0, 1.15.2, 0.31.1) Learn more at: https://osv.dev/vulnerability/CVE-2026-44494help: Upgrading may break peer dependencies or parent requirements. Analyze dependency paths first.Command: woof sniff axiosApply the fixed version:Command: woof remediate axios 1.16.0 Package    lodashVersion    4.17.15Severity   8.1 (HIGH)Status     Upgrade available (4.17.21, 4.17.19, 4.17.20)Command: woof remediate lodash 4.17.21 Package    zodVersion    3.23.8Severity   7.5 (HIGH)Status     Upgrade available (4.6.6)Command: woof remediate zod 4.6.6 3 vulnerabilities foundSeverity: 0 critical, 3 high, 0 medium, 0 low✗ Audit completed in 38.77s. Vulnerabilities detected, see report above.

If you are not technical, read it like a health check for your software. Each block is one ingredient, how risky it is, and what to swap it for. If you are a developer, the woof sniff line helps you see where the package sits in your tree before you upgrade, so the fix does not break something else.

Your Code Stays On Your Machine

Your code, file names and environment variables never leave your computer. When Rustywoof finds a secret, it hides most of it in the report, so you are not leaking it again by accident. The Playground on this site runs the very same scanner inside your browser tab, so nothing gets uploaded there either.

I am one person building this, and I am still learning as I go. If it saves you from one bad commit, it was worth it. Try it on a project and tell me what you find.

Try Rustywoof on your project.

Install it in a few seconds, or drop in a lockfile and test it right in the browser.