Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Minesweeper over exotic boards — flat tilings and 3D surfaces.
Translation pending
GamesTypeScript · PythonGitHub @sirk0OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Classic minesweeper, but the board can be almost any surface and tiling — from a flat aperiodic Penrose mosaic to a Möbius strip.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Classic minesweeper, but the board can be almost any surface and tiling — from a flat aperiodic Penrose mosaic to a Goldberg sphere or a Möbius strip. Play in the browser: (the TypeScript/WebGL app in web/, deployed from master by GitHub Actions; installable, and it works offline once loaded) Goldberg GP(3,0) on a sphere · Bright, domed, light Hexagons on a Möbius strip · Bright, domed, dark Penrose rhombi · Bright, domed, light Snub square on a donut, boom · Bright, domed, dark Hexagons in a Gosper island · Bright, flat, dark A hexagon of hexagons · Classic, beveled, lightRead the full README ↗
Classic minesweeper, but the board can be almost any surface and tiling — from a flat aperiodic Penrose mosaic to a Goldberg sphere or a Möbius strip.
Play in the browser: https://hypersweeper.pages.dev/
(the TypeScript/WebGL app in web/, deployed from master by GitHub
Actions; installable, and it works offline once loaded)
Pick a surface, then a tiling:
< button goes back to the menuEvery board is a link — ?mode=…&difficulty=…, plus a seed to share
the exact layout. Winning files the time: the fastest three per board and
difficulty live under Settings › Best times. It also files an achievement
where there is one to file — fifty-two of them, and none written by hand: they
are the catalogue's own structure, one per kind of tile a board can be made of
(triangles through 13-gons), one for playing a tiling family and one for
finishing it, the same pair for each surface and each group of solids, and one
for the lot. The card that goes up on a win says what it just unlocked and links
to the rest, under Settings › Achievements. Settings also holds the
three themes (the page behind the board and how its cells are cut) over
three colour schemes (auto, following the device, plus light and dark),
three sound presets (synthesised from the move that caused them — a tile's
side count is its voice) with a volume slider, an animations toggle, and —
on a phone that can buzz — a haptics switch.
The hosted game counts, anonymously, which boards get opened and how they go — the board and difficulty, whether it was won and how long it took, how far the board got and how the flags fell, how the game was started, and whether this is a phone, tablet or desktop. No account, no cookie, no identifier, and nothing about the request itself (no IP, no country, no user agent), so there is no way to link two games. The switch is Settings › Privacy › Analytics. The macOS and iPhone apps send nothing at all: they are built without the collector, not merely with it switched off. The full policy is at hypersweeper.pages.dev/privacy.
The game is a TypeScript/Three.js app in web/:
cd web
npm install
npm run dev # http://localhost:5173
npm run typecheck # tsc
npm run test # vitest unit tests
npm run e2e # Playwright e2e + visual regression
npm run build # production bundle into web/dist
npm run screenshots # regenerate the gallery above
make mac-app # build/desktop/mac*/Hypersweeper.app (run this on a Mac)
make mac-app-dmg # …and a drag-to-Applications .dmg
The same game, packaged with everything it draws — bundle, fonts, icons,
board data — inside the app, so it needs no internet connection at all.
The build proves that rather than promising it: it refuses to package a
bundle that references a remote URL, and then launches the app it built
with the network cut. See desktop/README.md.
make ios-app # build the game and open the project in Xcode (on a Mac)
make ios-run # …or build straight onto a connected iPhone
The same game again, wrapped in a Capacitor WKWebView so it installs on a
phone and plays offline — and, being native, can reach the Taptic
Engine: a light tick when a flag lands, the system's sharp error buzz
when you step on a mine, its success buzz when the board falls. No web API
on iOS can ask for that. Building it needs a Mac with Xcode; a free Apple
ID signs it for 7 days at a time. See ios/README.md.
web/AGENTS.md is the guide to the code — the renderer,
the board builders, themes, sound, and how to drive the app headless;
web/README.md is its milestone history.
data/*.json is shared configuration (the board catalog, presets,
UI screens) that both implementations read, plus a conformance oracle
exported from the Python game and replayed by the TypeScript tests, so the
two can never disagree about the rules.
The original game is a Python/pygame app and stays in the repo as the
reference implementation — the behaviour the TypeScript port is checked
against, and the place data/*.json is exported from. It is no longer
deployed to the web; the site root serves the TypeScript app (/next/,
where that app lived during the rewrite, redirects there).
pip install -r requirements.txt
python3 -m minesweeper # menu
python3 -m minesweeper --mode hex # skip the menu
python3 -m minesweeper --theme paper # one of the six pygame themes
Controls match the web app; n starts a new game, 1 / 2 / 3 switch
difficulty and Escape goes back to the menu.
make venv # create .venv with every dependency group
make test # pytest
make lint # ruff
make run # desktop game
make web-run # the pygbag browser build at http://localhost:8000
make help # everything else
Code layout: minesweeper/game.py holds the rules over an arbitrary
cell graph; minesweeper/boards/ generates the tilings (cell
vertices get exact hashable ids — lattice points in 2D, symbolic keys
in 3D — and two cells are neighbors when they share a vertex); the
sphere is built with the Conway gyro operation on an icosahedron;
minesweeper/gui.py is the pygame interface, including the rotatable
orthographic 3D view. Tests run headless via SDL's dummy video driver.
MIT — copy it, fork it, build something else on top of it, commercially or not; the one condition is that the copyright notice comes along. The game itself is free.
Most of it was written with AI assistance.
The two bundled fonts are not covered by that license. Rubik (© 2015 The Rubik
Project Authors) and DSEG7 Classic (© 2017 keshikan) are both under the SIL
Open Font License 1.1, and their license texts ship next to the font files in
minesweeper/assets/fonts/ — mirrored into
web/public/fonts/ so the browser app is self-contained
offline.