The story
An end-to-end test rarely fails because the product is broken. It fails because a button moved, a class was renamed, or a page took 300ms longer than it used to. So I watched tests get narrower until they checked almost nothing, or watched someone spend a day a week keeping them alive.
A test written against selectors has no idea what it’s
looking at. It knows there is an element at .btn-primary. It doesn’t know
there’s a button that says Continue. A person testing the same page never has
that problem, because a person reads the screen.
The product
You ask Domia for something in plain language and it drives the application. There are no recorded steps, and it’s the same loop for a web page or an Electron app. I built it as a TypeScript monorepo: an agent layer over any LLM provider, a Playwright tool layer, an Electron desktop app and a CLI.
Calling the model is the expensive part, so it happens last. A deterministic pass over a site’s files, headers and HTML settles whatever it can in pure functions: twenty findings in about a fifth of a second, with no model and no browser. The agent only picks up what is left. Every run is recorded as a tree and replays from its own tape without calling the model again.
What it prints
The sweep runs on a clean checkout with no API key:
$ domia audit https://example.com --sweep-only
▶ sweep: https://example.com (deterministic pass — no model)
11 requests in 215ms → 20 findings
▲ serious security No Content-Security-Policy
verified · security.csp-missing · fix (S): Ship a CSP, starting in report-only mode.
▲ serious security No HSTS
verified · security.hsts-missing · fix (S): Send HSTS with a long max-age once https is confirmed.
● moderate files No robots.txt
verified · files.robots-txt · fix (S): Publish /robots.txt.
● moderate seo No meta description
verified · seo.description-missing · fix (S): Add a meta description of 120–160 characters.
· minor agentic No /llms.txt
verified · agentic.llms-txt · fix (S): Publish /llms.txt.
…
Every finding carries the rule that produced it and the fix, sized.
It’s a beta and it says so. What’s missing is the ordinary part: entering a key from the desktop UI, proper empty states, and signed builds.