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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 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.
Open http://localhost:3000.
Operational + test scripts under scripts/ run via npx tsx — see CLAUDE.md for the index.檢視完整 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 |