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
Bracket pools for debate elimination rounds — pick, lock, and watch it score itself.
GamesTypeScript · JavaScriptGitHub @elichen09OnlineOwner 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
bracket betting for debate
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Bracket pools for debate elimination rounds. Fill in a Tabroom elim bracket, lock
it, and it scores itself as results post — a March-Madness-style pool with a
leaderboard per tournament. Built with Next.js + Supabase; deploys to Vercel (or
anywhere that runs Next).Read the full README ↗Bracket pools for debate elimination rounds. Fill in a Tabroom elim bracket, lock it, and it scores itself as results post — a March-Madness-style pool with a leaderboard per tournament. Built with Next.js + Supabase; deploys to Vercel (or anywhere that runs Next).
/new (guarded by an admin key).Scoring: points double each round so every round is worth the same total, plus an
upset bonus of 1 point per N seeds of gap (4 in small fields, 8 in fields of 64+),
capped at double the round value. Rounds already decided before a tournament is
added don't count. Full explanation lives at /about.
supabase/schema.sql, then supabase/seed.sql
(the seed loads the two tournaments already tracked — delete those rows if you
want to start clean). Already running an older copy? Run
supabase/migrations/002_accounts_and_stats.sql (accounts) and
supabase/migrations/003_career_cache.sql (career cache) instead.anon public key,
and the service_role secret key.Copy .env.example to .env.local and fill it in:
| var | what it is |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | anon public key (browser, read-only) |
SUPABASE_SERVICE_ROLE_KEY | service role key (server only — all writes) |
ADMIN_KEY | passphrase required to add tournaments at /new |
UPDATE_SECRET | shared secret the scheduled updater must send |
TABROOM_USERNAME / TABROOM_PASSWORD | a Tabroom account (results pages need a login) |
The NEXT_PUBLIC_* values are the only ones shipped to the browser. Everything
else stays server-side.
npm install
npm run dev # http://localhost:3000
.github/workflows/update.yml), since Vercel's Hobby plan only allows daily
crons. In the GitHub repo, add Settings → Secrets and variables → Actions
secrets SITE_URL (your deployed URL) and UPDATE_SECRET (same value as the
app's env var), and it curls the updater every hour.Admins can also use the "Admin: force update" button on the home page, or trigger a refresh by hand:
curl -X POST https://YOUR-SITE/api/update -H "x-update-secret: YOUR_UPDATE_SECRET"
The dossier is built from Tabroom's public REST API (api.tabroom.com/v1) — no
login needed: the event's field, prelim seeds, speaker awards, final places, and the
per-entry records document (every round with side, opponent, ballots, points and
judges). Documents are cached in memory per server instance (5 minutes while a
tournament is live, an hour once it's complete) so a busy pool page stays cheap for
Tabroom. GET /api/stats/:tournament?code=Emory%20GY returns the compiled shape.
Every dossier ends with each debater's full Tabroom record: every tournament,
season by season, with partners, prelim and elim records, deepest elim round,
titles, speaker averages, and past meetings against teams in the current bracket.
It comes from Tabroom's per-student results page (team_results.mhtml?id1=…), which
needs a login — the app uses the same TABROOM_USERNAME account as the updater —
and is cached for 12 hours in student_records
(supabase/migrations/003_career_cache.sql; optional, memory cache otherwise).
Open /new, enter the admin key, and paste the Tabroom bracket link
(…/bracket.mhtml?tourn_id=…&result_id=…). The updater finds that event's elim
rounds on Tabroom's API by itself and walks forward from the first one, so the
first elim round's results link (…/round_results.mhtml?…&round_id=…) is only
a fallback for the rare event whose rounds it can't work out. The bracket fills
in on the next update, or paste the seeded team list to open it for picks
immediately.
/api/update logs into Tabroom, and for each unfinished tournament:
round_id is known
yet, then reads each round's results page walking forward from the last known
one, matching pairings against the bracket (side columns may be labelled
Aff/Neg, Pro/Con or Gov/Opp);ADV, never guessed);It never touches anyone's picks.
tournaments — one row per tournament (bracket, results, status, Tabroom ids).entries — one bracket per person per tournament; carries a private token
that proves ownership for edits. The browser reads the entries_public view,
which omits the token.Row-level security lets the browser only read; every write goes through the API routes with the service-role key.
app/
page.tsx home — tournament index
t/[id]/page.tsx one tournament: bracket, pool, leaderboard, results
new/page.tsx add a tournament (admin-key gated)
about/page.tsx scoring explained
api/
entries/ create + edit brackets (token-checked)
tournaments/ add a tournament (admin-key)
update/ the Tabroom results updater (secret-gated, cron)
lib/
bracket.ts scoring + bracket engine (shared client/server)
tabroom.ts Tabroom session + result parsing/sync
useBreak.ts client data hooks (realtime + polling)
supabase/
schema.sql tables, view, RLS, realtime
seed.sql the two tournaments already tracked