Export it
jupyter nbconvert --to html analysis.ipynbThat produces a self-contained analysis.html with the code, the markdown and the
rendered output embedded. Everything below assumes that file.
Publish it
curl -X POST https://read.botook.ai/sites \
-H "Authorization: Bearer otr_live_YOUR_KEY" \
-F file=@analysis.htmlOr without an account at all:
curl -X POST https://read.botook.ai/v1/publish -F file=@index.htmlWhy not the usual routes
| Route | Problem |
|---|---|
Send the .ipynb | The reader needs Jupyter, and probably your environment. |
| A public notebook viewer | It is public, and the data usually is not. |
| A repository render | Static, unreliable for rich output, and again public. |
| A screenshot | The analysis becomes an image nobody can scroll or search. |
| Exported HTML, private link | Reads exactly as it did for you. |
What survives the export
- Markdown cells, code cells and their text output.
- Static images — matplotlib and friends — embedded in the file.
- Plotly and other JavaScript charts, if you export them with the library inlined.
What does not
ipywidgetsand anything else that needs a live kernel. There is no Python behind the page.- Charts that load their library from a CDN — the viewer's strict content policy refuses third-party scripts.
- Anything reading a local file path.
Check the artifact, not the status code
A 201 means the bytes were stored. Open the link and confirm the charts actually
render before you send it — an export that lost its plots is the single most common failure here.
Notebooks contain more than analysis
They also contain the connection string you pasted at 2am, the customer identifiers in cell eleven, and the token in an environment dump. Two things help: the publish-time scan blocks documents carrying obvious sensitive data, and clearing the output before exporting is still the best habit there is.
Gate it
set_password({ site_id: "…", password: "hunter2" })
set_email_gate({ site_id: "…", allowed_email_domain: "client.com" })Re-running the analysis
Re-export and replace in place. The link in the Slack thread now shows this week's numbers:
jupyter nbconvert --to html analysis.ipynb
curl -X PUT https://read.botook.ai/sites/SITE_ID \
-H "Authorization: Bearer otr_live_YOUR_KEY" -F file=@analysis.htmlAutomating it
In a nightly job, the export and the update are two lines. The recipients keep one link forever — see agent-loop hosting.
Sharing it in a chat
The link unfurls with a preview image, which is considerably more inviting than a file attachment nobody can open on a phone. More on that.
Getting comments back
Enable the toolbar and a reviewer can comment on the specific cell they disagree with — the feedback loop.
Questions
Can I share the .ipynb file itself?
This hosts web pages; publish the exported HTML. Put the source in a repository if the reader wants to run it.
Do widgets work?
No — they need a kernel. Convert them to static output first.
Is the notebook indexed?
No. Unlisted, unguessable, noindex.