Inspiration
Typing tests are weirdly addictive. Sites like Monkeytype turn a plain skill into a number you want to beat. But the screen is a white box and a timer. We wanted the feeling of Subway Surfers or Temple Run: something is chasing you, you can't look away, and the only control is your keyboard.
Then we hit the problem every typing game has. It either crushes a 30 WPM beginner or bores a 120 WPM speed typist. So we gave ourselves one rule: every player should feel the same panic, no matter how fast they type.
What it does
Slyrun is a 2D runner where your keyboard is the gas pedal. The world is ending. A darkness called the Storm is swallowing the forests, the mountains, the ground itself. Sly the fox is the last thing still running.
- A word appears. You type it. Then the next one, and the next.
- Type fast and Sly sprints ahead. Slow down or slip, and the Storm creeps in from the left: embers, cracking ground, a rumble, faster music, and finally its glowing eyes.
- If it catches Sly, the ground gives way.
A quick 30-second test tunes the game to your speed before your first run. You can play a Timed Journey (30 s, 1 min or 2 min) or Survival, where the Storm keeps speeding up until it catches you. There are three difficulties and two typo rules: Stumble (a typo costs you ground) and Freeze (the world drains to grey until you fix it).
How we built it
One number runs the whole game. \(H\) is the Storm's pace in WPM: the speed you need just to hold your ground. In casual runs it comes from your own baseline speed \(B\) and a difficulty pressure \(P\) (0.75, 0.90 or 1.05):
$$H = P \times B$$
So on Medium, a 30 WPM typist has to hold 27 WPM and a 120 WPM typist has to hold 108. Same pressure, different hands.
Sly's speed comes from your live WPM over a rolling 3-second window, smoothed so Sly doesn't stutter between words. If \(\hat{W}\) is the raw WPM in the window:
$$W \leftarrow W + (\hat{W} - W)\left(1 - e^{-\Delta t / 0.4}\right)$$
$$r = \mathrm{clamp}\left(\frac{W}{H}, \quad 0.25, \quad 1.8\right)$$
At \(r = 1\) you're holding ground. The floor keeps Sly moving even when you stop, and the ceiling stops one burst from banking a huge lead.
The gap \(g\) between Sly and the Storm is the only thing the rest of the game reads. The Storm moves at speed \(v = 1\) (or 0.5 while you're frozen by a typo):
$$g \leftarrow \mathrm{clamp}\left(g + 1.5 \cdot (r - v) \cdot \Delta t, \quad 0, \quad 6\right)$$
Every visual and sound is a function of \(g\): smoke on the horizon when you're safe, embers and scribbles in Warning, ground cracking and screen shake in Danger, the Storm's eyes opening in Critical. The rumble's volume is \((1 - g/6)^2\), so it stays quiet until the danger is real. At \(g = 0\), Sly falls. In Survival, the pressure rises by 0.003 every second, so every run eventually ends.
The engine. The game is built in Godot 4 with GDScript and exported to the web, so anyone can play from a link. Sly and the Storm each take just one speed number, which keeps the code small and makes a future 1v1 mode a simple swap: the Storm's clock gets replaced by the other player's typing.
Words come from Monkeytype's open English frequency lists, split into easy, medium and hard banks by length and filtered by hand, plus our own themed words like ember, hollow, outrun and tremor.
Art, audio and website. Every asset is original. We sketched the look in Figma first, then drew Sly, the hills and the layered soil as vector art. The music is layered and crossfades as the Storm gets closer. The website opens on a dark keyboard: as you scroll, the S, L, Y, R, U and N keys pop out and fly together into the logo, then Sly lands on a sunny hillside where he wags his tail and looks around. A web demo page shows the idea in seconds: type the word and Sly speeds up from a walk to a run while the world scrolls past.
Challenges we ran into
Making fair hard to cheat. If the game scales to your test score, the obvious trick is to type slowly on purpose and get an easy game. We closed that in layers. Pauses don't lower the test score, a burst check catches "type fast, then wait," and deliberate typos are caught by comparing gross and net WPM. Most importantly, the Storm learns during the run. If your sustained speed \(S\) is well above your baseline (tolerance \(T\) of 1.15 or 1.25), the baseline moves up to meet you:
$$B \leftarrow B + \left(\frac{S}{T} - B\right)\left(1 - e^{-\Delta t / 3}\right)$$
When it does, the Storm surges forward and the game tells you: "The Storm has learned your pace." Ranked runs skip the baseline completely and use fixed paces (30, 50 or 70 WPM), so a leaderboard can't be gamed this way.
- Smooth, not twitchy. Using raw keystrokes made Sly lurch between words. A rolling window fixed that, but made the first few seconds of each run read as zero. We fill the window with "ghost keystrokes" at the Storm's pace when the run starts, and they fade out as your real typing takes over.
- Players never look away from the words. Any warning in the middle of the screen gets missed, so danger had to live at the edges: color, shake, sound.
- Making 2D art feel alive. Our first art direction didn't feel like Slyrun, so we redrew everything from our own mockups. Small details took several rounds. Sly's head turn showed the flat side of the drawing, so we made it a small glance. Birds that flipped looked wrong, so their wings now bend through each flap and glide.
What we learned
- Game feel is math you can tune. Putting every number in one config file meant anyone on the team could adjust the difficulty without touching code.
- Designing around a single variable, the gap, made every new feature cheap to add: visuals, sound and game over all read the same number.
- To design something fair, you have to think like someone trying to break it.
- Tiny animations, like a tail wag or a blink, do a lot of the work of making a character worth rooting for.
What's next
- 1v1: one player types as Sly, the other types as the Storm chasing them.
- Ranked leaderboards, personal bests, a WPM-over-time chart and unlockable fox skins.
- New word packs: code, other languages, commonly misspelled words.
- More of Sly's journey: new landscapes and chapters of the story.
Word lists from Monkeytype (GPL-3.0). Built at Knight Hacks IX.
Built With
- css
- figma
- gdscript
- godot
- html
- html5
- javascript
- monkeytype
- svg
- webassembly

Log in or sign up for Devpost to join the conversation.