Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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


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:

  1. A hard-to-reach item (animated, elaborate), or
  2. 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 kn00t folder.
  • 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

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):

PathSource
assets/src/bg/*.jpgthe 4 signal-*.jpg sky/landscape photos above
assets/src/video/VID-20210802-WA0000.mp4prequel source (stick-figure flipbook)
assets/src/video/VDSL_Video_1622044168870.mp4interlude source (nifty.ink drawing replay)
assets/src/kn00t/*.webp, kn00t_67.gifthe Discord CDN links above
assets/src/pixel/*.webpthe 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/)

SourceWhat it actually isUse
pixelsp33d.jpg (150×150)Orange blob/taco with eyes + “PIXEL” wordmark. YT/Discord avatarHUD score badge (as specced)
pixel/robot3bild, pixel/unknownVoxel/Minecraft-style robot: white body, cyan eyes, copper antenna, control panel, copper feetPlayer sprite base (proposed)
pixel/kleki_2021_06_03Hand-drawn brown mouse/bear headInterlude art / secret
kn00t/gdrive/*.png8 native 16×16 pixel-art portraits: Cyber, Diving, EvilOriginal, God, InBlack, OpenHair, RedShirt, LazyPer-level boss forms — zero conversion needed
kn00t/kn00t_1..3.webp3 more kn00t busts (straw hat / top hat / eyepatch), ~16×16 upscaledExtra boss forms, dialogue portraits
kn00t/kn00t_67.gif2-frame kn00t idle loop, straw hat + rainbow shirtThe “6-7” special cameo (spec req.)
kn00t/nifty_1kn00t full-body wizard, yellow hat, rainbow shirtBoss full-body sprite reference
kn00t/nifty_2Red mushroom house with rainbow-lit doorLevel scenery / hub
kn00t/nifty_3Yellow horned creature, blue eyesCollectible companion / powerup
kn00t/nifty_4Red “piXELSP33D” wordmarkTitle screen logo
bg/signal-*.jpg ×5Real photos by Moritz: puffy blue sky · mackerel sky w/ tree · field w/ power pylons · 2× above-the-clouds from a plane wingParallax backgrounds, one set per level
video/VID-20210802-WA0000.mp4 (3.2s)Hand-drawn stick-figure flipbook on lined paperPrequel 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)

ItemRoleEffect
PizzaFood+10 energy
KebapFood+25 energy
vegan SchnitzelFood (rare, Moritz’s own)+40 energy, full heal
Lidl River ColaSpeed pickup+1 speed tier — the levelling currency
FootballContext-dependentObstacle 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.

ItemRoleEffect
Drop ChickenHarmless, patrols like a Keen snail+8 energy on contact — safe, even edible
Poison EggObstacle, patrols like a Keen snail−35 energy on contact (harder-hitting than Football — “possibly fatal”)
uervel knightPowerupOnce 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.

#SceneVerbBackgroundBoss form
0Prequellined paper
1MinigolfJumpmackerel sky + treeLazykn00t
2Lidl LunchWalk / Runpuffy blue skykn00tInBlack
3Soccer w/ friendsRun (sprint)field + power pylonskn00tRedShirt
4TanzstundeSneak (rhythm)mackerel sky, dusk gradekn00tOpenHair
5Above the CloudsFly / Jetplane wing ×2Cyberkn00t → EvilOriginalkn00t
Post-gameallGodkn00t

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 in assets/gen/. Never hand-edit gen/.
  • 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.game record 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

PhaseOutputRough size
P0 Asset pipelinetools/pixelize.sh, palette, assets/gen/ populated, contact sheets to eyeballsmall
P1 Player + kn00t sprites10 Pixel sprites, boss sprite sheets from the 16×16 portraitsmedium
P2 Engine corecanvas loop, fixed timestep, input, integer camera, 4-layer parallax, collisionmedium
P3 Gameplayenergy/speed model, items, obstacles, the 5 movement verbs, boss encounters, egg-dish enemy + uervel knight — done, prototyped in Lidl Lunchlarge
P4 Levels 1–5level data files, per-level backgrounds, tuning, the three secret-area portals (Minigolf hole, mushroom-house treasure trove, River Cola crate stack)large
P5 Narrativeprequel/interlude/sequel cutscene player, caption system, narration slotsmedium
P6 atproto + scoregame record, run/trophy lexicons, score screen with PIXEL badgemedium
P7 Shipstatic dist/ build + mobile touch controls; deployment to pixelsp33d.de left to yousmall

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.txt are signed and will expire — assets are already pulled into assets/src/, so this only matters if we need re-downloads.