There is no sign-in here. To prove an X account is yours, you post a short code from it.
No OAuth screen, no access token to store, no permissions to grant, nothing of yours held on a server afterwards.
The cheapest proof of control is the one where you already own the channel.
The explanation beside the live run is not a script. The frame forwards each orchestrator event to the page around it, and that page turns events into sentences as they arrive.
Which means when the run does something unexpected, the narration says the unexpected thing — including the times an agent fails.
The console and the village share no drawing code and no state. They share a stream.
Every agent start, tool call, block and metric is an event; each view is just a way of listening. Add a third skin tomorrow and the orchestrator does not learn about it.
The run does not know it is being watched.
The four waves are sequential. Inside a wave, nothing is.
Wave 1's four agents search, fetch and write at the same time, then the wave ends and their files land on the table together.
Ordering only where order changes the answer. Everywhere else, at once.
One agent kept explaining its findings instead of writing the file. The obvious fix — force a tool call — is rejected by models that reason, because forcing is incompatible with thinking.
So the runtime catches it afterwards: if an agent finished with an answer and no file, the answer is saved as the file, and the file says that is what happened.
"invalid temperature: only 1 is allowed."
Some models reject the parameter everyone sends by habit. The fix is not a different value — it is not sending it at all unless you know the provider takes it.
Defaults copied from another API are not defaults. They are guesses.
Every reply came back empty, and the request was succeeding.
Reasoning models spend the token budget thinking before they write. At a 200-token cap, 189 went to reasoning and 5 to the answer. Nothing was broken — the budget was.
Now it retries once with more room before giving up.
A public demo is an open invitation to spend someone else's money.
So: a ceiling on live sessions, a ceiling on concurrent runs, a per-address hourly limit, and a sweeper that disposes idle sessions and their files.
Being turned away is a real behaviour, and the page says so rather than pretending it never happens.
Half a day went into a search integration against a free tier that no longer exists.
A plan you read about in an article is not a plan that is still offered. Check the pricing page, on the day, before building on it.
The fix took ten minutes. Finding out took much longer.
The demo would not embed even after the policy allowed it.
X-Frame-Options cannot express an allowlist — it is SAMEORIGIN or nothing. Where it and the newer policy disagree, the stricter one wins.
So once a specific parent is permitted, the old header has to step aside entirely. Adding a rule is not the same as removing one.
The project image was generated by a PNG encoder written with nothing but node:zlib and a CRC table.
IHDR, IDAT, IEND. Filter byte zero on every scanline. Deflate the lot.
Not because it is the fast way — because the alternative was one more dependency in a project whose whole claim is that it has none.
The live demo showed nothing when embedded, and the reason was one cookie attribute.
A SameSite=Lax cookie is refused inside a frame on another site. Without it every request minted a new session — so the run and the event stream watching it ended up in different worlds.
Now it loosens only when actually framed, by an allowed parent, over HTTPS.
Every visitor's demo run asks the same handful of questions, and a paid search quota is a shared, finite thing.
So the second visitor gets the first visitor's results instead of spending a credit to learn the same answer. Six hours, then it expires.
Only successful lookups are cached. A failure has to be retried, not remembered.
The download is packed by a zip writer written from scratch: local headers, a central directory, CRC32, stored entries.
One bug worth the story — file modes are shifted left 16 bits, and in JavaScript that overflows into a negative number. Every archive came out subtly wrong until it was forced back to unsigned.
Posting to X still needs OAuth 1.0a — percent-encode the parameters, sort them, build a signature base string, HMAC-SHA1 it with a key made of two secrets joined by an ampersand.
It is about forty lines. Pulling in a dependency for forty lines you can read is how a project stops being auditable.