shipbytes/laravel-ui-kit
Laravel 12+ admin panel and auth UI scaffolding with Livewire 3, Volt, Fortify, and Tailwind v4. One command installs auth pages, 2FA, admin shell, dashboard, and 7 optional modules, with a health-check doctor command.
What this actually is. Not a runtime library in the usual sense — it is a scaffolder. ui-kit:install publishes Blade views, Livewire/Volt components, routes, migrations, and config into the host application, patches config/fortify.php, config/admin.php, and routes/admin.php between marker comments, and then gets out of the way. The consequence a TPM must internalize: from the first install onward you own a fork. Upstream fixes only reach you if they land in files the installer re-writes, and re-running the installer over hand-edited published files is a merge problem the package does not solve.
Architecture fit. Strong for one narrow shape: a greenfield Laravel 10–12 app that wants Fortify + Livewire 3 + Volt + Tailwind 3 auth and an admin shell out of the box. Poor for anything else:
--force.<x-ui-kit::head /> / <x-ui-kit::banners /> master layout and a specific Tailwind preset; retrofit into a design-system-driven app means unwinding its opinions.Because it is opinionated on four fronts simultaneously (Fortify auth, Volt single-file components, Tailwind preset, Alpine stores), the architectural commitment is larger than "an admin UI" implies. Volt in particular is a paradigm most Laravel teams have not shipped at scale.
Integration feasibility. High, conditionally. The preflight collision check and the explicit publish map are genuinely good TPM-facing artifacts — you can diff the destination list against an existing repo and know your conflicts before running anything. The irreducible manual checklist (User trait, layout tags, Tailwind preset, Vite imports, .env) is small and documented. Realistic effort: ~0.5 dev-day on a fresh laravel new project; 1–2 weeks on a brownfield app where Breeze must be surgically removed first.
Technical risk. This is the dominant factor and it is severe.
dev-main in a production app is a supply-chain practice most orgs forbid.@include in the GA4 section — a signal that the README is not linted and may not be trustworthy on detail.--force handling "Laravel silently skips them, leaving you with Breeze's code running under this kit's layouts — usually broken." Silent partial installs are the worst class of scaffolding failure.migrate, storage:link, npm install, and vendor:publish for every transitive dependency. That is a lot of side effects from one artisan command.Key questions to resolve before any commitment
| # | Question | Why it gates the decision |
|---|---|---|
| 1 | Is there a tagged Packagist release with a semver policy, or must we pin dev-main? |
Determines whether this can be a managed dependency or must be vendored/forked |
| 2 | Who owns maintenance, and will they accept PRs / cut releases on our timeline? | Bus-factor mitigation plan |
| 3 | Does Laravel 13 actually pass, or is the claim aspirational? | Our platform roadmap depends on it |
| 4 | What is the upgrade contract for published files we've modified? | Defines total cost of ownership over 3 years |
| 5 | Beyond install CI, are module behaviors tested (tickets, permissions, impersonation, UTM)? | Determines whether we can upgrade with confidence |
| 6 | Security review of UTM middleware globally pushed into the web group, impersonation, and mews/purifier integration? |
Attack-surface and privacy/compliance exposure |
| 7 | Does the team have Volt 3 / Alpine depth, or is this a skills bet? | Ramp-up cost, hiring bias |
Stack fit. Adopt only where the target app is already converging on the Laravel 10–12 + Livewire 3 + Tailwind 3 baseline. Reject if any of the following are true: Jetstream present, Sanctum-token-centric API auth in play, a bespoke design system with its own Tailwind config, or Fortify actions already customized.
Recommended consumption model: fork-and-vendor, not composer require. Given zero dependents and no clear release channel, treat the repository as an internal template. Clone it into an internal platform/ui-kit fork, tag our own 1.0.0, and require that via VCS. This:
Cost: we absorb upstream maintenance. Benefit: we can actually ship.
Migration path.
| Scenario | Path | Verdict |
|---|---|---|
| New internal admin/greenfield product | laravel new → ui-kit:install → customize |
✅ Primary use case |
| API-only app needing an admin panel added | Uninstall stray resources/views/auth/, then install |
✅ Acceptable |
| Breeze app | Hand-remove Breeze per README, then install | ⚠️ 1–2 weeks, medium risk |
| Jetstream app | Start fresh app; reuse domain code | ❌ Reject |
| Multi-tenant / complex auth | Not modeled; do not force it | ❌ Reject |
Compatibility gates. Lock PHP and Laravel to a matrix row the CI actually proves (PHP 8.2/8.3 × Laravel 11/12). Do not accept the Laravel 13 claim without running the full install + smoke test yourself. Node 18+ and a working Vite/Tailwind build are hard prerequisites — confirm before scheduling.
Sequencing.
admin-middleware, profile, impersonation). Exercise login, password reset, admin CRUD, impersonation ribbon. Time-box; deliver a go/no-go memo.composer.json points at our VCS. Record the upstream commit SHA.activity-log or support-tickets later means another installer run against a live codebase..env, npm run build, admin role assignment). Do not leave these scattered.Lock-in note. Lock-in here is not to the vendor — it's to the generated code. Because it's Blade + Livewire + Fortify, the exit cost is rewriting screens, not escaping an SDK. That is a favourable property and should be stated explicitly in the ADR; it's the strongest argument for proceeding.
Maintenance. The recurring cost is not dependency bumps — it's drift management for ~20+ published files. Every Laravel or Livewire minor version forces a decision: re-run the installer (safe for marked config/nav/route blocks, risky for published views) or hand-patch. Budget 1–2 engineer-days per Laravel minor release for verification and patching, plus ad-hoc time for Tailwind 3 → 4 whenever the host app upgrades. Because published files are hand-customized, there is no clean three-way merge — assume manual review.
Support. No vendor, no community, no SLA, no security disclosure channel. Operationally this means:
Scaling. Mostly a UI concern, so application scaling impact is low — but several modules are not purely cosmetic:
analytics pushes UTM-capture middleware into the global web group. Every authenticated request gets extra work and writes; verify it doesn't become a hot path or a PII sink.activity-log and support-tickets add tables that grow unbounded — plan retention/pruning before launch, not after.impersonation (lab404) is a privileged capability; it needs an audit trail and role gating, not just the exit ribbon.admin-middleware introduces Spatie permissions; cache invalidation on role assignment is the classic production gotcha.Failure modes to instrument or test explicitly.
| Failure | Symptom | Mitigation |
|---|---|---|
| Partial/aborted install | Admin shell renders under Breeze layouts, auth flows broken | Always install in a clean branch; verify every "Next steps" item; smoke-test register/login/reset/admin |
| Mail unconfigured | UI looks fine, verification/reset emails never arrive | Block launch on a real SMTP/Postmark send test; never ship MAIL_MAILER=log |
| No admin role assigned | /admin 403s post-install — looks like a bug |
Seed role assignment into deploy runbook or seeder |
| Marker-comment corruption | Re-running installer duplicates or skips nav/routes | Diff config/admin.php and routes/admin.php after every run; keep idempotency in the upgrade test |
--force on an existing auth setup |
Orphaned Breeze files shadow kit files | Forbid --force in the runbook; require hand-removal first |
Fortify views=false patch overwritten |
Auth views revert to Fortify defaults | Assert the patch after any config:cache/publish cycle |
| Transitive config sprawl | Five-plus packages publish configs and migrations on one command | Inventory published artifacts; review migrations before migrate runs in prod |
| Upstream abandonment | No fixes for a future Laravel major | Fork ownership + exit plan (see below) |
Ramp-up. Non-trivial despite the "2 minutes to working UI" pitch. The team needs Livewire 3 and Volt and Alpine fluency to customize rather than just accept the defaults. Volt's single-file component model is unfamiliar to most Laravel developers; expect 2–4 days of genuine productivity loss on first customization, more if the team is Breeze-trained (muscle memory actively misleads here).
Exit plan (state it in the ADR). The kit is a Blade/Livewire/Fortify implementation. If upstream dies or diverges, the escape route is to freeze the fork permanently and maintain it as first-party code. Because there is no proprietary runtime, that route is viable — which is precisely why a fork-and-own posture is the right call and a direct composer require on an untagged, zero-adoption package is not.
Recommendation. Approve as an internal greenfield accelerant under a fork, with a 3-day spike gate and a named owner — do not approve as a production dependency on dev-main, and do not attempt on Breeze/Jetstream bases. Re-evaluate only after the project demonstrates a tagged release, a second maintainer, and CI coverage matching its advertised Laravel support.
How can I help you explore Laravel packages today?