04 Sept 2026 · 4 min read
Hyva compatibility modules for third-party extensions
A real-world look at the Hyva compatibility layer: which kinds of Luma-only extensions need a Hyva template, how to structure a compat module, and the extension categories that generate the most migration work.
Part 9 of the Hyva series — building the core storefront. Implementation-focused, drawn from real migration experience (project names withheld).
Why compatibility is the real work
The theme and the Tailwind pipeline are solved problems — you set them up once. The work that actually varies project to project is the compatibility layer: the set of third-party extensions that ship Luma PHTML and Knockout widgets but no Hyva template. On a typical merchant storefront, this is where the schedule lives.
Hyva renders any module whose frontend is plain server-side PHTML without modification. The modules that need work are the ones that inject interactive JavaScript or rely on Luma-specific markup. Inventory them early (the migration checklist post shows how) and the rest of the project is predictable.
Extension categories, ranked by effort
From migrations of mid-size catalog stores, these are the categories that most often need a Hyva template, roughly in order of frequency:
- Layered navigation / faceted search — especially when backed by Elasticsearch or OpenSearch. The filter widgets are heavily Knockout-driven; a Hyva port rebuilds them as Alpine components hitting the same search endpoint.
- AJAX cart and quick-view — add-to-cart, mini-cart, and product quick-view popups. The Luma versions are Knockout; the Hyva versions are small Alpine components around the existing cart controller.
- CAPTCHA / bot protection — form protections that inject their own JS. These need a Hyva-compatible template that loads the same challenge but without the Luma requirejs graph.
- Gift cards and store credit — balance display, apply forms, and checkout integration. Mostly PHTML plus a little Alpine for the apply flow.
- FAQ and content widgets — accordions, tabs, brand sliders. Low logic, pure markup, fast to port.
- Social login — the buttons and the post-auth redirect. Usually a template swap plus ensuring the provider's script loads under Hyva's single JS file.
- Brand / manufacturer widgets — brand sliders and filters on the category page. Markup-heavy, logic-light.
- Inventory / store locator — store pickup and geolocation UIs. These are the heaviest, because they mix maps, distance calculation, and session state; budget them separately.
This list is not exhaustive, but it captures where weeks — not days — accumulate.
Structure of a compatibility module
A Hyva compatibility module follows the normal Magento module layout; it only adds a view/frontend/templates override and, where needed, an Alpine component. It does not patch the original extension — it provides the Hyva-shaped presentation alongside it.
ExampleStore/CompatGiftCard/
registration.php
etc/
module.xml
view/frontend/
templates/
giftcard/apply.phtml
web/
js/apply.js (Alpine.data component)
The template renders Tailwind markup and binds the Alpine component:
<form x-data="giftCardApply" @submit.prevent="submit">
<input name="code" x-model="code" class="rounded border border-border px-3 py-2">
<button x-bind:disabled="loading">Apply</button>
<p x-show="error" x-text="error" class="text-red-600 text-sm"></p>
</form>
The original extension's PHP (the apply controller, the balance model) is untouched — you are replacing the face, not the engine.
A pattern that recurs: keep the endpoint, swap the face
Almost every compatibility task reduces to the same shape:
- Find the original Luma template and its Knockout bindings.
- Identify the server endpoint or controller it calls.
- Write a Tailwind PHTML that calls the same endpoint from Alpine.
- Confirm the response shape matches what the Luma widget expected.
When an extension exposes a clean controller or GraphQL resolver, step 3 is trivial. When it hides logic inside a Knockout uiElement, you may need to read the original JS to learn the endpoint — that reconnaissance is most of the effort.
What to outsource vs build
Before writing a compat module, check whether the vendor already ships a Hyva compatibility package or the community has one. Many popular extensions do. For the long tail of niche or abandoned extensions, you write the template yourself — and that is fine, because each one is small once the endpoint is known.
The migration checklist post turns this inventory into a go/no-go per module and a realistic timeline.
What's next
With the theme built and the compatibility layer understood, the next post assembles them into a migration plan: the order of work, the go-live checklist, and how to de-risk the cutover.
Next in this series: The Luma to Hyva migration checklist —
/blog/magento2-hyva-migration-checklist