Build1 distinct publisher3 min readPublished
Webhands refuses any recipe containing a write-marked click until the caller resends it with confirm:true. That check runs before Cloudflare provisions a browser, so no mutation ever gets caught half-executed.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The gate is a static predicate over a JSON document, not a runtime interceptor. `hasWriteStep` walks the recipe and returns true if any step is a click marked `write: true`; when `confirm` is absent, the handler returns an error and never opens the browser [10]. The ordering is the part worth copying. The refusal lands before the browser is provisioned, so there is no window in which a write step has partially executed and then gets caught [12].
That is a different boundary from the one people usually reach for. Sandboxing isolates the process from the host, but the authority here sits elsewhere: in the logged-in session. The author's framing is that handing an agent a real browser session gives it everything the logged-in human can do, including issuing a refund or canceling an order [3]. Filesystem containment does not extend to refund authority.
The arithmetic on the gate is worth spelling out, because it sets the granularity. The check is one boolean AND evaluated once over the whole recipe [9]. Confirmations required per run is therefore one, regardless of how many write clicks the recipe holds: six write-marked clicks and one write-marked click both unlock on the same `confirm: true` [1]. A confirmed mutation costs exactly two requests carrying the identical body, since you resend the same recipe to execute it [2] - the first refused before any browser starts, the second doing the work.
There is a hole in the classification. It is visible in the type union. `goto` is treated as inherently safe, and the author states that the only action which can change state is a click [6][7]. Any mutation reachable by navigating to a URL sits outside the gate by construction [3]. Plenty of dashboards put a confirm-by-link somewhere in the flow.
For this model to transfer to your stack, two things have to be true. Every state change you care about must be behind a click on a selector you enumerated, and recipes have to be reviewed like code, because the flag is a field in a request body rather than a property of the button it points at [19].
The degrade paths are the best engineering in the writeup. With no Anthropic key set, the prompt-based extractor returns the raw text slice instead of failing, so the pipeline still runs in development [15]. When the key is present it calls the Messages API with a Claude Haiku model, asks for JSON only, strips code fences, and parses, and on a parse failure it returns the unparsed text rather than discarding the result [16]. When the BROWSER binding exists but Browser Rendering is over quota or unprovisioned, the launch is wrapped so it becomes a clean error instead of a crash [18]. Three places where the obvious implementation throws and this one hands back something you can inspect.
If I were adopting it, I would start on the extraction path that takes no model at all: a list of `fields` with CSS selectors, scraped directly [14]. A stale selector fails loudly, while a Haiku extraction that drifts one field fails quietly, and quiet failures in a pipeline that also holds a refund button are the ones that cost money.
Ranked by verification strength, evidence, and original report placement.
Webhands is a computer-use agent that operates dashboards in a real headless browser, returns clean structured data, and refuses any write action unless the caller explicitly confirms it.
The author's stated motivation is tools with no usable API: seller centers, supplier portals and 3PL dashboards where the only way to get the data is to log in and click through the UI like a human.
The author writes that the moment you hand an agent a real browser session you have given it the power to do everything the logged-in human can do, including issuing a refund, confirming a shipment or canceling an order.
The author states that most automation frameworks treat every action the same way, where a click is a click, and calls that the design choice he did not want.
Webhands is driven by POSTing a recipe, which is an entry URL, an optional list of login and navigation steps, and an extraction spec.
The exported Step type is a union of four actions: goto with a url, type with selector, text and optional secret, click with selector and optional write boolean, and waitFor with selector and optional timeoutMs.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Computer use goes GA with a new request shape, and browser automation becomes something you buy1 distinct publisher
build
A build step instead of a backend: 1,025 records, 8 locales, no runtime API1 distinct publisher
product
A 2x LLM bill is not a bug report: token spend is an observability problem1 distinct publisher
build
Anthropic's Browser Use hands Claude element refs, and hands you the browser1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Code shown, nobody else has run it
The strongest thing about this reporting is that it quotes what it claims: the Step union and the gate condition appear verbatim, error string included, so the mechanism is inspectable rather than asserted. The weakness is structural — the author of the code is the only witness to its behaviour, and the runtime claims that matter most operationally (that a launch over quota degrades cleanly, that the refusal always precedes provisioning) are exactly the ones no reader can check from the excerpt.
Publication, not uptake
A public repository link is the only trace of anything leaving the author's machine. No stars, forks, installs, users, production runs against any named portal, or third-party deployments appear anywhere in this reporting, and the piece is candid that the author has been iterating in dry mode without a paid binding. Scoring uptake from that would be invention.
Honest about one limit, silent on two
The framing — a boolean deciding whether the browser launches at all — is accurate, and the author pre-empts the obvious objection by conceding the flag is only as good as whoever types it. What keeps this above zero is the word 'safety model' doing more work than the code: confirmation is granted per run, so one confirm: true clears a recipe holding six write-marked clicks, and the taxonomy that makes navigation inherently safe quietly exempts every mutation reachable by URL. Neither appears in the write-up.
Author writing up his own repo
The interest at work is plain and disclosed rather than hidden: this is a developer showcasing a project he built, ending with a link to his own GitHub, which shapes what gets emphasised — elegance of the gate, cheapness of dry mode — and what stays out, like sustained reliability against real dashboards. Working against a higher reading: there is no product to sell, no pricing, no sponsor, and the paid dependencies named (Cloudflare Browser Rendering, an Anthropic key) are costs the author absorbs rather than revenue he collects.
Narrow claims, one voice
Confidence lands low-to-middling for a mundane reason: everything traces to one dev.to post by the code's author, so there is no corroboration on any point. It is not lower because the claims are unusually cheap to falsify — they are statements about a small public repository, not about market traction or performance under load — and because the author's own caveats about selectors breaking and labels being human-supplied are the kind of admission that tends to travel with accurate description.