From the margins
An ongoing goose

A small history
of honking.

A goose has wandered through this site since the beginning. First a few characters in a pond; now a small collection of pixels with places to be.

Meet both generations below. Follow the ASCII goose with your cursor, or click the pixel goose to make it honk.

V1

ASCII Pond System

July 3, 2025 to January 26, 2026

     __
  __(o )>
  \ <_. )
   `---'

V2

Pixel Sprite System

January 26, 2026 to present

The selected edition

Pixel Sprite System

January 26, 2026 to present

The current sprite-sheet goose shipped on January 26, 2026 in the header rail and was optimized later that same day. The goose now has a transparent background and a coral heart, so it can live in both light and dark themes.

V2: Pixel Sprite System

Live on Goose Group: January 26, 2026 to present.

The current goose replaced the ASCII system on January 26, 2026. It uses a compact sprite sheet, a small state machine, and runtime mirroring to cover both leftward and rightward motion.

Mechanism

  • The current goose is a single DOM node with background-image: url(/goose-sprite-warm-heart.png) and a moving background-position.
  • The transparent sheet is displayed at 264×144, organized as a 6×3 grid of 44×48 cells. The sprite element itself is 44×48, trimmed inside a 40×46 viewport.
  • Leftward movement does not use separate art. The same frames are mirrored at runtime with transform: scaleX(-1) on the sprite element.
  • A requestAnimationFrame loop advances both motion and animation state, while timers determine when to switch between walking, idle, sitting, and honking.

Behavioral Algorithm

  1. Walking: the goose drifts horizontally, cycles an eight-step walk playback, and bounces at the left and right bounds.
  2. Idle: the goose stays in place and alternates between two row-three standing frames before returning to walking.
  3. Sitting: it plays a sit-down transition, loops through the seated heart frames for 5 to 15 seconds, then plays a get-up transition.
  4. Honking: it runs an eight-step wing-flap cycle, then idles briefly before randomizing direction and returning to walking.
  5. Interaction: clicking the live goose forces the state machine into `honking` immediately if it is not already there.

Sprite Sheet

The live sheet is the same asset used in the current site header. The atlas below shows every raw frame the state machine references.

Goose sprite sheet used by the current header goose
`/public/goose-sprite-warm-heart.png`, displayed as a 6×3 grid of 44×48 cells. The original opaque sheet is preserved at `/goose-sprite.png`.

Walk Row

Playback order while walking: (4,0) → (3,0) → (2,0) → (1,0) → (0,0) → (1,0) → (2,0) → (3,0).

W0

Deepest forward stride

W1

Return from stride

W2

Mid-waddle

W3

Pre-stride

W4

Neutral walk anchor

Sit / Heart Row

Sit-down uses (1,1) → (2,1), seated loop uses (3,1) → (4,1) → (5,1) → (4,1), and get-up uses (2,1) → (1,1) → (0,1).

UP3

Final get-up frame

DOWN1

First sit-down frame / second get-up frame

DOWN2

Second sit-down frame / first get-up frame

SIT

Seated neutral frame

HEART1

Heart loop frame A

HEART2

Heart loop frame B

Honk / Idle Row

Honk playback: (0,2) → (1,2) → (2,2) → (3,2) → (3,2) → (2,2) → (1,2) → (0,2). Idle playback toggles (4,2) and (5,2).

H0

Honk frame 1

H1

Honk frame 2

H2

Honk frame 3

H3

Honk frame 4 / peak flap

I0

Idle frame 1

I1

Idle frame 2

Directional Note

The sprite atlas itself only stores one facing direction. Leftward travel is produced by flipping the sprite element with CSS. That means the walk, idle, sitting, and honk sequences all reuse the same raw cells regardless of direction.