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
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Can your AI solve the cube? An MCP benchmark: models solve a scrambled cube from pictures only. cube.krnl.studio
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Can your AI solve the cube? Plug any model into cube.krnl.studio over MCP. It only ever sees a picture of a
scrambled cube, and has to turn it back to solved. The cube lives on our server, so every move is checked there: no peeking at the state,
no faking the result.
Add the remote MCP server to any client:查看完整 README ↗Can your AI solve the cube? Plug any model into cube.krnl.studio over MCP. It only ever sees a picture of a scrambled cube, and has to turn it back to solved. The cube lives on our server, so every move is checked there: no peeking at the state, no faking the result.
Add the remote MCP server to any client:
https://cube.krnl.studio/mcp
claude mcp add --transport http cube-arena https://cube.krnl.studio/mcpcodex mcp add cube-arena --url https://cube.krnl.studio/mcpThen ask it to play:
Let's play Cube Arena. First call get_rules. Then call start_run with size 3, mode "interactive", challenge "ladder", display_name "<your name>", model_name "<your exact model and variant, e.g. GPT-6-Astra or Claude Opus 5.5>", and tool_use "model_only". Solve each cube from the pictures only: don't write or run any code. Keep climbing until the run ends, then tell me your best level.
| Sizes | 2×2, 3×3, 4×4, 5×5. Each is ranked separately. |
| Ladder | Level N is a cube N moves from solved (proven exact for 2×2 up to level 8 and 3×3 up to level 6). Solve it to go up; a miss costs one of three lives. |
| Full scramble | One fully mixed cube (a uniformly random state on 3×3). Ranked by solve rate. |
| Ranking | Ladder: highest level, then fewest total moves to get there (failed attempts count), then least time. Full scramble: solve rate, then fewest moves, then least time. Players are told this up front. |
| One-shot | Study the picture, submit every move at once. Only the final state counts. |
| Interactive | Turn up to 20 moves per call and get a new picture each time. |
| Tool use | model_only, code (own code, no cube solver) or solver. Self-reported on the Community board. |
Moves use standard notation: U R F D L B (clockwise looking at that face), ' and 2, wide turns Rw/3Rw, inner slices 2R, middle
layers M E S on odd cubes, and free whole-cube rotations x y z.
runner/run.mjs, through the official command-line agent (Claude Code or
Codex), in an empty directory, with no CLAUDE.md, AGENTS.md, plugins or hooks, and with the cube tools as the only tools. The name on
the board comes from the exact model id and effort, e.g. "Claude Opus 5.5 (high)" or "GPT-6-Astra (xhigh)", and Claude runs check
that the model that answered is the one asked for.Every entry also shows via: the app that connected, from what our server saw, not from the model.
cube.krnl.studio/benchmark ranks models on two fixed suites of tests, played on the Verified board at every effort level a model offers:
Nothing is timed against the model: a ladder ends at the top level or on the third miss, however long the model thinks.
Each test scores 0 to 100: a ladder by how far up it climbed (level 7 of 20 is 35), a full scramble 100 for a solve. The index weighs the tests: in Fast, the 2×2 ladder 20%, each 3×3 ladder 30% and each Gauntlet ladder 10%, so a model that doesn't unlock the Gauntlet tops out at 80 (Thorough weighs its tests equally). A test that was never played counts 0. Equal scores rank by the fewest moves, then the lowest cost, then the least time. Every model gets the same cubes, fixed per suite version from a secret only the server knows. The page also plots score against moves, time and cost, and each model has a page with every effort it was run at.
Anyone can play a suite with the start_suite and next_test tools; those results stay on the Community board.
There are more models than we can afford to run, so people we know run some of them for us with
cube-arena-runner and an 8-character invite code:
cube-arena-runner profile --x).Revoking a code can also hide everything it ran.
node --env-file=.env.local scripts/invite.mjs create "Priya" --note "OpenRouter credits" # prints the code once
node --env-file=.env.local scripts/invite.mjs list
node --env-file=.env.local scripts/invite.mjs revoke <invite id> --hide
node --env-file=.env.local scripts/invite.mjs x <invite id> priya_runs # set (or "-" to clear) someone's X handle
node --env-file=.env.local scripts/moderate.mjs transcript <run id>
node scripts/build-catalog.mjs # refresh data/catalog.json from data/aa-models.json and OpenRouter
node scripts/pack-runner.mjs # runs before every build: public/runner/cube-arena-runner-<version>.tgz, served for npm install -g
| Part | Where |
|---|---|
| NxN cube engine (moves, rotations, parsing), tested move-for-move against cubejs | lib/cube |
| Ladder scrambles, certified exact by search where feasible | lib/cube/scramble.ts |
| The picture models see: unfolded net, two 3D corner views, legend (SVG → PNG) | lib/render |
| Game rules and state, all in Postgres transactions | lib/arena |
| MCP server (stateless Streamable HTTP) | app/mcp/route.ts, lib/arena/mcp.ts |
| Suites and their grading | lib/arena/suites.ts |
| Website: index, leaderboards, live view, 3D replays | app, components |
Built with Next.js, the MCP TypeScript SDK, react-three-fiber and Postgres (Supabase).
npm install
cp .env.example .env.local # fill in the three values
npm run db:migrate # needs ADMIN_ENV_FILE with the database admin password
npm run dev # http://localhost:3060, MCP at /mcp
The app connects as a limited cube_app role that can only read and write the cube_arena schema. Migrations live in db.
Checks: npm run typecheck, npm run lint, npm test. scripts/smoke.mjs plays a full game against a running server.
node --env-file=.env.local runner/suite.mjs --model gpt-6-luna --effort max --suite fast # one suite, a fresh session per test
node --env-file=.env.local runner/sweep.mjs --suite fast # every model × effort in runner/models.mjs; add --go to play
node --env-file=.env.local runner/sweep.mjs --suite thorough --top 5 # Thorough for the 5 best on Fast, at their top effort
node --env-file=.env.local runner/run.mjs --model claude-opus-5-5 --effort high --size 3 --mode interactive # a single run
The sweep plays Claude and Codex models side by side, one suite at a time each, skips suites already finished and resumes half-played ones. Claude models only get the efforts they support (Opus 4.5: low to high; Sonnet 4.5 and Haiku 4.5: none).
Codex runs use their own CODEX_HOME (~/.codex-bench, signed in once with CODEX_HOME=~/.codex-bench codex login --device-auth).
If anything other than the cube tools shows up, the run is stopped and hidden. Transcripts are saved to runner/out/.
node --env-file=.env.local scripts/moderate.mjs list
node --env-file=.env.local scripts/moderate.mjs hide <run or attempt id, or replay URL> --reason "fake model name"
node --env-file=.env.local scripts/moderate.mjs rename <id> "GPT-6-Astra"
Hidden runs leave every public page but stay in the database (unhide brings them back). Hiding a suite, or any run in it, hides the
whole suite.
MIT. Cube Arena is a KRNL Studio experiment and is not affiliated with any cube brand.