liberusoftware/theme-support
Theme support for Laravel applications: register, switch, and organize themes, resolve theme views and assets, and keep theme configuration centralized. A lightweight foundation for building multi-theme PHP apps.
Architecture fit. The package targets a well-understood seam in Laravel: view resolution and asset emission. Theme discovery + view overrides map naturally onto View::prependLocation() / View::addNamespace(), and "safe asset directives" map onto custom Blade::directive() registrations. That is genuinely idiomatic Laravel — no framework fighting, no exotic runtime. "Preferences" and "panel palettes" suggest an admin/panel layer (Filament-shaped, given the vocabulary), which means the package probably couples a rendering concern to a UI-framework concern. That coupling is the main architectural question: if the palette layer assumes a specific panel library or a specific settings/persistence driver, adopting it constrains our admin stack more than the theme story alone would justify.
Integration feasibility. Mechanically trivial — one service provider, a publishable config, a filesystem convention for theme roots. The real feasibility question is precedence. Any package that mutates global view resolution competes with our own namespaced view overrides, package-provided views, and test-time view fakes. We need to know whether resolution is scoped (per-request, per-panel, per-theme-activated) or globally prepended, because a global prepend is the kind of thing that silently changes error-page rendering and mail templates.
Technical risk. High, and dominated by supply-chain rather than code quality. Zero stars, zero dependents, single-vendor namespace, and a release timestamp (2026-10-27) that we should verify against the actual repo before trusting any of the metadata — an anomalous date is a prompt to audit composer.json, tags, and CI, not a detail to shrug at. Adoption risk is also a signal about documentation maturity: with no downstream users, we will be the first integrator, and every edge case is ours to discover.
Key questions.
composer.json constraints; is there CI against multiple framework majors?Stack fit. Fits cleanly if we are on a modern Laravel with Blade and no competing theme layer. If we already have a design-token/CSS-variable approach or a view-namespace convention, this package's value proposition shrinks to the discovery + override mechanics — plausibly a few hundred lines we could own ourselves. The build-vs-buy line sits at: does the package give us a maintained abstraction we'd otherwise re-derive badly, or does it give us a convention we'd fight?
Migration path. Do not adopt as the primary theme engine. Instead:
composer.lock entry.ThemeResolver contract in our own codebase that delegates to the package. Every call site depends on our interface, not the vendor namespace. This is the exit hatch and it costs us a day.Compatibility. Treat the framework support matrix as unverified until we've run our own test suite against our Laravel version. Watch for config-cache compatibility (discovery results baked into a cached config is a classic stale-theme bug) and for interactions with view:cache. On asset directives, gate any adoption behind our existing CSP policy so we discover breakage before customers do.
Sequencing. Audit → spike → adapter → internal pilot → deliberate re-decision before any customer-facing surface. That last gate matters more than the others: by then we'll know whether we're adopting a library or inheriting a liability, and the adapter means the answer can change without a rewrite.
Maintenance. Effectively bus-factor one. Zero dependents means no downstream bug reports surfacing issues before us, no community CVE triage, and no implicit pressure on the maintainer to keep pace with Laravel majors. Budget an explicit annual cost: one engineer-day per framework upgrade to assess compatibility, plus the fork option. Document a fork-and-vendor contingency now — MIT makes it legal, and the adapter limits it to swapping one implementation class.
Support. No stack of community answers to search. Our on-call runbook must be written by the engineer who did the spike, covering: where themes live, how resolution order is determined, how to bust the cache, and how to disable theming to fall back to default views. That last one is a required kill switch, not a nice-to-have — a theme failure should degrade to the base view, never to a 500.
Scaling. Theme discovery over the filesystem is the scaling hazard: if it runs per request, it's an is_dir/scandir tax on every render, and worse under container filesystems where stat calls are slow. Insist on cache-backed discovery. Preference lookups are the second hazard — per-user theme settings on a hot path invite N+1 queries and cache stampedes on deploy; verify the persistence driver is cacheable and that reads are batchable.
Failure modes to instrument. Missing or partially-deployed theme directory (blank page — should degrade gracefully); view override collisions where our namespace loses to the theme's unexpectedly; stale discovery cache after a theme edit; asset directive resolving a traversal path or emitting an unescaped URL; and panel palette drift when the underlying panel package ships breaking CSS-variable changes. Each needs an alert or a test, not a runbook paragraph.
Ramp-up. Small and Blade-literate: a mid-level Laravel developer should be productive in a day if they read the source, because documentation is unlikely to be sufficient at this adoption level. The genuine ramp-up cost isn't the developer — it's the organisation accepting that a 0-dependent dependency sits in the critical rendering path. Given the low adoption score against a respectable opportunity score, the honest framing is: the gap this fills is real, but this specific package has not yet earned the trust. Adopt behind an adapter, pilot internally, and revisit at the customer-facing gate with evidence rather than a plan.
How can I help you explore Laravel packages today?