3 entries in this register are declared substitutes for, successors to or predecessors of Patchright (Node), and 1 of them is still shipping at the last field check. Patchright (Node) itself reads ACTIVE, and 2 of the candidates carry a state mark other than ACTIVE or SEMI, which is the part a list without check dates cannot tell you. Every row is judged by the same rubric, from the same sweep, on the same fields.
Every row below is judged by the same rule as Patchright (Node) itself, from the
same field check. Supersession is only printed where a project or its
author says so — this register does not infer that one tool replaces
another because it is newer.
Read the state column with the licence column. A permissively licensed
project that stopped shipping is not safer than a copyleft one that did
not.
What Patchright (Node) does, so you know what you are replacing
A Playwright drop-in that removes the automation tells the protocol itself introduces — the Runtime.enable call being the well-known one — rather than papering over their effects from inside the page.
A substitute has to do that job, not merely occupy the same category. Because it is a patched fork rather than a plugin, the version you install is bound to a Playwright version. Confirm which upstream release the current patch set tracks, and re-confirm it after any Playwright upgrade.
How this register decides what counts as an alternative
Patchright (Node) is recorded as the successor to rebrowser-patches. Both directions of that edge are stored once and reversed when the index is built, so the graph cannot contradict itself in one direction and agree in the other.
Patchright (Python), puppeteer-extra are recorded as substitutes for the same job. The alternative relation is symmetric and carries no ordering at all: it says these things answer the same question, and it says nothing whatsoever about which answers it better.
Nothing on this page is a ranking, a score or a recommendation, and nothing on it is a detection-test result — no entry in this register has been run against any anti-bot system by this register. What the table gives you is four measured columns and one derived one, applied identically to every row.
How to read the comparison above
1 of the 3 candidates read ACTIVE or SEMI and 2 do not. Start by reading the state column, then read the last-push and latest-release columns against each other, because they answer different questions: a push says somebody is there, and a tag says there is something you can pin a dependency to.
1 of the entries in the table declare no licence at all — rebrowser-patches. Read that column before the state column if you intend to ship anything: an absent licence file is an absent grant, and no amount of recent activity substitutes for one. Every no-licence entry in the register is grouped together for the same reason.
Why NRND: pushed_at = 2025-05-09 — 462 days, inside the 365–1095 day NRND band.
Field
Value at this printing
pushed_at
2025-05-09
archived
false
latest_release
—
license.spdx_id
null (none declared)
stargazers_count
1400
http_status
200
fetched_at
2026-08-14T09:12:00Z
rubric_edition
2nd, in force
Endpoint: GET https://api.github.com/repos/rebrowser/rebrowser-patches
unauthenticated · 60 req/hr
A live read does not change what is printed above it. The site records that you ran it; what GitHub returned is not kept. The printed state moves only when the register is swept and a new printing is issued. raw JSON
Why ACTIVE: pushed_at = 2026-08-09 — 5 days, within the 90-day ACTIVE threshold.
Field
Value at this printing
pushed_at
2026-08-09
archived
false
latest_release
—
license.spdx_id
Apache-2.0
stargazers_count
1500
http_status
200
fetched_at
2026-08-14T09:12:00Z
rubric_edition
2nd, in force
Endpoint: GET https://api.github.com/repos/Kaliiiiiiiiii-Vinyzu/patchright-python
unauthenticated · 60 req/hr
A live read does not change what is printed above it. The site records that you ran it; what GitHub returned is not kept. The printed state moves only when the register is swept and a new printing is issued. raw JSON
Why NRND: pushed_at = 2024-07-18 — 757 days, inside the 365–1095 day NRND band.
Field
Value at this printing
pushed_at
2024-07-18
archived
false
latest_release
—
license.spdx_id
MIT
stargazers_count
7400
http_status
200
fetched_at
2026-08-14T09:12:00Z
rubric_edition
2nd, in force
Endpoint: GET https://api.github.com/repos/berstend/puppeteer-extra
unauthenticated · 60 req/hr
A live read does not change what is printed above it. The site records that you ran it; what GitHub returned is not kept. The printed state moves only when the register is swept and a new printing is issued. raw JSON
Still the most-copied answer on the internet and two years without a push. That gap is the single best argument for this catalogue existing. — ED.
Answered from the same fields the table above prints, and from no other source.
What is the best alternative to Patchright (Node)?
This register does not answer that, because it publishes no ranking and has tested no tool to rank. What it can tell you is which candidates are still shipping: Patchright (Python). The rest of the decision is fit, licence and how much of your own stack you are prepared to change.
Are these Patchright (Node) alternatives still maintained?
Patchright (Python) reads ACTIVE. Each of those states is derived from that entry's own measured fields by the rubric in force, at the field check printed in the folio, and the clause that produced it is printed on the entry page.
Why does this list not rank the alternatives?
Because a ranking would be an opinion wearing a number's clothes. Every figure on this site is a date, a count, an SPDX identifier or an HTTP status you can re-fetch from the endpoint named beside it, and there is no honest way to compress those into an ordering without inventing weights nobody published. The rubric sets states; it does not rate them against each other.
Where does the alternatives data for Patchright (Node) come from?
From declared edges in the register itself, never inferred. Each edge is stored once and reversed at build time, and every field in the table is read from the same sweep that produced the rest of the catalogue. The whole set is downloadable as CC0 JSON and CSV, including the supersedes, superseded_by and alternative_to columns.
Everything in section 02 is a patch applied to somebody else's automation stack, which means every one of them inherits that stack's release cadence and breaks on its own schedule. Donut Browser starts from the other end: the fingerprint handling is in the browser it ships rather than in a layer bolted onto a driver, and the local REST API and MCP server mean automation talks to it directly instead of through a patched client library.