# Share a Jupyter notebook as private HTML · Stacktree

Source: https://stacktr.ee/share-jupyter-notebook-html

[Skip to content](#main) [Stacktree](/)[Developers](/developers)[Agents](/agents)[Docs](/docs)[Use cases](/use-cases)[Pricing](/pricing)[Blog](/blog)[Dashboard](https://app.stacktr.ee)[Sign in →](https://app.stacktr.ee)      By [ Steve Smith ](/about) · Founder, Stacktree  ·  Last updated July 2, 2026          use case

#  Share a Jupyter notebook as private HTML.

   Export the notebook to HTML, publish to Stacktree, gate the link to your team. Plotly, ipywidgets, matplotlib, and DataFrame previews all render exactly like they did in the notebook — and the URL is private by default.

  [ Get started free ](https://app.stacktr.ee/?join=1&from=seo_share_jupyter_notebook_html)   install npx stacktree-install
Copy
     No card · 3 pages free · about a minute

##  How do you share a Jupyter notebook with your team privately?

Export the notebook to standalone HTML (`jupyter nbconvert --to html --embed-images notebook.ipynb`), upload the resulting file to Stacktree, and add an email-domain gate or password. Viewers open the link without installing Jupyter, without logging into a hosted Jupyter server, and without exposing the notebook publicly. Re-running the export later and calling `update_site` swaps the content under the same URL.

## The minimal workflow

```
`# 1. Convert
jupyter nbconvert --to html --embed-images analysis.ipynb

# 2. Publish (anonymous, 24-hour link)
curl -F file=@analysis.html https://api.stacktr.ee/sites

# 3. Or publish authenticated for a persistent URL
stacktree publish analysis.html --gate=email:@yourco.com --expire=30d`
```

## What renders correctly

  - Plotly / Bokeh / Altair. Interactive charts work — nbconvert embeds the JS bundles.
 - ipywidgets. Static representations are embedded (live interaction requires a kernel; not in scope).
 - matplotlib + seaborn. Rendered as static PNG, embedded inline.
 - pandas DataFrames. HTML tables, styled.
 - LaTeX / MathJax. Renders via the embedded MathJax bundle.
 - Markdown cells. As written.

## Why not GitHub Gist or nbviewer?

  - nbviewer is public — anyone with the URL of the underlying .ipynb sees the rendered notebook.
 - Gist works only if the notebook is committed to a Gist (public or "secret" / shareable, but not enforceably private).
 - Stacktree keeps the notebook out of any public surface and lets you layer auth on top.

## For data-science teams

 The pattern that's worked well: each analyst publishes their notebook output to a Stacktree, gates it to the team's email domain, and posts the link in Slack. When the analysis is re-run with new data, calling `update_site` replaces the content — the existing Slack message link picks up the new version on refresh. No version sprawl, no "see V3" follow-up post.

FAQ

## Frequent questions

     How do I share a Jupyter notebook with my team privately? +  Export the notebook to standalone HTML with `jupyter nbconvert --to html --embed-images notebook.ipynb`, then upload the file to Stacktree. Add an email-domain gate so only @yourco.com viewers can open the link. The notebook's plots, widget output, and DataFrames render exactly as they did in the notebook.   Do Plotly charts and ipywidgets work? +  Yes. nbconvert's HTML export embeds the JS libraries the widgets need; Stacktree serves the file as-is. Plotly, Bokeh, ipywidgets, Altair, and matplotlib (as static PNG) all render in the published page.   What about the kernel? Will viewers be able to re-run cells? +  No — exported HTML is a static snapshot of cell outputs. If you need a live kernel, you want JupyterLite or a hosted Jupyter server, not a static-HTML host.   Can I publish from a notebook directly? +  Yes — from a code cell: `!curl -F file=@$(jupyter nbconvert --to html --stdout notebook.ipynb) https://api.stacktr.ee/sites`. The response includes the URL.   Is the notebook output really private? +  Every Stacktree URL is unguessable by default. Add a password or email-domain gate per link if the notebook contains sensitive data (customer rows, API responses, model outputs).   How does this compare to nbviewer or GitHub Gist rendering? +  nbviewer and Gist rendering are public-by-default and need the notebook to live on a URL anyone can fetch. Stacktree keeps the notebook private and supports replace-in-place if you re-publish updated runs.
Keep reading

## Related guides

   -  [ Share architecture diagrams Same workflow for Mermaid/D2 outputs. ](/share-architecture-diagrams)
-  [ Host AI-generated reports Same primitive for agent-written analyses. ](/host-ai-reports)
-  [ Private HTML hosting in 2026 Category overview. ](/private-html-hosting)
-  [ Agent-loop hosting Why replace-in-place beats "v3 link in Slack". ](/agent-loop-hosting)

References

## Sources and further reading

   -  [ nbconvert — official docs ↗ The canonical tool for converting notebooks to standalone HTML. ](https://nbconvert.readthedocs.io/en/latest/)
-  [ Jupyter widgets — embedding ↗ How interactive widget output is embedded in exported HTML. ](https://ipywidgets.readthedocs.io/en/stable/embedding.html)
-  [ Plotly — exporting figures ↗ Reference for Plotly figure embedding in static HTML exports. ](https://plotly.com/python/static-image-export/)

##  Get your notebook off the public web.

 One nbconvert, one curl. Your team opens the link; nobody else can.

 [ Sign up free → ](https://app.stacktr.ee/?join=1&from=cta_share_jupyter_notebook_html)   install npx stacktree-install
Copy
       Private hosting for the HTML your agents make.

[](https://betalist.com/startups/stacktree?utm_campaign=badge-stacktree&utm_medium=badge&utm_source=badge-featured)[Featured on](https://devhunt.org/tool/stacktree)[](https://buildlist.io)[Get started free](https://app.stacktr.ee/?join=1)

## Product

- [Page video](/page-video)
- [Ask this page](/ask-this-page)
- [Client spaces](/client-spaces)
- [Templates](/templates)
- [Example deliverables](/examples)
- [Custom domains](/custom-domains)
- [Client feedback](/client-feedback-loop)
- [One-time links](/one-time-view-links)
- [See how pages get read](/page-engagement)
- [Made with Stacktree](/made-with)
- [Security](/security)
- [Watch the demo](/demo)

## Agents

- [All integrations](/agents)
- [Claude Code](/claude-code)
- [OpenAI Codex](/codex)
- [Cursor](/cursor)
- [Claude.ai connector](/claude-ai-connector)
- [Claude Cowork](/what-is-claude-cowork)
- [Meta Muse](/muse)
- [MCP server](/mcp-publish-html)
- [Deploy from Claude Code](/deploy-html-from-claude-code)
- [Skills](/skills)
- [Slack app](/slack)
- [n8n node](/n8n)
- [Agent payments (x402)](/x402)

## Alternatives

- [All comparisons](/alternatives)
- [Head-to-head comparisons](/compare)
- [Tiiny Host](/tiiny-host-alternative)
- [GitHub Pages (private)](/github-pages-private-alternative)
- [Vercel](/vercel-alternative-for-agents)
- [ngrok](/ngrok-alternative-for-html)
- [Display.dev](/display-dev-alternative)
- [Static.app](/static-app-alternative)
- [OpenAI Codex Sites](/openai-codex-sites-alternative)
- [here.now](/here-now-alternative)
- [Shippage](/shippage-ai-alternative)
- [Best private hosting](/best-private-html-hosting)

## Use cases

- [All use cases](/use-cases)
- [Share with clients](/share-with-clients)
- [Send a file to a client](/share-html-file-with-client)
- [Share Claude artifacts](/share-claude-artifacts)
- [Share Jupyter notebooks](/share-jupyter-notebook-html)
- [Host Storybook privately](/host-storybook-privately)
- [Architecture diagrams](/share-architecture-diagrams)
- [AI-generated reports](/host-ai-reports)
- [Internal HTML tools](/internal-tool-hosting)
- [Private HTML hosting](/private-html-hosting)
- [Vibe-coded page hosting](/vibe-coding-hosting)
- [Leave a website builder](/website-builder-migration)

## Learn

- [Blog](/blog)
- [Glossary](/glossary)
- [FAQ](/faq)
- [Where AI output should live](/where-ai-output-lives)
- [Agent-loop hosting](/agent-loop-hosting)
- [Why agents need a publish primitive](/blog/why-agents-need-a-publish-primitive)
- [MCP servers explained](/blog/mcp-servers-explained-for-developers)
- [What changed in the 2026-07 MCP spec](/blog/mcp-2026-spec-changes)
- [Sites in Codex explained](/blog/sites-in-codex-explained)
- [Private-by-default hosting](/blog/private-by-default-html-hosting)
- [An agent paid us $1 (x402)](/blog/agent-paid-to-provision-itself)
- [When a loop hits a paywall](/blog/loop-engineering-paywall)
- [Pricing](/pricing)
- [Self-host (new)](/self-host)
- [Changelog](/changelog)
- [Docs](https://stacktr.ee/docs)
- [About](/about)
© 2026 Stacktree · stacktr.ee

[Privacy](/privacy)[Terms](/terms)[Security](/security)[Dashboard](https://app.stacktr.ee)[npm](https://www.npmjs.com/package/stacktree-mcp)[Sitemap](/sitemap.xml)[llms.txt](/llms.txt)[API spec](/openapi.json)

---
Full markdown summary of the Stacktree marketing surface: https://stacktr.ee/llms-full.txt
