One shape for every app that runs

Pinch or Ctrl+scroll to zoom; the text is selectable. Source · TheYard

Every app TheYard runs ships the same way: build the Docker image, push it to the registry, point the web app at the tag, verify One shape for every app that runs: a Docker image, by tag Both web apps run a container image built from this repository's own Dockerfile and pulled from the registry as the identity. Nothing is zip-deployed or built on the server. The one web app: both sites and The Shed .github/workflows/deploy.yml, on every push to main Build the image Dockerfile, three stages Node builds the page; the SDK publishes TheYard and The Shed; the runtime image holds both. Push to the registry crtheyardsszmnetj67bn5h2/theyard:vN One tag per version, signed in as the workflow (OIDC), no password anywhere. Point the web app at the tag APP-THEYARD-ONE-SS: DOCKER|...:vN The settings it holds, then the image; App Service pulls it as id-theyard-ss. Verify, then the edge origin, the three names, domains The version, readiness, the Cosmos DB name and The Shed's name; the edge moves after, if it changed. The rendering service .github/workflows/deploy-render.yml, on every push to main Build the image render/Dockerfile, two stages Node builds the renderer from the site's own source; the runtime is Node and that build. Push to the registry crtheyardsszmnetj67bn5h2/theyard-render:vN The same version as the API, the same registry, the same sign-in. Point the web app at the tag APP-THEYARD-RENDER-SS: DOCKER|...:vN One call: every other setting is infra/render.bicep's. Verify its own /readyz Ready as the version it was built as, and says whether the API has caught up. Source: docs/images/deploy-shape.svg, drawn by docs/images/deploy-shape.mjs from the two workflows it names.