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
Digital port of FFG's Star Wars: Rebellion. TypeScript engine + React UI. Non-commercial fan project.
Translation pending
GamesTypeScript · JavaScriptGitHub @johnchampaignOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
A faithful in-browser port of the 2016 FFG board game. Engine is a pure-function
TypeScript core; UI is React + Vite. Designed for solo play against a random AI
while the engine is fleshed out.
Early playable. Setup, Assignment, Command, and Refresh phases run end-to-end.
Mission resolution (with opposition), combat (with tactic-card choice for the
human), build-phase choice, retreat/reputation tracking, and probe-card play
are wired up. See docs/engine.md for architecture and the task list (/
TaskList in Claude Code, or the GitHub Issues tab) for what's still pending.Read the full README ↗A faithful in-browser port of the 2016 FFG board game. Engine is a pure-function TypeScript core; UI is React + Vite. Designed for solo play against a random AI while the engine is fleshed out.
Play it here: https://star-wars-rebellion.pages.dev
Early playable. Setup, Assignment, Command, and Refresh phases run end-to-end.
Mission resolution (with opposition), combat (with tactic-card choice for the
human), build-phase choice, retreat/reputation tracking, and probe-card play
are wired up. See docs/engine.md for architecture and the task list (/
TaskList in Claude Code, or the GitHub Issues tab) for what's still pending.
npm install
npm run dev
Then open http://localhost:5173. Engine state is mirrored to
./game-logs/latest.json on every action while vite dev is running, which is
the agent-collaboration loop — see "Problem reports" below.
The deployed site at https://star-wars-rebellion.pages.dev ships no
VASSAL-derived art — no board, no card art, no leader portraits, no unit
silhouettes. It's a text-mode demo of the engine. Broken <img> tags are
hidden via a global error handler so the UI stays clean.
If you want full visuals while playing locally:
vmod_extracted/ at the repo root.npm run copy-assets to copy and process the images into
public/dev-assets/.npm run dev. The full UI now shows board art, cards, etc.The asset-extraction scripts (scripts/extract-*.py, scripts/copy-dev-assets.mjs)
are committed; the actual images are gitignored and the deploy script strips
any images out of dist/dev-assets/ before publishing.
The project deploys as a static Vite build + two Cloudflare Pages Functions
(functions/api/report.ts, functions/api/upload-logs.ts) that file
GitHub Issues and commit play-log JSON respectively. Step-by-step setup in
docs/deploy.md. Once configured:
git push to main → CF auto-builds & deployslogs/<hash>.json in the repo (with an
in-game warning that the logs are publicly visible)You will need to bring your own copies of:
sw03_rules_reference_web.pdf)sw03_learn_to_play_web.pdf)Star Wars Rebellion_v1.02d.vmod) if you want to
regenerate the unit / board / card image assetsThe pipeline scripts in scripts/ expect these to live at the repo root.
They are deliberately gitignored — FFG owns the content and we don't
redistribute it.
To regenerate the dev image assets after dropping the .vmod in the root:
npm run copy-assets # extracts board, units, cards from the .vmod
The Play tab has two header buttons:
SWR_BUGREPORT_TOKEN
SWR_BUGREPORT_REPO env vars are set). Falls back to a local reports/
file and a pre-filled GitHub "new issue" URL otherwise.logs/
for AI development. Shows a consent dialog up front; hash-based dedup means
re-clicking only commits new games.To enable both, drop a .env in the project root:
SWR_BUGREPORT_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
SWR_BUGREPORT_REPO=johnchampaign/star-wars-rebellion
The token needs contents:write and issues:write. .env is gitignored.
Per the policy followed by the VASSAL module this project builds on: objective card text is redacted in the source PNGs. FFG has had an informal policy of permitting fan-made tools that block out text on key cards, so players who own the game can reference their physical cards.
This project provides two ways to bake text onto those redacted PNGs:
npm run composite-card-text — bakes the verbatim rules text. Local
play only. Output lives in public/dev-assets/cards/, which is
gitignored — it never ships from this repo.npm run composite-card-notice — bakes a short notice on each
objective explaining the redaction and asking the player to buy the
game. Use this for any public deploy (GitHub Pages, etc.) where
the dist folder includes the card images.If you're cloning to play locally, run the first one. If you ever set
up a public host of the built site, switch to the second one before
running npm run build.
Code is MIT (see LICENSE); the license file is kept verbatim so
tooling detects it, and the scope carve-out lives here: all game content (rules, card text,
unit names, board art, etc.) belongs to Fantasy Flight Games. This project
is a non-commercial fan implementation; do not distribute the original game
assets via this repo.
The most useful thing you can send is an in-game problem report — the report button inside the game. Filed while you're playing, it captures the game state and context that make an issue reproducible, which helps far more than a code change.
Pull requests generally won't be merged. This is a solo-maintained project, and reviewing and integrating outside code costs more than it saves. If you open a PR, it'll be read as a well-specified bug report or feature request and implemented here rather than merged — so it's a fine way to describe a change you'd like, just please don't expect it to land as-is.
The whole codebase is MIT-licensed — fork it and do whatever you want: change the rules, reskin it, build and ship your own version. No permission needed; that's the point of the license.
Building a bot or a bridge? There's a hosted HTTP API for online games —
create a game, fetch a seat's redacted view, submit actions, chat — so an
external client (a Discord bot, say) can run games without reimplementing the
rules or the hidden-information handling, and picks up engine fixes for free.
See docs/bot-integration.md. Non-commercial use
only, same as the rest of the project.