Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
공식 WCA 스크램블·실제 통계·대회 시뮬레이터 제공 무료 스피드큐빙 타이머, 브라우저만으로 사용
A free speedcubing timer with official WCA scrambles, real stats and a competition simulator. Works in any browser, no download.
게임TypeScript · CSSGitHub @prizeficrypto가동 상태 재확인 필요운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A free speedcubing timer and WCA competition simulator. Open the site and you're on the timer; the simulator lets you solve the real scrambles from a real WCA round and see where you'd have placed against the people who were there. Supported by ads (Google AdSense); no paid plans.
/app, the front door) — csTimer-class practice timer:
sessions per puzzle (all WCA events + "no scramble"), real random-state WCA
scrambles (cubing.js) with history and your own scrambles, hold-to-start,
WCA inspection (+2 after 15 s, DNF after 17 s) with spoken 8 s / 12 s calls
(choose a male/female/system voice, volume, or a beep), multi-phase splits,
focus mode, OK/+2/DNF and comments per solve, csTimer's keyboard shortcuts,
typed times, StackMat (audio jack) and GAN Smart Timer (Bluetooth,
beta) input, full stats (mo3/ao5/ao12/… current + best, csTimer trimming,
WCA rounding), a time list that stays fast at 10k+ solves, tools (scramble
image, trend, distribution, scramble generator, metronome), and
import/export (csTimer JSON + CSV, Twisty Timer, Cubic Timer, plain lists)./app/competitions) — pick any past WCA competition
(a "Just published" list surfaces new ones automatically), an event and a
round, solve its official scrambles, and get placed by WCA ranking rules.client/ React + Vite + TS SPA
server/ Express API: WCA data proxy, accounts, social, feedback
api/ Vercel serverless entry (wraps the bundled Express app)
Server routers live in server/src/routes/ (data, account, social,
feedback); server/src/index.ts composes them.
Cache-Control: s-maxage so Vercel's CDN serves repeat
requests without running the function. Public data requests carry no
Authorization header (that would bypass the CDN).client/src/lib/timer/storage.ts);
signed-in users sync them in hashed 200-solve chunks so only changed chunks
upload (client/src/lib/cloudSync.ts, server/src/social/).client/src/lib/cubing.ts — simulator scoring per WCA Regulations: attempts
truncated to the hundredth (whole seconds at 10:00+), Ao5 drops one best and
one worst, mean of 3 for 6x6/7x7, averages rounded (to the second at 10:00+),
placement by average then best single, ties share a position, DNF averages
ranked after every valid average by best single.client/src/lib/timer/stats.ts — practice stats with csTimer's definitions
(5% trimming, DNF rules) and WCA rounding.client/src/lib/timer/engine.ts — the timer state machine (pure, tested).Server (server/.env, see server/.env.example):
| Variable | Needed for |
|---|---|
DATABASE_URL | Required. Supabase transaction-pooler URL (port 6543) |
APP_URL | Public URL (WCA sign-in redirect) |
GOOGLE_CLIENT_ID | Google sign-in |
WCA_CLIENT_ID, WCA_CLIENT_SECRET | WCA sign-in / connect |
ADSENSE_PUBLISHER_ID | Serves /ads.txt (e.g. pub-123…) |
CRON_SECRET | Protects the daily database keep-alive |
Client (client/.env, see client/.env.example): VITE_GOOGLE_CLIENT_ID,
VITE_ADSENSE_CLIENT (ca-pub-…) and VITE_ADSENSE_SLOT_* ad-unit ids.
Anything unset simply stays off (no fake buttons, no empty ad boxes).
server/schema.sql once in the Supabase SQL editor (it's
idempotent). Upgrading an existing database only needs
server/migrations/2026-10-26-social.sql. Until it's run, social features
hide themselves.<APP_URL>/auth/wca and scope public (sign-in also asks for email).vercel.json schedules a daily /api/cron/keepalive to prevent
that (set CRON_SECRET).Node 22.18+ (the server runs TypeScript directly via type-stripping).
cd server && npm install && npm start # API on :4000
cd client && npm install && npm run dev # app on :5173, proxies /api
cd client && node src/lib/cubing.test.ts # WCA scoring + placement
cd client && node src/lib/timer/stats.test.ts # practice stats
cd client && node src/lib/timer/engine.test.ts # timer state machine
cd client && node src/lib/timer/typing.test.ts # typed-time parsing
cd server && node src/social/social.test.ts # sync codec, handles, scoring
cd server && node src/wcaOauth.test.ts # WCA OAuth state signing
cd server && npm run verify # real WCA fetch sanity check
cd client && npm run build # typecheck + production build