BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기bracket betting for debate
저장소 README에서 가져옴
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).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