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
翻譯準備中
Gridiron Franchise 是一個虛構的橄欖球營運指揮中心:上傳自訂名冊,評分 0-100,建立深度圖表,並模擬賽季。
AI 翻譯
Gridiron Franchise is a fictional football operations command center: upload custom rosters, rate players 0-100, build depth charts, and simulate seasons.
遊戲TypeScript · CSSGitHub @DarrellJBullock上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A polished, original football franchise simulation platform: upload custom Excel rosters, rate every
player from 0-100 across position-specific skills, build depth charts, preview matchups, and simulate
full seasons with a franchise-style game engine.
All teams, players, and branding are entirely fictional. No real NFL, NCAA, Madden, EA Sports, or
other copyrighted names, logos, or players are used anywhere in this project.檢視完整 README ↗A polished, original football franchise simulation platform: upload custom Excel rosters, rate every player from 0-100 across position-specific skills, build depth charts, preview matchups, and simulate full seasons with a franchise-style game engine.
All teams, players, and branding are entirely fictional. No real NFL, NCAA, Madden, EA Sports, or other copyrighted names, logos, or players are used anywhere in this project.
Built a football franchise simulation platform with custom roster uploads, Excel template validation, 0-100 player skill ratings, team management, depth charts, game simulation, season tracking, and polished React dashboards.
Fantasy and franchise sports games are usually either shallow CRUD apps (add a player, list some stats) or closed commercial products you can't build a portfolio around. Gridiron Franchise demonstrates what a real football operations product looks like end-to-end: a real relational data model, a file-upload and validation pipeline that mirrors how production import tools work, a rules-based simulation engine, and a cohesive sports-broadcast-style dashboard UI — all original IP so it's safe to publish and demo publicly.
This is intentionally not a basic CRUD app — the roster validator, rating system, and simulation engine are all real, non-trivial pieces of logic.
.xlsx) or CSV template from the Roster Upload pageteamName, teamAbbreviation, teamCity, teamState, teamPrimaryColor, teamSecondaryColor,
firstName, lastName, jerseyNumber, position, height, weight, classYear, hometown, archetype,
overall, speed, acceleration, strength, agility, awareness, stamina, injury, toughness,
throwPower, shortAccuracy, mediumAccuracy, deepAccuracy, throwOnRun, playAction, pocketPresence,
carrying, ballCarrierVision, trucking, elusiveness, spinMove, jukeMove, breakTackle,
catching, routeRunning, release, spectacularCatch, catchInTraffic,
passBlock, runBlock, impactBlock, footwork, handTechnique,
blockShed, powerMove, finesseMove, pursuit,
tackling, zoneCoverage, manCoverage, press, playRecognition, hitPower,
kickPower, kickAccuracy
teamName, teamAbbreviation, firstName, lastName, jerseyNumber, position are requiredjerseyNumber must be 0-99 and unique within a teamposition must be one of QB, RB, FB, WR, TE, LT, LG, C, RG, RT, LE, RE, DT, LOLB, MLB, ROLB, CB, FS, SS, K, PteamAbbreviation must be 2-4 uppercase lettersEvery player has a core rating set (speed, acceleration, strength, agility, awareness, stamina, injury, toughness, overall) plus a position-specific set, all on a 0-100 scale:
| Group | Ratings |
|---|---|
| QB | throwPower, shortAccuracy, mediumAccuracy, deepAccuracy, throwOnRun, playAction, pocketPresence |
| RB/FB | carrying, ballCarrierVision, trucking, elusiveness, spinMove, jukeMove, breakTackle |
| WR/TE | catching, routeRunning, release, spectacularCatch, catchInTraffic |
| OL (LT/LG/C/RG/RT) | passBlock, runBlock, impactBlock, footwork, handTechnique |
| DL (LE/RE/DT) | blockShed, powerMove, finesseMove, pursuit |
| LB (LOLB/MLB/ROLB) | tackling, pursuit, blockShed, zoneCoverage, hitPower |
| DB (CB/FS/SS) | manCoverage, zoneCoverage, press, playRecognition, catching |
| K/P | kickPower, kickAccuracy |
lib/simulation/team-ratings.ts derives four team ratings — overall, offense, defense, and
special teams — by weighting the top players at each relevant position group (QB, RB, WR/TE, and OL
for offense; DL, LB, CB, and S for defense; K and P for special teams).
lib/simulation/game-engine.ts is a statistical, drive-based simulation, not a physics engine. Each
simulated game runs a fixed number of possessions per quarter. Every drive resolves probabilistically
from the rating differential between the offense and the opposing defense, factoring in:
The result includes a final score, quarter-by-quarter scoring, team stat lines, individual player stat lines (attributed to the top players at each position), a text summary, a turning point, a play-style summary, and the top performers of the game.
lib/simulation/franchise-progression.ts runs the off-season once a season's status is COMPLETED and
you click Advance to Next Season on the Season page. For every active player on every team:
retired (never deleted, so their career stats and game history stay intact)
and are immediately backfilled with a rookie at the same position, generated with the same procedural
logic used to seed the league (lib/simulation/player-generator.ts)A new season is then created with a fresh round-robin schedule and reset standings. The Season page shows a summary of notable retirements and rookies after each advance, plus a Franchise History list of every past season's champion.
Once a season is COMPLETED, Run Playoffs (lib/simulation/playoffs.ts) seeds the top 4 teams by
regular-season record into a single-elimination bracket — 1 vs. 4 and 2 vs. 3 in the semifinals, then a
championship game, with the higher remaining seed hosting each round. Playoff games are simulated with
the same engine as every other game (full play-by-play, box score, recap page) but never affect regular-
season standings. Running the playoffs is entirely optional: skip it and the season's "champion" in
Franchise History falls back to the best regular-season record; run it and the bracket winner takes over
that title instead.
Prisma models: League, Team, Player, PlayerRating, DepthChart, Season, SeasonTeam, Game,
GameTeamStats, GamePlayerStats, Standing, RosterImport, RosterImportRow,
RosterValidationIssue, AuditEvent. See prisma/schema.prisma for the full
schema.
/, /league, /teams, /teams/[id], /players, /players/[id], /roster-upload, /depth-chart,
/matchup, /game/[id], /season, /standings, /stats, /about
GET /api/teams, GET /api/teams/[id], POST /api/teams/[id]/depth-chart, GET /api/players,
GET /api/players/[id], POST /api/roster/upload, GET /api/roster/upload,
GET /api/roster/template, GET /api/games, GET /api/games/[id], POST /api/games/simulate,
POST /api/season/create, GET /api/season/create, POST /api/season/simulate-week,
POST /api/season/simulate-full, POST /api/season/simulate-playoffs, GET /api/season/simulate-playoffs,
POST /api/season/advance, GET /api/season/history, GET /api/standings, GET /api/stats/leaders
npm install
Copy the example environment file and set your own connection string:
cp .env.example .env
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/gridiron_franchise
NEXT_PUBLIC_APP_URL=http://localhost:3000
Note:
.env.exampleis not committed in this workspace because the project's own.claude/settings.jsonpermission rules deny writing any.env*file — a deliberate guardrail against ever committing secrets. Create.env.example(and your local.env) yourself using the two lines above.
npx prisma migrate dev --name init
npm run db:seed
This creates 8 fictional teams (Delaware Storm, Jersey Iron, Atlanta Firebirds, Orlando Rockets, Chicago Frost, Seattle Voltage, Houston Copperheads, Philadelphia Founders), 45 rated players each, starter depth charts, and a full Season 1 schedule.
npm run generate:templates
npm run dev
Open http://localhost:3000.
Gridiron Franchise uses Clerk for sign-up/sign-in. Every account owns exactly one League (enforced by a
unique ownerId on the League model), auto-generated the first time you sign in — 8 fictional teams,
360 rated players, depth charts, and a scheduled season, ready to play immediately with no setup. Every
API route and page is scoped to the signed-in user's own league, and looking up another user's game, team,
or player by ID returns a 404 rather than leaking data. There is no shared "global" league anymore; each
account's franchise is fully private.
Error monitoring runs through Sentry, installed as a Vercel Marketplace integration
(org darrell-bullock, project sentry-bistre-yacht — see next.config.ts) rather than a hand-wired
SDK. It covers all three Next.js runtimes:
instrumentation.ts loads sentry.server.config.ts (Node runtime) and sentry.edge.config.ts (edge
runtime — middleware, edge routes) at startupinstrumentation-client.ts initializes Sentry in the browser, with Session Replay enabledapp/global-error.tsx is a global React error boundary that reports uncaught render errorsnext.config.ts wraps the app with withSentryConfig, which uploads source maps at build time (using
the SENTRY_AUTH_TOKEN / .env.sentry-build-plugin that Vercel's integration provisions) so stack
traces in Sentry show real file/line info instead of minified bundlesThe tunnel route matters for auth. Client-side error/session reports are sent through a same-origin
tunnel at /monitoring (configured via tunnelRoute in next.config.ts) instead of directly to Sentry's
domain, so ad blockers don't silently swallow them. Because this app's proxy.ts middleware is
fail-closed (everything requires sign-in unless explicitly allow-listed), /monitoring —
along with /sentry-example-page and /api/sentry-example-api — is explicitly listed as a public route.
If you ever tighten or rewrite the auth middleware, keep that route public, or error reporting for
every signed-out visitor (which is most first-time traffic) silently breaks with no error of its own.
To verify it's working: visit /sentry-example-page and click Throw Sample Error — it should show
"Error sent to Sentry" and the error should appear on the
Sentry Issues page within a few
seconds.
Environment variables (auto-provisioned by the Vercel Marketplace integration, pulled into
.env.local via vercel env pull): NEXT_PUBLIC_SENTRY_DSN, SENTRY_AUTH_TOKEN, SENTRY_ORG,
SENTRY_PROJECT. None of these need to be set by hand.
Add screenshots of the home dashboard, team detail, roster upload, matchup, and game recap pages here.
Gridiron Franchise is an entirely original, fictional football simulation. It does not use or reference Madden, EA Sports, the NFL, NCAA, or any real team, player, school, or logo. All teams, players, leagues, and branding are invented for demonstration purposes only.
The 3D live-game viewer's player model is "Mannequiny" by GDQuest, Luciano Muñoz, and contributors (source), licensed under Creative Commons Attribution 4.0 International (CC-BY-4.0). It replaced an earlier single-animation model ("CesiumMan") specifically because it ships with a real set of locomotion/action clips (run, walk, idle, dash, jump, punch, kick) instead of only one.
The stadium-sky HDRI (public/hdri/stadium_sky_1k.hdr) is "Kloofendal 48d Partly Cloudy Puresky"
and the field's grass texture/normal map (public/textures/grass/) is "Leafy Grass", both from
Poly Haven, released under CC0 1.0
(public domain, no attribution required — credited here anyway as a courtesy).
Built a football franchise simulation platform using Next.js, React, TypeScript, PostgreSQL, Prisma, Excel roster uploads, 0-100 player skill ratings, team depth charts, game simulation logic, season standings, stat leaders, and polished sports dashboard UI.