simba-runner — because even a 404 page deserves a game
┌─[ status: live ]─[ version: 2.0 ]─[ license: MIT ]─[ price: $0 ]─[ deps: 0 ]─[ runtime: vanilla JS ]─[ size: ~18 KB ]─┐
simba-runner — endless runner where the cat is the hero, the background is parallax, and the 404 page is the stage.
Every page has a 404. Most 404s say "Page not found, go back." My 404 is an arcade with a cat. Because Simba deserves more than lazily sleeping on the keyboard (although he likes that too).
📖 Table of Contents
▶ Play now
One click: esej.space/404 (yes, INTENTIONAL 404 — the game loads there instead of the standard error).
Or any non-existent URL — e.g. esej.space/lalala. Every wrong path leads to the arcade.
🎯 About
Simba — Maine Coon, house cat, 7 kg of living protest against human deadlines. After a while I thought: "it's a pity not to preserve him digitally."
The idea: an endless runner in the style of the Chrome dino, but:
- on the 404 page — because an error page doesn't have to be boring
- with a cat instead of a dinosaur — because Simba is more photogenic than a T-Rex
- with parallax background — because without parallax it would be just another dino game
- with power-ups — because every game deserves a shield, magnet, and slow-mo
- with a leaderboard — because without competition there is no motivation
✨ Features
- 🐈 Simba as the protagonist — runs, jumps, collects power-ups, sometimes dies
- 🏔️ Parallax background — mountains (layer 1) + city silhouette (layer 2) + drifting clouds (layer 3)
- ⭐ Particle effects — when collecting power-ups, upon death, at 1000m milestones
- 🌅 Day-night cycle every 1100m — sky gradient changes, stars twinkle at night
- 💎 5 power-ups — SHIELD / MAGNET / x2 / SLOW-MO / BOOST
- 🏆 Leaderboard top 50 — localStorage, your nickname + best score
- 💾 Zero backend — everything client-side, works offline after the first load
- 📱 Touch controls — tap to jump on mobile
💎 Power-ups
| icon | name | duration | effect |
|---|---|---|---|
| 🛡️ | SHIELD | 8s | You hit an obstacle, but it doesn't kill you. One hit and the shield disappears. |
| 🧲 | MAGNET | 10s | All coins within a 200px radius are pulled toward Simba. |
| ×2 | DOUBLE POINTS | 12s | Every collected point counts double. |
| 🐌 | SLOW-MO | 5s | The world slows down 2x, Simba moves normally. Time-perception dilation. |
| 🚀 | BOOST | 3s | Simba sprints at 3x base speed. Trail particle effect. |
🎮 Controls
| action | key | touch |
|---|---|---|
| jump | Space or ↑ | tap |
| double jump | 2× Space | 2× tap |
| dodge | ↓ | swipe down |
| pause | P or Esc | — |
| restart | R | tap on game over |
Save modal: Space / Enter submit · Esc skip · nick without spaces.
🛠️ Stack
| layer | tech | why |
|---|---|---|
| engine | vanilla JS + Canvas 2D | endless runner doesn't need WebGL or Unity |
| render | requestAnimationFrame | 60 FPS on any hardware from 2010 onwards |
| storage | localStorage (simba_leaderboard_v2) | zero backend, zero cost |
| physics | custom (gravity + collision boxes) | ~50 lines of code, works |
| assets | SVG inline + emoji | no HTTP requests for graphics |
| file | assets/js/simba-runner.js | integral part of the theme, loaded only on 404 |
| container | <div id="simba-runner"> in 404.php | theme renders when WP returns 404 status |
🏆 Leaderboard
Top 50 all time per browser/device (localStorage, not synced between browsers).
- Key:
simba_leaderboard_v2(bumped from v1 — old scores were cleared on upgrade) - Nick: max 16 characters, no spaces (compromise for parsing)
- Sorting: by score DESC, ties → older score ranks higher
Global leaderboard is on the roadmap — it would require a backend, queue, anti-cheat. Maybe in v3.0.
📜 Changelog
v2.0 — 2026-05-19 — Power-up Edition
- 5 power-ups (SHIELD / MAGNET / x2 / SLOW-MO / BOOST)
- Parallax background (mountains + city silhouette + clouds)
- Particle effects (collection, death, milestones)
- Day-night cycle every 1100m
- Flickering stars at night
- Save modal: SPACE/ENTER submit, ESC skip
- Leaderboard key bumped (
v1→v2) — clean slate - Container ID renamed (
simba-runner-container→simba-runner)
v1.0 — earlier — Initial release
- Endless runner core gameplay
- Simba + one obstacle
- Score counter, basic leaderboard
- Single static background
🗺️ Roadmap
v2.1 — Polish
- [ ] sound effects (jump, hit, power-up pickup, death)
- [ ] music toggle (chiptune loop)
- [ ] settings panel (volume, particles on/off, FPS counter)
- [ ] colorblind mode (alt palette for power-ups)
v2.2 — More biomes
- [ ] biome 2: forest (instead of city), at night — fireflies
- [ ] biome 3: space (after running 5000m), weaker gravity
- [ ] random biome rotation every 1500m
v2.3 — Enemies
- [ ] obstacle 2: drone (flying, must duck)
- [ ] obstacle 3: neighbor's dog (chasing for 3s)
- [ ] boss every 3000m: Roomba vacuum
v3.0 — Global leaderboard (requires backend)
- [ ] POST /score endpoint in WP REST
- [ ] anti-cheat: checksum score + replay validation
- [ ] global top 100 displayed next to local top 50
- [ ] daily challenges (each day has seeded RNG)
❓ FAQ
Why on 404 and not on a separate page?
Because the 404 page only had "Page not found". Better that someone who got lost gets something more than 503 words "go back home" from their mistake.
Does Simba get royalties?
Yes. In the form of gravel. Every day.
Can I hack the leaderboard?
Yes. It's localStorage. localStorage.setItem('simba_leaderboard_v2', ...) in the console and you're in top 1. But honor matters, not numbers.
Why not React/Phaser/Unity?
Because it's unnecessary. 18KB vanilla JS does the same. Without 200MB of node_modules.
Will there be an Android/iOS app?
No. The page is PWA-ready, so "Add to home screen" and you have an app.
Your highest score?
~12,400m. But that was without power-ups (v1.0). In v2.0 I haven't had time to play yet.
// PS: Simba never played simba-runner. He claims it's offensive — a cat doesn't run 12km for no reason.