Skip to content

Draw a character, watch him walk#9

Merged
codewithwan merged 2 commits into
mainfrom
feat/character-editor
Jul 16, 2026
Merged

Draw a character, watch him walk#9
codewithwan merged 2 commits into
mainfrom
feat/character-editor

Conversation

@codewithwan

Copy link
Copy Markdown
Owner

The repo has promised "characters are plain TOML — zero Rust" since the
start, in three places, and meant it. But zero Rust still meant typing # and
+ into a text file, guessing at the shape, and running a build to find out.

Two characters exist. Both mine. That's the tell.

The spec is smaller than it looks

It asks for six fields that look like work — sit_rows, leg_frames,
eye_row, mouth_row, legs_row, and the art. Only the art is work. Both
existing characters derive from rows alone, exactly — checked against them,
not assumed:

field derived as awan oyen
sit_rows [blank] + rows[:5]
leg_frames [legs, ←1, legs, →1]
eye_row first row with @
legs_row last row

So the editor asks for a drawing and hands back a character. Ten by six, two
colours.

The first build lied, and that's the interesting part

A drawing with no eyes fails the engine's check, and character_of falls back
to the built-in buddy. So you drew a cat and watched a cloud walk past, with
nothing on screen to tell you why.

The cause was mine: I'd re-implemented the engine's validation rules in
JavaScript, and got them wrong. Two sources of truth, neither trustworthy.

check_spec now hands the engine's own verdict back across the wasm boundary,
and the preview refuses to draw a stand-in — it prints what the engine said,
which is the same check CI runs. One place decides what a character is.

The loop closes

Draw → he walks immediately (present, stroll, sleep, dance — the four beats a
character has to survive) → he's in the cast → the zip carries him as
characters/<name>.toml with awan.json pointing at him. A config naming a
file you don't have isn't a setup.

Engine untouched apart from check_spec: 47 tests, clippy clean, every file
under 200 lines.

The repo has promised 'characters are plain TOML — zero Rust' since the start,
in three places, and meant it. But zero Rust still meant typing '#' and '+' into
a text file, guessing at the shape, and running a build to find out. Two
characters exist, both mine. That's the tell.

The spec asks for six fields that look like work — sit_rows, leg_frames,
eye_row, mouth_row, legs_row, and the art. Only the art is work. Both existing
characters derive from  alone, exactly, and I checked that against them
rather than assuming: sit_rows is [blank] + rows[:5], leg_frames is [legs, ←1,
legs, →1], eye_row is the first row with an '@', legs_row is the last. So the
editor asks for a drawing and hands back a character.

The first build silently lied. A drawing with no eyes fails the engine's check,
and character_of falls back to the built-in buddy — so you drew a cat and
watched a cloud walk past, with nothing to tell you why. I'd re-implemented the
engine's rules in JavaScript, badly, which is how you get two sources of truth
and neither of them trusted. check_spec now hands the engine's own verdict back
across the wasm boundary, and the preview refuses to draw a stand-in: it prints
what the engine said, which is the same check CI runs.

He rides in the zip as characters/<name>.toml with awan.json pointing at him.
A config naming a file you don't have isn't a setup.
snk gets 5,951 stars for 'Generates a snake game from a github user
contributions graph'. Nine words on line eight, and you're done reading.

Ours opened with 'a tiny living character for your terminal — and a personality
layer any CLI can embed: wait, ask, react'. Two products joined by an 'and',
jargon nobody searches for, API names in the first breath — and not one mention
of GitHub, for a thing whose whole point is a GitHub profile.

It's one sentence now: a tiny pixel character that walks your GitHub
contribution year. The profile section moves to the front because that's what
someone came for, and the terminal moves under it and says out loud that it's
the second act. Every badge in the header resolves — checked, including the
crates.io one, which reads v0.0.5.

The engine is still the interesting part. It just isn't the pitch.
@codewithwan
codewithwan merged commit 9017084 into main Jul 16, 2026
9 of 10 checks passed
@codewithwan
codewithwan deleted the feat/character-editor branch July 16, 2026 17:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant