OmaCRT

RSS

The log · 29 September 2026 · design

An arcade hall, drawn with an agent

Between a Monday evening and Tuesday afternoon, Claude Opus 5.5 redrew OmaCRT's pixel art from prompts a line or two long. This entry shows the design canvases it proposed, the attempts I turned down, and the Rust that stayed.

subject

the launcher's pixel art, from the home screen to the idle pages

brief

two lines, in Italian

tools

Claude Code with Opus 5.5, design canvases, Rust drawing into a 320x240 framebuffer

image generators

none

3.5mmthe size of one voxel in every console model, taken from the real machine

The home screen today: an aisle between two rows of lit arcade cabinets, the OmaCRT sign in neon on the far wall, a man walking in, and the menu in a window of dark glass.
Launcher framebufferThe home screen today: an aisle between two rows of lit arcade cabinets, the OmaCRT sign in neon on the far wall, a man walking in, and the menu in a window of dark glass.

On Monday evening I typed this into Claude Code:

OK, now I want us to bring out Opus 5.5's artistic talents and improve OmaCRT's pixel art overall. I want it to be fantastic.

I wrote every prompt in Italian, and they are translated here. By Tuesday afternoon the launcher had an arcade hall for a home screen, twelve consoles built as 3D models, a new sky over Brussels and a small gallery of René Magritte's paintings that move.

01How a language model draws

OmaCRT's launcher draws every frame itself, into a buffer of 320 by 240 pixels that goes to the television as it is. There are no image files for the interface. A cabinet, a cloud or a console is a Rust function that decides the colour of each pixel, sixty times a second.

Opus 5.5 draws by writing code, and it can read an image back. Articles written since its release on 22 September describe the same method, code that places every pixel. In this project every proposal went through four steps:

  1. A mockup in Python on a design canvas, drawn with the launcher's own font, icons and colour themes, which the agent exported from the code before it started.
  2. My answer on the canvas, usually one line.
  3. The same idea in Rust, inside the launcher.
  4. A headless render of the launcher, frame by frame, which the agent read as an image and criticised before I saw it.

The agent cannot see my television, and the preview window on my desktop does not run at full speed. So it rendered the screen it was working on at the second it cared about, looked at the frame and fixed what it saw. Most of its corrections were made that way, before I had seen anything.

02Three directions and an honest answer

The first canvas put the same four screens side by side at real size: the launcher as it was, and three directions.

Today: the home screen as the launcher drew it on Monday.
Launcher framebufferToday: the home screen as the launcher drew it on Monday.
A: every screen in full windows, after the role playing games on the Super Famicom.
Design canvasA: every screen in full windows, after the role playing games on the Super Famicom.
B: the same layout with a raised selection and a light that sweeps across it.
Design canvasB: the same layout with a raised selection and a light that sweeps across it.
C: a heading bar and a denser list.
Design canvasC: a heading bar and a denser list.

I liked B and asked whether we would really gain anything compared with the current version. The agent answered:

Honestly, not much. B is today's layout, refined. Someone on the sofa sees the same launcher, a bit more polished. They don't see "fantastic".

It argued that almost every pixel on those screens is text and icons, so a new frame around them changes little. The next board redrew the font glyph by glyph, in a thin cut with a drop shadow and a heavy one. It also redrew the icons so that each has one meaning: a floppy disk for saving, an hourglass for slow motion, a house for home.

The font as it was, a thin cut with a shadow and a heavy cut, set on the same sample lines.
Design canvasThe font as it was, a thin cut with a shadow and a heavy cut, set on the same sample lines.
The icons as they were, and the new set.
Design canvasThe icons as they were, and the new set.

03Still too timid

I thought we were still being timid, and I sent the agent a prompt somebody had published for a pixel art game made with the same model. The agent applied that prompt's rules: colour ramps whose shadows drift toward purple and whose highlights warm up, a rim of light on every edge, grain in the darks, and animation at ten frames a second.

The next board was a sunset over a bay, with a sun sliced into scanlines and mountains with a rim of light. I asked where the bay had come from.

Honestly, nothing of yours. It works as a demonstration of technique, but it's an arbitrary landscape. It says nothing about OmaCRT or about you.

Staying with retro games, it offered a Mode 7 flight after F-Zero and Pilotwings, or an Amiga demo with copper bars. I picked the flight. The curving track made me seasick, so it straightened the road and slowed it down. Then it looked like a car game, and the agent took the road away and kept only the floor. After that it wrote:

When an idea hasn't convinced you after three attempts, it's usually the wrong idea.

The bay at sunset.
Design canvasThe bay at sunset.
Design canvasThe Mode 7 track, turning.
Design canvasThe road straightened and slowed down, with a blade of light every two seconds.

We went ahead with B. Before a line of it went into the launcher, I asked for a way back. The agent made a branch, a tag called pre-pixel-art and a copy of the installed binaries.

04The consoles, four times

The systems list shows the selected console on a lit stage. The first round was drawn from memory, and its Nintendo 64 looked like nothing Nintendo ever made. The second was traced from Evan Amos's photographs at three quarters, and at a hundred pixels wide a traced photograph comes out dirty and crooked. The third stood the consoles up straight over the reference photographs, and the Saturn and the Super Nintendo still did not look like themselves. Then I wrote:

