FlakeMonster

An async fuzzer for JavaScript

░  Your test ran too fast and left a bug behind.

░  Your test flaked!

In your development environment:

That's why your tests are flaking.

Fuzz your async timing with deterministic await delays to surface the bugs that hide within.

$ npx flake-monster test --cmd "npm test"
$ npm install flake-monster
<script type="module" src="https://unpkg.com/flake-monster@0.4.6">
$ curl -L registry.npmjs.org/flake-monster/-/flake-monster-0.4.6.tgz | tar xz
Real demos! No mocks!

How It Works

FlakeMonster uses Acorn to parse your code into an AST, walks the tree to find async functions and top-level module statements, injects delay nodes, then generates the modified source.

Your JavaScript source code.

Operational Jitter

See how FlakeMonster reorders async operations by injecting deterministic delays.

Without FlakeMonster

With FlakeMonster

Code Injection Intensity

Watch FlakeMonster inject delay statements into real JavaScript code.

Original

Injected

File / Seed Based Determinism

Each seed is combined with the file path and function name to derive a unique delay. Same seed, same delays, every run.

seed
src/user.jsloadUser()
src/cart.jsgetCart()
lib/auth.jscheckAuth()

  

Agent Skill

Uses the open Agent Skills standard. One SKILL.md works across Claude Code, Codex, Copilot, and more.

Install the skill One command drops the skill file into your project
Use the slash command Type /flakemonster followed by your test command
Get a flake report Your agent runs multiple seeds, analyzes results, and reports flaky tests
$ mkdir -p .claude/commands && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .claude/commands/flakemonster.md
$ mkdir -p .cursor/skills/flakemonster && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .cursor/skills/flakemonster/SKILL.md
$ mkdir -p .agents/skills/flakemonster && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .agents/skills/flakemonster/SKILL.md
$ mkdir -p .github/skills/flakemonster && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .github/skills/flakemonster/SKILL.md
$ mkdir -p .windsurf/skills/flakemonster && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .windsurf/skills/flakemonster/SKILL.md
$ mkdir -p .agent/skills/flakemonster && \
  curl -sL https://raw.githubusercontent.com/growthboot/FlakeMonster/refs/heads/main/SKILL.md \
  -o .agent/skills/flakemonster/SKILL.md
Usage
// Type in any supported agent:
/flakemonster npm test
/flakemonster npx playwright test
/flakemonster --runs 20 --mode hardcore npx jest
New

GitHub Action

Catch flaky tests on every pull request. Automatically.

Add one file Drop a YAML workflow into your repo
Push code FlakeMonster runs 5 seeds on every PR
See results A detailed comment lands on your PR
retrigger: wait for npm cache e9bf241
retrigger: action now fails on flake 0b36d45
retrigger: clean restore 8315e73
One check has failed 1 failing check
Flake Check / flake-monster (pull_request) Failing after 13s
No conflicts with base branch Merging can be performed automatically.
flake-monster bot 2 min ago
Found 2 flaky tests across 5 seeds
Test Result Failed seeds
checkout › applies discount 3/5 17 42
auth › refresh expired token 4/5 89
cart › adds item 5/5 ,
user › loads profile 5/5 ,

Pricing

The CLI is free forever. The GitHub Action adds automated flake detection to every pull request.

Open Source

$0
forever

Full CLI with inject, test, and restore. Run locally, run in CI, run anywhere.

  • Full CLI & GitHub Action
  • 50 GitHub Action checks per month
  • PR comments with results
  • Community support
Get started

Team

$29/mo
per team

Gate every pull request with flake detection — no cap, no throttling. Stop flaky tests from reaching your main branch.

  • Unlimited GitHub Action checks
  • Everything in Free
  • Priority support
  • Cancel anytime
Get started

Planned Features

FlakeMonster is just getting started. Here's what's coming next.

TS PY
Up next

More language support

TypeScript, Python, Go, and beyond. The adapter architecture is ready — new languages just need a parser and codegen layer.

Planned

CI dashboard

A web dashboard to track flaky test trends across repos and seeds over time. See which tests are getting worse before they break.

Planned

IDE integration

VS Code extension to inject and restore delays without leaving your editor. One-click flake testing from your sidebar.

Planned

Monorepo support

First-class workspace support for monorepos. Run FlakeMonster across packages with shared seeds and unified reporting.

Exploring

Timing profiles

Named delay profiles (network, database, filesystem) that model real-world latency patterns instead of uniform random delays.

Your idea here

Have a feature request or found a bug? We'd love to hear from you.

Open an issue on GitHub

Our Mission

What if you could throw static at your code and listen for the bugs that surface?

~
Randomness is interesting

Randomness is one of the most underrated primitives in software. Fuzz testing, A/B experiments, fault injection, random isolation. A coin flip in the right place reveals things that careful analysis never will. We think the surface area for this kind of thinking is way underestimated, and we're ready to start exploring it with you.

>
Not everything needs AI

AI is great at many things, but some problems have cheaper, faster, more deterministic solutions. Algorithmic tools run in milliseconds, cost nothing to operate, and give you the same answer every time. There's a huge class of bugs that can be caught without a model ever seeing your code.

*
Beyond delays

Reordering, mutation, boundary injection, symbolic constraints. Algorithmic techniques can catch race conditions, state bugs, and logic errors without understanding a single line of code. We're interested in tools that find mistakes by probing how code behaves, not by trying to read it.