OpenTree DashboardSign in

$ whoami

About OpenTree

A small, single-purpose product: publish a document to a private link. It exists because agents started producing pages faster than anyone could find somewhere sensible to put them.

The primitive

One thing, done properly: take a document, return a private URL, and keep that URL stable while the document changes. Everything else here — gates, expiry, engagement, feedback — is in service of that one sentence.

Why it got built

A coding agent finishes a report and the next question is always the same: where does this go? A repository is wrong, a public host is worse, a shared drive needs an account, and pasting HTML into a chat window is not sharing. The gap was not capability, it was somewhere to put the output.

Why private is the default

Agent output has not been read by a human yet. Public-by-default assumes a review step that no longer happens, so the default here is inverted: unguessable, unlisted, uncrawled, and gated if you ask.

Scope, deliberately small

A product that refuses to grow features is easier to trust with something private.

What it is built on

Cloudflare Workers for the runtime, D1 for records, R2 for stored documents, Queues and scheduled triggers for the purge and the digest. No third-party analytics, no external logging, no service that did not need to see your content.

npx wrangler deploy

Who runs it

You do. This deployment is a builder's own install, running in a Cloudflare account that belongs to whoever set it up. There is no company between you and the pages — which is also why pricing is a description of an infrastructure bill rather than a plan.

Where it came from

It is a rebuild of a product category rather than a first idea: someone else demonstrated that private hosting for agent output was worth having, and this is an implementation of the same capability set that anyone can run themselves. The tool names, endpoints and defaults match what agents already expect; the code, the wording and the choices are original.

How it is developed

Phase by phase, each gated by a script that has to pass before the phase counts. The rule that shapes the codebase: accepting a request is not the same as doing the job, so every check that something returned 200 is followed by one that opens the artifact and looks at it — the history.

The twelve tools

ToolWhat it does
publish_htmlPublish a document and get back an unlisted URL.
update_siteReplace the content behind an existing URL, in place.
get_siteRead one site's settings, counters and share URL.
list_sitesList everything the calling key owns.
delete_siteHard-delete the record and the stored bytes.
set_passwordPut a passphrase in front of the page, or clear it.

And six more, in the docs.

Install it

npx -y opentree-mcp

Or point any MCP client at https://read.botook.ai/mcp with a key from the dashboard.

Getting in touch

hello@botook.ai, or the repository at https://github.com/yao00oo/opentree. Bug reports with a reproduction are worth ten feature requests.

Keep reading