The timer#
The drill timer measures one case. This timer measures a whole solve, optionally broken into its four CFOP phases. It is what feeds your real phase averages, and therefore what eventually replaces the shipped split targets with your own numbers.
Timing a solve#
- A scramble is generated and shown — 18 random twists plus up to 6 more, with no cancelling moves. It pastes straight into csTimer if you want to cross-check. See Scrambling.
- Arm the timer: hold the spacebar (desktop) or press and hold the timer face (phone). It turns green when you have held it long enough.
- Release to start.
- Press once to stop. On a touch screen, tap anywhere on the timer face.
The timer face goes full-bleed while running — no navigation, no chrome, no distraction — and comes back with the result and the buttons for what to do with it.
Phase splits#
Splits are optional. Turn them on with the Splits toggle before you start. With splits on, the interaction changes from one stop to four taps:
| Tap | Ends |
|---|---|
| 1 | Cross |
| 2 | F2L |
| 3 | OLL |
| 4 | PLL — stops the timer |
Each tap records a cumulative time; the app stores the differences as
cross_ms, f2l_ms, oll_ms and pll_ms next to the total.
Splitting costs you a couple of tenths
Reaching for a key mid-solve is not free. Expect split-tracked solves to come out a little slower than untracked ones, and compare splits against splits rather than against your personal best.
If you mis-tap, the result screen lets you correct or clear individual splits before saving, and saving a solve with only some splits filled in is fine — a missing phase is stored as null and simply not counted in that phase's average.
Penalties#
Standard WCA-style penalties are on the result screen:
- OK — the time stands.
- +2 — two seconds added; stored as the raw time plus the penalty flag, so the original is not lost.
- DNF — the solve counts as an attempt but is excluded from every average.
What the app does with your solves#
Every solve is stored with its scramble, so you can reproduce it later — the solve list has a View button that loads the scramble into the 3D viewer.
Your solves drive:
- Session statistics — best, worst, mean, and the rolling averages every cuber expects: ao5, ao12, ao100 (WCA trimmed averages, dropping the best and worst 5%, DNFs counted as worst).
- Phase averages on the assessment overview, which is where split data actually earns its keep. Once you have enough split-tracked solves, the overview shows your real phase times against the targets for your goal, instead of only the projection built from case drills.
- The projected versus actual comparison. The projection adds up your isolated case times; your real splits are always slower, because real solves contain the pauses between phases that case drilling never exercises. The size of that gap is a direct measure of your lookahead.
- The "Getting better" chart on the dashboard — see below.
The "Getting better" chart#
On the dashboard, over the last 24 hours, 7, 30, 90 or 365 days. The 24-hour window buckets by the hour rather than the day — a day-bucketed day is a single column, and one column is not a trend — so its axis is clock time and its rolling average is over 6 hours instead of 7 days.
Four views of the same solves:
| Trend | The 7-day rolling mean, plus each day's mean as a tick. The smooth version: where you are, without the noise. |
| Every solve | One mark per solve. The only view that shows spread — and a plateau in the mean is usually a spread problem wearing a disguise. |
| Both | The scatter with the trend drawn over it. The default. |
| Solves/day | How many solves you did each day. A different question — am I turning up — and often the one that explains a flat line in the others. |
Two solvers with the same 25-second average, one steady and one alternating 18s and 34s, need completely different practice, and only the scatter tells them apart. That is why Both is the default rather than the trend alone.
A long enough history is thinned before it is drawn — the chart says so when that happens rather than quietly showing a sample of your solves and calling it all of them.
Solves/day counts DNFs, because a DNF is a solve you did. It is the one view that does; a DNF has no time, so it cannot appear in the other three.
Setting outliers aside#
A what-if, for the question every cuber asks: what would my average be without the disasters?
Pick which end to cut — the slow ones, the fast ones, or both — and drag the slider. It is a sigma filter: it sets aside every solve further than that many standard deviations from your mean. At 3σ almost nothing goes; at 1σ roughly a third does.
The line under the slider is the answer, and it always shows both numbers:
26 of 282 timed solves (9.2%) set aside — kept under 39.75s. Mean 29.53s → 27.46s.
Three things worth knowing about how it behaves:
- The threshold comes from your unfiltered mean, computed once. A filter that re-derives its own threshold from what it has already trimmed keeps finding new outliers in a shrinking sample, and a slider whose meaning changes as you drag it is not a slider.
- The slider redraws as you drag it, with no request to the server: the page arrives carrying your solves, and the browser recomputes the whole chart from them. Nothing is saved, and the URL follows what is on screen so a reload or a shared link lands on the same view.
- The solves it sets aside are still drawn, as hollow rings. A filter you cannot see the effect of is one you cannot judge. The axis rescales to what is left, so some excluded solves end up above the top of the chart — the note says how many.
- It does not change your averages anywhere else. ao5, ao12, ao100 and your personal bests are untouched: this is a view, not an edit. Nothing is deleted, and reloading without the filter shows every solve again. Solves/day ignores it too — that view answers "did I turn up", and you did turn up for the solve you locked up on.
Keyboard and touch#
| Action | Desktop | Phone |
|---|---|---|
| Arm / start | Hold and release Space |
Press and hold the timer face |
| Stop / split | Space or any key |
Tap the timer face |
| Cancel a running solve | Esc |
The Cancel button |
| New scramble | N |
The ↻ button |
| Toggle splits | S |
The Splits switch |
Everything is reachable without a pointer, and the timer face is a real button with a visible focus ring, so screen-reader and keyboard-only use works.
Inspection#
If your instance sets drills.inspection_seconds above zero, the timer offers
a WCA-style inspection countdown before the solve starts, with the customary
audible-free 8- and 12-second markers shown on screen. It ships disabled
(0), because most practice is more useful without it.
Importing and exporting#
- Copy scramble puts the current scramble on the clipboard in csTimer's format.
- Export solves downloads your solve history as JSON — total, splits, penalty, scramble and timestamp per solve. That file is also what backups contain, in a larger form.
- Import from csTimer reads a csTimer export and adds the solves in it.
Importing from csTimer#
csTimer is what a lot of people already time on. Its
export button writes a .txt file that is really JSON, and
Timer → Import from csTimer reads it.
In csTimer: the wrench icon → Export → Export to file.
Every session in the file is read. Each solve keeps its time, its scramble, its comment, its +2 or DNF, and the moment it was finished — so the history lands in the right order and your averages are the averages of the solves you actually did, not of one afternoon's worth stamped at today's date.
Importing the same file twice is safe
A solve is recognised by when it finished, its time and its scramble. Re-upload a file you have already imported and nothing is added; drop in next month's export and only the solves you have done since are added. So there is no need to remember which file you last used, or to trim one before uploading it.
A solve that is already here is left exactly as it is. If you cleared a DNF or edited a comment in csTimer afterwards, re-importing will not overwrite what is here — the first import wins. Neither the penalty nor the comment is part of how a solve is recognised, precisely so that editing one cannot make it import a second time.
What it cannot bring is the part this app is otherwise for. csTimer records a whole solve and nothing about the middle of it, so an imported solve has no phase splits — Where the seconds go stays empty for them — and no per-case attribution. Imported times count towards your averages, your personal best and your solve count; the case-level picture still comes from assessments and drills.