Every app in this portfolio is deployed by one person, often several times a day, and until this shipped nothing checked any of them afterwards. Breakage was found by a user, or by me on my phone days later. The first real sweep found live bugs in all four apps it was pointed at, including 31 pages on one study site that 404 only when the link to them ends in a slash.
What it does
A Playwright crawler visits each registered app once a day. It discovers pages from the site’s own links, clicks the safe elements on each one from a fresh load, and records the hard errors: uncaught exceptions, console errors, failed requests, blank screens, dead links, and clicks that land on an error page.
Every finding gets a fingerprint built from the app, the route, the element, the kind of error and a normalised message, so the same failure hashes the same way every day. Each run is compared with the last, which makes a finding new, regressed, ongoing, recovered or suppressed. A recovery is only claimed for a check that actually ran again: a run cut short by its time cap carries an unreached failure forward instead of calling it fixed.
Two layers
- The sweep is a script, not an agent. Same input, same output, no model and no tokens. That is what makes “new since yesterday” mean something.
- Journeys are written by an agent, then run by the script. A human-triggered command explores an app and writes durable specs with real assertions, such as “place a digit in Sudoku and the cell shows it”. Clicking proves nothing crashed. Only journeys prove things work.
Safe on a live site
Safety outranks coverage. Elements named buy, pay, checkout, subscribe, delete, share, submit or sign out are never clicked, and neither is an element with no name. Every request except GET, HEAD and OPTIONS is aborted before it leaves the browser, and payment, publishing and analytics hosts are blocked outright. An integration test proves a “Buy now” button is never clicked and its host is never even contacted.
Where it lives
It ships as doorman qa, a command in Clembot Doorman, so anyone can run it on their own apps with their own Playwright: doorman itself keeps zero dependencies. The results feed a launch-readiness gate, where an open finding blocks a go-live. Email goes out through Resend only when something changed, and the public recap shows counts and app names only. Routes, error messages, screenshots and traces stay on the machine that found them.

