Deployed (front page)
VeryBad.Dog My personal site, and my workshop for building with AI.
My personal site, where AI coding agents write the code under one set of written rules. The front is this portfolio, a night sky where the mascot’s head is drawn in red pencil, one star for each project. The arcade has its own page: a cabinet drawn by WebGPU shaders on one canvas, with two games inside it. A browser without WebGPU gets a CSS cabinet and never downloads the GPU code. My private pages sit behind a two-layer GitHub sign-in.
What I set out to learn
I wanted to learn how to direct AI agents well on something I look at every day, and how far an AI that can’t draw can take a brand. Claude only writes code, so every piece of art on this site is code. One SVG of the mascot grows, through scripts the agents wrote, into the favicons, the link preview card, the arcade’s marquee and lamps, the games’ reference art and the red pencil constellation on the front page.
The hardest part
The arcade cabinet. It took six rounds of changes over three days in September. It started as three separate canvases, and the gaps between them split the picture apart. After the agents rebuilt it as one, the colour was too blue and buried the logos, the bezel had “some squares for no reason”, the screen read as a fish-eye on phones, and the collar spikes sat flat until each one became a lamp. The cloud machines that build the site have no graphics card, so I checked the speed of each pass on a real phone.
The arcade cabinet, round by round
- Three canvases became one. My note on the first build: “the space between all of the elements separates everything instead of connecting them.”
- The colour: “too blue… obscures the logos.” Blue now belongs only to the screen, and warm light only to the marquee’s lamp.
- The sign: the agents redrew the wordmark as pixel lettering on the brand’s own grid, so the marquee and the logo carry one wordmark at every size.
- The collar spikes: “it’s just kind of flat right now.” Each stud is now a lamp, found in the logo itself and lit across its whole shape, in a chase every 240 milliseconds.
- The bezel took three rounds, from a raised ridge and wide padding to one moulding drawn by a shader.
- The sky: the rain read as hail, so it went, and a moon, two tiers of stars, a shooting star and clouds came in. A flicker in the fence turned out to be the moonlight’s shadows beating against the brick, and the fix was measured before it shipped.
- The budget: a browser without WebGPU never downloads the GPU code, and the JavaScript before START fell from 250.7 kB to 143.6 kB.
One logo, every format
- The favicons and app icons, rendered from the logo onto a cream plate.
- The link preview card: the logo’s own head and wordmark under the front page’s pencil.
- The private pages’ mascot, which switches to a light ink in the dark scheme.
- The arcade’s marquee, its side art and the collar lamps, all cropped or measured from the same file.
- The front page’s constellation, traced from the head’s outline by a script, never drawn by hand.
- The games’ reference: Bone Yard’s attract-screen dog and the heads its sprites are checked against.
Decisions on VeryBad.Dog
One written rulebook for every AI coding tool
Why it matters Agents from several companies work on this codebase, so I put the rules in one file they all read: which files are frozen, what a private page may load, and which checks must pass. A failed check stops the deploy.
The cabinet drawn as one picture7 Sep 2026
Why it matters It started as three separate pieces. My note on that build: “the space between all of the elements separates everything instead of connecting them.” The marquee, screen and side art now draw as one object.