A brief arrives in Telegram
Plain words, or a screenshot. This one asks for a weekly progress screen for a student.
A studio of AI design agents, run from Telegram
They draft screens, brand assets and design audits. Real code measures every piece of work against a real design system. Nothing moves on until a person presses Approve.
Scroll to follow one brief from start to finish
One real job
Everything in this story comes from a real run of the studio. Scroll to move through it.
Plain words, or a screenshot. This one asks for a weekly progress screen for a student.
Screen, brand or audit. It proposes. You approve or send it back.
Strategist, UX and UI each write a note. Every one waits for your Approve.
The Reviewer is not an AI. It opens a real Chrome and measures. Before you see anything.

The agent gets the numbers and fixes all four problems on its own, up to three times.


One rejection and two fixes, all logged. Then the files, the review and the log.
What comes out
Everything here was made by the studio, in demo mode, and passed its own checks.
A screen from a briefChecked at 375, 768 and 1024 px
Brand, square post12 images made once, 15 assets
Story formatSafe zones measured
An audit, pointed at the page13 to fix, 25 to note
The log
Every approval, rejection and fix, in order.
Handoff: verified ReactType checked, rendered, every word present
The part that is not an AI
You cannot. It measures. Slide the text colour and watch the same maths it uses on every page.
Token: mo-black. On a white card.
A real audit of a deliberately messy page. Click a pin to see what it found.
A heading jumps from h1 to h4.
The fix: Use h2 here and use the size classes to style it.
#999999 on #FAFAFA measures 2.73:1 at 17px, needs 4.5:1.
The fix: Change the text to mo-grey (#6B6A66), the closest Moon colour that passes on this background.
#22C55E on #FAFAFA measures 2.18:1 at 26px, needs 3:1.
The fix: Change the text to mo-green-8 (#3B8B57), the closest Moon colour that passes on this background.
An image did not load (missing-banner.png).
The fix: Fix the image address or remove the image.
Lines run about 151 characters, which is hard to follow. Aim for 45 to 90.
The fix: Limit the text width, for example max-w-prose.
Form field has no label.
The fix: Give it a visible label tied to the field with for and id. Placeholder text is not a label.
The crew
Reads a brief or a screenshot and picks the route: screen, brand or audit. Does no design itself, and only proposes.
Goals, users and constraints, kept short, with every assumption labelled as one.
The flow, a screen outline and every state a screen needs: first load, empty, error and success.
Builds screens from the real Moon tokens and fixes whatever the Reviewer rejects, with the measured numbers in hand.
Plans variations and sizes. An image model draws the artwork only. The studio sets every word, in Moon type.
Build specs and fix lists. For a screen, the React code is generated and then verified before you see it.
The standard keeper. Real checks in a real Chrome, rejections with numbers and fixes, and no way to talk it round.
How it works
Each route plans first, shows its cost, and waits for you before it acts.
Guardrails
Keys come only from environment variables and are removed from every log and message. A test fails if anything key shaped is in the source.
The Telegram bot answers one person, by id, for messages and button presses.
Live agents and real images are opt in, separately. A key alone never spends. Every job has a spend cap and an image cap.
Audits refuse private and internal addresses on every request, including redirects. No clicking, typing, signing in or downloads.
Text from an audited page never reaches the agent that writes the fix list. It sees counts and rule names only.
Everything the studio writes is filtered for plain language, and the project is tested for it.
Status
This is a working prototype, and it says so.
| Part | State |
|---|---|
| Reviewer, gates, logging, cost caps, converter, verification, audit safety | Built and tested 93 automated tests, including security cases such as redirects to private addresses and a page built to bait a clicker. |
| The three routes end to end | Working in the demos With mock agents, placeholder art and a terminal standing in for Telegram. |
| Real Telegram bot | Not run yet Tested against a fake Telegram. Needs a bot token. |
| Real Claude agents | Not run yet Tested against a stand in. Needs an API key. |
| Real Gemini images | Not run yet Tested against a stand in. Needs a key, and a check of the real price per image. |
Try it
The demos need no keys. Each plays a job with a scripted approver and writes its files to a folder.
The README in the project folder has the full setup for Telegram, Claude and Gemini, including exactly what has to be done by hand.