etechflow / module-vehicle-compat

etechflow/module-vehicle-compat

Universal Product Fitment Finder for Magento 2. Make/Model/Year/Part filtering on any fitment domain — automotive, motorcycle, marine, RV, bicycle, phone accessories, watch straps, appliance parts, or any product where customers ask "will this fit my X?". Admin-configurable labels and field visibility. SEO-friendly URLs, PDP fitment badges, customer garage. Theme-agnostic — Hyvä, Luma, custom themes.

magento2-module Compatibility: Not yet tested Code Quality: Pending Tests: N/A Security: Pending proprietary
Viewing version 1.0.1. Latest version is 1.2.1. Switch to latest

ETechFlow_VehicleCompat — Vehicle Compatibility + Part Finder for Magento 2

A complete vehicle compatibility (Make / Model / Year / Part) system for Magento 2 stores selling automotive products. Theme-agnostic by design — bundles its own Alpine.js loader so it works on Hyvä, Luma, and any custom theme without code changes.

  • Version: 1.0.0
  • Package: etechflow/module-vehicle-compat
  • Magento: 2.4.4 – 2.4.8
  • PHP: 8.1, 8.2, 8.3
  • License: proprietary (see LICENSE.txt)
  • Vendor: ETechFlow — https://etechflow.com

What's in the box

Two halves of one feature, intentionally bundled in one module:

Half 1 — Vehicle compatibility data

  • vehicle_compat_data product attribute (JSON) storing every (Make, Model, Year) combination a product fits.
  • parts_required product attribute (multi-select) tagging which part-types each product covers (key blade, transponder, immobilizer chip, etc.).
  • Admin CRUD for Makes and Models under Catalog → Vehicles → Makes / Models.
  • CSV import for bulk-loading vehicle compatibility data (bin/magento etechflow:vehiclecompat:import-parts).
  • Product edit form modifier — a visual Make/Model/Year picker tab on every product, so the admin doesn't hand-edit JSON.

Half 2 — Part Finder widget

  • /vehiclecompat/options/index — server-side filtered options endpoint. Each dropdown click sends field=make|model|year|part + current selections, server applies bidirectional filter and returns only matching options.
  • /vehiclecompat/tree/index — full vehicle tree (cached, browser-cacheable for 1h).
  • /vehiclecompat/find/index — find-parts results page that filters the catalog by the customer's vehicle.
  • Shareable form fragment (ETechFlow_VehicleCompat::partfinder/form.phtml) that drops into any layout — header modal, hero section, PDP sidebar, all use the same template.
  • Self-contained Alpine.js bootstrap — on Hyvä stores Alpine is already loaded; on Luma / custom themes the bootstrap lazy-loads Alpine from a CDN (URL is overridable for stores that want to self-host).
  • Shared Alpine store so multiple form instances on the same page (desktop hero + mobile hero + header modal) stay in sync.

Theme compatibility

Theme Status What happens
Hyvä (Tailwind + Alpine) ✅ Native Alpine is global. The bootstrap shim becomes a no-op. Module just works.
Luma / Blank ✅ With bootstrap The bootstrap shim detects no Alpine and lazy-loads it from a CDN. Module works.
Custom themes (Luma parent) ✅ With bootstrap Same as Luma.
Custom themes (Hyvä parent) ✅ Native Same as Hyvä.
Air-gapped / no-CDN stores ⚠️ Self-host Alpine Replace the CDN URL in view/frontend/web/js/alpine-bootstrap.js with your self-hosted Alpine URL, or pre-install Alpine in your theme.
Headless / PWA Studio ⚠️ Use API only Use /vehiclecompat/options/index directly from your headless storefront. The PHP-rendered form fragment is skipped in headless.

See COMPATIBILITY.md for the full audit.


Quick start

# 1. Extract into your Magento root
unzip etechflow-module-vehicle-compat-1.0.0.zip -d <magento-root>/

# 2. Enable + migrate (creates DB tables + product attributes)
cd <magento-root>
bin/magento module:enable ETechFlow_VehicleCompat
bin/magento setup:upgrade
bin/magento setup:di:compile      # production-mode only
bin/magento setup:static-content:deploy -f
bin/magento cache:flush

# 3. Visit the admin
open https://your-store.example.com/admin/etechflow_vehicle/make/index
# (Admin sidebar → Catalog → Vehicles → Makes / Models)

# 4. Embed the Part Finder on your homepage / header
#    Reference: USAGE.md → "Embedding the Part Finder form"

Documentation index

File Purpose
README.md Overview, features, theme matrix (this file)
INSTALL.md Manual + Composer install + verification + troubleshooting
USAGE.md Admin walk-through (Make/Model CRUD, product editor, CSV import) + how to embed the Part Finder widget
CONFIGURATION.md Alpine bootstrap CDN URL, server-side filter behavior, caching
COMPATIBILITY.md Theme + Magento + PHP matrix and the design choices that keep it portable
CHANGELOG.md Version history
UNINSTALL.md Clean removal
LICENSE.txt proprietary license

Support

  • Email: [email protected]
  • Include: Magento version, PHP version, active theme, sample product with vehicle data, screenshot.

License

proprietary — see LICENSE.txt.

Changelog — ETechFlow_VehicleCompat

[1.0.1] — 2026-06-03 — Brand de-leak: rename Keystation-derived routes, files, and CSS classes

Cosmetic but important release. Renames every customer-visible and
admin-visible identifier that still carried the original developer's
"Keystation Vehicle Compatibility" (kvc) / "Keystation" branding, so the
module ships as a generic eTechFlow product any merchant can install
without seeing another shop's name in their URLs or DevTools.

Changed (customer-facing)

  • URL prefix renamed: frontName="kvc"frontName="vehiclecompat".
    Part Finder page is now at /vehiclecompat/find/index instead of
    /kvc/find/index. The Options + Tree AJAX endpoints follow:
    /vehiclecompat/options/index, /vehiclecompat/tree.json.
  • Frontend JS file renamed: view/frontend/web/js/kvc-part-finder.js
    part-finder.js. The Alpine.js function inside is now
    vehicleCompatPartFinder() (was kvcPartFinder()), and its store key
    is 'vehicleCompatSel' (was 'kvcSel').
  • CSS class prefix: kvc-*vc-* across all templates (vc-row,
    vc-ico-left, vc-trigger, vc-side, vc-find-page, vc-pager,
    vc-cat-chips, etc.). Keeps the prefix short while removing the
    Keystation branding.
  • Frontend layout file: view/frontend/layout/kvc_find_index.xml
    vehiclecompat_find_index.xml.
  • Block names in layout XML: kvc.sidebar.summary /
    kvc.category.filter.chipsvehiclecompat.sidebar.summary /
    vehiclecompat.category.filter.chips.

Changed (admin-facing)

  • 11 admin layout + UI component files renamed from
    keystation_vehicle_* to etechflow_vehicle_* so they match the
    module's existing admin route id (etechflow_vehicle). Previously
    they were dead-code on disk (route id and file name didn't match;
    Magento auto-loads layout by URL pattern). Renaming gets them back
    on the auto-load path under the canonical eTechFlow naming.

Added

  • Setup/Patch/Data/V101ReleaseMarker.php — no-op release marker
    patch. Continues the always-a-patch discipline. Depends on the three
    v1.0.0 data patches so patches run in version order.

Breaking changes ⚠

Anyone who installed v1.0.0 in the ~1 hour between v1.0.0 and v1.0.1
publication will see the Part Finder URL change. No real customers
were installed at the time of this release. Bookmarks pointing at
/kvc/find/index will 404 — clients should update to
/vehiclecompat/find/index.

If you've embedded the Part Finder form in CMS blocks or themes via
JavaScript, the Alpine.js function call needs renaming:
kvcPartFinder()vehicleCompatPartFinder(). Same for any
Alpine.store('kvcSel') references.

Why this exists

The original developer of this module built it first for the Keystation
brand and then handed the code to eTechFlow. The brand prefixes
(kvc/, keystation_vehicle_*) survived the rebadge. v1.0.0 shipped
with that leak. v1.0.1 cleans it up so the module sells generically.

Migration

