Publish a bundle
Drop a folder or a.zip (or select several files at once) — the whole export, not
the one folder inside it that holds the site. Shareable finds the site for you: the directory
that actually holds your pages, whether that is the top level or something like site/ inside
a design-tool export. The file named index.html becomes the entry page; the others are
reachable by their filenames.
The assets those pages use come along even when they sit outside that directory — a pages/
folder beside assets/, css/ and fonts/ is uploaded whole, nothing dropped — and a page
in a subfolder reaching back out with ../assets/logo.png or ../css/site.css resolves the
way it does on your own machine, because each page is served from its own folder rather than
from the deck root.
Some exports ship the same site twice — once web-shaped, once with every page carrying its
own copy of the images. When a drop really does contain two sites, you get a short chooser
naming each one with its page count, file count, size and entry page, with the better-shaped
one selected. Whatever is left out — the other copy, or a file of a type decks don’t take — is
named for you before you publish, never dropped quietly.
Non-HTML files in the folder ship with the deck as assets:
- Images — PNG, JPG, WebP, GIF, SVG, ICO
- Stylesheets and scripts — CSS, JS
- Fonts — WOFF, WOFF2, TTF, OTF
- Data — JSON
<img src="images/logo.png">,
<link href="style.css">) — exactly as they sit in the folder. Anything outside
these types is skipped, and the uploader tells you what was left out and why.
Linking between pages
Use relative links between files —href="team.html", href="deck/02.html", href="../index.html"
from a page in a subfolder — and they resolve within your page’s namespace automatically.
Root-relative paths (/style.css) work too, resolved against the deck’s root.
Clean URLs work as well. A static-site export that links a folder — href="about/",
the shape Hugo, Astro and Next produce — is served that folder’s index.html (or
index.htm). A file named about wins over an about/ folder if a deck somehow has both.
One difference from a plain static host: we serve the page at /about rather than
redirecting to /about/, so a page that replaces its own <base> at runtime should link
files rather than folders.
How it behaves
- One access setting, one link — sharing, password, or email gating applies to the whole bundle, assets included: an image in a password-protected deck is just as protected as its pages.
- One entry URL (
/p/your-slug); visitors click through the internal links. Opening it redirects to the entry file’s own address (/p/your-slug/index.html), which is what makes a relative reference in the entry page resolve against the deck. Share the short URL — the redirect is what your visitor’s browser follows. - Analytics and version history work across the bundle (version history covers the HTML; assets are not versioned).
Limits
- Up to 60 HTML files and 150 assets per deck
- Your plan’s per-file cap for each HTML page (5 MB on Free, more on Pro and Team), up to the deck total below — which is the real ceiling, so on a paid plan a single page in a deck can be larger than 2 MB but never larger than the deck itself
- Your plan’s cap for the deck total as well (HTML + assets combined) — the same number, so a deck gets what its content would get as one page, up to 32 MB: that means 5 MB on Free and 32 MB on Pro and Team. A deck near that size takes a minute or so to upload and shows a progress percentage
- About 4 MB per API request when you publish a deck through the API or MCP — the whole
JSON body,
filesandassetstogether. This is a platform limit that applies before any of the caps above, so it is the practical ceiling for a deck published in one call; the app uploads a deck a different way and is not subject to it - 5 MB per asset when you publish a deck through the API or MCP (
assets[]), on every plan. Uploading a folder in the app instead lifts that to whatever the deck total leaves after your HTML — the deck total is the real ceiling either way
Assets are stored privately and served only through your page’s link — they’re
never publicly listable, and access control is enforced on every request.
<meta property="og:image" content="images/logo.png"> in the entry page and
the card in iMessage/Slack shows your image instead of the generic Shareable one.