What goes over the wire
JSON: a slug, a sentence of metadata saying why the thing was built, and the files base64-encoded. Each file may carry the SHA-256 of its own decoded bytes, which the server recomputes and refuses on a mismatch — so a truncated upload fails at deploy time rather than quietly serving a corrupt page.
The response carries the artifact’s id, the version just written, and the URL. Copy that URL field exactly: renderers glue adjacent characters onto a link, including invisible ones, and a zero-width space on the end of a perfectly good address is a 404 somebody has already tapped.