Keep the request that answered wrong
Flag a request that returned the wrong answer without crashing. Crumbtrail keeps it and replays it, so you can compare its answer before and after a change.
GET /api/quote · 200 · shipping.total = 0 → keepCrumbtrail records each failing request with the rows, cache keys and outside calls it touched. Then it rebuilds exactly that state on your machine, so your real code fails the same way it did in production. It brings only the rows that request touched, so you skip the production restore.
For engineering and support teams chasing bugs that only happen in production.Example output.
The customer's rows, the cache state, the outside service that answered oddly. Your machine has none of it. The bug won't happen there, so every fix is a guess.
Your AI coding agent says it fixed a production bug. Here's how Crumbtrail verifies that fix.
Crumbtrail recorded this failing request in our test shop, and saved the database rows behind it.
Then it replays the bug on your real code, sealed off from production. It fails the same way every time: same status, same error, same line of code.
The agent's fix is on a branch. We run the original code and the fix, ten times each, against the same recording.
The original fails every time. The fix never does.
Every database read the fix made came from the recording. So Crumbtrail calls it: fixed.
Copy the summary into your ticket, and move on.
Add the recorder to your start command. It saves each failing request with the database rows and outside calls it touched.
loads from your start commandCrumbtrail rebuilds production's state for that request in a throwaway database on your machine, cut off from every live system. Your real code must fail the same way 10 times out of 10.
same status, error type, database error and code lineGive the recording to a developer or a coding agent. They run the production failure on their own machine as often as they need.
any coding agent or a personThe patched build runs from the same production state. The runs decide the result: fixed, still broken or could not tell.
report names the exact recording and build# set up the recorder in your app. no changes to your code. shows the database settings it needs. $ crumbtrail install # one time, with your database owner's OK: turns on logical replication. needs a direct connection, not a pooler. $ crumbtrail install --apply-db
Crumbtrail checks a patch only against the state it recorded. If the patch reads data the recording never saw, Crumbtrail names what's missing instead of guessing.
The recorded failure is gone on all 10 runs, and every database answer the patch relied on came from recorded data.
The same failure comes back, or a new one appears. You see which, and where in your code.
The error went away, but the patch read rows the recording didn't capture. You get the list of what it couldn't check.
The outputs shown on this page are examples. Crumbtrail reproduces failures in open-source apps from GitHub as well as our own test apps.
Flag a request that returned the wrong answer without crashing. Crumbtrail keeps it and replays it, so you can compare its answer before and after a change.
GET /api/quote · 200 · shipping.total = 0 → keepThe request that failed often isn't where the bug started. Crumbtrail lists the earlier requests that wrote the rows it read, so you know where to start looking.
POST /cart wrote cart 812 → POST /checkout read it → failsCrumbtrail cuts the recording down to the few rows that still trigger the bug, so a person can read it. Fix checks always use the full recording.
212 rows in 9 tables → 14 rows in 3 tablesBefore a release, replay every saved failure against the new code and see which ones still happen.
crumbtrail compare <rec> --base main --head releaseThis is what works today. Ask us about your setup during early access. If your app does something outside this list, replay flags it and makes no claim it can't back.
No. Crumbtrail keeps only the rows each failing request touched, and rebuilds them in a throwaway database on your machine.
The same status, error type, database error code and line in your code as production, on all 10 runs. The error message is saved but not compared.
It means the recorded failure no longer happens on any of 10 runs, against the recorded data. It doesn't promise the patch has no other bugs, or that the result is the right one for your business.
No. The recorder loads from your start command. The one setup step is a database setting that lets it see full rows when they change.
No. An agent can write the patch. The verdict comes from replay runs and fixed rules.
No. Each run gets its own throwaway database on the same machine, and all other network access is blocked. A call it didn't record fails the run, unless the app made the same call earlier in the recording. Those answers are listed.
Environment values named like secrets, tokens, keys or passwords are dropped before anything is saved. Credentials in recorded outside calls are swapped for fakes.
On our test app it adds about 0.45 ms per request with one user, and roughly doubles the app's CPU per request with eight at once. Measure it on your own traffic during early access.
Early access is open. Leave your work email to join the list.