n1crack/laravel-starter-kit
Laravel Starter Kit
A Laravel kit that asks what you are building and installs only that.
Requirements
PHP 8.4 · Node 22
Getting started
laravel new my-app --using=n1crack/laravel-starter-kit
cd my-app
composer dev
The install asks four things:
How should the public pages be rendered? Blade + Livewire / React (Inertia)
Would you like to add teams support? yes / no
Would you like to add multi-tenancy? yes / no
Which database will your application use? SQLite / MySQL / MariaDB / PostgreSQL / SQL Server
Answering yes to multi-tenancy asks two more: which domains serve the application itself, and what tenant database names should be prefixed with.
composer dev runs the server, queue worker, log viewer and Vite together.
To load demo data — an admin@example.com account plus 25 users, all with the password password:
php artisan db:seed
What's inside
- Laravel 13, Inertia 3, React 19, Tailwind 4
- Authentication via Fortify: registration, login, password reset, email verification, two-factor
- Roles via spatie/laravel-permission, with an
/adminarea behindrole:admin - Typed routes generated by Wayfinder
- Pest, PHPStan, Pint, Rector, oxlint and Prettier, wired into CI
The admin and user panels are always React. The public-page question only covers the public pages, so nothing in the kit has to exist twice.
Teams
Answering yes adds teams with membership roles (owner, administrator, member),
email invitations, member management, team deletion and a switcher in the
sidebar. Team roles live on the team_user pivot; the application-wide
admin and user roles stay with spatie and are unaffected.
Multi-tenancy
Answering yes installs stancl/tenancy and turns the kit into a tenant-facing application: one database per tenant, resolved from the request domain or subdomain.
Everything the kit ships becomes tenant-owned. Its migrations move under
database/migrations/tenant and its routes move into routes/tenant.php;
the central database is left holding only tenants and domains. There is no
central login — authentication happens on a tenant domain.
Run Composer once afterwards, since the package is only added when asked:
composer update
php artisan migrate # central: tenants and domains
php artisan tenants:create acme --seed
tenants:create makes the tenant, its database, and its first domain, then
migrates it. --seed adds the demo users; leave it off for a real tenant.
The tenant is then served at acme.your-central-domain.
After adding a migration under database/migrations/tenant, apply it to
tenants that already exist:
php artisan tenants:migrate
What is shared and what is not
| Where it lives | Why | |
|---|---|---|
| Users, sessions, roles, teams, your tables | Tenant | Nothing about them is shared |
| Cache | Tenant | Isolated by the connection, not by cache tags — the default database store cannot tag |
| Queue tables | Central | One queue:work serves every tenant; each job is restored to its own tenant |
| Tenants, domains | Central | The registry the request is resolved against |
The cache, session, rate limiter and auth guard are all rebuilt when tenancy
switches. Each is resolved once and then held, so without that a tenant would
read another's rows — and the rate limiter, which guards signing in, would
reach for a cache table the central database does not have.
Tenants themselves are expected to be administered by a separate application.
tenants:create exists so the kit can be run locally.
Layout
| Path | Contents |
|---|---|
routes/web.php |
Public pages and authenticated user settings |
routes/admin.php |
Admin area (auth, verified, role:admin) |
routes/tenant.php |
Tenancy only: wraps the above in tenant identification |
resources/views |
Blade pages and Livewire components |
resources/js/pages |
Inertia React pages |
stubs/ |
The optional features, published by the installer |
Commands
composer dev # server, queue, logs and Vite
composer test # type coverage, unit tests, linting, static analysis
composer lint # Rector, Pint and oxlint, applying fixes
The test suite enforces 100% code coverage and 100% type coverage.
Nothing under stubs/ is covered by those, because the linters only see a
working application. CI therefore installs every combination of answers into a
clean checkout and runs Pint, Rector, PHPStan, type coverage and the test
suite against the result.
License
MIT
Related Packages
Servicio Linea Once starter kit for Laravel, Inertia, Vue, React, MUI, PrimeVue,...
EvoLayer Base starter — the Laravel React Inertia starter kit with the EvoLayer...
Domion - Professional Architecture for Laravel with Automated Frontend & Auth In...
Scaffold Laravel resources for Inertia (Vue/React) or Blade (migration, model, c...
A comprehensive Laravel starter kit with Inertia.js, React, module-based archite...