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.

This is a narrow renderer microbenchmark. It excludes middleware, networking, database work, concurrency, and tail latency. It does not establish a general “faster than html/template” claim.

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.

Visit the live EQL Helper Read the technical guide