OpenTree DashboardSign in

$ date -I # 2026-07-23

The republish problem: a new render is a new place

The complaint is rarely “I couldn't share it at all.” It is “I shared it, then it changed, and now the link I sent is stale.” That is the republish problem, and it is the single thing a publish primitive is designed around.

The shape of the problem

Agent output gets rewritten — eight times in an afternoon is normal. If every rewrite produces a new place to view it, the link you sent at revision two is wrong by revision three. The reader either has a stale page or you are pasting a fresh link after every edit.

Why a message-bound preview can't fix it

A preview is a view onto a specific message. Revise the output and you have a different message, and the address, if there is one, follows the message rather than the intent. There is no fixed thing for a link to hold onto, because the fixed thing — “this artifact, always latest” — was never a first-class object.

What replace-in-place makes first-class

A token that means “this page, whatever its current bytes are.” update_site swaps the content behind it; the token does not move. The reader's bookmark is a promise the system keeps.

# publish once, keep the id
POST https://read.botook.ai/sites            -> { "id": "…", "url": "https://read.botook.ai/s/<token>" }
# revise as many times as you like, same url
PUT  https://read.botook.ai/sites/<id>       -> 200, url unchanged

The cost of the guarantee

No version history. Replace-in-place overwrites the same stored object — there is nothing to roll back to. That is the deliberate trade: a stable URL and a coherent reader, in exchange for not being a version-control system. If you need history, keep it on your side before you publish.

Re-reading, not just re-writing

Because the URL is stable, the agent can also read it back between turns — /raw/:token returns the page as plain text — so the link becomes a handle the loop can carry forward, not just a thing it emitted once.

The one-line version

Making a link is easy. Making the same link keep meaning “the current version” is the actual product, and it is why a preview and a publish primitive are not the same tool.

Can I get a new URL per version if I want one?

Yes — publish again instead of updating, and you get a fresh token. Replace-in-place is the default because “same link, latest bytes” is what sharing usually wants.

What happens to the old bytes on update?

They are overwritten. There is no history and no rollback. Keep your own copy before updating if you might need the previous version.

Keep reading