Open source · MIT · Node.js 18.3 or later

See what an AI agent could lift from your app. Close it in one command.

Tools such as rea let a coding agent read a shipped app without its source, explain how it works and rebuild it. Reaproof finds what makes that easy, such as a source map with your original code, a server key in the bundle or a .git folder in the output. It rates the risk in plain words and takes out what is safe to take out.

npx reaproof

347 downloads from npm so far

It reads first and asks before it changes anything. Nothing to install, nothing to configure.

$ npx reaproofChecking. This only reads; nothing is changed.Target: dist (output folders picked by name, next to package.json)Files read: 3rea risk: very high  Levels: [very high] · high · moderate · baseline  A tool like rea can take your original source or your secret values as they are.Leaks found: 1 kind (critical 1)[CRITICAL] Your original source code is public  1 source map file(s) contain the full text of 4 original file(s).  Anyone who downloads them reads the code exactly as you wrote it.  - dist/index.js.map (originals: ../../../src/pricing.ts, ../../../src/license.ts, ../../../src/client.ts, ../../../src/index.ts)  Fix: reaproof fix (takes the map files out of the output; can be undone)⋯What to do next:  1. Fix the findings above from the top: the most damaging come first.  2. Then rebuild and run npx reaproof again. A finding that is gone is fixed.  3. After deploying, check the live site too: npx reaproof https://your-siteReport page: file:///home/node/.reaproof/pages/shop-web-9e7dd8976d3e.html (opened in your browser)1 map file(s) will be taken out of the output:  - dist/index.js.mapContinue? (y/N) yDone: 1 taken out.rea risk: very high → baselineLeaks found: 1 kind (critical 1) → noneKept at: /home/node/.reaproof/backups/shop-web-9e7dd8976d3e/2026-10-18T09-27-36-271ZUndo: reaproof undo⋯Report page: file:///home/node/.reaproof/pages/shop-web-9e7dd8976d3e.html (opened in your browser)
  1. Run it where you build
  2. The report page opens
  3. Say yes to the fix
  4. See the page again
A real run on our web test app: the terminal as it was recorded, and the report page it wrote, before and after the fix. Lines left out are marked ⋯. Open the page before and after the fix.

How it works

It reads, rates and explains. Then it asks.

  1. Run it where you build

    In a JavaScript project it finds the build output by name: dist, .next/static, out, build. Of a server-rendering build it reads what browsers load, not the server's own code. Anything else, a folder, an app, a program or an archive, it reads as given.

  2. Read the rating

    The report opens with the rea risk, then every finding, worst first, with what it exposes and how to close it. It also says what it did not read, and opens the same result as a page in your browser.

  3. Say yes to the fix it can make

    It lists the source maps it can take out and, after a y, moves them to a backup outside your project. npx reaproof undo puts them back.

  4. Close the rest, run it again

    Each finding names the setting to change. A finding that is gone is fixed. The report ends with what to do next.

Every report opens with one of these

  • [very high]

    A tool like rea can take your original source or your secret values as they are.

    A source map that holds your source; a .env file, a .git folder or a server-only key in what ships.

  • [high]

    Near-secret values, data, or the inside of the running app are exposed.

    A database file or debug symbols in the output; a test key; a program signed with get-task-allow.

  • [moderate]

    Something left in makes the code easier to read, or the running app easier to get into.

    Code that is not minified; source maps that list file names; a program that kept its development names.

  • [baseline]

    None of the leaks this tool looks for was found.

    Code structure, the text in it and server addresses are still readable, as in any shipped app.

  • [not rated]

    What ships could not be read, so no rating is given.

    A disk image, an installer or an archive it does not open. It does not mean nothing leaks.

There is no "safe" level, because there is no such state. Screen structure and the server addresses an app calls stay readable in any app.

1

command to start: npx reaproof

0

dependencies, and nothing to configure

61

patterns for server keys, from Stripe and AWS to xAI and Supabase

13

test setups for every change: Node 18 to 24 on Linux, macOS and Windows

Benchmarks

Measured, and checked against the tools that define the answer

What the fix changes for rea

4 of 4original files rea names in a minified build that ships its source map

0after reaproof fix

Our web test app: four TypeScript files bundled with Bun 1.2.19. Measured with rea 6.4.0 on 2026-10-14; rea 6.5.0 gave the same counts on 2026-10-16. Minifying alone changed none of rea's counts.

Safe on archives built to cost you

A 1 MB archive whose one file states 1 MB and holds 1 GB is refused in 0.04 s with 55 MB of memory in use. Without that stop it used 2.1 GB.

A 137 kB archive that holds another many times over and lists twenty million files is done with after about a million of them, in about a second.

Nothing is unpacked to disk, and programs are read without running them.