The Saturn doesn't look faithful, nor the SNES. I liked the isometric attempt. Think for a moment about how to do them really well, maybe animate them a little when they change. Let's do something properly that nobody has done.

Round one, drawn from memory.
Launcher framebufferRound one, drawn from memory.
Round two, traced from a photograph.
Launcher framebufferRound two, traced from a photograph.
Round three, drawn straight over the reference.
Launcher framebufferRound three, drawn straight over the reference.
Round four, a voxel model built from the real dimensions.
Launcher framebufferRound four, a voxel model built from the real dimensions.

Twelve minutes later a Super Nintendo and a Saturn were on the canvas and on the television as voxel models. Instead of drawing the consoles, the agent had built them and written a renderer for them.

Each model is a grid of cells, one for every 3.5 millimetres of the real machine. The Super Nintendo is 200 by 242 by 72 millimetres. Boxes, rounded boxes, cylinders and slots are added to the grid or cut out of it. The renderer sends one ray per pixel through the grid and stops at the first full cell, which gives hard faces and the right occlusion at any angle. Each face takes a tone from its material's ramp according to the stage's spotlight, with a 4x4 ordered dither between the tones, a dark outline and a highlight along the top edges.

The landing lasts 0.7 seconds. The console drops onto the stage, bounces once and turns a full circle. The turn still to go shrinks with the cube of the time left, so the spin slows into the three-quarter view.

A model costs under a millisecond a frame while it moves. At rest the picture is kept and costs nothing. By Tuesday morning there were twelve machines, from the NES to a GameCube and a beige PC for ScummVM.

Rendered from the launcherEight consoles landing one after another as the cursor walks down the systems list, at 60 frames a second with the launcher's sounds.

Starting a game plays the matching gesture. A cartridge goes into its slot, a coin drops into the arcade cabinet, and the disc goes into the PlayStation. When I said its lid did not open, the next build hinged the lid at the back, printed the game's cover on the disc and lit the power light as it locked in.

05An arcade hall

For the home screen I asked for an eighties arcade hall, sketched on the canvas first. The agent drew two ideas: the menu on the screen of one OmaCRT cabinet, and a corridor of cabinets in perspective with a neon sign at the end. I chose the corridor, because it reads as a place, and asked for it to be drawn better and joined to the power-on animation.

A: the menu on the screen of a single cabinet.
Design canvasA: the menu on the screen of a single cabinet.
B: the corridor, first round.
Design canvasB: the corridor, first round.
B: the corridor, second round.
Design canvasB: the corridor, second round.

The next board replaced my boot sequence with a new one that ended in the hall. I wrote back that I had not wanted to lose the opening animation, with its floor, its laser and its logo.

The proposed new boot, with the word writing itself in the dark.
Design canvasThe proposed new boot, with the word writing itself in the dark.
The tubes flash.
Design canvasThe tubes flash.
The cabinets light.
Design canvasThe cabinets light.

You're right, I misunderstood: it shouldn't replace today's animation, it should connect to the hall.

The next board kept the boot whole and added a bridge after it. The laser that ends the boot climbs the screen and the hall stands up behind it. The wordmark flies to the far wall and becomes the sign, and the cabinets come on in pairs.

The boot's laser climbing.
Design canvasThe boot's laser climbing.
The wordmark flying to the far wall.
Design canvasThe wordmark flying to the far wall.
The sign striking.
Design canvasThe sign striking.

In the launcher the hall is a small 3D scene. Every wall, cabinet side, screen and sign is a flat patch in space, projected through a fixed camera. A depth buffer keeps the nearest patch for each pixel. The static layer is drawn once for each state of the lights and kept, and only the cabinets' attract modes and the marquees are drawn every frame. The whole bridge costs 3.8 milliseconds a frame, only while the hall is lighting up.

Rendered from the launcherThe boot's laser climbing into the arcade hall in the launcher, the sign striking and the cabinets lighting in pairs.

06People who come in to play

I asked for somebody to walk in after a while and start playing, and maybe a jukebox. The next board had three characters and a Wurlitzer by the wall. I said it was too much, and the jukebox went.

The living hall on the canvas, with the jukebox that was dropped.
Design canvasThe living hall on the canvas, with the jukebox that was dropped.

The people were first drawn as sprites that slid. The agent rebuilt them as skeletons of capsules with hips and knees, and drove the walk cycle by the distance covered, so a foot on the carpet stays where it was put. There are four scenes now, one at a time: somebody loses to a GAME OVER, two people play side by side, somebody makes a record and jumps, and a janitor mops the aisle and leaves a wet trail behind him. A day later they were redrawn as sprites and walked from a gait laboratory's numbers, which How people walk in the hall tells.

GAME OVER.
Design canvasGAME OVER.
A new record.
Design canvasA new record.
The janitor.
Design canvasThe janitor.

