Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Web-based Home Run Derby Pick 'Em League for John
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A web app for running a fantasy baseball Home Run Derby league. Owners pick players from tiered groups, and the site tracks every team's home runs all season: standings, monthly races, player rankings, optimal lineups, win odds, and a monthly standings workbook emailed to each owner.
Scoring comes straight from MLB StatsAPI game logs, refreshed nightly, so the app matches the league host's own workbook game for game.
/{league}: overall and monthly standings, player rankings by group, optimal lineups, win odds, rules, and a page for every team. Past seasons are available with ?season=YYYY./admin: league and season settings, owner emails, entry status, exports, manual sync, and batch ingest.| Layer | Details |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript |
| Database | PostgreSQL with Prisma 7 (@prisma/adapter-pg) |
| Styling and UI | Tailwind CSS 4, Arc UI components (src/components/arc/), lucide-react, motion |
| Validation | Zod |
| Spreadsheets | ExcelJS |
| Resend | |
| Data | MLB StatsAPI game logs |
| Tests | Vitest |
| Hosting | Vercel (with Vercel Cron) |
git clone https://github.com/aplaceforfacts/HRD4WEB.git
cd HRD4WEB
cp .env.example .env # then fill in the values below
npm install # also runs `prisma generate` (client goes to src/generated/)
npx prisma db push # fresh database: builds the schema from prisma/schema.prisma
npm run prisma:seed # creates league `hrd` for the current MLB season
npm run dev
Open http://localhost:3000, then run npm test to check everything works.
The migrations in
prisma/migrations/are incremental changes to a database that already existed, soprisma migrate deployonly works against an existing production database. Useprisma db pushfor a new one. Prisma 7 no longer loads.envby itself;prisma.config.tsandsrc/lib/prisma.tsload it throughdotenv.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | Yes | PostgreSQL connection string |
ADMIN_SECRET | Yes for admin | Password for /admin and Bearer token for scripts. Falls back to CRON_SECRET. Use a long random value. |
CRON_SECRET | Yes in production | Bearer token Vercel Cron sends to the cron routes |
RESEND_API_KEY | For emails | Resend API key for the monthly workbook |
EXPORT_FROM_EMAIL | For emails | Sender, e.g. Home Run Derby <[email protected]> |
PUBLIC_SITE_URL | For emails | Base URL used in email links |
EXPORT_SIGNING_SECRET | Optional | Signs unsubscribe links. Defaults to CRON_SECRET. |
NEXT_PUBLIC_APP_NAME | Optional | Site name shown in the UI |
LEGACY_LEAGUE_SLUG | Optional | League that old unscoped links (/standings, /team/...) redirect to. Defaults to hrd. |
Never commit .env. Only .env.example is tracked.
| Command | What it does |
|---|---|
npm run dev / build / start | Run, build and serve the app |
npm test | Run the Vitest suite |
npm run prisma:migrate / prisma:deploy | Create or apply migrations (existing databases) |
npm run prisma:seed | Seed league hrd |
npm run season:setup | Create a new season for a league |
npm run season:import-workbook | Import players and teams from the host's workbook |
npm run season:export-workbook | Build a standings workbook without emailing it |
npm run sync | Run the nightly scoring pipeline by hand |
npm run import:projections | Load projection CSVs |
npm run backfill:historical-stats | Backfill past seasons' stats |
vercel.json schedules two Vercel Cron jobs:
| Path | Schedule (UTC) | Job |
|---|---|---|
/api/admin/sync/run | 0 9 * * * | Nightly MLB game-log sync, scoring, odds and forecast snapshots |
/api/cron/monthly-export | 0 15 * * * | Sends any monthly workbook that has been closed for two days, and resumes interrupted sends |
Both routes are protected by the proxy and expect Authorization: Bearer <CRON_SECRET>, which Vercel Cron adds automatically.
Each year starts fresh: new owners, a new player pool, and the league's format carried over.
# 1. Create the season (pulls opening/closing day from MLB, copies groups and prize sheet)
npx tsx scripts/setup-season.ts hrd 2027
# 2. Load the player pool and teams from the host's workbook (dry run first)
npx tsx scripts/import-host-workbook.ts hrd 2027 "2027 Home Run Derby.xlsx"
npx tsx scripts/import-host-workbook.ts hrd 2027 "2027 Home Run Derby.xlsx" --commit
# 3. Projections and history for the entry form and forecasts
npx tsx scripts/import-projections.ts 2027 path/to/projections.csv
npx tsx scripts/backfill-historical-stats.ts 2025 2026
Then run a sync from /admin/sync, add owner emails on the season's admin page, and open entries. To start a second league:
npx tsx scripts/setup-season.ts office-derby 2027 "Office Home Run Derby"
The full yearly checklist, MLB ID overrides and email setup are in docs/OFFSEASON.md.
├── prisma/ # Schema, migrations, seed (prisma.config.ts at the root)
├── scripts/ # Season setup, imports, exports, manual sync
├── docs/ # Offseason guide and yearly checklist
├── src/
│ ├── app/
│ │ ├── [league]/ # Public pages: standings, players, optimal, odds, team, submit, rules
│ │ ├── admin/ # Commissioner area
│ │ └── api/ # admin, cron and public routes
│ ├── components/ # UI, including Arc components
│ ├── lib/ # Admin auth, login throttle, Prisma client, helpers
│ ├── server/ # Entries, scoring, stats sync, odds, forecasts, export, email
│ └── proxy.ts # Gates /admin, /api/admin and /api/cron
└── tests/ # Vitest suites
/admin, /api/admin/* and /api/cron/* are gated by the Next.js proxy (src/proxy.ts). Browser sessions use a signed, expiring, httpOnly cookie; scripts and cron use a Bearer secret. Secrets are compared in constant time./api/admin/login.X-Frame-Options, X-Content-Type-Options, HSTS, and others).No license has been specified yet. Until one is added, all rights are reserved by the author.