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
Football squad memorisation game for iOS. React Native / Expo, TypeScript. Built solo with Claude Code. Live on the App Store.
GamesTypeScript · JavaScriptGitHub @tovmassianOnlineOwner 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.
Escuadra — a football squad memorisation trainer for iOS and Android. Expo SDK 57 + expo-router, TypeScript strict,
Zustand, Reanimated. Light and dark themes, following the device setting by default, with a toggle on Home.
Runs in Expo Go for local development — no Xcode, no Apple Developer account, no native build.Read the full README ↗Escuadra — a football squad memorisation trainer for iOS and Android. Expo SDK 58 + expo-router, TypeScript strict, Zustand, Reanimated. Light and dark themes, following the device setting by default, with a theme setting in Settings.
Runs in Expo Go for local development — no Xcode, no Apple Developer account, no native build.
Escuadra is on the App Store and Google Play. What each version shipped is in CHANGELOG.md; how a change reaches users, as an over-the-air update or a store build, is docs/release.md. The marketing site and the privacy and support pages are published from the gh-pages branch.
Prerequisites, once per machine and phone:
.nvmrc pins 24; CI runs 24). nvm use picks it up
automatically on either OS.npx expo login -b, then confirm with npx expo whoami.Then:
git clone <repo-url>
cd escuadra
npm install # also wires up the husky git hooks (prepare script)
npx expo start
Scan the QR with the iPhone Camera app; it offers to open in Expo Go.
| Windows | macOS | |
|---|---|---|
| Watchman | Not used — skip it | Metro's file watcher; install with brew install watchman. Without it, large projects can hit EMFILE: too many open files |
| First-run network prompt | Windows Firewall asks to allow Node.js on private networks — allow it, or the phone never connects | macOS asks to allow incoming connections for node/Terminal — allow it, or add it under System Settings → Privacy & Security → Firewall |
| Everything else | Same commands, same scripts, same Expo Go flow |
npm run check
npx expo start
Scan the QR with the iPhone Camera app; it offers to open in Expo Go. Edit, save, see it on the phone.
Useful keys in the Metro terminal: r reload · m dev menu · j DevTools ·
Ctrl+C stop. npx expo start -c clears the bundler cache.
| Script | Does |
|---|---|
npm run check | typecheck, lint, format check, tests, squadctl's registry check and the generated-file diffs: everything CI runs, and the pre-push gate |
npm test | Vitest, once |
npm run typecheck | tsc --noEmit |
npm run lint | expo lint |
npm run format | Prettier, write mode |
npm run format:check | Prettier, verify only |
A husky pre-push hook runs npm run check, so nothing reaches the remote with
broken types, lint errors or unformatted code. git push --no-verify bypasses it
in an emergency. Hooks install themselves through the prepare script on
npm install.
app/ expo-router routes (files = routes)
components/ shared UI; ui/ holds primitives
data/ static squad JSON
lib/ logic: pure modules are unit-tested; the few that wrap a native API keep their decisions in a pure sibling
i18n/ the catalogs and translations
scripts/ generators, CI logic and evals
tools/ squadctl
stores/ Zustand: progress (persisted), session (ephemeral)
theme/ design tokens + font map
types/ shared domain types
lib/questionEngine.ts stays pure, so the question engine is unit-testable without a renderer.
package.json pins SDK 58, and an SDK upgrade changes the native runtime, which invalidates every over-the-air update path and forces a new build and submission. An SDK upgrade is a release decision.useFonts in app/_layout.tsx. Expo Go cannot
use the expo-font config plugin — that needs a prebuild.@expo-google-fonts/inter/700Bold),
never the package root. The root barrel pulls in every weight and italic.| Symptom | Fix |
|---|---|
| QR scans but never connects (Windows) | Allow Node.js on private networks in Windows Firewall (port 8081) |
| QR scans but never connects (macOS) | Allow incoming connections for node when macOS's firewall prompt appears |
| Connects once then dies | Settings → Privacy & Security → Local Network → Expo Go → on |
| Server runs but phone never lists it | Sign in to the same Expo account on both: npx expo whoami and Expo Go |
| Phone and laptop can't see each other | Same Wi-Fi, no client isolation; else npx expo start --tunnel |
EMFILE: too many open files (macOS) | Install Watchman: brew install watchman |
| Animations do nothing | npx expo start -c |
| Stale code after adding a package | npx expo start -c |