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
翻译准备中
正在加载完整 README。 以下为已保存的摘录。
Browse and play unblocked HTML5 games in the browser or as a Tauri 2 desktop app. Download individual games for offline play via the separate puller backend service.查看完整 README ↗Play online: dixonsolutions.github.io/potatoetomatoe3
Browse and play unblocked HTML5 games in the browser or as a Tauri 2 desktop app. Download individual games for offline play via the separate puller backend service.
pnpm install
pnpm dev # web dev + offline downloader (opens browser)
pnpm app # Tauri desktop + offline downloader
pnpm console-test # native dev harness: touch console + proxy injection
pnpm puller-test # native dev harness: puller health + download lifecycle
Development harnesses are documented in docs/dev-test-harnesses.md.
Offline download runs in a bundled puller backend that starts automatically with pnpm app (Tauri) and packaged Flatpak/AppImage builds. Downloaded games are stored in app data (~/.local/share/com.potatotomato.games/games/), not in the git repo.
For web dev only, pnpm dev also starts the puller. User-downloaded offline/ folders under static/games/ are gitignored.
If game thumbnails or online shells are missing after a fresh clone, restore from the last build:
pnpm games:restore-from-build # copies online/ + metadata from build/games/
pnpm install
pnpm tauri:dev # starts Vite + Tauri; puller auto-spawns in debug builds
pnpm tauri:build # production binary in src-tauri/target/release/
Linux deps: libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
Closing the window hides to the system tray (StatusNotifierItem). Quit from the tray menu to exit. See docs/desktop-tray.md.
App ID: com.potatotomato.games
Requires Flatpak and the Flathub remote:
# One-time setup
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# Remove a broken remote from earlier attempts, if present
flatpak remote-delete potatotomato 2>/dev/null || true
flatpak remote-add --user --if-not-exists --no-gpg-verify potatotomato \
https://dixonsolutions.github.io/potatoetomatoe3/potatotomato.flatpakrepo
# Install and run (branch is stable, not master)
flatpak install --user potatotomato com.potatotomato.games
flatpak run com.potatotomato.games
Updates:
flatpak update --user com.potatotomato.games
If the remote is unavailable (e.g. server has no summary file), install the
.flatpak asset from
GitHub Releases:
# With GitHub CLI:
gh release download -R dixonSolutions/potatoetomatoe3 -p '*.flatpak' -D /tmp
# Or download com.potatotomato.games-<version>.flatpak from the Releases page, then:
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user /tmp/com.potatotomato.games-*.flatpak
flatpak run com.potatotomato.games
Build the Tauri app and puller sidecar on the host first, then package with Flatpak:
git clone --recurse-submodules https://github.com/dixonSolutions/potatoetomatoe3.git
cd potatoetomatoe3
# If you already cloned without submodules:
git submodule update --init --recursive
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub org.gnome.Platform//50 org.gnome.Sdk//50
# Tauri build deps (Debian/Ubuntu)
sudo apt install libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
pnpm install --frozen-lockfile
pnpm puller:bundle:linux
pnpm tauri:build:flatpak
pnpm flatpak:install # build + install to ~/.local/share/flatpak
pnpm flatpak:run
The puller runs as a separate Node package at puller/. It exposes:
| Endpoint | Method | Description |
|---|---|---|
/api/offline/health | GET | Service health |
/api/offline/status | GET | All games' online/offline status |
/api/offline/status/:gameId | GET | Single game status |
/api/offline/:gameId/download | POST | Start offline download |
/api/offline/:gameId/progress | GET | Download progress |
/api/offline/:gameId | DELETE | Remove offline copy |
/games/:gameId/... | GET | Serve offline game files |
Strategies: embed (Unity/Google Sites — Shrek) and generic (iframe wget mirror).
See docs/offline-downloader.md for details.
Touch controls for mobile require same-origin (mirrored) game documents — see docs/touch-console.md.
PotatoeTomatoe3/
├── puller/ # Offline download backend (Playwright + HTTP API)
├── src/ # SvelteKit frontend
├── src-tauri/ # Tauri Rust shell (+ puller sidecar)
├── static/games/ # Game catalog (gitignored except shrek-escape)
├── flatpak/ # Flatpak manifest
├── scripts/ # Catalog generators, port importers
└── docs/ # Architecture & release docs
Every push to main runs .github/workflows/release.yml:
.flatpak bundle/flatpak/ + potatotomato.flatpakrepo)See docs/release.md for CI details and troubleshooting.
| Script | Description |
|---|---|
pnpm dev | Web dev server (opens browser) |
pnpm app | Tauri desktop app |
pnpm puller:start | Start puller backend |
pnpm games:restore-from-build | Restore online shells from build/games |
pnpm tauri:dev | Alias for pnpm app |
pnpm flatpak:build | Local Flatpak build |
pnpm port-game | Import a game from tag2game |
MIT — game assets are third-party content where applicable.