Embed a map
Put a live map in a README, a Notion page, a Confluence doc, or your own site. It stays current: edit the map in Canopy and every embed updates.
Notion · Confluence · your site
Interactive iframe
Pan and zoom, never edit.
README
Static image

GitHub strips <iframe>, so this is the only form that works there.
Both follow the map's sharing state, and both carry the badge.
Two snippets, and they are not interchangeable
Notion, Confluence, a blog, a wiki get an iframe. Readers can pan and zoom; nobody can edit.
<iframe
src="https://embed.canopy.8starlabs.com/embed/map/<map-id>"
width="100%"
height="460"
loading="lazy"
allow="fullscreen"
style="border:1px solid #e5e7eb;border-radius:12px"
title="Architecture map"
></iframe>A GitHub README needs the image form instead:
[](https://canopy.8starlabs.com)Why READMEs are different
GitHub's markdown sanitizer strips <iframe> entirely, so the interactive
embed cannot appear there at all. The image is not a lesser fallback, it is the
only thing that works. It updates whenever you save the map, and because GitHub
proxies external images through its own CDN, even a heavily-read README barely
touches Canopy.
Both snippets are generated for you: open a map and click the embed icon in the header.
Dark theme
Choose Dark in the embed dialog. Canopy puts theme=dark in the generated
URL, so the theme is explicit and stays consistent in a cross-origin iframe or
an image proxy such as GitHub Camo.
<iframe
src="https://embed.canopy.8starlabs.com/embed/map/<map-id>?theme=dark"
width="100%"
height="460"
loading="lazy"
allow="fullscreen"
style="border:1px solid #2b343a;border-radius:12px"
title="Architecture map"
></iframe>The same option works for a README image:
[](https://canopy.8starlabs.com)The embed does not guess the parent page theme. The explicit URL keeps the interactive and image versions stable, including when a cached image is shown.
The map must be public
An embed follows the map's sharing state. A private map's embed returns 404, and setting a public map back to private stops every existing embed immediately.
There is no separate embed link or token. Deciding to embed a map is the same decision as making it public: anyone with the URL can see it.
Embeds are allowed to be framed
Canopy blocks framing for dashboard pages, but the embed route intentionally
allows framing from any site with frame-ancestors *. It is served from a
separate cookieless host, can only read public map data, and is read-only. The
generated iframe requests fullscreen only.
Options
Append them to either URL, e.g. /embed/map/<map-id>?theme=dark&spend=1.
Anything else is ignored.
Cost is hidden unless you ask for it
Monthly spend is off by default in embeds, even though a public map page shows it. An embed travels further than a page someone chose to visit - into READMEs, wikis, and search results - so turning cost on is a deliberate act.
Attribution
Every embed carries a Made with Canopy badge, on every plan:
This differs from exports, where Pro can remove the watermark: an export is your own data leaving Canopy, whereas an embed is Canopy rendering inside someone else's page.
Sizing
The iframe fills whatever box you give it. 460px tall suits most maps; give a
large map more height, or let readers zoom. The image form scales to its
container like any other image.
Why embeds are served from a different domain
Embeds come from embed.canopy.8starlabs.com, never from the app domain. That is
deliberate: an embed renders inside a page Canopy does not control, so it is
served from an origin that holds no Canopy session. An embed cannot read your
cookies, act as you, or reach the API, because on that origin there is nothing to
reach with.
The embed also loads no external scripts or fonts and makes no network calls of its own.