$ cat projekty/simba-runner.md

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

iconnamedurationeffect
🛡️SHIELD8sYou hit an obstacle, but it doesn't kill you. One hit and the shield disappears.
🧲MAGNET10sAll coins within a 200px radius are pulled toward Simba.
×2DOUBLE POINTS12sEvery collected point counts double.
🐌SLOW-MO5sThe world slows down 2x, Simba moves normally. Time-perception dilation.
🚀BOOST3sSimba sprints at 3x base speed. Trail particle effect.

🎮 Controls

actionkeytouch
jumpSpace or tap
double jumpSpace2× tap
dodgeswipe down
pauseP or Esc
restartRtap on game over

Save modal: Space / Enter submit · Esc skip · nick without spaces.


🛠️ Stack

layertechwhy
enginevanilla JS + Canvas 2Dendless runner doesn't need WebGL or Unity
renderrequestAnimationFrame60 FPS on any hardware from 2010 onwards
storagelocalStorage (simba_leaderboard_v2)zero backend, zero cost
physicscustom (gravity + collision boxes)~50 lines of code, works
assetsSVG inline + emojino HTTP requests for graphics
fileassets/js/simba-runner.jsintegral part of the theme, loaded only on 404
container<div id="simba-runner"> in 404.phptheme 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 (v1v2) — clean slate
  • Container ID renamed (simba-runner-containersimba-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.

Leave a Reply

// markdown in comments: yes.