Rubik's Trainer#
A local-first web trainer for intermediate CFOP speedcubers — the people sitting around 20 seconds who already know that the next chunk of improvement is hiding in F2L recognition, last-layer recall and finger tricks rather than in raw turning speed.
The app keeps an algorithm library (41 F2L, 57 OLL and 21 PLL cases), records how well you actually know each case, and turns your weakest cases into short repeatable drills. Everything runs on your own machine in Docker; nothing is sent anywhere and the app works with the network cable pulled out.
Who this is for#
- Student
- You want to get faster, you have a cube in your hand, and you want the app to tell you what to practise next instead of making you decide.
- Coach
- You keep several students on one machine. Each gets a profile, their own assessments, their own drill history and their own training plans.
- Developer
- You want to add a case, wire up a new drill mode, or call the JSON API from something else.
The idea in one paragraph#
You cannot practise everything at once, so the trainer maintains a single
number — a score from 0 to 100 — for every (profile, case) pair. A case you
have never seen scores None and sorts to the very top, because unknown work
is the most valuable work. A case you have only self-assessed is capped at 80,
because an unmeasured claim is not mastery. Once you have timed a case enough
times, measured attempts take over and are compared against the split target
for your solve goal. Drills then pull the worst cases off the top of that list.
Map of the documentation#
| Section | Read it when |
|---|---|
| Using the trainer | You want to learn the app: the tour, the library, assessments, drills, plans, the timer and the 3D viewer |
| Administration | You run the instance: profiles, backups, resets, and every configuration key |
| Installation | You are installing, upgrading, or something is broken |
| Developer | You are changing the code, adding cases, or calling the API |
Two pages are worth reading even if you skip the rest:
- Expected times — what a sub-20 solve is actually made of, with references. This is the yardstick the whole scoring model uses.
- Drills — the loop the app is built around.
Everything here is a file
This site is nothing but the docs/ directory rendered on the fly. Edit a
markdown file and reload the page — the tree is re-read whenever a file's
modification time changes, so you do not need to restart the container.
Conventions used in this manual#
- Move sequences are written in Singmaster notation:
R U R' U'. The full grammar is in Cube engine → Notation. - Times are shown in seconds with two decimals (
12.34), and stored internally as integer milliseconds. - Shell commands assume you are in the repository root and that everything runs through Docker Compose:
docker compose run --rm web pytest
RT_*names are environment variables; dotted names liketargets.splitsare keys inapp/config/config.yml.
Credits#
Algorithms come from the F2L / OLL / PLL sheets by Feliks Zemdegs and Andy
Klise, shipped as PDFs in pdf/. Those sheets credit Conrad Rider's
VisualCube for the case diagrams. The scramble format is chosen so scrambles
paste straight into csTimer.