composer require etechflow/module-vehicle-compat:^1.0.1
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush

Pre-flight check after upgrade:

SELECT module, schema_version, data_version FROM setup_module
WHERE module='ETechFlow_VehicleCompat';

Both columns should read 1.0.1. If data_version is stale, re-run
setup:upgrade — do NOT flush cache yet.

After upgrade, the Part Finder page is at /vehiclecompat/find/index.
A merchant who wants to preserve the old /kvc/* URLs can ship a
custom URL rewrite from /kvc/* to /vehiclecompat/* in their web
server config — but a fresh install no longer publishes any /kvc/*
URLs at all.


1.0.0 — 2026-05-20

First public release as a standalone, theme-agnostic Magento 2 module.

Added

  • Vehicle compatibility data
    • vehicle_compat_data product attribute (JSON) — Make / Model / Year tuples per product
    • parts_required multi-select product attribute
    • Admin Makes CRUD under Catalog → Vehicles → Makes
    • Admin Models CRUD under Catalog → Vehicles → Models
    • Product editor tab with visual Make/Model/Year picker (no hand-edited JSON)
    • CSV import command: bin/magento etechflow:vehiclecompat:import-parts
  • Part Finder widget
    • Reusable form fragment (ETechFlow_VehicleCompat::partfinder/form.phtml) — embed anywhere
    • Server-side filtered options endpoint /vehiclecompat/options/index (bidirectional)
    • Full vehicle tree endpoint /vehiclecompat/tree/index (cached, browser-cacheable)
    • Find-parts results page /vehiclecompat/find/index with category chips
    • Shared Alpine store keeps multiple form instances in sync (header modal + hero + sidebar)
  • Theme-agnostic JS bootstrap
    • alpine-bootstrap.js detects Alpine, lazy-loads it from CDN if absent
    • part-finder.js factory function — loaded once via layout XML
    • Both loaded on every storefront page via view/frontend/layout/default.xml
  • Scoped namespaced CSS
    • .vc-* class prefix prevents theme collisions
    • Inline <style> block in partfinder/styles.phtml
  • Catalog filter integration
    • Plugin\Catalog\Layer\FilterByVehicle narrows product collections by ?make_id=&model_id=&year=&part_id= URL params
    • Plugin\Catalog\Block\HideLayeredNav hides the layered nav on /vehiclecompat/find/index pages
  • Documentation bundle
    • README, INSTALL, USAGE, CONFIGURATION, COMPATIBILITY, CHANGELOG, UNINSTALL, LICENSE

Compatibility

  • Magento 2.4.4 – 2.4.8
  • PHP 8.1, 8.2, 8.3
  • Hyvä Theme (native — Alpine global)
  • Luma / Blank / custom themes (Alpine auto-loaded from CDN)
  • Adobe Commerce + Magento Open Source + Mage-OS

Versions
Version Stability QA Status Compatibility Released
1.2.1 stable Fail Magento 2.4.7-2.4.8 Details 2026-06-03 16:12:56
1.2.0 stable Not tested Not yet tested Details 2026-06-03 13:22:54
1.1.1 stable Not tested Not yet tested Details 2026-06-03 13:03:05
1.1.0 stable Not tested Not yet tested Details 2026-06-03 10:56:25
1.0.3 stable Not tested Not yet tested Details 2026-06-03 10:47:01
1.0.2 stable Not tested Not yet tested Details 2026-06-03 10:45:39
1.0.1 stable Not tested Not yet tested Details 2026-06-03 10:29:19
1.0.0 stable Not tested Not yet tested Details 2026-06-03 10:22:30

Requires 6

Package Constraint
magento/framework >=103.0
magento/module-backend >=102.0
magento/module-catalog >=104.0
magento/module-store >=101.0
magento/module-ui >=101.0
php ~8.1.0||~8.2.0||~8.3.0||~8.4.0

No QA results yet

QA pipelines haven't run for this version. Compatibility and quality results appear here once the vendor publishes a tagged release that gets ingested.

License
proprietary
Authors

More from etechflow

View vendor
Make it pay

Turn an existing module into recurring revenue.

If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.