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
Free Mario Kart and Mario Party randomizers, live scoring, tournaments and stream tools for any game night. GameShuffle Pro turns your whole chat into players.
GamesTypeScript · CSSGitHub @blorentzenOnlineOwner 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.
Game night companion platform for streamers and their viewers — randomizers, competitive tools, tournaments, live scoring, a streamer-owned Twitch chat bot, a Discord adapter, a closed-loop token economy with prediction markets, a TCG companion, and a social layer (profiles, follows, top friends, notifications, invitations, and direct messages) with a trust-&-safety layer (reporting, blocking, moderation). Built with Next.js, CascadeDS, and Supabase.
Open http://localhost:3000.
Operational + test scripts under scripts/ run via npx tsx — see CLAUDE.md for the index.Read the full README ↗Game night companion platform for streamers and their viewers — randomizers, competitive tools, tournaments, live scoring, a streamer-owned Twitch chat bot, a Discord adapter, a closed-loop token economy with prediction markets, a TCG companion, and a social layer (profiles, follows, top friends, notifications, invitations, and direct messages) with a trust-&-safety layer (reporting, blocking, moderation). Built with Next.js, CascadeDS, and Supabase.
npm install
npm run dev
Open http://localhost:3000.
| Command | Description |
|---|---|
npm run dev | Start development server |
npm run build | Production build |
npm run start | Serve production build |
npm run lint | Run ESLint |
Operational + test scripts under scripts/ run via npx tsx <script> — see CLAUDE.md for the index.
src/
├── app/ # Next.js App Router
│ ├── layout.tsx # Root layout (theme, chrome, providers, Analytics)
│ ├── globals.css # Theme tokens + CDS overrides
│ ├── page.tsx # Homepage
│ ├── api/ # Server routes (admin, account, stripe, twitch,
│ │ # discord, dsar, email, sentry, economy)
│ ├── randomizers/ # MK8DX + Mario Kart World randomizers
│ ├── apps/ # App index (all tools in one place)
│ ├── tools/ # Free-tools hub
│ ├── wheel-spinner/ # Free wheel spinner (no account)
│ ├── features/ # Free-vs-Pro features overview
│ ├── gs-pro/ # GS Pro pitch + pricing (former /pricing 301s here)
│ ├── mario-kart-8-deluxe-randomizer/ # SEO/GEO landing pages (per app),
│ ├── mario-kart-world-randomizer/ # driven by AppMarketingPage + marketing-apps data
│ ├── competitive-mario-kart/ #
│ ├── mario-kart-tournaments/ #
│ ├── pokemon-tcg-companion/ #
│ ├── competitive/ # Competitive hub + live lounge scoring
│ ├── tournament/ # Browse, create, manage, public view
│ ├── live/[streamer-slug]/ # Public live stream view (read + tactile via Twitch viewer OAuth)
│ ├── lobby/[token]/ # Public Twitch lobby viewer (regular chrome)
│ ├── overlay/[token]/ # OBS browser-source overlay (chrome-free)
│ ├── (stream)/ # Stream overlay routes (chrome-free)
│ ├── account/ # Tabbed account + platform admin surfaces
│ ├── hub/ # Streamer hub (session list, create, configure)
│ ├── twitch/ # Twitch streamer integration dashboard
│ ├── mod/ # Mod accounts (invite + per-streamer surface)
│ ├── staff/ # Staff/admin internal tooling
│ ├── tcg-companion/ # TCG companion app (Pokémon Mode)
│ ├── auth/ # OAuth callback handler
│ ├── login/ # Login page
│ ├── signup/ # Signup + passwordless set-password flow
│ ├── u/[username]/ # Public user profiles (brand-themed)
│ ├── s/[token]/ # Shared config view
│ ├── quotes/[community]/ # Public !quote pool viewer (per streamer)
│ ├── help/ # Help index + topic pages
│ ├── terms/ # Terms of Service
│ ├── privacy/ # Privacy Policy
│ ├── cookie-policy/ # Cookie Policy
│ ├── accessibility/ # Accessibility Statement (WCAG 2.1 AA)
│ ├── data-request/ # Public DSAR form (Turnstile-gated, email-verified)
│ ├── unsubscribe/ # Marketing email opt-out
│ └── contact-us/ # Contact form
├── components/
│ ├── layout/ # SiteNavbar, SiteFooter, ConditionalChrome,
│ │ # CookieConsent, PolicyUpdateBanner, VideoHero
│ ├── marketing/ # AppMarketingPage, FeatureCard, DarkBand, GamesShowcase,
│ │ # AutoplayCarousel, ProPitchBand, MarketingJsonLd
│ ├── wheel/ # WheelGraphic, WheelSpinner (free), WheelStylePicker
│ ├── overlay/ # WheelOverlay (OBS)
│ ├── auth/ # AuthProvider, UserMenu
│ ├── account/ # All account + platform admin tabs (incl. Theme, Wheels)
│ ├── hub/ # Session creation + configure + tabs
│ ├── live/ # LiveStreamView + tabs (markets, picks/bans, participants)
│ ├── markets/ # Prediction market UI
│ ├── picks-bans/ # Picks/bans picker + icons
│ ├── randomizer/ # PlayerCard, KartSlot, FilterGroup, TrackList, etc.
│ ├── tournament/ # SortableTrackList
│ ├── companion/ # TCG companion theme picker
│ ├── staff/ # Impersonation banner + provider + control
│ ├── theme/ # RouteThemeSync (client-side theme reapply)
│ ├── help/ # Help nav + page chrome
│ └── legal/ # Legal page chrome
├── lib/
│ ├── supabase/ # Browser + server + admin clients
│ ├── theme/ # app-routes (isAppRoute), brand themes (brand + brand-server)
│ ├── wheel/ # Shared wheel geometry, themes, fill-style color helper
│ ├── wheels/ # Pro wheel data layer (types, store, spin engine)
│ ├── subscription.ts # Tier + role model + effectiveTier()
│ ├── stripe/ # Checkout, portal, subscriptions
│ ├── email/ # Billing, account, policy-update, subscriptions
│ ├── consent.ts # Cookie consent + GPC honor
│ ├── adapters/ # PlatformAdapter pattern (twitch, discord)
│ ├── twitch/ # Twitch integration (commands, EventSub, channel points, overlay)
│ ├── discord/ # Discord bot (interactions, embeds, room codes)
│ ├── sessions/ # gs_sessions lifecycle, queries, recap, scheduler
│ ├── modules/ # Module registry (picks, bans, randomizer, markets)
│ ├── picks-bans/ # Picks/bans queries, aggregate, rate limit
│ ├── economy/ # Token economy spine (identity, tokens, awards,
│ │ # bounties, leaderboards, markets, events, compliance, policy)
│ ├── events/ # Domain event publisher (policy-aware fan-out)
│ ├── companion/ # TCG companion modes + save states + styling
│ ├── images.ts # Centralized image path helper
│ └── auth-utils.ts # isEmailVerified() etc.
├── hooks/ # useKartRandomizer, useTrackRandomizer, useAnalytics, etc.
├── data/ # Game data JSON + types + game-registry + config-types + marketing-apps/games
├── middleware.ts # Auth gates + x-pathname header for theming
├── instrumentation.ts # Sentry server init
├── instrumentation-client.ts # Sentry client init
└── styles/ # randomizer, competitive, companion, stream, overlay, twitch-lobby
@empac/cascadeds)/tools hub and a no-account /wheel-spinner (idle spin, tick sounds, color themes + fill styles, localStorage persistence)/apps, /features, /gs-pro, and per-app SEO/GEO landing pages with SoftwareApplication / Breadcrumb / FAQPage JSON-LD/live, and the public profile (/u/[username]) via --brand-* CSS variables!gs-shuffle, !gs-join, !gs-leave, !gs-mycombo, !gs-lobby, !gs-help), mod commands (!gs-kick, !gs-clear), broadcaster bypass/overlay/[token] — combo card animations on shuffle; brand-themed!spin / !wheel, animated on the overlay with a chosen color theme + fill style/lobby/[token] — full participant list with thumbnails/hub — session list, creation, per-session configuration, fan-out policy/mod/[streamer] — act-on-behalf-of model with invite tokens/live/[streamer-slug] — read-only state + tactile interactions for picks/bans, prediction markets, voting (Twitch viewer OAuth required for tactile)!gs award @user <amount> discretionary or !gs bounty <amount> <condition> outcome-pegged!chaos (sink/burn) + !random (event deck draws, in progress)/u/[username] with gamertags + configs/comms — notifications (Alerts tab) + direct/crew messages (Messages tab) in one place; navbar bell + messages icons with realtime per-type unread badgesChat), membership-based conversations ready for crew/app group chats; new DMs ping with a deduped notification/data-request (Turnstile-gated, email-verified)/tcg-companion)| Variable | Public | Purpose |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | Yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Yes | Supabase public anon key |
SUPABASE_SERVICE_ROLE_KEY | No | Server admin APIs (account deletion, platform admin) |
NEXT_PUBLIC_TURNSTILE_SITE_KEY | Yes | Cloudflare Turnstile widget |
NEXT_PUBLIC_BASE_URL | Yes | Public origin (OAuth redirect + bot-message URLs) |
GITHUB_TOKEN | No | Vercel: private CDS dependency access |
STRIPE_SECRET_KEY | No | Stripe API |
STRIPE_WEBHOOK_SECRET | No | Stripe webhook signature verification |
STRIPE_PRICE_* | No | Stripe Price IDs (per tier) |
DISCORD_APPLICATION_ID | No | Discord bot application ID |
DISCORD_PUBLIC_KEY | No | Discord interaction signature verification |
DISCORD_BOT_TOKEN | No | Discord bot token for posting messages |
TWITCH_CLIENT_ID | No | Twitch app client ID (streamer-integration OAuth) |
TWITCH_CLIENT_SECRET | No | Twitch app client secret |
TWITCH_EVENTSUB_SECRET | No | HMAC secret for EventSub webhook signature (≥10 chars) |
TWITCH_ENCRYPTION_KEY | No | AES-256-GCM key for encrypting stored OAuth tokens (64-char hex) |
TWITCH_BOT_USER_ID | No | GameShuffle bot's Twitch user ID (shared bot account) |
bash scripts/vercel-install.sh (injects GITHUB_TOKEN for private CDS repo)Game asset image paths are centralized through src/lib/images.ts. Update IMAGE_BASE_PATH to point to the CDN when migrating.
SENTRY_DSN / NEXT_PUBLIC_SENTRY_DSN | Mixed | Sentry instrumentation |
MAILERSEND_* | No | Marketing email + policy-update blast credentials |