News ·
EQL Helper moved to Sandwich Hime.
The larger proving ground is live: EQL Helper now renders its production pages through 106 typed Sandwich Hime components while retaining its old renderer as an immediate rollback path.
The template conversion was the calm part
EQL Helper had 47 complete HTML document families spread across public browsing, search, planning, API documentation, errors, and administration. Once the shared layouts and typed view models were settled, moving those pages into visible .sando source was direct and pleasantly repetitive. The difficult work was not persuading Hime-san to render a page; it was earning confidence that every page still meant the same thing.
The migration therefore kept both implementations compiled together. A full DOM differential suite rendered representative legacy and Sandwich Hime pages, normalized the documents, and compared their structure and meaning. Context, dangerous-URL, RCDATA, trusted-output, CSP, and failure-path checks supplemented that comparison.
Generated source stayed reviewable
All 106 generated companions were committed beside their templates. Two complete generation passes changed neither their bytes nor their modification times. The application build links only the small Apache-2.0 sando runtime; the Hime-san compiler remains a development and CI tool.
That boundary mattered during review. The generated Go could be diffed like any other source, the dependency graph remained explicit, and the production application continued to own routing, headers, data, caches, and server lifecycle.
The launch stayed reversible
The release entered the inactive application slot, passed health, readiness, and representative page checks, then became active through the existing blue-green Caddy switch. The legacy renderer and prior binary remained available for rollback. No rollback was required.
A fresh production check on August 14 found the active EQL service running with zero restarts and no warning-level journal entries since the current release began. The current release was built with Go 1.26.6. Those are bounded observations from one service and one period—not a promise that future errors are impossible.
A preliminary renderer observation
Before launch, the representative home-page renderer was measured locally with the same typed view and a reused buffer. Across three samples, the Sandwich Hime renderer took 10.9–11.6 microseconds per operation, allocated about 2.8 KB, and performed 78 allocations. The legacy html/template path took 145–150 microseconds, allocated about 205.6 KB, and performed 884 allocations.
After the renderer migration, route-scoped CSS work also reduced the home page's raw embedded stylesheet by 68% and its compressed HTML by about 35.6%. The representative items page reduced raw CSS by 30.3% and compressed HTML by about 15.4%. That was a separate application optimization made easier to organize around the new component boundaries—not an automatic compiler result.
What I learned on the climb
The migration felt like the project promise becoming ordinary: open the template, see the page, pass typed data, compose another component, and let Go build the result. Most of the effort went into evidence and safe rollout rather than fighting the template language. That is exactly where I wanted the effort to go.