BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
翻译准备中
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.