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
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证lauraevan/Xbox
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A console dashboard rebuilt for the browser: the system bar, the tile rail,
the guide overlay, spatial focus, controller input, achievements, a 743-title
catalogue streamed straight from the CDN, and cloud titles streamed through
Stratus.
Runs from static files in development — open index.html and it works. Production
goes out through a build step (npm run build) that Vercel runs for you.查看完整 README ↗A console dashboard rebuilt for the browser: the system bar, the tile rail, the guide overlay, spatial focus, controller input, achievements, a 743-title catalogue streamed straight from the CDN, and cloud titles streamed through Stratus.
Runs from static files in development — open index.html and it works. Production
goes out through a build step (npm run build) that Vercel runs for you.
https://xbox-xi-gold.vercel.app
That address always serves the newest commit on
claude/xbox-web-replica-v4s0jk: Vercel's GitHub integration picks up every
push, runs npm run build, and publishes dist/. Nothing to re-copy after a
push — reload the same link.
githack served the repository tree directly, which was fine while this was a
pile of static files. It cannot host the backend. /api/stratus is a
serverless function that keeps the Stratus API key server-side, and a static
file host has nowhere to run it. githack also rate-limits: this page pulls
more than twenty scripts, and once the host started throttling, one script
failed to arrive and the boot screen never cleared.
| Piece | Where it runs |
|---|---|
| Dashboard | Vercel static, built from dist/ by scripts/protect-build.mjs |
/api/stratus | Vercel serverless function (api/stratus.js) |
| Stratus backend | a persistent host — Vercel functions are too short-lived |
| Catalogue and covers | jsDelivr at runtime, nothing vendored |
vercel.json sets buildCommand: npm run build and outputDirectory: dist.
api/ is picked up by Vercel independently of the static output, so the
function ships even though the build never copies it into dist/.
| Action | Keyboard | Controller |
|---|---|---|
| Move focus | Arrows / WASD | D-pad or left stick |
| Select | Enter / Space | A |
| Back | Esc / Backspace | B |
| Search | X | X |
| Pin / unpin | Y | Y |
| Switch view | Tab / Shift+Tab | RB / LB |
| Game details | M | Menu |
| Achievements | V | View |
| Guide | G / Home | Guide |
Focus moves by geometry, not DOM order, so a grid behaves like a console grid: pressing right picks the nearest tile to the right, weighting cross-axis drift so rows and columns stay coherent. Mouse and touch work too.
Multiple profiles with per-profile state, Quick Resume, a captures gallery, screen-time limits, content blocks by category, night mode on a schedule, an idle HUD, a time drawer, button remapping, and accessibility passes for colour-vision filters, text scaling, high contrast and reduced transparency.
With nothing selected, Home runs the Xbox Series X|S Waves wallpaper behind the dashboard, and cross-fades a game's key art over it once a tile is focused. The clip is vendored, not hotlinked, at 1080p and 720p — the smaller pair is served to phones and tablets. It is never fetched at all under reduced motion, Save-Data, a 2g connection, under 4 GB of device memory, or when a fixed wallpaper is set, and every failure path lands on a still poster rather than an empty frame.
Profile, pins, recents, playtime, achievements and settings persist to
localStorage; captures and a custom wallpaper live in IndexedDB. The console
remembers you between visits.
The catalogue is fetched at runtime from the CDN — nothing is vendored here:
cdn.jsdelivr.net/gh/bestsabplayerox/assets@main/zones.jsoncdn.jsdelivr.net/gh/bestsabplayerox/covers@main/cdn.jsdelivr.net/gh/bestsabplayerox/html@master/The manifest ships {COVER_URL} and {HTML_URL} placeholders, which
catalog.js expands. Every asset also carries a raw.githubusercontent.com
fallback, so covers, backdrops and the manifest itself recover on networks that
block jsDelivr. If both hosts fail, the dashboard says so instead of sitting
empty.
Flagship key art and the Waves wallpaper are vendored under assets/
rather than hotlinked, so they do not depend on a third-party host staying
reachable.
Cloud titles come from Stratus. The integration goes deeper than a catalogue drop-in: purchased licences are surfaced first in the library, and sessions are created, started, kept alive and quit from the dashboard itself.
The browser never sees the API key. Requests go
browser -> /api/stratus (Vercel function) -> Stratus API
api/stratus.js reads the credential from the environment only, returns a
clean 503 when it is not configured, and fails over to a secondary upstream on
a retryable status. The backend is vendored under stratus/ for reference and
is deliberately excluded from the published build — see below.
The UI is authored against a 1920×1080 canvas:
:root { font-size: min(100vw / 192, 100vh / 108); }
1rem = 10px at 1080p, so every size in the stylesheets reads as "pixels at
1080p" and the whole dashboard scales to any panel. Below 760px it reflows for
a phone.
index.html load order is load-bearing; see below
api/ Vercel serverless functions (Stratus gateway)
assets/ boot clip, Waves wallpaper, vendored key art, icon licence
stratus/ vendored Stratus backend, not published to the web build
scripts/ protect-build.mjs, the production build
css/ 22 stylesheets: tokens and TV scaling, then themes and passes
js/ 31 scripts, loaded in order
Load order matters. The base modules own the data and the first render:
icons media features artwork catalog state audio nav views
console-pages stratus stratus-backend-pass store cloud-library
guide reference personalization app
| Module | Owns |
|---|---|
catalog | manifest loading, mirrors, queries |
media | cover loading: mirror chain, bounded queue, retries, host health |
state | profiles, pins, recents, achievements, settings |
nav | spatial focus engine, gamepad and keyboard input |
stratus | the cloud catalogue and session lifecycle |
app | boot, routing, backdrop, detail page, launching |
Everything after app is a pass — a layer that augments what already
exists rather than replacing it. Passes wrap rather than rewrite, attach
through the nav:* event seam, and fail soft: a pass that cannot do its job
must leave the dashboard working.
A consequence worth knowing before adding a 32nd script: these load
sequentially and later ones patch earlier ones, so one failing to arrive leaves
a half-patched app rather than a clean failure. An inline failsafe in
index.html clears the boot screen after 13s and names the missing modules.
The startup clip is treated as optional decoration, so a weak connection never leaves you on a buffering screen:
| Guard | Behaviour |
|---|---|
| Ready budget | 2.5s to become playable, else fall back to the still |
| Stall grace | 1.2s to recover mid-play, else fall back |
| Hard cap | 10s ceiling on the boot screen, whatever happens |
| Save-Data | never fetches the clip at all |
| Reduced motion | never fetches the clip at all |
The poster is the clip's final frame, so a skipped boot lands exactly where the animation would have ended rather than cutting from an unrelated image. The manifest loads in parallel with the clip and is capped at 9s, so a dead network surfaces a message instead of hanging.
Encoded weight: 118 KB (H.264) / 97 KB (VP9) / 18 KB poster. Audio is stripped — autoplay requires a muted track anyway, so it was 65 KB of dead weight.
Fluent UI System Icons,
MIT licensed, © Microsoft Corporation — the same system icon family Microsoft
ships across its own products. 27 of them are vendored into js/icons.js as
path data; the licence is at assets/FLUENT-ICONS-LICENSE.txt.
The profile avatar is generated procedurally from a seed, and the UI sounds are synthesised at runtime rather than sampled. Game cover art and the games themselves belong to their respective developers and load from the CDN above at runtime — the manifest credits each developer, and the detail page links to them.
To run it locally, use a static server (python3 -m http.server) rather than
file://, so the catalogue fetch isn't blocked by CORS.
The original Xbox project code is proprietary and covered by the root
LICENSE. Third-party material keeps its own license or permission.
Production deployments use scripts/protect-build.mjs. Vercel publishes a
separate dist/ artifact instead of serving the repository tree directly.
Selected project-specific JavaScript is obfuscated with source maps disabled,
and server-side Stratus source under stratus/api is not copied into the
public static deployment.
Obfuscation is a deterrent, not a substitute for keeping secrets and sensitive server logic off the client. API credentials remain server-side.