ezehky / ezehstart
A Laravel 13 + Livewire 4 starter kit with the batteries a project actually needs on day one — and a written house style that keeps everything added after day one looking like it was there from the start.
Requires
- php: ^8.3
- jenssegers/agent: ^2.6
- laravel/framework: ^13.17
- laravel/tinker: ^3.0
- livewire/blaze: ^1.0
- livewire/flux: ^2.15
- livewire/livewire: ^4.1
Requires (Dev)
- fakerphp/faker: ^1.24
- larastan/larastan: ^3.9
- laravel/boost: ^2.2
- laravel/pail: ^1.2.5
- laravel/pao: ^1.0.6
- laravel/pint: ^1.27
- laravel/sail: ^1.53
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.9.3
- pestphp/pest: ^5.1
- pestphp/pest-plugin-laravel: ^5.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
A Laravel 13 + Livewire 4 starter kit with the batteries a project actually needs on day one, and a written house style that keeps everything added after day one looking like it was there from the start.
What ships
Authentication — password sign-in, registration, password reset, email verification by six-digit code, and a passwordless flow that both registers and signs in from an emailed code (throttled, attempt-limited, hashed at rest).
Roles and workspaces — a Role/UserRole pivot with active/inactive assignments, so
revoking a role keeps the history. Two workspaces behind their own middleware:
| Workspace | URL prefix | Route name | Route file |
|---|---|---|---|
| Admin | /app-splash |
admin. |
routes/admin.php |
| Member | /app |
user. |
routes/user.php |
| Public + auth | / |
(none) | routes/web.php |
Admin workspace — dashboard with live metrics and a "waiting on you" queue, admin and member listings with search and filters, an unassigned-accounts listing, a roles page, a searchable activity log, a single-account view, and a manage-roles modal with guards (you cannot revoke your own admin role, or the last one).
Member workspace — dashboard with a next-steps checklist, profile, preferences, security settings, and account deletion that anonymises rather than destroys when there is history worth keeping.
Cross-cutting — an audit trail that records what changed and what it changed from, database notifications with a bell menu, and a site configuration editable from the admin rather than from a deploy.
Getting started
composer setup # install, key, migrate, npm install, npm run build composer dev # server + queue + vite together
Then seed the roles, the site configuration, and an admin:
php artisan db:seed
That creates admin@example.test / password. Change it in
database/seeders/UserSeeder.php before this becomes a real project.
Working on it
php artisan test --compact # the suite php artisan test --compact --filter=X # one file or one test vendor/bin/pint --dirty # after touching any PHP vendor/bin/phpstan analyse --memory-limit=1G composer test # all three, as CI runs them
The house style
This kit is opinionated, and the opinions are written down in .agents/my-skills/ —
44 files covering where code goes, how it is named, and what this project deliberately
does not use. Start at agent.md, finish at
checklist.md, and use
README.md as the index.
AI agents get the same rules automatically: CLAUDE.md orients a session,
AGENTS.md carries the Laravel Boost guidelines, and the house-style
skill in .claude/skills/ (mirrored to .agents/ and .github/) routes into the
library on its own.
The short version:
- Every screen is a Livewire single-file component at
resources/views/pages/**/⚡name.blade.php, routed withRoute::livewire(). There is noapp/Livewire, and norender()method. - Every status is an enum using
WithEnumHelpers, with oneis{CASE}()per case. - Every model is
#[Unguarded]with acasts()method and#[Scope]scopes. - Business logic lives in a
#[Singleton]service, resolved withapp(). - Every admin write is logged through
ActivityLogService. - There is no
app/Actions,app/Repositories,app/Jobs,app/Events,app/Policies, orapp/Http/Requests— each has a file in the library explaining what this project does instead.
Stack
Laravel 13 · PHP 8.3+ · Livewire 4 · Flux UI free v2 · Tailwind v4 · Alpine · Pest 5 · Pint · Larastan.
Adding a third workspace
Three files and two match arms:
app/Http/Middleware/{Role}Middleware.php— a copy ofUserMiddlewarewith the new enum case.routes/{role}.php.- A route group in
bootstrap/app.php. - The case in
UserRoleEnum, then thematchinUserService::middlewareGeneralCheck()and the branch inWithAuthWorker::userDashboardRedirect(). Both are exhaustive, so PHP will tell you if you miss one.