shipu/themevel
Themevel is a Laravel package for managing multiple themes with ease. It provides theme activation, view and asset resolution, CLI commands, and middleware support, helping you organize and switch frontend themes without touching core application code.
Architecture fit
Themevel is a presentation-layer package: a Laravel service provider that registers a theme resolver, overlays theme view paths onto the framework's view finder (with fallback to base resources/views), and resolves theme asset URLs. It has essentially no coupling to domain code — controllers keep returning view names, and the package decides where to look. That makes it a good fit for:
It is a poor fit if the front end is Inertia/React/Vue/Livewire-heavy, or if theming is really just "a few CSS variables." In those cases the package adds an indirection layer without buying view/asset resolution.
Integration feasibility
Low-friction to spike: composer require shipu/themevel, publish config and assets, register the provider (auto-discovery on modern Laravel), set default_theme and theme path. A working two-theme proof of concept is a 1–3 day exercise for one engineer. The real work is not installation — it is the fallback chain, asset pipeline (Vite/Mix manifest per theme), and per-request theme selection if multi-tenant.
Technical risk
composer.json constraints against our target Laravel/PHP versions before committing; Laravel 11/12 and PHP 8.3+ support is the first thing to test.view:cache, config:cache, and per-theme compiled views need an explicit invalidation story.Key questions
Stack fit Target a Laravel monolith or modular monolith on Blade, PHP 8.1–8.3, with Vite for assets. Themevel covers view resolution natively; asset resolution will need a thin adapter so each theme's Vite manifest is resolved correctly rather than relying on the package's default asset URL helper.
Migration path Adopt incrementally and behind an abstraction:
ThemeResolver contract (activate, current, asset, fallback). Nothing in application code calls the vendor API directly.Compatibility
Pin the Laravel minor version, add the package to the upgrade test matrix, and assert behavior for: missing theme fallback, view:cache rebuild, config:cache after adding a theme, and Octane request isolation. Confirm asset publishing works non-interactively in CI (vendor:publish --force in the deploy step, or committed theme assets).
Sequencing
Maintenance Budget roughly 0.1 FTE of ongoing ownership, concentrated around Laravel upgrades. Practically: fork to our org (CC0 permits it), vendor the fork in Composer via VCS, and keep our patches minimal and documented. Track upstream releases; expect few.
Support Community-only, no SLA, no vendor to escalate to. That is acceptable for a presentation-layer package but not for anything on the critical path without an internal owner and runbook. Document the fork point and the upgrade procedure explicitly.
Scaling Runtime cost is negligible — theme resolution is a path lookup and a view-finder entry. Real scaling considerations are: N themes × compiled Blade views in cache, duplicated per-theme asset bundles, and CDN path prefixes per theme. Add a per-theme asset prefix to keep cache keys clean. Under Octane, enforce a theme reset at request start and in queued jobs.
Failure modes
config:cache after a theme is added → theme invisible in production only.view:cache not cleared on theme change → mixed output between tenants.Ramp-up Low for anyone fluent in Blade — about a day to be productive, with most of that spent on our wrapper and asset conventions rather than the package itself. Documentation upstream is thin, so plan to write a one-page internal guide plus a checked-in example theme skeleton. The learning curve is not the package; it is our fallback, caching, and asset conventions layered on top.
How can I help you explore Laravel packages today?