rename the service to diff.sr.ht The instance-facing name changes and nothing else does: the config.ini section, the origin, the apk package, the nginx block and the systemd unit are all diff.sr.ht now, and the brand's red service label reads "diff" because chrome derives it from the section name. What deliberately stays is everything whose rename would cost more than it is worth: the Go module path, the repository name, the comparesrht binary, and the /~owner/repo/compare/base...head routes people have in their history. README says so at the top so the split is not read as an oversight.
cmd: ecoretest keys in the startup smoke test The synthesized config.ini takes ecore's fixed keyset and origins rather than generating a keypair per run; a constant cannot be malformed by accident, which matters for a subprocess whose only way of complaining is a log.Fatal. Also notes the three middlewares Register now installs inside its own group, and why chi's Recoverer stays out here.
cmd/comparesrht: daemon entry point, startup validation, dev stub Wire the compare.sr.ht daemon on core-go's server.New: it runs crypto.InitCrypto, parses -b/-d/-m/-p, and drives the standard SourceHut warm-shutdown loop (SIGINT). We deliberately skip WithDefaultMiddleware (it demands Postgres/Redis and 401s anonymous viewers) and instead install the web package's documented middleware chain — RealIP, Recoverer, Logger, config.Middleware, authz.Middleware — inside a Group on the anonymous router. validateConfig checks every required key up front (network-key, webhook key, repos root, a git.sr.ht API origin candidate, meta and compare origins) with a single clear fatal, so a misconfiguration fails loudly at startup rather than as a deep panic in config.GetAPI on the first request. A build-and-exec smoke test proves the binary starts against a synthesized config, answers /healthz 200, and exits cleanly on SIGINT in under 15s. Makefile: build ./comparesrht from ./cmd/comparesrht, run-dev binds localhost:5090 against a local config.ini, install ships the binary and static assets. contrib/dev-stub is a stdlib-only fake git.sr.ht GraphQL API returning fixed public repos for local development, and the systemd unit now stops with KillSignal=SIGINT to hit the warm-shutdown path.