In early October a wave of "vibe-coded" browser ports went viral: Halo, The Simpsons: Hit & Run, GTA Vice City, Call of Duty Zombies, all running in a browser tab, many of them built with heavy help from AI coding tools. Lists of them spread on X faster than anyone could check them.
I run PortedGames, a directory of these ports (browser builds, PC ports and recompilations). It re-checks every entry once a day, because the first question people ask is "does this one still work?". Within two weeks the more interesting question was "which ones got taken down, and by whom?". So I started a takedown tracker.
This post covers what the data shows so far, and why the obvious way to detect a takedown (check the HTTP status) misses many of them.
The numbers (as of Oct 19, 2026)
12 ports taken down after a copyright claim since Sep 11:
| Rights holder | Takedowns |
|---|---|
| Activision | 5 |
| Mojang / Microsoft | 2 |
| Rockstar Games | 1 |
| SEGA | 1 |
| SNK | 1 |
| Maddy Makes Games | 1 |
| Not named by the site | 1 |
A few things stand out:
- Activision took down four Call of Duty browser remakes on the same day (Oct 10), all by one developer, plus an unreleased AI-assisted decompilation of Modern Warfare 2 that was reportedly hit a week earlier.
- Time online varies a lot. Of the 9 ports with a known release date, the median stayed up for 29 days. The GTA V browser port lasted hours. A Celeste WebAssembly port sat on GitHub for 321 days before its game data was removed.
- It isn't only browser remakes. The list includes a static recompilation (Metal Slug XX, Xbox 360), a "clean-room" Minecraft reimplementation that Mojang says contains over 2,000 original files, and a long-running campaign against Eaglercraft repositories (18 GitHub notices since August).
- 8 of the 12 never produced a public GitHub DMCA notice. The ports ran on their own domains or on hosts like Railway and Cloudflare Pages, so the usual place to look (github.com/github/dmca) doesn't show them.
Every row on the tracker links its evidence: the notice, the author's post, or what the site itself now says.
Why status codes lie
My first link checker was the obvious one: request the page, 2xx means up, 4xx/5xx means down. It reported the first port below as working even though the game was gone.
1. Notice pages return 200 and keep their title. The Modern Warfare 2 browser port "Open Victor Zulu" still serves a page titled "Open Victor Zulu". The body is now a short notice saying the game was taken down "due to a DMCA request". A status check sees 200. A title check sees the game's name. Only the body text tells you it's gone.
2. Dead addresses get recycled. Three pages.dev addresses that used to host Call of Duty remakes now all redirect to the same unrelated site. Follow the redirect and you get a 200 from a page that has nothing to do with the game.
3. Bot protection looks like "up". Some hosts answer automated requests with a Cloudflare "Just a moment..." challenge page (200) or a 403/429. The first looks up when it might be down. The second looks down when it's probably fine.
4. Takedowns don't always reach GitHub. As above: if the port isn't on GitHub, there's no public notice to find.
What the checker does now
The daily check is a small Node script. For each port:
- 2xx in under 6 seconds: Working. 2xx but slow: Slow. 4xx/5xx or a network error after one retry: Down.
- 403/429: inconclusive. Keep the previous status and don't bump the "last checked" date, rather than mark a working port as down.
- Read the body, not just the status. If the visible text is short (game pages are mostly JavaScript; notices are a few lines) and reads like a takedown notice, flag it:
// A 200 is not enough: taken-down ports often keep serving a short notice page.
const TAKEDOWN =
/\b(taken (the game |it |this )?(down|offline)|(game|site|project) (is|has been) (taken down|removed|shut down|discontinued)|offline for now|no longer (available|online|playable)|due to an? (DMCA|copyright|legal)|DMCA (request|notice|takedown|complaint)|cease and desist|received a takedown)\b/i;
const SHORT_PAGE = 4000; // visible characters
const m = text.length < SHORT_PAGE && text.match(TAKEDOWN);
- Expect something specific. Each entry can declare a string that must appear on the page (usually the game's own name). If a recycled domain redirects somewhere else, that string is missing and the entry gets flagged.
- A person confirms. The script only ever flags. "Taken down" is set by hand after reading the page and finding a source, and the script never overwrites it. A regex is good at noticing; it isn't evidence.
The short-page limit matters more than it looks. Some real game pages mention "DMCA" in a footer or FAQ. Restricting the match to short pages keeps those from being flagged, because a working WebAssembly game page has very little visible text before the game loads.
The data
The tracker is at portedgames.com/takedowns, and the same rows are available as JSON at portedgames.com/takedowns.json (rights holder, method, release and takedown dates, days online, sources). It's free to use with a link back. If you know of a takedown I've missed, or I got something wrong, the contact address is on the page.
One note on scope: the directory never hosts or links game files, ROMs or ISOs, only each project's own page, and ports their authors closed voluntarily aren't counted as takedowns.
I run PortedGames, so take the framing with that in mind; the evidence for each row is linked so you can check it yourself.
Top comments (1)
The notice page that keeps the game’s title is sneaky. One more check that might be easy to add: hit the actual .wasm or main JS bundle the page loads, not just the HTML. When a port gets taken down the assets usually 404 first, even if the landing page still looks fine.