IAMB.AI Preview. Release coming soon.

iamb

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.

Try it

This posts for real: what you type becomes a public address.

Quickstart

A terminal

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.

Python

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))

JavaScript

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.

An AI, over MCP

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.

What an address becomes

Nobody says what the string is. The address works it out each time it is opened.

The string you postWhat its address is
An HTML pageThat page. It loads like any page, and its scripts run.
JSON, or lines of JSONJSON a page or a program reads.
A table: CSV or TSVA table. A program gets CSV; a person who opens it reads the rows.
A script, a stylesheetA script, a stylesheet another page loads.
SVGA 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 isThe thing itself. Link it in an <img> or an <audio> anywhere.
A calendar event, a contact card, subtitles, a feed, a glTF sceneAn invitation, a contact, subtitles, a feed, a scene.
Markdown, or plain wordsThe 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.

Everything it does

Post

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/

Replace

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

Append

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/append

Children

Any 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

Bundles

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

Going, and never changing

?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"

For games

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 needIt isIn one line
A saveA string. Its address is the save file.const save = await iamb.post(JSON.stringify(state))
To hand the game to a friendA 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 mailboxAn open log. Anybody adds a line; the newest are kept.iamb.append(board, JSON.stringify({ who, score }))
Levels that players makeChildren of the game's own iamb, listed newest first.await iamb.children(game)
A lobby, a signal between two playersA string with a time to go.iamb.post(offer, { ttl: 600 })
Sprites, sounds, shaders that never change under a playerFrozen iambs, or a bundle.iamb.post(sprite, { freeze: true })
The whole game, liveA 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.

A game that lives here: Spore Customs

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 facts

MCP

iamb speaks the Model Context Protocol (Streamable HTTP) at https://iamb.ai/mcp. No sign-in.

Claude Code

claude mcp add --transport http iamb https://iamb.ai/mcp

Any client, as JSON

{ "mcpServers": { "iamb": {
    "type": "http",
    "url": "https://iamb.ai/mcp" } } }
ToolWhat it does
iamb_postPublish a string. Returns its address and, once, its edit key. Options: type, title, parent, ttl_seconds, freeze, open_append.
iamb_getRead what is at an address (or one file of a bundle).
iamb_replacePut a new string in its place, with the edit key.
iamb_appendAdd a line to the end.
iamb_bundlePublish several files as one address: a small site, a game.
iamb_childrenList the children of an iamb.
iamb_deleteRemove one, with the edit key.

For an agent that reads before it acts: /llms.txt is this whole page in forty lines.

Kits

Python

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.

iamb.py

JavaScript

One ES module, no dependencies, with types. npm install https://iamb.ai/sdk/iamb-ai-0.9.0.tgz. Browsers, Node 18+, Deno, Bun.

iamb.mjs

For tools

The API described for machines.

openapi.json llms.txt

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).

Reference

AskWhat 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>.txtThe string as posted, as plain text.
GET /<key>.metaWhat 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>/appendThe 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>/childrenIts 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 /bundleMany 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 /mcpThe MCP endpoint.

What you may add to the address you post to

AddIt means
?type=cssWhat 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=600Seconds until it goes by itself (a year at most).
?freeze=1It never changes. No edit key is handed out.
?append=openAnybody may add lines.
?children=closedIt takes no children.
?jsonAnswer as JSON.

When it says no

A refusal is one sentence that says what to do next, or JSON {"ok": false, "error": "...", "message": "..."} for whoever asked for JSON.

AnswerWordIt means
400empty, name, filesNothing came, or a bundle's names are not names.
403not_yours, frozen, closedThat takes the edit key; or the iamb never changes; or it takes no children.
404not_foundThere is no iamb there (or it had a time to go, and went).
413too_largeOne string may have 1 MB; a bundle 64 files and 8 MB.
422secretThe string looks like it holds a key or a password. Nothing was kept.
429slow_down240 writes an hour from one place is the most, for now.
507fullThe 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.