BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A season-long NFL pick’em pool for three people, with no accounts and no
passwords. One link, tap your name, make your picks.
The Lock and the Upset are picks in their own right, each chosen once for the
week from a dropdown, and are not attached to a spread pick — you can Lock a
team without taking that game against the number. Because they are separate,
one game can score twice: take a team against the spread and make them your
Lock, and a win that also covers is worth 1 + 2.README 전문 보기 ↗A season-long NFL pick’em pool for three people, with no accounts and no passwords. One link, tap your name, make your picks.
| Points | |
|---|---|
| Each game picked correctly against the spread | 1 |
| Lock of the Week — your team wins outright | 2 |
| Upset of the Week — your underdog wins outright | 3 |
The Lock and the Upset are picks in their own right, each chosen once for the week from a dropdown, and are not attached to a spread pick — you can Lock a team without taking that game against the number. Because they are separate, one game can score twice: take a team against the spread and make them your Lock, and a win that also covers is worth 1 + 2.
A push scores 0 for everyone. Unpicked games score 0 — nothing is auto-picked. One Lock and one Upset per week, both optional. Most points across the 18-week regular season wins.
Picks close when the game kicks off. Per game, no earlier. A Monday night game can be picked on Monday night. Anything unpicked at kickoff scores 0.
The spread freezes earlier, per window, so that all three players are graded on the same number no matter when they got their pick in. Times are US Eastern, displayed to each player in their own zone.
| Games | Line freezes |
|---|---|
| Sunday and Monday | 10:00am ET Sunday |
| Any other day | 10:00am ET that morning |
| Anything kicking before 10:00am ET | 7:00am ET that morning |
The middle row is a general rule rather than a list of weekdays because the schedule does not cooperate — the 2026 season opens on a Wednesday. The last row covers the international games, and it keys off kickoff time rather than a country flag so it also catches any other unusually early start.
Once a line has frozen, the card shows the frozen number, so what a player sees when picking is always what they are graded on.
These two deadlines used to be one instant. Keeping them apart is the point: collapsing them would either freeze lines at kickoff (grading players on numbers they never saw) or close picks at 10am (which is what we moved away from).
Two terminals. In the first:
npm install
npm run dev
In the second, once that says ready:
npm run seed
Then open http://localhost:3002.
npm run seed pulls in the current week's real games and lines by asking the
running app to do its normal sync, so it exercises exactly the code path the
scheduled job uses in production. Run it again any time to refresh.
With no DATABASE_URL set, the app runs against an embedded
PGlite database — real Postgres compiled to WASM,
persisted to .pglite/ — so there is no account to create and nothing to
install, and the schema is applied automatically on boot.
This is a separate database from the live pool. Picks made locally are
yours alone and touch nothing in production. To start over, stop the dev server
and delete the .pglite/ folder.
Port 3002 is deliberate, to stay clear of anything already using 3000.
npm test
The scoring rules, the deadline rules, and the ESPN parser are pure functions with no database or network dependency, so the suite runs in under a second.
There is also an end-to-end check that pulls the live slate, stores it, makes picks, freezes a line and scores a game against the embedded database:
npx tsx scripts/verify.mts
Everything — schedule, point spreads, and final scores — comes from ESPN's public scoreboard endpoint in a single request. No API key, no rate limit, no second source to reconcile.
ESPN reports the spread from the home team's perspective, which is the same
convention used throughout this codebase: -3.5 means the home team is favored
by 3.5, +3.5 means they are getting points.
One scheduled job, POST /api/cron/sync, does all of it and is safe to run at
any time:
Vercel's free plan allows only two cron jobs, once per day each, which is not
enough for a 7am lock, a 10am lock, and score updates. The schedule runs from
GitHub Actions instead (.github/workflows/poll.yml), every 30 minutes.
Scheduled runs on GitHub can drift by several minutes. That is why the graded line is defined as the last snapshot at or before the lock time rather than whatever we fetched at exactly 10:00 — frequent polling matters, punctuality does not.
| Name | Where | Purpose |
|---|---|---|
DATABASE_URL | Vercel | Neon connection string |
CRON_SECRET | Vercel + GitHub | Shared bearer token for the sync endpoint |
APP_URL | GitHub | Deployed base URL, e.g. https://picks.vercel.app |
Each player can set a photo, which replaces their name in the score tiles. The image is cropped square and shrunk to 192px in the browser before upload, so a stored photo is a couple of kilobytes and lives in Postgres rather than in a separate blob service.
The database is the live copy; a weekly snapshot is the safety net.
.github/workflows/backup.yml fetches /api/export every Tuesday morning and
commits it to backups/snapshot.json.
It overwrites one file rather than writing dated copies, so git history gives every earlier week for free. If the Neon project were ever lost, every game, line, pick and result could be rebuilt from that file.
Profile photos are excluded from the export, because this repository is public.
There is no authentication. The pool lives at an unlisted URL and is marked
noindex.
Between players, each game's picks are hidden until that game kicks off, then revealed. Before kickoff you can see that someone has picked, never what they picked — so the last person to pick gains nothing.
That filtering happens server-side in app/page.tsx, before the props are
built. Hidden picks are never serialised into the page at all; hiding them
inside the component would still ship them to the browser.