This page describes how vimkatas works: how a result is scored, where rank comes
from, and what a subscription buys. It's public on purpose — rules you can't read
usually turn out to be unfair.
Everything in sections 1–6 works right now. Section 7 is planned, and says so.
1. The metric is keystrokes, not seconds
A vimkatas result is keystrokes, with time as the tiebreak.
That's the whole point of Vim: a command is a sentence, and the more directly you
said what you meant, the better you said it. Typing the wrong command quickly is
not an achievement. Pressing x five times and pressing dw once look identical
on screen — they are not the same command of the language.
So the leaderboard sorts by keystrokes first, and only compares time when
keystrokes tie.
2. Par
Every kata has a par — the keystrokes a canonical solution needs.
Par isn't a guess. Each kata carries its reference solution in the code, and a
test on every build checks that the solution really does solve the kata in
exactly par. If we lied about par, the build would fail.
You can hit par. Beating it usually isn't possible — par is the short way.
3. Rank
Rank is computed from your progress across every kata: for each one you've
cleared we take par / your keystrokes (capped at 1), and average that over
all katas in the campaign. That gives a percentage and a tier:
:readonly → hjkl rider → operator → text-object ninja → dot commander → Vim wizard
Two consequences worth understanding:
- Rank grows both from new katas and from improving old ones. Clearing
everything sloppily and clearing half of it perfectly are different numbers. - Rank cannot be bought. Not with money, not with anything. This is
deliberate: a subscription buys features, never progress.
4. We verify every run
When you solve a kata, your browser records the keystrokes with timestamps and
sends that recording to the server. The server replays it through the same
engine and derives the keystrokes and time itself.
We don't trust the number you send — we reproduce it. Forging a score in the
request is pointless: the number isn't used.
A side effect that matters for racing: a recording's timestamps are relative to
your own start, so latency can't affect your score. You never lose a live
race to your connection.
5. Ghost races
A ghost is someone's recorded run (or your own) replayed beside you. Who you get:
- the champion — the #1 run on the leaderboard;
- a challenge link — if someone sent you their run;
- your personal best — otherwise;
- a tier ghost — pick an opponent at your level, below it, or above it.
6. Subscription
A subscription buys features and cosmetics. It does not buy progress, rank or
leaderboard position — see §3.
Free forever: the whole campaign, ghost races, live races, the leaderboard, and
the lesson builder with a limit.
7. Planned — none of this exists yet
Marked honestly: nothing below is built. These are design decisions. We
publish them early so the rules can't change after the fact.
- A lesson builder in your profile. Free up to three lessons; a subscription
lifts the limit. - Collections. Group your lessons and publish them. Publishing needs a
subscription. - If your subscription ends: what you published stays with the community,
you keep playing and seeing all of your own work, and you can edit three
lessons — the three you choose. We charge for the right to create, not
for access to what you already made. - Publishing is one-way. A published collection stays available to the
community even if you leave. That will be stated before you press the button,
not after. - Rewards for authors. A popular and good collection earns a free
subscription. Only real players count (a verified recording, 10+ campaign katas
cleared, one person once, the author never), and it won't be volume alone —
completion rate and 👍/👎 count too. Otherwise clickbait would win over good
lessons.
What will never happen
Pay-to-win. Rank, leaderboard place and progress are earned by skill alone.
The only things money buys are features and appearance. That isn't a promise
about the future — it's a constraint we design against every time.