pixelsp33d
A pixel-art parallax sidescroller starring Pixel, narrated by Moritz (alias pixelsp33d), antagonized by kn00t. Will be published at pixelsp33d.de.
This site collects the project’s working documents so anyone can catch up without digging through the repo:
- Story & Game Design — the concept, level design, characters, and ongoing brainstorming.
- Assets & Sources — where all the artwork and media came from, and where it ended up in the repo.
- Technical Plan — asset pipeline, engine architecture, and the phased build plan.
These are living notes from an active build, not a finished spec — expect gaps, open questions, and things that change as we go.
Story & Game Design
Split from the original design notes on 2026-08-02.
Concept
We want to build a sidescroller game with a parallax effect. The player avatar is Pixel; levelling up happens by increasing speed. It will be published at pixelsp33d.de.
Narration
Levels are narrated by a real person, Moritz, alias pixelsp33d.
Level Design (initial thoughts)
Movement: Walk, Run, Jump, Sneak, Fly, Jet
Objects: Pizza, Kebap, vegan Schnitzel, Lidl Cola (“River Cola”), Football
Resolved in the technical plan: Pizza/Kebap/Schnitzel are food, River Cola is the sole speed-tier pickup, and Football is an obstacle everywhere except the Soccer scene, where it’s the objective.
Scenes: Minigolf, Lidl Lunch, Soccer game with friends, dancing lessons (Tanzstunde)
Winning Strategy
Avoid obstacles (they cost energy) and grab food items.
Narrative Sequences
Short prequel, sequel, and interlude (“Meanwhile …”) graphical sequences drive the narrative. One trophy will be Minecraft (opcraft) themed, based on opcraft (a Minecraft clone).
Characters
-
Antagonist: kn00t
-
Protagonist: left unplanned in the original notes.
Working decision in the technical plan: the protagonist is the voxel robot from the “pixel” reference art; the orange PIXEL blob avatar is used as the HUD score badge instead of the player character.
Score Display
Score display uses the provided pixel-art graphics used as the YT and Discord avatar.
References
- Pentaract: atproto video game lexicons — for scores/records interop. See the technical plan for how this project uses/extends it.
Post-Lunch Brainstorming (family session)
A moving opponent, like the snail in Commander Keen, could be an animated egg dish (Moritz dislikes Eierspeisen — egg dishes). Two opposing behaviors:
- Drop chicken — no danger, possibly even edible.
- Poisoned egg — drains energy, possibly fatal.
uervel knight is a powerup to fight the egg-dish opponent. Earned as a special achievement via either:
- A hard-to-reach item (animated, elaborate), or
- Unlocking a hidden level reachable via a portal (in Commander Keen, the player crawls into a pipe to reach one).
Resolved in the technical plan: Drop Chicken, Poison Egg, and the uervel knight are prototyped and working in the Lidl Lunch level. For the “pipe,” the Minigolf hole is the chosen portal to a hidden bonus level; the mushroom house door (already-drawn kn00t art) is leaning toward a separate treasure trove secret; a River Cola crate stack is earmarked as a secret entrance for a later level. None of the hidden levels are built yet.
Assets & Sources
Split from the original design notes on 2026-08-02.
Task
Extract game items from the source images, pixelize them, and create a pixelized player avatar using up to 10 sprites (running, jumping, …).
- Antagonist avatar images are pixelized in the
kn00tfolder. - Score display graphics:
pixelsp33d.jpg(top-level project file, the YT/Discord avatar) — used as the HUD score badge.
All Discord CDN links below are signed and will expire. Every asset they point to has already been downloaded into
assets/src/, so this list only matters if we ever need to re-fetch something from source.
Artwork
Source: Discord DMs (channel).
kn00t
- portrait 1
- portrait 2
- portrait 3
- reaction gif — the “6-7” cameo needs a special appearance in the game
pixel
- robot reference 1
- robot reference 2
/home/tgoerke/Downloads/VID-20210802-WA0000.mp4— “Alles gute zum Geburtstag”, from Pixel, 2021-08-02 — move to project folder- Kleki drawing (Pixel, 2021-07-03)
/home/tgoerke/Downloads/VDSL_Video_1622044168870.mp4
kn00t (nifty.ink w/ pixelsp33d)
Background art for the sidescroller
/home/tgoerke/signal-2026-08-02-12-00-27-109.jpg/home/tgoerke/signal-2026-08-02-11-59-28-734_002.jpg/home/tgoerke/signal-2026-08-02-11-59-28-734.jpg/home/tgoerke/signal-2026-08-02-11-57-26-572.jpg
(move to project folder)
Additional kn00t artwork (gdrive)
Google Drive folder kn00t (via rclone remote gdrive:kn00t)
contained 8 native 16×16 pixel-art portraits, already downloaded to
assets/src/kn00t/gdrive/: Cyberkn00t, Divingkn00t, EvilOriginalkn00t,
Godkn00t, kn00tInBlack, kn00tOpenHair, kn00tRedShirt, Lazykn00t.
What’s already in the repo
Local files already copied into the project (originals left in place):
| Path | Source |
|---|---|
assets/src/bg/*.jpg | the 4 signal-*.jpg sky/landscape photos above |
assets/src/video/VID-20210802-WA0000.mp4 | prequel source (stick-figure flipbook) |
assets/src/video/VDSL_Video_1622044168870.mp4 | interlude source (nifty.ink drawing replay) |
assets/src/kn00t/*.webp, kn00t_67.gif | the Discord CDN links above |
assets/src/pixel/*.webp | the Discord CDN links above |
See the technical plan for what each of
these turned out to actually be and how it’s used in-game, and
tools/*.sh + tools/*.py in the repo for the pixelization pipeline
that turns this source art into assets/gen/.
pixelsp33d.de — Build Plan
A pixel-art parallax sidescroller. Player avatar Pixel, antagonist kn00t, levels narrated by Moritz (alias pixelsp33d). Levelling up = gaining speed.
1. Asset inventory (gathered — all in assets/src/)
| Source | What it actually is | Use |
|---|---|---|
pixelsp33d.jpg (150×150) | Orange blob/taco with eyes + “PIXEL” wordmark. YT/Discord avatar | HUD score badge (as specced) |
pixel/robot3bild, pixel/unknown | Voxel/Minecraft-style robot: white body, cyan eyes, copper antenna, control panel, copper feet | Player sprite base (proposed) |
pixel/kleki_2021_06_03 | Hand-drawn brown mouse/bear head | Interlude art / secret |
kn00t/gdrive/*.png | 8 native 16×16 pixel-art portraits: Cyber, Diving, EvilOriginal, God, InBlack, OpenHair, RedShirt, Lazy | Per-level boss forms — zero conversion needed |
kn00t/kn00t_1..3.webp | 3 more kn00t busts (straw hat / top hat / eyepatch), ~16×16 upscaled | Extra boss forms, dialogue portraits |
kn00t/kn00t_67.gif | 2-frame kn00t idle loop, straw hat + rainbow shirt | The “6-7” special cameo (spec req.) |
kn00t/nifty_1 | kn00t full-body wizard, yellow hat, rainbow shirt | Boss full-body sprite reference |
kn00t/nifty_2 | Red mushroom house with rainbow-lit door | Level scenery / hub |
kn00t/nifty_3 | Yellow horned creature, blue eyes | Collectible companion / powerup |
kn00t/nifty_4 | Red “piXELSP33D” wordmark | Title screen logo |
bg/signal-*.jpg ×5 | Real photos by Moritz: puffy blue sky · mackerel sky w/ tree · field w/ power pylons · 2× above-the-clouds from a plane wing | Parallax backgrounds, one set per level |
video/VID-20210802-WA0000.mp4 (3.2s) | Hand-drawn stick-figure flipbook on lined paper | Prequel cutscene |
video/VDSL_Video_1622044168870.mp4 (18.2s, w/ audio) | nifty.ink drawing replay — art appearing stroke by stroke | “Meanwhile …” interlude |
Everything downloaded: Discord CDN links all live (11 files), gdrive kn00t/ folder pulled via rclone (16 files), local photos + videos copied in (originals left in place — nothing moved or deleted).
2. Design decisions
Items (spec asked me to decide food vs. obstacle)
| Item | Role | Effect |
|---|---|---|
| Pizza | Food | +10 energy |
| Kebap | Food | +25 energy |
| vegan Schnitzel | Food (rare, Moritz’s own) | +40 energy, full heal |
| Lidl River Cola | Speed pickup | +1 speed tier — the levelling currency |
| Football | Context-dependent | Obstacle everywhere (−15 energy, knockback) — except the Soccer level, where it’s the objective |
Rationale: speed is the progression axis, so exactly one item grants it. The football flipping role between levels is the cheap trick that makes the Soccer scene feel authored rather than reskinned.
Egg-dish enemy family (from the 2026-08-02 family-lunch brainstorm)
A moving opponent in the spirit of the Commander Keen snail — Moritz’s own dislike of Eierspeisen (egg dishes) made the antagonist. Two variants of the same creature, opposite intent. Prototyped and working in the Lidl Lunch level.
| Item | Role | Effect |
|---|---|---|
| Drop Chicken | Harmless, patrols like a Keen snail | +8 energy on contact — safe, even edible |
| Poison Egg | Obstacle, patrols like a Keen snail | −35 energy on contact (harder-hitting than Football — “possibly fatal”) |
| uervel knight | Powerup | Once collected, touching a Poison Egg defeats it instead of damaging the player (+5 energy, counts as a collected item) |
The knight is deliberately scoped to counter only the egg-dish family, not Football — different scene, different mechanic, keeps each obstacle type meaningful on its own.
Secret areas & the uervel knight’s second path
The brainstorm gave the knight two ways to earn it: (1) a hard-to-reach placed item, (2) a hidden level behind a Commander-Keen-style “pipe.” Path 1 is what’s implemented today (the knight sits on a jump-up crate in Lidl Lunch). For path 2 and other secrets, three portal ideas came out of discussion — each assigned a distinct role rather than left redundant:
- Minigolf hole (chosen) — sinking into the cup instead of finishing the hole normally is the portal into a hidden bonus level, the project’s answer to Keen’s pipe. Natural fit since Minigolf is already planned as level 1.
- Mushroom house door — the kn00t nifty.ink art (
assets/src/kn00t/nifty_2.webp, red mushroom house with a rainbow-lit door) is already drawn and already “his.” Leaning toward combining it with a treasure trove: a separate bonus-loot secret, not knight-related, reachable through that door. - River Cola crate stack — good secret-entrance idea, earmarked for a later level (not yet assigned); a stack of crates at the back of a level as a crawl-in point, no new art needed.
None of these hidden levels are built yet — this section records the decision on what each secret is for, ahead of P4 level construction.
Movement → level mapping
Each level teaches one verb and reuses the previous ones.
| # | Scene | Verb | Background | Boss form |
|---|---|---|---|---|
| 0 | Prequel | — | lined paper | — |
| 1 | Minigolf | Jump | mackerel sky + tree | Lazykn00t |
| 2 | Lidl Lunch | Walk / Run | puffy blue sky | kn00tInBlack |
| 3 | Soccer w/ friends | Run (sprint) | field + power pylons | kn00tRedShirt |
| 4 | Tanzstunde | Sneak (rhythm) | mackerel sky, dusk grade | kn00tOpenHair |
| 5 | Above the Clouds | Fly / Jet | plane wing ×2 | Cyberkn00t → EvilOriginalkn00t |
| ★ | Post-game | all | — | Godkn00t |
Divingkn00t is held for a bonus/underwater stage. The 6-7 gif cameos as a non-hostile easter egg between levels 3 and 4. Minigolf’s hole doubles as the secret portal to the hidden bonus level (see Secret areas above).
Player sprite set (10 sprites, the spec’s ceiling)
idle · run_1 · run_2 · run_3 · run_4 · jump_rise · fall · sneak · fly · hurt
Derived from the voxel robot at 16×24 px, palette-locked.
3. Technical approach
Locked decisions (2026-08-02): player = the voxel robot · vanilla TypeScript + Canvas2D · static dist/ build, hosting deferred · narration ships as timed captions with empty audio slots.
- Internal resolution 384×216, integer-scaled to viewport. Nearest-neighbour everywhere. No sub-pixel positions for sprites — that’s what kills pixel art.
- Parallax: 4 layers per level (far sky · cloud band · midground silhouette · ground), each a strip pixelized from the source photo, scroll factors
0.1 / 0.25 / 0.55 / 1.0. Speed tier multiplies scroll rate, so levelling up is visible in the background, not just a number. - Pixelization pipeline: ImageMagick script, committed and re-runnable — downsample → quantize to a shared 32-colour palette → optional Floyd-Steinberg on skies only → upscale for layer strips. Source art stays in
assets/src/, generated art inassets/gen/. Never hand-editgen/. - Cutscenes: videos → frame-extracted at ~8fps → pixelized → played back as sprite-sheet animations in-canvas. Keeps everything one renderer, no
<video>element, no codec worries. - Narration: per-level timed caption track (German, in the voice of pixelsp33d) plus an audio slot per line, empty for now. Dropping in Moritz’s recordings later is a data change, not a code change.
- Build: Vite → static
dist/, no server requirement. Deployable to any static host when the domain is ready; the atproto score layer (P6) is the only piece that will later want a Worker or equivalent.
atproto integration
Pentaract is early — only games.gamesgamesgamesgames.game is published; scores/achievements are conceptual, not implemented. So:
- Publish one
games.gamesgamesgamesgames.gamerecord for pixelsp33d (name, summary, type, modes) — real interop where it exists. - Define our own
de.pixelsp33d.*lexicons for what Pentaract lacks:run(a scored playthrough),trophy(incl. the opcraft-themed one),speedTier. Shaped to be replaceable by Pentaract equivalents when they land. - Scores render with the PIXEL blob badge, as specced.
4. Phases
| Phase | Output | Rough size |
|---|---|---|
| P0 Asset pipeline | tools/pixelize.sh, palette, assets/gen/ populated, contact sheets to eyeball | small |
| P1 Player + kn00t sprites | 10 Pixel sprites, boss sprite sheets from the 16×16 portraits | medium |
| P2 Engine core | canvas loop, fixed timestep, input, integer camera, 4-layer parallax, collision | medium |
| P3 Gameplay | energy/speed model, items, obstacles, the 5 movement verbs, boss encounters, egg-dish enemy + uervel knight — done, prototyped in Lidl Lunch | large |
| P4 Levels 1–5 | level data files, per-level backgrounds, tuning, the three secret-area portals (Minigolf hole, mushroom-house treasure trove, River Cola crate stack) | large |
| P5 Narrative | prequel/interlude/sequel cutscene player, caption system, narration slots | medium |
| P6 atproto + score | game record, run/trophy lexicons, score screen with PIXEL badge | medium |
| P7 Ship | static dist/ build + mobile touch controls; deployment to pixelsp33d.de left to you | small |
Playable vertical slice = P0–P3 with level 2 only. That’s the first thing worth showing Moritz.
5. Open dependencies
- Narration audio from Moritz (not blocking — caption-first).
- Hosting choice for pixelsp33d.de, deferred by decision. Build stays host-agnostic until then.
- Pentaract’s score/achievement lexicons don’t exist yet; our
de.pixelsp33d.*records are the stopgap and may need migrating if upstream lands equivalents. - Discord CDN links in
ASSETS.txtare signed and will expire — assets are already pulled intoassets/src/, so this only matters if we need re-downloads.