Right answers on framework builds

22 test apps, six frameworks0.7.00.8.0
Leaks found, of 14 put in, with the .env file there (your machine)1314
The same, with the values in the environment instead (a CI job)1114
The same, with neither1113
Apps built right that were rated with a leak, of 840
Apps with any false alarm, of 22100
Apps it could not check, of 2210

Built on 2026-10-18 in Docker with Next.js 16.4.2, Vite 8.3.4, SvelteKit 3.1.0, Nuxt 4.6.2, Astro 7.4.0 and React Router 8.4.0, each built right, with source maps on, and with a server key handed to browser code. The false alarms of 0.7.0 came from reading server code, which does not ship. With neither a .env file nor the environment, a token of the app's own, in no vendor's format, cannot be told from any other value. How the apps were built

Same answer as the reference tool

What is countedOnReaproofReference toolResult
Android build left debuggableTermux 0.118.3, debug build from its GitHub releasedebuggableaapt: debuggableSame
Android classes that keep their namesFossify Gallery 1.14.0228 of 228dexdump: 228Same
Names a default go build keepsOur Go test program, for Linux2,519readelf: 2,519 functions and objectsSame
Electron fuses that check app.asar16 Electron apps on the test Mac16 of 16@electron/fuses readSame
Function names in WebAssembly12 modules on the test Mac12 of 12wabt wasm-objdumpSame
.NET types and methods5 .NET runtime assemblies, the largest with 41,416 methods5 of 5.NET's metadata readerSame
Swift and Objective-C names left after stripOur macOS test program, Swift 6.344 · 42 · 22 · 20otool, same sectionsSame
Paths left out by .reaproofignore20 paths, 11 patterns17git check-ignore: 17Same
SARIF output7 targets7 of 7 validOASIS SARIF 2.1.0 schemaSame

Speed on real builds

TargetSizeFiles readTime
Our web test app6.3 kB30.04 s
Our Vite build with eight SDKs1.8 MB30.05 s
ripgrep 15.2.0 for Windows, .zip1.8 MB140.07 s
Fossify Gallery 1.14.0, .apk38.5 MB1,6060.19 s
Joplin 3.7.10, .apk177.1 MB1,1620.63 s
Electron Fiddle 0.39.0 for macOS, .zip117.8 MB3661.32 s

Median of three runs of reaproof <target> --json with 0.8.0 on 2026-10-18, on an Apple M4 Pro with Node 24.14.0, Node's own start included, in a shell with two variables named like a secret, which it compares with what ships. Size is the file or folder on disk. Details of every check are in the guide.

What it checks

The leaks that make an app easy to copy

CriticalFixed for you

Source maps that carry your code

A map with your original files hands them to anyone who downloads it. reaproof fix takes standalone maps out of the output and keeps a backup outside the project; undo puts them back.

CriticalHigh

Server keys and .env values

61 key patterns, looked for in code, scripts and settings files of any name, and in programs and bytecode for the services an app calls while it runs; a Google API key counts as a Gemini key in browser code that calls Gemini. Also any secret value from your .env or your CI job's environment that appears word for word in what ships. Keys meant for browsers are not reported, and secrets are never printed in full.

CriticalHighMedium

Files that should never ship

