vanilo/properties
Vanilo Properties adds flexible product attributes to Laravel e-commerce stores: define properties and values, attach them to products, and manage catalog attributes for display, filtering, and organization. Integrates with Vanilo Products.
Architecture fit. vanilo/properties is the attribute/property sub-system of the Vanilo e-commerce suite for Laravel — it supplies Property and PropertyValue models plus contracts for modeling product attributes (color, size, material, numeric specs) and their typed values. It is not a standalone product: it is one node in a contract-first, component-based framework assembled through konekt/concord, which registers models/contracts into Laravel's service container so they can be swapped. Architecturally this fits any Laravel application that already adopts (or intends to adopt) the Vanilo family of packages — products, properties, cart, checkout, channels, pricing. It does not fit a non-Vanilo stack cleanly, because the value proposition is interoperability with the sibling modules (properties exist primarily so products can carry structured attributes that feed catalog filtering, PDP specs, and faceted search).
Integration feasibility. Feasible for a Laravel team already committed to Vanilo or evaluating it. The practical install path is vanilo/framework (which pulls vanilo/properties transitively) rather than installing vanilo/properties in isolation — hence the misleading "0 dependents": direct Composer dependents are near-zero because consumption is transitive. Installing the subpackage alone is technically possible but leaves you to wire the Concord module registration, product relationship bindings, and migrations yourself.
Technical risk.
Key questions.
Stack fit. Good fit for a Laravel monolith or modular monolith where the catalog is a first-class domain and the team is comfortable with service-container-driven contract swapping. Poor fit for polyglot stacks, headless-only architectures requiring a stable, versioned attribute API independent of PHP, or teams expecting a turnkey platform (Shopware/Magento-style) rather than an assemble-it-yourself framework.
Migration path.
vanilo/framework in a branch, run migrations in a disposable database, and confirm the product + properties tables land as expected.product_attributes columns or a bespoke EAV table): do not rip-and-replace. Stand up Vanilo properties alongside, define property types, backfill values via a one-off artisan command, then cut read paths over module-by-module.vanilo/properties with the pinned vanilo/framework and konekt/concord versions, re-run migrations, and verify no contract overrides were shadowed.Compatibility.
konekt/concord version required by properties matches the one the application bootstraps.Property model, custom PropertyValue) — Concord swaps are global, so an override intended for one module can silently change behavior in another.Sequencing.
Maintenance. Recurring cost is low in code volume but non-trivial in upgrade coordination: the module moves with the Vanilo release train, which moves with Laravel's. Budget a recurring dependency-upgrade task each Laravel minor and each Vanilo minor. Because consumption is transitive, version drift is easy to miss until a composer update surfaces it.
Support. Community/GitHub-issues support with a small maintainer base; no vendor SLA. For a revenue-bearing catalog, assume internal ownership of the module's behavior — read the source, vendor a fork if needed (MIT permits it), and keep a patching path. Do not plan on upstream turnaround for niche defects.
Scaling. The properties model is EAV-adjacent: product → property values → property definitions. That shape is fine for correctness and admin ergonomics but degrades on high-cardinality reads — expect N+1 hazards when hydrating PDPs and heavy joins when filtering by multiple property values. Mitigations: eager-load aggressively, denormalize a flat "spec sheet" projection for read paths, and treat the search index (not the relational store) as the filtering surface for catalog browse. Writes are low-volume (catalog ops), so write scaling is rarely the constraint; read and index-freshness are.
Failure modes.
Ramp-up. Expect 1–2 weeks for a Laravel-fluent engineer to become productive with Concord and the contract-override idiom, plus the same again to internalize Vanilo's module boundaries (properties vs. products vs. channels vs. pricing). The domain modeling itself — deciding which attributes are typed properties versus first-class columns — is the higher-leverage learning and deserves product/merchandising input, not just engineering judgment. Onboarding cost is modest; the real investment is governance: a documented attribute taxonomy, a version-pinning policy for the Vanilo family, and a named owner for upgrades.
How can I help you explore Laravel packages today?