# Share HTML files in Slack as private links (Slack app) · Stacktree

Source: https://stacktr.ee/slack

[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 August 29, 2026          slack app

#  The HTML file in your Slack thread, openable.

   Slack renders HTML files as code blocks nobody can read.  One click on the message turns the file into a private link, posted back into the conversation. No account, no dashboard, no copy-pasting.

  [ Add to Slack ](https://api.stacktr.ee/slack/install)   install api.stacktr.ee/slack/install
Copy
     No card · 3 pages free · about a minute

    # general# launchSStacktree# launchststeve 12:46 AMlaunch-status.html ▾1  <!DOCTYPE html>2  <html lang="en">3  <head>4  <meta charset="utf-8" />5  <title>Launch Readiness…⋮Copy link to filePin to channelSHost on StacktreeMore message shortcuts…▦Stacktree APP12:46 AMlaunch-status.htmlPrivate link · viewers need no account or loginAcme · Weekly statusLaunch Readiness — Week 24387212Open page🔒 stacktr.ee/p/hNmLbc94SZ…Acme · Weekly statusLaunch Readiness — Week 24387212The file everyone shares, the way Slack shows it: line 1 of the markup.

##  How do you open an HTML file someone posted in Slack?

You host it. Slack shows uploaded HTML as a code preview, not a rendered page. The Stacktree Slack app adds a message shortcut: click ⋮ → Host on Stacktree on any message carrying an .html or .md file, and it publishes to a private, unguessable URL and replies with the link, visible to everyone in the conversation. Installing takes one OAuth approval and no Stacktree account: the workspace gets its own free identity automatically.

## The moment this exists for

 A colleague asks for the architecture diagram. You have it as a self-contained HTML file, because that is what your agent produced, so you drag it into Slack, and Slack displays line 1 through 5 of the markup with syntax highlighting. Nobody is reading a diagram out of a code block. The information is right there and completely unreadable.

 We built this app after being caught by exactly that moment ourselves, in our own Slack, by a colleague who knew what we build. The lesson we took: the file-into-Slack reflex is unbeatable, so stop fighting it. Drop the file the way you always do; the shortcut makes the drop the publish.

## Slack now renders HTML attachments

 Since mid-June 2026, Slack has been rolling out inline rendering of attached HTML files: in workspaces where it has landed, the file shows as a page in the channel rather than a code preview. The rollout is gradual, so the same file can still appear as code elsewhere. Rendered or not, the file stays inside Slack: no URL to send, no gates, nothing a client without a seat can open. The render changed how the file looks in the channel; this app exists for the part that did not change. We covered [what the render does and does not change](/blog/slack-renders-html-attachments) on the blog.

## How it works

  - Install once. One OAuth approval. The workspace gets its own free Stacktree identity at that moment, so there is no signup, no API key, no configuration. Anyone in the workspace can use the shortcut immediately.
 - ⋮ → Host on Stacktree. On any message with an HTML or Markdown file, in any channel or DM. The bot needs no invite, because it is a shortcut, not a member.
 - The link comes back into the conversation. Private, unguessable, viewable with no account. The person who asked clicks it and sees the rendered page, not the markup.
 - Outgrow it, then link. When the workspace's free pages are used up, the reply itself offers to link a Stacktree account, which migrates the workspace's existing sites into your dashboard and applies your plan's limits. Friction arrives after value, not before.

## Or just ask Slackbot

 Slack made Slackbot an MCP client in June 2026, and Stacktree is a remote MCP server, so the two connect. Once an admin adds Stacktree in the Slack app's MCP settings, anyone can ask Slackbot in plain language, "publish this as a private link," and it calls Stacktree's publish primitive and posts the link back into the channel. The message shortcut above is the no-setup path; the MCP connection is the conversational one. Both produce the same private, unguessable links, with the same gates available afterwards.

## What it deliberately does not do

 No event subscriptions, no channel presence, no passive scanning of files or messages. The app acts only when a person runs the shortcut on a specific message, and touches only that message's files. Hosted pages carry a strict Content-Security-Policy, are excluded from search indexing, and can be gated further from the dashboard: expiry on any plan, a password or email-domain verification on a paid one. The privacy bar for putting something at a URL should be higher than for a file in a channel, and here it is.

FAQ

## Frequent questions

     How do I share an HTML file in Slack so people can actually open it? +  Slack renders uploaded HTML as a syntax-highlighted code block, not a page, so nobody can view it. With the Stacktree app installed, click the three-dot menu on the message and pick Host on Stacktree: the file is published to a private, unguessable URL and the link is posted back into the conversation. Viewers open it in a browser with no account or login.   Does the app read my messages or files? +  No. It is a message shortcut, not a listener: it has no event subscriptions, is never present in your channels, and only acts when someone explicitly runs Host on Stacktree on a specific message. It then reads only that message's attached HTML or Markdown file. The click is the consent.   Do I need a Stacktree account to use it? +  No. Installing the app gives the workspace its own free Stacktree identity automatically, with the free plan's limits: 3 pages in total, 25 MB each, and each page live for 7 days. Linking a Stacktree account later is optional: it moves the workspace's pages into your dashboard and applies your plan's limits instead.   Does it work in DMs? +  Yes. Message shortcuts work in direct messages and in channels the bot has never been invited to. One current caveat: for files in DMs, the download runs with the installing user's permissions, so if someone else runs the shortcut on a DM the installer cannot see, the reply explains who should run it instead.   How private is the hosted link? +  The URL is unguessable and acts as the credential: no directory listing, no search indexing, and a strict Content-Security-Policy on every served page. You can set expiry on any plan, and on a paid plan add a password or an email-domain gate (viewers verify a work address by magic link) from the dashboard. Compared to the file sitting in Slack, the hosted copy is both readable and more access-controlled.   What file types does it handle? +  HTML (.html, .htm) and Markdown (.md, rendered to a styled page). Up to three files per message. Anything else on the message is ignored.   Can Slackbot publish to Stacktree over MCP? +  Yes. Slack made Slackbot an MCP client (generally available June 2026) that connects to remote MCP servers, and Stacktree is one, OAuth-secured at api.stacktr.ee/mcp. An admin connects it once in the Stacktree Slack app's MCP settings; after that, anyone can ask Slackbot in plain language to publish HTML to a private link, alongside the one-click message shortcut.
Keep reading

## Related guides

   -  [ Agent skills The other front doors: publish skill, MCP server, migration, agent payments. ](/skills)
-  [ Share architecture diagrams The exact artifact that sparked this app, and the workflow around it. ](/share-architecture-diagrams)
-  [ Internal tool hosting Where the single-file utilities in your threads should live. ](/internal-tool-hosting)
-  [ Private HTML hosting The unguessable-URL access model and the gates you can add. ](/private-html-hosting)

References

## Sources and further reading

   -  [ Slack: message shortcuts ↗ The interaction model the app uses: user-invoked, message-scoped, no passive access. ](https://docs.slack.dev/interactivity/implementing-shortcuts/)
-  [ Slack: app installation and OAuth ↗ The OAuth flow behind the one-approval install. ](https://docs.slack.dev/authentication/installing-with-oauth/)
-  [ Slack: Slackbot MCP client ↗ Slack's docs for connecting remote MCP servers to Slackbot, the basis for the ask-Slackbot path. ](https://docs.slack.dev/ai/slackbot-mcp-client/)

##  Stop screenshotting HTML into Slack.

 Install once, no account needed. The next HTML file anyone drops is one click from a private, openable link.

 [
Sign up free →
](https://app.stacktr.ee/?join=1&from=cta_slack)   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

- [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)
- [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)
- [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
