makinacorpus/preferences-bundle
Symfony bundle for managing user preferences: define configurable preference keys, persist per-user values, and read or write settings through a simple API. Integrates with Symfony apps to centralize user-specific configuration.
Confirms a real capability gap on the roadmap: runtime, user-managed configuration. The package exists because some settings genuinely cannot live in env vars or container parameters — they change per user, per tenant, or per request without a deploy. If your backlog keeps producing "let users/admins change X themselves," treat that as evidence of a structural need, not a series of one-offs. This package is a data point for putting a settings/preferences capability on the roadmap.
Forces a taxonomy decision that prevents long-term debt. Teams routinely merge four different things into one "settings" table: deploy-time config (env/container), global administrator settings, user preferences (this package's scope), feature flags, and secrets. Making that distinction explicit is a genuine product decision — it determines your admin UX, your permissions model, your caching strategy, and your security posture. Borrowing this package's framing (scoped key/value with a resolution order: user → tenant → global default) lets you draw those lines deliberately.
Informs concrete feature scoping and sequencing. Directly applicable to notification/channel preferences, dashboard layout and saved views, per-tenant defaults, locale and timezone overrides, and operator-tunable thresholds that today require a config change and a redeploy. Each of these becomes a small, independently shippable increment once a shared preference store exists.
Supports a build-vs-buy-vs-borrow call, and here the answer is "borrow." This should not be adopted as a dependency. It is a Symfony bundle being evaluated against a Laravel codebase — a platform mismatch that alone disqualifies it as an install candidate. What it is useful for is pressure-testing your own data model and surfacing the acceptance criteria your real implementation will need.
Surfaces a platform and licensing trap before it costs a sprint. Flagging "this is Symfony, not Laravel" and "this is GPL-2.0" early prevents an engineer from burning a spike week on an integration that cannot ship. That is a cheap, high-value PM intervention.
Consider it only as a design reference, and only when all of the following hold:
Look elsewhere — or build — when any of these apply:
spatie/laravel-settings (mature, MIT, Laravel-native, actively maintained) or build a small settings table with a cached repository behind an interface. If the actual need is toggling behavior rather than storing preferences, evaluate Laravel Pennant instead.To executives (one paragraph): We've identified a recurring product need — letting users and administrators change certain settings themselves without an engineering deploy. That need is real, and it belongs on the roadmap. The specific open-source package we evaluated is not a dependency we recommend: it's a Symfony component in a Laravel-oriented evaluation, it carries a GPL-2.0 copyleft license requiring legal review, and it shows essentially no adoption or maintenance signal (one star, zero dependents). Recommendation: treat it as reference design, and fund either a small internal build (roughly one to two sprints) or a maintained MIT-licensed alternative. That de-risks the license exposure and the bus factor while still capturing the capability.
To engineering: It's a Symfony bundle from Makina Corpus under GPL-2.0, effectively unmaintained — assume we own it on day one, so plan to reimplement rather than integrate. What is worth taking is the model: typed key/value settings with a scope hierarchy and a defined resolution order (user → tenant → global), kept cleanly separate from env-based config. What it likely will not give us — and what we should write down as explicit acceptance criteria — is authorization on writes, an audit log, encryption for sensitive values, a cache layer with sane invalidation on the read path, and multi-tenant isolation. Build behind a single internal PreferenceStore interface so the implementation is swappable; that interface is the deliverable that caps the downside of this bet at one adapter swap.
The decision in one line: Adopt the pattern, not the package. The capability goes on the roadmap; this repository goes in the "prior art" column. And the first two questions for any future candidate in this space are "Laravel or Symfony?" and "what's the license?"
How can I help you explore Laravel packages today?