Why this kit

Every new Laravel app needs the same first week of work: auth pages, a two-factor challenge that actually works, an admin layout with navigation, a users list. Starter kits cover some of it, each a little differently, and none of them ship the admin half. This kit is that week, installed by one command.

What is in the box

Core, always installed. Login, registration, forgot and reset password, email verification, confirm password and a two-factor challenge page, as Livewire Volt pages over Fortify, each with a dark variant. An admin shell with a collapsible sidebar, mobile bottom navigation, theme toggle and current-user footer, driven from one config file. A lighter user shell for pages like /profile. A dashboard stub and a users list with a detail page. Tailwind v4 theme tokens, two Alpine stores, and ui-kit:doctor.

Seven optional modules. Role-based admin middleware, support tickets, a changelog, a contact inbox, self-service profile with full two-factor management, impersonation, and an activity log. Each is a folder of stubs copied into your app plus the routes, navigation entries and Composer packages it needs. Modules has the full list.

Nothing hidden in vendor/. The installer publishes views, Livewire components, models and migrations into your app. After install they are ordinary application code you can read and change. The package itself keeps the installer, the doctor, a fallback admin middleware and two tiny Blade components.

Compared with Breeze and Jetstream

Laravel UI KitBreezeJetstream
Auth pagesYes, Volt pages over FortifyYesYes
Two-factor challengeYes, with recovery codesNoYes
Admin shell with navigationYes, config-drivenNoNo
Users listYesNoNo
Optional modulesSevenNoTeams, API tokens
StackLivewire 3 + Volt, Tailwind v4Blade, Livewire, React or VueLivewire or Inertia
Re-runnable installerYes, update modeNoNo
Health checkui-kit:doctorNoNo

Breeze is the smaller choice when you only need auth pages and will build the rest yourself. Jetstream is the choice when you need teams or API tokens. The kit is the choice when the app has an admin side from day one.

The fresh-app rule

The kit publishes routes/auth.php, app/Livewire/Forms/LoginForm.php and resources/views/livewire/pages/auth/*. Breeze publishes files with the same names, and Jetstream registers the same routes. Two sets of auth routes and two login forms in one app is not a merge anyone wants to do, so the installer looks before it writes.

The preflight check

Before publishing anything, ui-kit:install reads composer.lock for laravel/breeze and laravel/jetstream and scans for colliding files: routes/auth.php, app/Livewire/Forms/LoginForm.php and the login view. Then:

It findsIt does
NothingContinues.
A previous kit install, recognised by the ui-kit:managed header in routes/auth.phpSwitches to update mode. Existing files are kept unless you pass --force, and the run stays non-interactive.
JetstreamAborts with Jetstream detected (laravel/jetstream is installed). There is no clean migration path; start from a fresh app. --force overrides, and is not recommended.
Breeze, or stray auth filesWarns, lists the collisions, and asks Continue anyway?. Without --force colliding files are left untouched, which gives you a mixed UI.
Collisions while running with --no-interactionAborts unless --force is set, so CI never half-installs.

If you must install into an app that has Breeze, remove it first:

composer remove laravel/breeze
rm -rf app/Http/Controllers/Auth resources/views/auth routes/auth.php
rm -f app/Livewire/Forms/LoginForm.php app/Livewire/Actions/Logout.php
rm -rf resources/views/livewire/pages/auth resources/views/components/{input-error,input-label,primary-button,text-input}.blade.php

Then run the installer as on a fresh app.

How it is tested

Every push runs the unit suite on PHP 8.2, 8.3 and 8.4 against Laravel 12, plus an experimental Laravel 13 leg, and a separate job that creates a real fresh Laravel 12 app, installs the kit from the local checkout with every module, asserts the user trait was applied, builds the frontend, caches routes, runs the doctor, promotes a user with make-admin, and smoke-tests the HTTP pages. That job exists because v0.1 shipped without one and never survived a real install; the changelog records the reset.

Was this page helpful?