Frontend
The half that runs in the browser
React
Renders the whole SPA — 24 tool pages all live inside one React tree.
React Router
Routes all 24+ tool pages. Each page is lazy()-split into its own chunk with <Suspense> covering the load; react-router-dom 7 pairs with React 19 concurrent renderer.
Vite
Dev server + production bundler for the SPA. Cold start under 1s; build emits ~80 hashed chunks.
Three.js
The renderer behind every 3D cube on this site — TwistyPlayer and the sq1 demo both ride three.js.
cubing.js
Random-state scrambles for all 17 WCA events, 3D animation for every player, and KPuzzle state derivation all live here.
WebCodecs Stack
The core pipeline behind /frame-count. Video file → mp4box.js demux → WebCodecs hardware decode into VideoFrame → OffscreenCanvas crop → VideoEncoder hardware re-encode → mp4-muxer writes back to .mp4. VFR / exotic codecs fall back to ffmpeg.wasm.
Tailwind CSS
Installed on cuberoot.me, but mostly used as the preflight base layer with utility classes as an escape hatch.
i18next
The whole site\
Zustand
Client-side cross-page state — 11 stores: auth / settings / sessions / trainer / battle / calc / mosaic / viz / recon.
Backend
Processes and tables on that one VM
Hono
The whole backend API shell on this site. Hono 4 + Node 22 + pm2, 22 endpoints on 127.0.0.1:3001.
Node.js
Where the backend API, build tools, test runner, and scripts all run.
PM2
Starts the Hono API, restarts it on crash, and brings it back after reboot — one CLI.
PostgreSQL
Primary store. Recon caches, the 41-set alg library, training data, and WCA stats derivatives all live in PG 13.
pg_dump
Nightly backups. A 03:00 UTC systemd timer runs pg_dump -Fc into custom format on a 30-day rolling window.
MySQL
Local parser for the WCA public dump. stats-build reads it, ships JSON — never touches prod.
Docker
Run a local PG13 container to dry-run schema / migrations / load.sql before pushing to prod.
systemd
Runs the whole cuberoot.me VM — nginx, pm2, the pg-dump backup, and acme.sh renewals are all systemd units.
Edge / Network
TLS, DNS, HTTP — before a request even reaches a process
nginx
First hop for every request. SPA / API / WASM COI / blog archive all dispatched by one process.
Cloudflare DNS
Hosts the entire cuberoot.me zone. Authoritative only, grey-cloud on every record.
Let’s Encrypt
Signs the three certs (cuberoot.me / api.cuberoot.me / blog.cuberoot.me) used across this site; acme.sh + DNS-01 + a systemd timer renews them with zero hand-holding.
Dev / AI
From keystrokes to a commit — the whole authoring chain
Git
The single source of truth for this repo. Every commit, every branch, every deploy trigger starts here.
Claude
Co-author of nearly every new line of code on cuberoot.me. Opus 4.7 is the daily driver — the whole repo fits in one conversation at 1M context.
Claude Code
100% of this codebase is maintained inside Claude Code. Read / Edit / Bash / Grep + subagents + skills + memory replace most of an IDE.
pnpm
Package manager for the cuberoot.me monorepo — stitches 10 workspaces into a shared tree.
Turborepo
Threads build / typecheck / test / lint across the monorepo into a dependency graph, replaying cached outputs for unchanged packages.
Monorepo
Four core workspaces (client / server / shared / stats-build), one pnpm-lock, Turbo cache, one CI workflow.
npm
We type `pnpm install`, but every dependency still comes from registry.npmjs.org. package.json is the source; semver / lockfile is the glue.
Bun
Not in use. If we ever switch, the two first targets are api.cuberoot.me (Hono on Bun beats Node) and the one-off TS scripts under core/scripts/ (bun run is 2-3x faster cold start than tsx). The current pm2 + Node 22 setup is fine, so it stays.
uv
Python toolchain + deps + venvs in one binary. The site’s scripts are still on plain python3 — uv is the migration plan.
GitHub Actions
The execution engine behind this repo\
Playwright
UI regression suites + the browser backend AI agents drive to verify pages on this site.
Vitest
Runs unit / worker / regression tests — utils pure functions, worker algorithms, analyzer baselines all live here.
Tailscale
Pulls dev machine, phone, laptop onto one private network — dev servers reachable across devices without ever opening a public port.
OpenSSH
The transport beneath every server login, deploy, and git push. Every CI deploy on cuberoot.me rides it.
rsync
Syncs build artifacts / backups / mirrors between two machines — only the delta crosses the wire.
Obsidian
Planned tooling — personal knowledge base + AI-era context store. The cuberoot.me codebase does not depend on it yet, but the next year of work plans to move notes / design decisions / research into a vault and close the loop with Claude Code.
GitHub
Hosts this repo, RuiminYan/cuberoot.me, and executes the deploy / mirror / stats / healthcheck workflows.
curl
The default way to poke this repo. Opening an nginx vhost, pinging an endpoint, checking a cert, running a GitHub Actions health probe — all curl.