| Install | |
|---|---|
composer require lvntr/starter-kit |
|
| Latest Version: | v12.0.4 |
| PHP: | ^8.2 |
A full-featured Laravel admin panel package built with Laravel 12, Inertia.js v2, Vue 3, PrimeVue 4, and Tailwind CSS 4. Follows DDD (Domain-Driven Design) architecture with built-in role-based permissions, activity logging, settings management, and more.
make:sk-domain command generates full DDD stack interactively| Package | Purpose |
|---|---|
| Laravel 12 | Core framework |
| Inertia.js v2 | Server-driven SPA — no API layer needed between backend and frontend |
| Laravel Fortify | Authentication backend (login, register, 2FA, password reset) |
| Laravel Passport | OAuth2 API authentication (personal access tokens, device authorization) |
| Laravel Wayfinder | Type-safe route generation for TypeScript |
| Spatie Permission | Role & permission management with dynamic resource-scoped permissions |
| Spatie Activity Log | Model activity logging with browsable admin interface |
| Spatie Media Library | File uploads & media collections (avatars, attachments) |
| Spatie Query Builder | Filter, sort, and include relationships via query string |
| Spatie Translatable | Multi-language model attributes (JSON-based) |
| Package | Purpose |
|---|---|
| Vue 3 | Reactive UI framework |
| PrimeVue 4 | UI component library (DataTable, Dialog, Toast, Menu, etc.) |
| Tailwind CSS 4 | Utility-first CSS framework |
| Inertia.js Vue 3 | Client-side adapter for Inertia SPA |
| VueUse | Collection of Vue composition utilities |
| laravel-vue-i18n | Use Laravel translation files directly in Vue |
| Tool | Purpose |
|---|---|
| Vite | Frontend build tool with HMR |
| TypeScript | Type safety for frontend code |
| ESLint + Prettier | Code linting and formatting |
| Vitest | Unit testing for Vue components |
| Husky + lint-staged | Pre-commit hooks for code quality |
| Commitizen | Conventional commit messages |
composer require lvntr/starter-kit
php artisan sk:install
This interactive wizard will:
Non-interactive mode (CI/CD):
php artisan sk:install --no-interaction
Overwrite existing files:
php artisan sk:install --force
.envAPP_NAME="My Application"
APP_URL=https://my-app.test
DB_CONNECTION=mysql
DB_DATABASE=my_app
DB_USERNAME=root
DB_PASSWORD=
Open your browser and navigate to your app URL. Log in with the admin credentials shown after installation (default: admin@demo.com / password).
When a new version of the package is released:
composer update lvntr/starter-kit
php artisan sk:update
The update command uses a hash-based tracking system to safely update files:
Preview changes before applying:
php artisan sk:update --dry-run
Force update everything (overwrites your changes):
php artisan sk:update --force
The package keeps Vue components, language files, and config inside the package by default. If you need to customize them, publish them to your project:
# Interactive selection
php artisan sk:publish
# Publish Vue components (FormBuilder, DatatableBuilder, etc.)
php artisan sk:publish --tag=components
# Publish language files
php artisan sk:publish --tag=lang
# Publish config file
php artisan sk:publish --tag=config
| Command | Description |
|---|---|
sk:install |
Full installation wizard |
sk:update |
Update package files preserving user changes |
sk:publish |
Publish optional assets for customization |
make:sk-domain |
Scaffold a complete DDD domain interactively |
remove:sk-domain |
Remove a domain and all its files |
env:sync |
Sync .env keys to .env.example |
Create a new domain with all DDD layers:
# Interactive mode
php artisan make:sk-domain
# With options
php artisan make:sk-domain Product --fields="name:string,price:decimal" --admin --api --events --vue=full
This generates: Model, Migration, Factory, DTO, Actions, Events, Listeners, Controllers, FormRequests, Routes, and Vue pages.
Remove a domain:
php artisan remove:sk-domain Product
lvntr/starter-kit/
├── src/ # Core package code (never published)
│ ├── StarterKitServiceProvider.php
│ ├── Console/Commands/ # sk:install, sk:update, make:sk-domain, etc.
│ ├── Domain/Shared/ # BaseAction, BaseDTO, ActionPipeline
│ ├── Enums/ # PermissionEnum, HasDefinition, EnumRegistry
│ ├── Http/Middleware/ # CheckResourcePermission, SecurityHeaders
│ ├── Http/Responses/ # ApiResponse builder
│ ├── Traits/ # HasActivityLogging, HasEnumAccessors, HasMediaCollections
│ └── helpers.php # to_api(), format_date()
├── resources/
│ ├── js/components/ # Vue components (optionally publishable)
│ └── lang/ # Translation files (optionally publishable)
├── stubs/ # Published to app on install
│ ├── app/ # Controllers, Models, Domain, Providers, Enums
│ ├── config/ # permission-resources.php, settings.php
│ ├── database/ # Migrations, Seeders, Factories
│ ├── routes/ # Web & API routes
│ ├── resources/js/ # Vue pages, Layouts, Composables, Theme
│ └── bootstrap/ # app.php, providers.php
└── config/
└── starter-kit.php # Package configuration
app/
├── Domain/ # DDD business logic
│ ├── User/ # Actions, DTOs, Queries, Events, Listeners
│ ├── Role/
│ ├── Auth/
│ ├── Setting/
│ ├── ActivityLog/
│ └── Shared/ # Base classes (updated by package)
├── Http/
│ ├── Controllers/Admin/ # Admin panel controllers
│ ├── Controllers/Api/ # REST API controllers
│ └── Middleware/
├── Models/
├── Enums/
└── Providers/
| File Category | Behavior on sk:update |
|---|---|
Domain/Shared/, Traits, Middleware, helpers |
Always updated |
| Controllers, Models, Pages, Routes | Updated only if user hasn't modified them |
| User's custom domains | Never touched |
| New files from package | Automatically added |
Components are auto-resolved from the package. Use them in your Vue files:
<template>
<SkForm :form="form" :builder="formBuilder" />
<SkDatatable :builder="tableBuilder" />
<SkTabs :builder="tabBuilder" />
</template>
// From package namespace
__('starter-kit::admin.menu.dashboard')
__('starter-kit::message.created')
use Lvntr\StarterKit\Domain\Shared\Actions\BaseAction;
use Lvntr\StarterKit\Domain\Shared\DTOs\BaseDTO;
use Lvntr\StarterKit\Enums\PermissionEnum;
use Lvntr\StarterKit\Traits\HasActivityLogging;
MIT