# 43. Public pages: a static site scrap pushes to Date: 2026-10-31 (#497) ## Status Accepted. Replaces the scrap-to-gist skill (#481, #484, #489), which is removed. Keeps the access model of [](0007-tailscale-serve-for-access-and-identity.md): scrap itself never becomes public. Amended 2026-11-01 (1.3.1): a reader's theme and column width, by one script of the site's own (#519), and drawings published, downloadable and opened in excalidraw.com (#520). See [](#amendment-reader-preferences-and-drawings) at the end. Amended 2026-11-01 (1.3.2): a drawing replaces its photo, with no photo in it (#524); an SVG served as exactly `image/svg+xml`, so excalidraw.com opens it (#526); the site's icons and header mark, scrap's own (#527); and tables shown as the app shows them (#530). See [](#amendment-drawings-without-the-photo-and-the-sites-icon) at the end. Amended 2026-11-01 (1.3.3): Mermaid diagrams drawn, light and dark, rather than as their source (#525), and code left as written but for scrap's own addresses (#529). See [](#amendment-mermaid-diagrams-drawn) at the end. ## Context The owner wants to show a page to anyone with its address, read only. The motivating case is a whiteboard photographed in a meeting, with Claude's write-up of it. Until now the way out was the scrap-to-gist skill: Claude turned a page into GitHub-flavoured Markdown, worked around what GitHub cannot draw (`\cancel`, maths alignment), copied the images in, and made a secret gist. It needed `gh` with a token that can make gists, Chrome for the maths, a second Markdown renderer kept in step with scrap's by hand, and it published a copy that no longer changed when the page did. scrap has no login code ([](0007-tailscale-serve-for-access-and-identity.md)). Everything it serves is behind the tailnet or Cloudflare Access, and its API reaches every page. A public page must not open any path to that. The PWA already turns a page into one self-contained HTML file: Share as HTML (#485, `web/src/pagehtml.ts`). It reads the page's own rendered view, by allow-list, so its output is the page as scrap shows it, with no script, form or server address, and only its own `