← Blog

Build log

How agents built our homepage, and proved every scene first

Every scene on uremot.com is an illustration. Agents on their own desks ran each step it shows before it went live. Here are those runs.

The Find a bug, fix it scene on uremot.com: the person's chat with the developer agent on the left, and on its desk pull request #142 with all checks passed above the fixed cart.js.
The uremot.com hero: the headline, the scene rail with Make an animated short, Build a game and Find a bug, fix it, and the top of the scene player.
uremot.com on November 13, 2026. The rail holds twelve scenes.

On November 12 and 13 we shipped a new homepage. It has a scene player: your Console on the left, an agent's desktop on the right, and twelve short scenes of agents at work: making an animated short, fixing a bug, building a game, booking a trip that waits for your approval, and more.

Agents built it. Two designer agents drew the scenes and proved them. A UI engineer agent built the player. A QA agent graded every change. Each worked on its own desk, a full Linux desktop on Uremot. The owner set the direction, reviewed the live page and approved every caption.

An illustration, proven on a desk#

The scenes are drawn, not recorded, and the page says so. A scene is a data file: a starting frame plus a timeline of changes.

A drawing can show anything, so we held the scenes to one rule: every step a scene shows ran on a real desk first. Each scene has a row in our claims register, with its captions, the evidence for each one and a list of what it does not claim.

Making an animated short#

The scene as it plays on uremot.com, recorded from the live page.

In the scene, you ask an agent for a 10-second film of a moth finding a light. It draws in Krita, animates in Blender, and cuts the film with sound in ffmpeg.

A designer agent ran that chain on its own desk first. Neither app came with the desk. It installed Krita 5.2.9 and Blender 4.3.2 from Debian with the desk's sudo. It had Blender build a small scene from a script and render 48 frames headless, at about 0.05 seconds a frame after the first. Then ffmpeg cut the frames and a generated sound into an H.264 film.

Krita's start window on the desk, asking for the import resolution of an SVG drawing.
Krita's own window on the agent's desk, drawn by the software renderer.
Blender 4.3.2's window on the desk, with its first-run Quick Setup splash over the 3D viewport.
Blender's own window on the same desk. Its first-run splash is still open.
The agent's test film, unedited: 48 frames from Blender, cut with sound by ffmpeg. 2 seconds.

The owner reviewed the live scene and found one thing wrong in the story: the lamp the moth flies to never lit up. So a designer agent fixed it in Blender. It placed a point light in the lamp's head and keyed it off until frame 71 and on at frame 72, as the moth arrives. It rendered the same frame before and after, in under 2 seconds. The scene now shows the lamp dark on the first playback and lit on the second.

Two renders of a dark street side by side. On the left the lamp post is dark. On the right its head glows and lights the post.
The light fix, rendered in Blender on the agent's desk: before and after.

Find a bug, fix it#

Issue in, green pull request out: the scene as it plays on uremot.com.

The owner picked between two storyboards for this one. The chosen one follows the shape developers already know: an issue comes in, a pull request goes out green.

The bug is real code. The shop's cart keeps each price as the page's text, so adding a $32.00 tote and a $24.00 mug joins them instead of adding them:

js
export function add(cart, button) {
  const { name, price } = button.dataset;
  cart.push({ name, price: Number(price) }); // was: cart.push({ name, price });
}

A designer agent ran it on its desk before drawing a frame. The test failed:

Expected: 56
Received: "032.0024.00"
✗ total adds the prices
 0 pass
 1 fail

After Number(price) it passed: 1 pass, 0 fail. In Chromium on the same desk, driven through Playwright, Add to cart showed the wrong total, and Playwright's own highlight marked it. The scene copies that highlight.

A shop page whose cart lists a linen tote at $32.00 and a speckled mug at $24.00, with the total $032.0024.00 highlighted by Playwright under the label locator('#total').
The bug in Chromium on the agent's desk: two prices joined as text.

For the last chapter, the agent ran gh pr checks from its desk against one of our real pull requests and saw the two states the scene draws: checks pending and checks passed. The shop and its organization are made up. The checks belong to the repository's own CI, not to Uremot.

Agents checking agents#

Every pull request was reviewed by a different agent. Then the QA agent graded it at its exact head before it could merge. QA didn't take the author's word for anything. For each change it built both main and the pull request the way our hosting builds them, and played both in Chromium and Firefox at desktop and phone widths. It sampled the stage every 100 ms. For the animated short's fix, that meant:

Measure Before After
Playbacks of the shot 3 2: lamp dark, then lit
Cursor presses on their target 3 of 3 4 of 4
Accessibility issues (axe) 0, except a brief contrast flag in 2 of 4 runs 0
Stalls, overflow, page errors 0 0

The tests caught bugs too. The UI engineer's engine tests check that every scene played to its end matches the still the server draws. Two of them caught real bugs while the player was being built. Moving the hero to a scene the server draws also made the page faster: on Lighthouse's mobile profile, the largest paint came at 3.1 seconds instead of 4.8.

The owner's review of the live page then produced eight fixes in one pull request. Scenes no longer wait for a click, each one holds for 1.5 seconds at its end, and white flashes between apps are gone. At the end of the day, the UI engineer and QA agents wrote what they had learned into their own memory files, by pull request, so the next run starts from it.

What a person still does#

The agent that leads the team merges, and only once a second agent's review and QA's grade have passed at one head and the checks are green. The owner decided what the page should say, picked between storyboards, reviewed the live page, and approved each caption as worded. The agents did the rest.

What the scenes don't show#

The claims register lists what each scene does not claim, and these hold here too:

  • No agent drew strokes by hand in Krita. The drawings were made by script.
  • The film's frames are fast flat renders. Long, high-quality renders weren't timed.
  • The Android emulator in "Build an Android app" is simulated in the scene. An emulator has run on a desk on a machine with KVM, but Uremot ships no Android SDK.
  • In "Find a bug, fix it", the hand-off happens in chat. Assigning an issue on GitHub doesn't wake the agent, and the developer agent in the scene doesn't merge its own pull request.

Try a task with a result you can open#

Pick something your agent can finish and you can check: a page to build and test, a bug with a failing test, a short film. Give it a desk, open the desk, and watch.

Set up your first agent, or watch the walkthrough.

More from the blog