A .env file, a .git folder, key stores, database files, debug symbols (.dSYM, .pdb, R8's mapping.txt) and the .DS_Store files the Finder writes.

MediumNote

Programs that keep their names

Function and variable names, debug information and build paths left in macOS and iOS (Mach-O), Linux and Android (ELF), Windows (PE) and WebAssembly. Notes say what stays in Go, Rust, .NET and Hermes code.

HighMedium

Release builds left in development mode

An Android app that is debuggable, test-only or signed with the debug key; a Mac program signed with get-task-allow or without the Hardened Runtime; Electron fuses left on, and the check of app.asar left off.

CriticalYour site

What your live site still serves

npx reaproof https://your-site checks whether the deployed site serves its source maps, for when a hosting platform builds from the repository and a local fix does not reach it.

Also: code that is not minified, source and test files packed in, long AI prompts in client code (a guess), and every server address your code names. Want rea's own view? reaproof measure runs the real rea on your output and counts what it reads, after asking. Every finding, with its severity and fix

Ways to use it

Yourself, with your agent, or in CI

Before you ship

npx reaproof

Run it in your project folder. The result opens as a page in your browser. If nothing is built yet, it offers to run your build first. The first time, npx asks Ok to proceed? (y): answer y.

With your AI agent

Run npx reaproof --json and fix what it reports.

Say that to any coding agent that runs commands. To make it reach for Reaproof by itself, install the skill once, for Claude Code, Codex, Cursor, Gemini CLI and other agents:

npx skills add Junhan2/reaproof

In CI, to stop a release

npx reaproof --fail-on high

It exits with 1 when something critical or high would ship. Add it after your build step. With --sarif the findings go to GitHub code scanning.

After you deploy

npx reaproof https://your-site.example

A local fix does not reach a site that a hosting platform builds from the repository. This checks what the live site serves. Use it on sites you run.

Check the build you are about to ship

It reads first, rates the risk, and asks before it changes anything.

npx reaproof

What you can point it at

Web, desktop, mobile, programs and the archives they ship in

Web builds

Next.js, Vite, Create React App, Nuxt, SvelteKit, Astro, React Router and any folder of HTML, JavaScript, CSS and maps. Of a server-rendering build it reads what browsers load.

Desktop apps

Electron apps and their .asar, Tauri apps (their screen code is checked in the project folder), and Mac apps with every framework and helper inside.

Mobile apps

Android .apk and .aab, React Native bundles and Hermes bytecode, iOS .ipa, Flutter builds.

Programs

Mach-O, ELF and PE programs, .NET assemblies, Go and Rust builds, and WebAssembly modules. Read without running them.

Archives

.zip and every file in that format, such as .jar and .msix; .tar and .tgz as npm pack writes them. Three deep, in memory.

Not opened yet: .dmg, .pkg, .7z, .rar, .tar.xz and .tar.zst. The report lists them as unread, never as clean.

Ready for CI and review

Made to sit in a release pipeline

  • Exit codes that mean one thing each, so a release check never takes "could not read" for a pass.
  • --fail-on critical|high|medium sets the mildest finding that fails the step.
  • --json for agents and scripts: the verdict comes first, and text copied from scanned files is marked as data, not instructions.
  • --sarif for GitHub code scanning: one rule for each kind of finding, one result for each finding.
  • .reaproofignore for files you know about, in .gitignore patterns. The report names everything it left out.
  • The build's own secrets, compared. Run in the same job right after the build, it compares the job's environment variables named like a secret with what ships, as it does values from .env, so a token in no known format is found too.
  • Reads only by default. fix shows the list and asks, keeps a backup outside the project, and undo reverses it.
  • No dependencies. MIT. Node.js 18.3 or later on Linux, macOS and Windows.
Exit codes
0No leak at the --fail-on level or above (high, unless you set it)
1A leak at that level or above would ship
2A usage error, or a target that could not be settled on
3What ships could not be read: not rated
4Reaproof itself ran into an error
GitHub Actions, with code scanning
permissions:
  security-events: write
steps:
  - uses: actions/checkout@v7
  - uses: actions/setup-node@v7
  - run: npm ci && npm run build
  - run: npx reaproof --sarif > reaproof.sarif
  - uses: github/codeql-action/upload-sarif@v4
    if: ${{ !cancelled() }}
    with:
      sarif_file: reaproof.sarif

Real runs

What the report said, word for word

[CRITICAL] Your original source code is public

rea risk: very high → baseline

Our web test app, before and after reaproof fix. rea named 4 of 4 original files before the fix and 0 after.

[HIGH] An Android app ships as a development build

rea risk: high

Termux 0.118.3, the debug build from its GitHub release. Debuggable, as aapt says, and 209 of its 211 own classes keep their names.

[HIGH] Files that should never ship are in the output

rea risk: high

A dotnet publish of our .NET test app. It puts the .pdb debug files beside the app by default. Reaproof 0.6.0 rated the same output baseline.

[MEDIUM] Names meant for development are still in the program

[NOTE] Function names and source paths stay in a Go program

Our Go test program, a default go build for Linux: 2,519 names, as readelf counts them. Stripped, it still keeps 1,796 function names, which Go reads while it runs.

Counts checked against

  • aapt
  • dexdump
  • bundletool
  • readelf
  • otool
  • nm
  • codesign
  • wasm-objdump
  • @electron/fuses
  • go version -m
  • .NET metadata reader
  • git check-ignore
  • OASIS SARIF 2.1.0 schema
  • rea 6.5.0

Get started

Your first check, in four steps

  1. Install Node.js 18.3 or later, if you do not have it.
  2. Build your app as you would for a release.
  3. In the project folder, run npx reaproof.
  4. Answer y to take out what it can, then fix the rest from the top and run it again.

Give it to your AI agent

npx skills add Junhan2/reaproof

In Claude Code you can also install it as a plugin:

/plugin install reaproof --marketplace Junhan2/reaproof

What it cannot do

Reaproof does not make an app impossible to copy. Nothing can.

  • Screen structure and the server addresses your app calls stay readable, because they reach the user's device.
  • Minified code stays readable in structure, and its numbers and strings stay as they are.
  • The only logic nobody can read is logic that runs on your server.