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
- Unguessable by default — the link is the credential, and nothing is indexed.
- Expiring by default — seven days with a key, twenty-four hours anonymously, and the purge deletes the object rather than hiding it.
- Stable across revisions —
update_sitereplaces the bytes under the same token. - Gateable — a passphrase for a client, a work-email domain for the team.
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=24hThen 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.