ASEM.ABDO
OPEN TO PROJECTS

A Design Loop for AI Agents

Most AI design is one shot and converges on the same safe look. I built a loop instead: taste-aware concepts, a spend gate, parallel variants on a live board you pin-comment, and a $0 path that needs no image API at all.

Asem Abdo

Asem Abdo

4 min read
433views

Ask a model to design something and you get one shot at a generic answer. Ask ten times and you get ten versions of the same safe gradient. The problem is not the model. It is the lack of a loop: no exploration, no taste, no human pin saying "this corner, not that one." So I built one. It ships in OpenPlanr as the Design Loop Engine, and it turns design from a single prompt into a live, iterative session.

Fight convergence on purpose

The loop opens with taste-aware concepts, and anti-convergence is enforced rather than hoped for. If three concepts all drift toward the same layout, that is a defect, not a coincidence. Before any money is spent, a mandatory concept gate asks you to choose a direction. Nothing renders at cost until a human has picked a lane.

Variants on a board you can actually touch

Once a direction is chosen, the engine fans out N variants in parallel and serves them on a live localhost board. This is where the loop earns its name. You pin comments on exact regions of a design, rate it, remix it, and step through a versions rail with an A/B diff. Feedback is not a paragraph of prose; it is a pin attached to a screen and a region.

That board taught me a lesson the hard way. In an early field run the pin overlay was swallowing every pointer event, so the canvas froze: no pan, no zoom. The fix was a clean separation of modes. An Interact / Pin toggle (press P) now decides whether the artifact is live or whether a click arms an annotation, and the review popover names the exact screen it captured. Modes that fight for the same pointer are a recurring trap in interactive tooling, and the cure is always to make the mode explicit.

A $0 path that is often the better one

The part I am most pleased with is the provider abstraction with graceful degradation. With an image API key, the engine generates rendered concepts. With no key at all, it falls back to agent-authored SVG, and that costs nothing.

For logos and UI, the no-key path is frequently the better one. An agent writing SVG gives you exact hex values, real typography, and clean vector output you can drop straight into a build, instead of a raster image you then have to trace. Free turned out to be a feature, not a compromise.

Keys are handled with the same care. They are never echoed back to the terminal. The engine never silently reads a .env, because an undisclosed key is an undisclosed bill; if a key is present but dormant, the doctor tells you it found one and how to enable it, rather than spending on your behalf.

A daemon that outlives the agent

The board is served by a daemon that runs independently of the agent. It speaks a small file-driven protocol: progress is written to disk and reflected in the tab, a per-board mutex prevents two runs from colliding, static serving is guarded against path traversal, and the page reloads in place as new variants land. Decoupling the surface from the agent means the board stays alive and responsive even while the model is busy thinking.

Submission is deliberately unmistakable. The submit button shows write progress, then an animated receipt of exactly what was recorded: your preference, your ratings, your pins. A confirmation banner and a check in the tab title remove any doubt that the feedback landed, because a silent submit in a creative tool is how people lose ten minutes of careful notes.

Why a loop beats a prompt

Every state the loop reads or writes is schema-validated, and the whole thing is covered by conformance suites that lock the behaviors that matter: the toggle, the receipt, the redirect rules. But the real result is not the test count. It is that design stops being a coin flip. You explore, you steer with real pins, the system remembers your taste for next time, and the output is something you chose rather than something you settled for.

Keep reading//