I told the agent that the people passed in front of and behind things in ways that made no sense. It found three causes. They appeared inside cabinets, they cut corners diagonally, and they walked between a player and his screen. The agent rebuilt the hall around them, with two doors at the far end and a lit corridor behind. The rows of cabinets moved forward to leave a gap, and everybody walks on paths laid over the open floor. Each figure is tested against the hall's depth, so a cabinet in front of somebody hides him.

07Small works of art

The clock and weather page already drew the real sky over a small town. I asked for it redrawn "as little works of art in pixels", now that the agent knew how.

The page at half past eleven at night before the redraw.
Launcher framebufferThe page at half past eleven at night before the redraw.
The same hour and weather after it.
Launcher framebufferThe same hour and weather after it.

Each hour of the day has its own palette of sky, sun and shadow, and the weather greys it. A cloud is a cluster of balls, and every pixel of a ball is shaded by that ball's own normal in five dithered tones, which gives it volume. A far city stands in the haze behind the near one. The digits of the clock have a bevel, lit on the top and left edges of each stroke.

Dawn, partly cloudy.
Launcher framebufferDawn, partly cloudy.
An afternoon with some cloud.
Launcher framebufferAn afternoon with some cloud.
Light rain at twenty to five.
Launcher framebufferLight rain at twenty to five.
A thunderstorm at three in the morning.
Launcher framebufferA thunderstorm at three in the morning.

The skyline has one local detail, because I live in Brussels: the Atomium stands on the horizon when the weather is for Brussels. I did not like the first one. My whole prompt was "Draw the Atomium properly, I don't like how you're doing it." The agent went back to the building. The Atomium is a cube standing on one corner, with spheres at the corners and the centre joined by tubes. So the agent rotated a real cube onto its corner, projected it, and tried four turns about the vertical before choosing the silhouette on the postcards. By day the spheres are chrome and reflect the sky.

The Atomium projected at four turns, from 0 to 0.79 radians. The launcher uses 0.26.
Design canvasThe Atomium projected at four turns, from 0 to 0.79 radians. The launcher uses 0.26.

08Three paintings that move

René Magritte lived and painted in Brussels, and I asked for a few moments after his work on the same page. There are ten. Each one comes up rarely, for twenty five seconds, and only when the weather suits it. It fades in and out through the same ordered dither, so the page never blends two pictures.

Rain brings the men of <em>Golconde</em> down over the town.
Launcher framebufferRain brings the men of Golconde down over the town.
A clear evening can bring <em>L'empire des lumières</em>.
Launcher framebufferA clear evening can bring L'empire des lumières.
A clear day can bring the castle on its rock.
Launcher framebufferA clear day can bring the castle on its rock.
A storm can bring the dove cut out of the daylight sky.
Launcher framebufferA storm can bring the dove cut out of the daylight sky.

Then I asked for three of his paintings redrawn whole, as homages, and hung in a gallery. On the canvas Le fils de l'homme kept its tall format. I asked for 4:3, with artistic liberties, and for all three to move a little while staying in their mood.

The first gallery board, with the painting in its own tall format.
Design canvasThe first gallery board, with the painting in its own tall format.
The painting in 4:3, as the launcher hangs it.
Launcher framebufferThe painting in 4:3, as the launcher hangs it.

The apple in front of the face slides aside to show another apple, and the eye behind it blinks. A bird crosses the daylight sky over the lamplit street, and one window goes dark. In Golconde the men bob in the air, and every so often one of them raises his hat.

Rendered from the launcherThe gallery: Le fils de l'homme, L'empire des lumières and Golconde, nine seconds each.

09What the model did

Anthropic's page for Opus 5.5 quotes a tester who had several models build a game from one prompt, and Opus 5.5 "scored higher than any other model on the strength of its graphics and polish". Other people have had it write animated pixel art scenes in a single HTML file. Here the job was longer. It had to keep one look across an existing program for a day, on a screen of 76,800 pixels.

It worked in the vocabulary of the period, Super Famicom windows, Mode 7 floors, copper bars, colour ramps and ordered dither, and it could say why one suited a screen and another did not. It found its own references: the consoles' measurements, Evan Amos's photographs, the Atomium's geometry and the paintings. When drawing the consoles failed three times, it changed method and wrote a renderer. Its animation has easing, a bounce, feet that stay planted and a hat raised at the right moment. It checked its frames before I saw them, and it told me when one of its own ideas was weak.

It also got things wrong. It drew consoles from memory, reverted work I had wanted improved, replaced a boot sequence I wanted to keep and put more in the hall than it needed. Each time, one line from me put it right.

Some of the ideas were silly, like a Magritte gallery in a launcher for retro games, or a janitor mopping an empty aisle. I enjoyed asking for those most, and each of them was on the television the same day.

The work took two canvases and fourteen boards, 39 commits after the pre-pixel-art tag and about 9,800 lines of Rust. Nothing in this entry was made with an image generator. Each picture is either a mockup the agent drew with code on a canvas, or the launcher's own framebuffer, rendered offline and enlarged by whole pixels.

Rendered from the launcherThe whole tour: the boot, the hall and a man walking in, eight consoles, the weather and the three paintings, at 60 frames a second with sound.