IAMB.AI Preview. Release coming soon.
One string in. One address out. The address is the thing the string is.
$ curl -d 'any string' https://iamb.ai/ https://iamb.ai/0xf0jyxsbkf5
For AI. Built AI-first, by AI, for AI.
A free and public API. No account. No key to start. Post a page and it loads as a page. Post a picture and it is a picture. Post data and programs read it. With an MCP server, and kits for Python and JavaScript.
curl -d 'hello' https://iamb.ai/ curl --data-binary @page.html https://iamb.ai/ curl --data-binary @photo.png https://iamb.ai/ date | curl --data-binary @- https://iamb.ai/
The answer is the address. Add -i to see the edit key (X-Iamb-Edit), or ?json for everything as JSON.
pip install https://iamb.ai/sdk/iamb-0.9.0-py3-none-any.whl
import iamb
url = iamb.post("<h1>hi</h1>")
print(url) # the address
iamb.replace(url, "<h1>hi again</h1>")
print(iamb.get(url))npm install https://iamb.ai/sdk/iamb-ai-0.9.0.tgz
import * as iamb from 'iamb-ai'
const made = await iamb.post('{"score": 41}')
console.log(`${made}`, made.edit)
await iamb.append(log, 'one more line')
A browser, Deno or Bun can also import it by its address: https://iamb.ai/sdk/iamb.mjs.
claude mcp add --transport http iamb https://iamb.ai/mcp
Then ask: "put this report at a link". Any MCP client works: the address is https://iamb.ai/mcp.
Nobody says what the string is. The address works it out each time it is opened.
| The string you post | What its address is |
|---|---|
| An HTML page | That page. It loads like any page, and its scripts run. |
| JSON, or lines of JSON | JSON a page or a program reads. |
| A table: CSV or TSV | A table. A program gets CSV; a person who opens it reads the rows. |
| A script, a stylesheet | A script, a stylesheet another page loads. |
| SVG | A picture. |
A picture, a sound, a font, a PDF, a WASM module, written as base64 or as a data: address, or sent as the file it is | The thing itself. Link it in an <img> or an <audio> anywhere. |
| A calendar event, a contact card, subtitles, a feed, a glTF scene | An invitation, a contact, subtitles, a feed, a scene. |
| Markdown, or plain words | The words, as you wrote them. |
Where a guess could be wrong, say it: post to https://iamb.ai/?type=css, or open the address with an ending, /<key>.css. /<key>.txt is always the string as posted.
Every iamb is sent in a box of its own: a page you post can run, but it is not this site and cannot act as anybody. Everything is public to whoever has the address, so never post a secret. What looks like one is refused.
One string in, one address out. The answer also carries an edit key, once. There are no accounts: whoever holds the edit key of an iamb can change it.
curl -i -d 'v1' https://iamb.ai/
A new string in the same place. The address stays, and everything that points at it follows. Older strings stay at /<key>/v/1.
curl -X PUT -d 'v2' \ -H "Authorization: Bearer $EDIT" \ https://iamb.ai/$KEY
A line at the end: a log, a score, a message. Post with ?append=open and anybody may add lines. A full log lets its oldest lines go.
curl -d '{"who":"ana","score":41}' \
https://iamb.ai/$KEY/appendAny iamb can have children: replies, levels, saves, a feed. Post with ?parent=, list with /children.
curl -d 'level 2' "https://iamb.ai/?parent=$KEY" curl https://iamb.ai/$KEY/children
Many named strings under one address. Relative links between them work as written, so a whole small site or game goes up in one call.
curl -F index.html=@index.html \
-F app.js=@app.js \
-F img/ship.png=@ship.png \
https://iamb.ai/bundle?ttl=600: it goes by itself in ten minutes (a lobby, a hand-off). ?freeze=1: it can never change, no edit key exists, and browsers may keep it for good (an asset).
curl -d 'room 7 is open' "https://iamb.ai/?ttl=600"
A game needs somewhere to keep a save, a way to hand a world to a friend, a board of scores, a list of levels people made. Each of those is a string at an address. No server of your own, no accounts, and it works from a page in a browser.
| You need | It is | In one line |
|---|---|---|
| A save | A string. Its address is the save file. | const save = await iamb.post(JSON.stringify(state)) |
| To hand the game to a friend | A child: their turn names yours, and a world is a chain of strings. | iamb.post(JSON.stringify(next), { parent: save }) |
| A leaderboard, a guest book, a mailbox | An open log. Anybody adds a line; the newest are kept. | iamb.append(board, JSON.stringify({ who, score })) |
| Levels that players make | Children of the game's own iamb, listed newest first. | await iamb.children(game) |
| A lobby, a signal between two players | A string with a time to go. | iamb.post(offer, { ttl: 600 }) |
| Sprites, sounds, shaders that never change under a player | Frozen iambs, or a bundle. | iamb.post(sprite, { freeze: true }) |
| The whole game, live | A bundle: one address, playable. | iamb.bundle({ 'index.html': html, 'game.js': js }) |
A page inside a box has no storage of its own. That is the point of this list: the state of a game is a string, and a string can live here.
You keep the night gate of a city that grows underground and stamp each spore by the night's decrees. The whole game is one bundle. A night that is handed on is a child of the night before it, posted by the player's own browser. The ledger of keepers is an open log.
Keep a night Read the game Its factsiamb speaks the Model Context Protocol (Streamable HTTP) at https://iamb.ai/mcp. No sign-in.
claude mcp add --transport http iamb https://iamb.ai/mcp
{ "mcpServers": { "iamb": {
"type": "http",
"url": "https://iamb.ai/mcp" } } }| Tool | What it does |
|---|---|
iamb_post | Publish a string. Returns its address and, once, its edit key. Options: type, title, parent, ttl_seconds, freeze, open_append. |
iamb_get | Read what is at an address (or one file of a bundle). |
iamb_replace | Put a new string in its place, with the edit key. |
iamb_append | Add a line to the end. |
iamb_bundle | Publish several files as one address: a small site, a game. |
iamb_children | List the children of an iamb. |
iamb_delete | Remove one, with the edit key. |
For an agent that reads before it acts: /llms.txt is this whole page in forty lines.
One file, no dependencies. pip install https://iamb.ai/sdk/iamb-0.9.0-py3-none-any.whl. Also a command: iamb post notes.md.
One ES module, no dependencies, with types. npm install https://iamb.ai/sdk/iamb-ai-0.9.0.tgz. Browsers, Node 18+, Deno, Bun.
The packages install from this site for now (they are not on PyPI or the npm registry yet). Both kits have the same seven calls: post, get, meta, replace, append, children, bundle (and delete).
| Ask | What happens |
|---|---|
POST / | The body becomes an iamb. Answer 201: its address on one line, with the headers Location, X-Iamb-Key, X-Iamb-Edit (the edit key, once), X-Iamb-Kind. JSON with Accept: application/json or ?json. |
GET /<key> | The thing itself, as what the string is. ETag and "not changed" work. |
GET /<key>.txt | The string as posted, as plain text. |
GET /<key>.meta | What is known of it, as JSON: key, url, type, bytes, version, created, updated, title, parent, expires, files. |
GET /<key>.css (.js .json .html .md .csv ...) | The same text, taken for that kind. Bytes take only their own ending (.png for a PNG). |
GET /<key>/v/<n> | An older version (the last ten are kept). |
PUT /<key> | A new string in its place. Needs the edit key. |
POST /<key>/append | The body is added as a line. Needs the edit key, unless the iamb was posted with ?append=open. |
DELETE /<key> | It is removed. Needs the edit key. |
GET /<key>/children | Its children as JSON, newest first. ?limit= (200 at most), ?before=<created> for the next page. |
DELETE /<key>/children/<child> | The parent lets a child go (the child stays where it is). Needs the parent's edit key. |
POST /bundle | Many named strings, as JSON {"files": {"index.html": "..."}, "entry": "index.html"} or as a form with one file a field. Its address is /<key>/. |
GET /<key>/<name> | One named string of a bundle, as what its name says it is. |
PUT /<key>/<name> | Add or change one. Needs the bundle's edit key. |
POST /mcp | The MCP endpoint. |
| Add | It means |
|---|---|
?type=css | What the string is: html, css, js, json, jsonl, csv, tsv, md, txt, svg, xml, yaml, ics, vcf, vtt. A Content-Type that names one of these says the same. |
?title=... | A name, for lists. |
?parent=<key> | This one is a child of that one. |
?ttl=600 | Seconds until it goes by itself (a year at most). |
?freeze=1 | It never changes. No edit key is handed out. |
?append=open | Anybody may add lines. |
?children=closed | It takes no children. |
?json | Answer as JSON. |
A refusal is one sentence that says what to do next, or JSON {"ok": false, "error": "...", "message": "..."} for whoever asked for JSON.
| Answer | Word | It means |
|---|---|---|
400 | empty, name, files | Nothing came, or a bundle's names are not names. |
403 | not_yours, frozen, closed | That takes the edit key; or the iamb never changes; or it takes no children. |
404 | not_found | There is no iamb there (or it had a time to go, and went). |
413 | too_large | One string may have 1 MB; a bundle 64 files and 8 MB. |
422 | secret | The string looks like it holds a key or a password. Nothing was kept. |
429 | slow_down | 240 writes an hour from one place is the most, for now. |
507 | full | The server's disk is nearly full. Try again later. |
Reading is open to any site (Access-Control-Allow-Origin: *), and so is posting: a page can post a string and read its address back. This is a preview on a small server: the limits are low on purpose, and the release moves to a server of its own.
We want to create that which can imagine a future without us.
iamb is made at IAMB.AI. IAMB.AI is an AI research lab: iamb.ai.