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
Procedurally 생성된 2D 세계 탐험·주변과 상호작용, Preponderous Software의 무료 소스 공개 생존 게임
Explore a procedurally-generated 2D world and interact with your surroundings. A free, source-available survival game by Preponderous Software.
게임TypeScript · PythonGitHub @Preponderous-Software온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
댓글을 불러오는 중입니다.
로그인 상태를 확인하는 중입니다.
Website for Roam — explore a procedurally-generated 2D world. Download builds and learn how to play.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The marketing and download site for Roam,
a free, source-available survival game by Preponderous Software where you explore a
procedurally-generated 2D world and interact with your surroundings.
The site is a small Next.js + MUI app, built as
a sibling of preponderous-dot-org
and dansplugins-dot-com — same theme,
color-mode toggle, chrome, and Docker/CI setup.README 전문 보기 ↗The marketing and download site for Roam, a free, source-available survival game by Preponderous Software where you explore a procedurally-generated 2D world and interact with your surroundings.
How these were captured: headless Chromium (Playwright) against the live site on 2026-10-18 at 1280×800 and 390×844; the GIF is a sequence of real screenshots of /play taken while WASD was held.
The site is a small Next.js + MUI app, built as a sibling of preponderous-dot-org and dansplugins-dot-com — same theme, color-mode toggle, chrome, and Docker/CI setup.
/) — hero (with a "Play in browser" link to /play, and one world shown side by side
in 2D and in 3D, linking to the 3D view at /play?view=3d), an at-a-glance feature grid,
in-game screenshots, and a "how to play" panel (desktop, terminal/text mode, and in the browser)./download) — an "Or play in browser" link to /play, platform cards linking to
the latest GitHub release assets (Windows installer + portable zip, macOS .dmg, and
run-from-source for Linux), and the same "how to play" panel as the home page./version.json — {"version": "<version>"}, the package.json version this build was made
from, sent with Cache-Control: no-store so a deploy can be checked by the version it reports./sitemap.xml — every indexable page (SITEMAP_PATHS in utils/site.ts) at
the production origin; public/robots.txt points crawlers at it.The game's own art (icon, sprites, screenshots) lives in public/ and is shown on the site.
npm install # first time only (a lockfile is committed)
npm run dev # http://localhost:3000
| Command | What it does |
|---|---|
npm run dev | Start the dev server on port 3000 |
npm run build | Production build |
npm run start | Serve the production build |
npm run lint | ESLint (next lint) |
npm test | Run the Vitest unit + component tests |
The download buttons point at a specific Roam release. When a new version ships, bump
LATEST_VERSION in utils/site.ts — that one value drives every direct
asset link. See CONFIG.md for the full content/config reference.
Containerized like its sibling sites:
docker compose up --build # serves on :3000
It is intended to deploy behind the Preponderous gateway nginx box alongside the other
Preponderous sites, served at https://roam.preponderous.org (SITE_ORIGIN in
utils/site.ts).
When the server is given a trace key in USAGE_REPORTING_KEY, it reports one page-view event per
HTML page it serves to trace, as the program roam-website,
carrying the page's path (for example /download — never a query string or fragment) and the site
version. Nothing about the visitor is sent: no IP address, user agent, cookie, session, account or
referrer. No script is added to any page — the report is made by the server (Next.js middleware),
so the key never reaches the browser — and crawlers, uptime monitors, prefetches, API calls,
assets and 404s are not counted.
Every page view also carries a random installation ID for the server (the tag install), so
trace can count installations of the site rather than raw events. It is a UUID made when the
server first reports, derived from nothing about the server or any visitor. TRACE_INSTALL_ID,
when set, is used as is; otherwise the client is pointed at
$XDG_DATA_HOME/roam-website/trace-install-id (or ~/.local/share/roam-website/trace-install-id).
The report is made from Next.js middleware, which runs in the Edge runtime and has no file system,
so in practice the ID lives in memory for the life of the server process: each restart or redeploy
counts as a new installation unless TRACE_INSTALL_ID is set. To reset it, restart the server or
change TRACE_INSTALL_ID (or delete the file, where a runtime with file access created one). Every
switch below also stops it: with reporting off no ID is made, read or written.
Reporting is off unless a key is set, and any of these turns it off:
USAGE_REPORTING_ENABLED=false in the server's environment (also 0, no, off; case and surrounding
space do not matter)TRACE_USAGE_REPORTING=off in the environment (also false, 0, no; shared by every program
that reports to trace, and it wins over the setting above)DO_NOT_TRACK=1 in the environment (also true, yes; see
consoledonottrack.com)USAGE_REPORTING_KEY unsetUSAGE_REPORTING_ENDPOINT sends the reports to a different trace server. On the first request
its middleware sees (any path outside /_next/ and /api/ without a file extension), the server logs one line saying whether reporting is on and, if it is off, which switch
turned it off. The only case with no line is a missing key with none of the other switches set,
so a site that was never configured stays quiet. Details: https://github.com/Stephenson-Software/trace#usage-reporting