OpenTree DashboardSign in

$ publish_html --expires 24h

Where the dashboard your agent just built should live

An agent can now build a bespoke dashboard faster than you can find the right saved view in an existing one. What it cannot do is hand you the result: it leaves an HTML file on disk, and the file is useless until it has a URL.

The step the agent leaves you with

You asked for error rate by endpoint for the last six hours; you got a self-contained page with the chart, the table and the query embedded. Now it has to reach a colleague. Pasting the markup into chat is not it. Attaching the file means whoever opens it downloads an HTML document from a chat client, which most people have correctly been trained not to do.

Why generic hosting is the wrong shape

Because the dashboard has a data problem, not a hosting problem. It contains real numbers from a real system, so a public URL is a disclosure. It answers one question, so a permanent URL is clutter. And it will be regenerated three times in the next hour, so a URL that changes per upload breaks the link you already sent.

Private, disposable, and stable

In one call

publish_html {
  content:    "<html>…the dashboard…</html>",
  title:      "Error rate by endpoint — last 6h",
  expires_in: "24h"
}
# → { url: "https://read.botook.ai/s/…", token: "…" }

Or, without MCP:

curl -X POST https://read.botook.ai/sites \
  -H "Authorization: Bearer otr_live_YOUR_KEY" \
  -F file=@dashboard.html -F expires_in=24h

Then keep it fresh

Every time the question is re-asked, the agent replaces the content instead of publishing again. The recipient keeps one bookmark for the entire investigation, which is the difference between a link people open and a link people stop trusting.

update_site { id: "…", content: "<html>…refreshed…</html>" }

Did anyone actually read it?

GET /sites/:idOrSlug/engagement answers with opens, unique viewers, dwell, scroll depth, read-to-end rate and a ten-segment attention map. For an on-demand dashboard that is unusually actionable: if attention stops at segment three, the chart below it is not doing its job.

Can the dashboard refresh its own data?

Not from here — this hosts a document, and the strict CSP blocks third-party script origins. The pattern that works is the agent re-running the query and calling update_site.

What if it should not expire?

Pass an expiry of never. Worth doing sparingly: the default exists because most of these stop being true within a day.

How do I keep it inside the company?

set_email_gate with your work domain. The reader verifies an address, so forwarding the link does not forward access.

Is there a limit on how many I can publish?

Not a plan limit — this is self-hosted, so the ceiling is whatever your own platform account allows and whatever you set in wrangler.toml.

Keep reading