Uindow vs. Puppeteer
Puppeteer hands you a toolbox. Uindow hands you the finished chore.
Both speak CDP, so both can issue trusted events. The difference is everything Puppeteer makes you build yourself - natural movement, a recorder, a results screen, pause-and-resume, agent hookups - already done, in an app you don't have to assemble.

Batteries included, assembly optional
Everything you'd bolt onto Puppeteer - cadence, recorder, results, MCP, a local LLM - already in the box.
Uindow
Puppeteer
Results you can actually use
Puppeteer gives you a raw CDP connection and leaves screenshots, logs, and artifacts entirely to you. Uindow's results screen saves the files it downloads, plus screenshots, full video, structured tables, and detailed logs - all searchable, filterable, and exportable as real files, out of the box.
Trusted events, every time
Both Uindow and Puppeteer issue trusted events via CDP. Uindow adds natural, non-linear mouse movement and human typing cadence on top - the stuff you'd otherwise bolt on with ghost-cursor and hand-tuned curves and then maintain forever.
Full video of every run
Recording runs in a separate worker, so it never drops a frame - not during page loads, reloads, or failures. In Puppeteer, capturing video is a DIY project.
A recorder that writes it for you
Hit record, use the browser, and Uindow turns your clicks into clean, deterministic JavaScript. Puppeteer is code only - every workflow is hand-written.
Waits for you when it matters
Some steps need a person: a login, a captcha, a one-time code. Uindow pauses mid-run, asks you to step in, and picks up exactly where it left off - so a single wall doesn't sink the whole automation.
State that carries between runs
Each runner gets a persistent global store that remembers values from one run to the next, plus a run-level store that resets cleanly every time - both readable and writable from your modules.
Inputs kept out of your code
A module's inputs - logins, files, anything sensitive - live separately from its source. Hand someone the automation and nothing secret comes with it, and you decide exactly which files each run may touch.
Modules you can read and share
Automations are portable
.js.yaml modules: genuinely human-readable, easy to diff and debug, and yours to keep private or publish for everyone.Private by default
Uindow runs entirely on your machine; your credentials, tokens, and the sites you automate never leave it. Self-host Puppeteer and you own the IP and scheduling strategy; run it in the cloud and you inherit datacenter-IP detection. With Uindow, local and private is the default.
CLI and MCP, built in
Drive Uindow from the command line or hand it to any AI agent over MCP - both built in. With Puppeteer, you build the CLI wrapper and the agent integration yourself.
A local, private LLM
Need a model to summarize or classify mid-run? Call a small LLM running right on your machine: private, offline, and zero cost per step. With Puppeteer you integrate and pay for an external API yourself.
The best selectors, open-sourced
Stop hand-writing brittle selectors. Explore any page inside Uindow and get the single best CSS selector in one click - no DevTools. Our engine treats selection as a search problem, ranks every candidate, and emits readable compound selectors with fallbacks already computed. We open-sourced the whole thing as @uindow/css.
Built for humans, not hackers
Uindow isn't for anti-bot obsessives. It's for teachers, office workers, and anyone stuck clicking through a site that refuses to release an API. Ease of use, privacy, and peace of mind come first - the realism is just a happy bonus.
Loved by the people behind these products