Building blocks
Some parts of a site are the same everywhere and easy to get subtly wrong: a cookie notice that really holds back analytics, a form that stays on the page, a video that does not reach Google before the visitor asks. We publish them as building blocks an AI copies into the site, so it does not have to write or retype them.
consent: a notice with Accept and Reject; tags written as<script type="text/plain" data-consent>load only after Accept.forms: sends every form that posts to Spaicely without leaving the page, and shows the result, a coupon code or the way on to Stripe.embeds: YouTube (youtube-nocookie), Vimeo, OpenStreetMap and Google Maps that load only after a click.nav: a menu that folds behind a button on a phone, closes with Escape and marks the current page; without JavaScript every link shows.faq: questions that open and close with<details>, with FAQPage structured data in the snippet.language: links to the same page in other languages; offers the visitor's own language once, never redirects.hours: an opening-hours table that marks today and says whether the place is open now, in its own time zone, with structured data.donation: the progress bar of a donation form, read from itsprogress_url: raised, goal, donors and the names they chose to show.cart: a cart for the web shop, kept in the browser, with add buttons (also for a picked size or colour), stock and prices from the shop's items endpoint, so a catalog of any size works. Stock updates live on every open page, the cart holds stock when the shop asks for it, and checkout sends only ids and quantities. See Web shop.
blocks.list lists them and blocks.get gives one, on the public server too. Its deploy_files go straight into sites.deploy as { path, source_url }: Spaicely fetches the files, and the site gets its own copy, served from its own domain, so nothing loads from us at runtime. The snippet goes in the pages, with its texts set through data- attributes in the language of the page. Without MCP the same is at https://spaicely.com/blocks/index.json, and each file at https://spaicely.com/blocks/<name>/v<n>/. A published version never changes; an improvement is the next version.