# Sample notes: "Browser games that actually work offline"

Snapshot date **2026-09-28**, US connection. This file goes with `candidates.tsv` (61 distinct games: 40 OK, 21 EXCLUDE), `sources-archive/` (every source list page) and `checks/` (the per-source draw, the load check, robots.txt files and terms pages).

manxlab.com is **not** in the list. No source named it. If the guide includes it, add it as a separate, disclosed entry and do not count it as part of the sample.

## 1. The rule

1. **Source (a), search.** Run three queries on 2026-09-28: `offline browser games`, `games that work offline in browser` and `pwa games offline`.
   - The engine was Claude Code's WebSearch tool (US). It returns about 9–10 organic results per query and does not say which engine it uses. **It is not literally Google or Bing.** Scraping a Google or Bing results page directly would breach their terms, so that was not done.
   - The union of the results gives 20 distinct pages, A01–A20. They are listed in `sources-archive/search-results-2026-09-28.txt`.
2. **Source (b), PWA directories.** Use the games category of every public PWA directory that is live and lists games today: **B1** store.app and **B2** webappfinder.app.
3. **Draw.** From each source page, take the **first 5 playable web games in document order**.
   - A game counts if it is named as a recommendation, as a heading, a list item or a game tile.
   - Skip:
     - non-games (tools, Pokédex-style apps, dice rollers);
     - app-store or extension-only titles;
     - games the page names as counter-examples (A12's "Games that never work offline");
     - games whose URL cannot be resolved (see 3).
   - The cap of 5 is applied **before** deduplication. A game named on two pages counts toward both pages' 5.
4. **Resolving the URL.**
   - If the page links the game, use that link.
   - If it names a game without a link, use the URL that another source page in this sample links for the same game. If there is none, use the game's official home.
   - If the resolved URL does not load, the entry stays in the table as EXCLUDE (unreachable). No mirror is substituted.
5. **Dedupe** by final URL after redirects, ignoring a trailing slash. Same game title on different sites, for example five different 2048s, is kept separately because each is a different build.
6. **Terms gate.** Check the ToS and robots.txt of every site. If automated access is forbidden, the verdict is **EXCLUDE** (the same bar as Poki and CrazyGames in the weight study). Otherwise it is **OK**.

### Sources, archived pages and what was drawn

All archives are in `sources-archive/`. Every page was fetched once with curl, except A17 and A19, which returned 403 to curl and were rendered once with Playwright.

| ID | Page | Archive | Drawn (first 5) |
|---|---|---|---|
| A01, A02 | Chrome Web Store extensions | — | **Not used**: browser extensions, not web games |
| A03 | https://itch.io/games/html5/tag-offline | `a-itch-tag-offline.html` | Life in Quarantine, Pico Dino, Racing Dash 2D, Robbing the Safe, Merge Game |
| A04 | Wikipedia, "Surf (video game)" | — | **Not used**: Edge's built-in `edge://surf` has no web URL |
| A05 | https://idev.games/games/tag/Offline | `a-idev-tag-offline.html` | AfroMan Rebel Hunter, Abeilles score, Accorder les bots, Course des abeilles, Jahia pop |
| A06 | https://weeklyarcade.games/games/offline/ | `a-weeklyarcade-offline.html` | Threadline, Scarwrit, Fairway Nine, Gearloom, Duneburst |
| A07 | https://playbrain.games/blog/offline-browser-games-no-wifi-needed | `a-playbrain-blog.html` | 2048, Sudoku, Solitaire, Tetris, Chess (its "Quick Pick", on PlayBrain) |
| A08 | https://playbrain.games/offline-games | `a-playbrain-offline.html` | 2048, Sudoku, Minesweeper, Snake, Tetris |
| A09 | https://github.com/Gams-Offline/Gams | `a-github-gams.html` | **None**: a download-the-zip collection with no hosted URL |
| A10 | https://gamezipper.com/blog/free-games-no-wifi-no-download.html | `a-gamezipper-blog.html` | Snake, 2048 Galaxy, Brick Breaker, Memory Master, Wood Block Puzzle |
| A11 | onlinegamespix.com/blog/13-best-offline-… | — | **Unreachable**: DNS does not resolve (curl and Chrome) |
| A12 | https://nointernetgame.com/blog/games-that-work-without-wifi | `a-nointernetgame-blog.html` | Dinosaur Game, Slope, Run 3, 2048, Minesweeper (skipping its "never work offline" trio) |
| A13 | https://dinogame.gg/blog/best-browser-games-no-internet/ | `a-dinogame-blog.html` | Chrome Dino (dinogame.gg), Cookie Clicker, 2048, A Dark Room, Kittens Game |
| A14 | https://github.com/ylxdzsw/offline | `a-github-ylxdzsw.html` | **None**: source code only, with no hosted URL on the page |
| A15 | https://github.com/hemanth/awesome-pwa ("Games and Entertainment") | `a-github-awesome-pwa.html` | 2048 (play2048.co), Backgammon, Cybercar, Falling Nikochan, Farmhand |
| A16 | https://dev.to/aerabi/pwa-and-offline-games-3b2e | `a-devto-aerabi.html` | **None**: names no games |
| A17 | https://www.juegostudio.com/blog/progressive-web-app-games-how-to-create-them | `a-juegostudio.html` (rendered) | Tower Game, Bubble Pairs (it names only 2) |
| A18 | https://bsscommerce.com/services/blog/pwa-games/ | `a-bsscommerce.html` | Waterwars, Pacman, The Cube, Paper Planes, HexTris (names only, resolved) |
| A19 | https://www.tigren.com/blog/pwa-games/ | `a-tigren.html` (rendered) | The Cube, Pacman, BreakLock, Tower Game, 2048 (Opera PWA demo) |
| A20 | https://simicart.com/blog/pwa-games/ | `a-simicart.html` | Tower Game, Hangapp, Bubble Pairs, The Cube, Tetra |
| B1 | https://store.app/browse/all/games ("Best Games Apps") | `b-storeapp-games.html` | Songl.io, Narrow One, Squaredle, PROXX, Tower Game |
| B2 | https://webappfinder.app/, rows `data-cat="games-leisure"` | `b-webappfinder-home.html` | BZO Battlezone Online, Wordle, Chess.com, Lichess, GeoGuessr |

`checks/draw-per-source.tsv` has the full per-source draw before dedupe (72 rows, giving 61 distinct games).

Directories that were tried and not used:
- **appsco.pe**: 503 on two tries during the session.
- **findpwa.com**: an empty JS shell even when rendered.
- **pwa-directory.appspot.com**: 404.
- **progressiveapp.store**: DNS failure.
- **0data.app**: a data-ownership directory with no games category.
- **Microsoft Store PWA listings**: they open the Store app, and a Store listing is not a web URL a player opens.

## 2. Terms and robots.txt verdicts

The ToS pages are saved in `checks/terms/` (`.html` plus extracted `.txt`) and robots.txt files in `checks/robots/`. All were fetched on 2026-09-28.

### EXCLUDE: automation forbidden (19 games, 7 sites)

- **idev.games** (5 games). https://idev.games/terms-of-service, Acceptable Use: "You agree not to … **Use automated bots, scripts, or scrapers without permission**." robots.txt allows everything, but the ToS clause decides.
- **Weekly Arcade** (5 games). https://weeklyarcade.games/terms/ (last updated March 17, 2026), §4 User Conduct: "you agree NOT to: … **Use automated scripts, bots, or tools to interact with the Service**." robots.txt is `Allow: /`. The ToS link appears only in the rendered footer.
- **GameZipper** (5 games). https://gamezipper.com/terms/ (last updated May 21, 2026): "you agree NOT to: … **Use automated tools to access our games without our written consent**." robots.txt has `Crawl-delay: 1`.
- **Squaredle** (B1). https://squaredle.app/terms: "you agree not to use any data mining, **robots, or similar data gathering and extraction methods when accessing the Site** or using the Services."
- **Chess.com** (B2). https://www.chess.com/legal/user-agreement: "[you will not] **use any robot, spider, site search/retrieval application, or other manual or automatic device or process to retrieve, index, "data mine,"** or in any way reproduce or circumvent the navigational structure or presentation of the Services". A separate AI clause adds: "You may not use automated or artificial intelligence (AI) tools to access, scan, scrape…". robots.txt also disallows `/game/`.
- **Wordle / NYT** (B2). https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-Service §4.1: "without NYT's prior written consent, you shall not: … (2) **use robots, spiders, scripts, service, software or any manual or automatic device, tool, or process designed to data mine or scrape the Content** … (NYT's robots.txt notice does not constitute NYT's prior written consent under these Terms of Service)".
- **GeoGuessr** (B2). https://www.geoguessr.com/terms: "[you will not] **use automatic programs or scripts, including but not limited to web spiders, crawlers, robots, ants, indexers, bots** … or other programs that may make multiple server requests per second, or that unnecessarily burden or hinder the operation…". This is a judgement call, because the clause is arguably load-qualified. It is excluded because:
  - a page load in headless Chrome does make several requests per second;
  - robots.txt disallows `/game/`, where play happens;
  - play needs an account, so an offline test of the home page would be meaningless.

### EXCLUDE: other reasons (2)

- **2048 (Opera PWA demo)**, https://2048-opera-pwa.surge.sh/. robots.txt is `User-agent: * / Disallow: /`, so the game URL itself is disallowed.
- **Hextris**, https://hextris.io/. Named by A18 without a link. The official URL did not resolve (DNS) on 28 September 2026. Checked again on 8 October 2026: it resolves, but serves an expired security certificate, so an ordinary browser still warns before opening it. It stays excluded from this edition. `hextris.github.io/hextris/` 301-redirects to it. `hextris.github.io/` is only a landing page. No mirror was substituted.

### OK (40 games)

- **itch.io** (5), OK with conditions. https://itch.io/docs/legal/terms has no automation clause. It prohibits "Soliciting, harvesting or collecting information about others". robots.txt on `*.itch.io` disallows `/*/download/`, `/*/rp/`, `/*/rh/` and `/-/`, and itch.io disallows `/embed/`. Conditions:
  - Load the project page only.
  - The game runs in an iframe from `html-classic.itch.zone`, and several games need a "Run game" click. The harness must state whether it clicks.
- **PlayBrain** (7), OK with conditions. https://playbrain.games/terms: "Use automated systems, bots, or scripts to access the Service **in a manner that sends more requests than a human can reasonably produce**". The clause is qualified by load, so the test is allowed at a human pace. robots.txt `*` disallows only `/admin/` and the `?from=` and `?via=` params. It explicitly allows ClaudeBot and GPTBot.
  - Condition: pace the loads like a human, with one game at a time and seconds between loads.
- **No Internet Game** (5), OK. There are no terms. Only /privacy and /about are linked, and neither has an automation clause. robots.txt disallows `/game.html`, `/random` and `/search-index.json`, none of which are our URLs.
- **Dinogame GG** (1), OK. There are no terms. /privacy/ has no automation clause. robots.txt disallows only `/wp-admin/`.
- **Lichess** (1), OK. https://lichess.org/terms-of-service (last modified 1 August 2026) has no automation or scraping clause, and the site offers a public API. robots.txt disallows `/api/`, `/embed/`, `/game/export/` and others, not `/`.
- **play2048.co** (1), OK. There are no terms, only a privacy policy with no automation clause. robots.txt is `Allow: /`.
- **Cookie Clicker** (orteil.dashnet.org), OK with a flag. There are no terms and robots.txt is 404.
  - **A plain curl got a Cloudflare 403 "Just a moment…" challenge.** A single rendered Chrome load got 200 ("0 cookies - Cookie Clicker").
  - The challenge is a bot check, not a terms clause. The harness may still hit it, so record it as "challenge" rather than "broken".
- **A Dark Room, Kittens Game, Tower Game, Narrow One**, OK. None has terms. robots.txt is Cloudflare's managed "content signals" preamble, with no Disallow and no signal set.
  - Narrow One (Pelican Party) links only https://privacy.pelicanparty.co/, which has no automation clause.
- **Sites with no terms and no restricting robots.txt**, OK: Backgammon, Waterwars, The Cube and BreakLock (GitHub Pages); Tetra (Netlify); Cybercar (Cloudflare Pages); Falling Nikochan (`Allow: /`); Farmhand; Bubble Pairs; Pacman PWA (bobrov.dev, `Disallow:` empty); Paper Planes; Hangapp; Songl.io (`Disallow:` empty); PROXX; BZO.
  - Common /terms paths were probed, following redirects, and none exists. Several return the SPA home page, which is not a terms page.
- **Hosting platforms.** Their terms bind the site owners, not visitors to the hosted sites. They were read anyway:
  - GitHub's Acceptable Use Policies say "Researchers may use public, non-personal information from the Service for research purposes, only if any publications resulting from that research are open access". A free web guide is open access.
  - Netlify's AUP ("users must not access the website through automated methods") is about netlify.com itself, not customer sites.

## 3. Load check

`checks/load.tsv` records status, final URL, bytes, title and the saved page. Each game URL was fetched **once** with curl (Chrome user agent), 2 s apart. The requests were interleaved across hosts (round-robin), so most sites saw 10 s or more between requests. At the end of the queue, PlayBrain had its last two requests 2 s apart.

- 59 of the 61 returned **200**.
- **hextris.io**: DNS failure.
- **Cookie Clicker**: Cloudflare 403 to curl, then 200 when rendered once.
- **One redirect**: `https://nikochan.utcode.net/` goes to `/en`, and the final URL is recorded.

The robots and terms fetches were one request per path, 0.6–1.5 s apart. No game was played and nothing was measured.

## 4. Judgement calls

- **The search engine is not Google or Bing.** It is the WebSearch tool, and its results are recorded verbatim. It is reproducible in spirit: re-running the same three queries on the same day should give similar pages. It cannot be re-run bit-for-bit. If you want real Google top-10s, the only clean route is a manual check by a person, and any differences should be noted.
- **The cap of 5 per page** was fixed before any terms check was done, to keep 15 sources inside 40–70 games. Tag and portal pages (A03, A05, A06, A08) would otherwise contribute hundreds.
- **Games named without links** were resolved as follows. Each resolution is recorded in `checks/draw-per-source.tsv`.
  - A13: Cookie Clicker went to orteil.dashnet.org, 2048 to play2048.co (the link A15 uses), A Dark Room to its doublespeakgames home, and Kittens Game to kittensgame.com/web/.
  - A18: Waterwars and Pacman went to the A19/A20 links, The Cube to the A19 link, Paper Planes to paperplanes.world, and HexTris to hextris.io, which is unreachable.
  - A20: Tetra went to the A19 link.
- **Items skipped as non-games or not freely playable.** Skipping them moved the draw to the next item on the same page.
  - A15: Air Horner (a sound board), Colosseum (a Pokémon stat browser) and Crazy Dice (a dice roller).
  - B1: The Sandbox (a web3 platform whose game runs in a downloadable client) and FrenPet (needs a crypto wallet).
  - B2: Monkeytype (a typing test).
- **B2 has no category page.** `/category/games-leisure/` and similar paths return 404. The draw is the home page's rows tagged `data-cat="games-leisure"` in document order. The order looks recency-weighted: the first row, BZO, was added 2026-09-21.
- **B1 order** is store.app's "Best Games Apps" list as served. The web URL comes from each app's `install/web_app` source in the page payload. For Chess.com that URL was `/register`, so the site root was used.
- **Several sources are rival offline-game portals** that list their own games: PlayBrain, GameZipper, Weekly Arcade, No Internet Game, Dinogame GG and idev.games. That is what the search results were. Three of them (Weekly Arcade, GameZipper and idev.games) forbid automated access, so 15 of the 21 exclusions are their own offline-marketed games. The guide should say they were excluded on their terms and not tested, not that they failed.
- **Multiplayer and online-first games** (Narrow One, BZO, Lichess, Songl.io) were kept, because the rule does not pre-judge offline ability. They will probably fail the offline reload, which is a legitimate finding.
- **The same game appears on several sites** (2048: 3 testable builds plus 2 excluded; Minesweeper ×2; Chrome-dino copies ×2). They were kept as distinct entries, as in the weight study.

## Added 8 October 2026: the "13 of 30" grouping, and what two sources promise

- **The 30.** The page's figure for games "on pages that recommend, tag or mark them for offline play" counts the games drawn from A03 (itch.io "offline" tag), A07 and A08 (PlayBrain), A12 (No Internet Game), A13 (dinogame.gg), A18 (BSS Commerce) and A20 (SimiCart). 13 of those 30 loaded again offline.
- **A wider reading.** A17 (Juego Studio) and A19 (Tigren) are lists of PWA games that praise offline mode in general terms; Tigren also says The Cube can be played without an internet connection. Adding both gives 14 of 31. A15 (awesome-pwa) and the two directories (B1, B2) make no offline statement about the games.
- **A12, No Internet Game.** The archived page says the site "installs the dinosaur game for offline play", that "the rest of the catalogue is embedded from other servers and does need a connection to start", and of games already loaded, "you just can't reload the page". Our reload result for its five games, 1 of 5, agrees with that.
- **A13, dinogame.gg.** The archived page lists twelve games; we took the first five web games. It advises: "load the page once online, then leave the tab open. Don't refresh until you're back online." Our test reloads with the ordinary cache cleared, which is the case that advice warns about. Its first entry is Chrome's built-in dinosaur game; we tested the version hosted at dinogame.gg, not the one built into Chrome.
- **What the test is.** A reload with the network off after clearing the ordinary HTTP cache. It does not test whether a game already open in a tab keeps running when the connection drops.
