Answering "why doesn't my domain load?" before it is asked: every custom domain carries an on-demand DNS resolution status, and the build pack matrix gains static site builds.
Added
- Static site build pack.
staticjoins the build pack select: the repo's install + build commands run on the panel host, and the output directory (defaultdist) ships inside an nginx:alpine image with an optional SPA history fallback (try_files→index.html). Health check, Traefik routing and blue-green swap behave exactly like any other deploy. Remote nodes are refused loudly (the build is host-executed); migration 0055 adds the two build-config columns. - Per-domain DNS resolution status.
GET /v1/services/:id/domains/:domainId/dnsresolves the hostname's A and AAAA records and compares them with the address this instance expects (the operator's record content, else the detected public IP). The web domain row gains a Check DNS chip showingok/mismatch/unresolvedwith the resolved addresses — advisory only; routing stays governed by the ownership challenge.