Project Documentation
This document gives the high-level map of the starter kit after installation. It is a Laravel 13 admin-first starter application with Inertia.js v3, Vue 3.5, Passport API authentication, Fortify web auth flows, and a package-backed UI toolkit.
Backend Areas
app/Domain/for the business logic that is scaffolded into your app; the runtime layer of vendor-managed domains lives in the package undersrc/Domain/(Lvntr\StarterKit\Domain\)app/Http/Controllers/for web and API entry pointsapp/Http/Responses/for API response shapingapp/Models/for Eloquent modelsapp/Providers/for app, domain, settings, and Fortify bootstrappingroutes/web*androutes/api*for modular route loading
Main Domain Modules
Surface ownership is split per module — Models always stay app-owned; the rest of the surface depends on the module. The domain runtime and HTTP/Vue surface split by module:
Authis fully app-side (app/Domain/Auth)UserandRoleare scaffolded into the app (controllers, FormRequests, Vue) but keep only the app-ownedBulkActionsslice underapp/Domain/...; the core domain runtime is vendor-residentSetting,ApiRoute,Logs,ActivityLog, andFilesare vendor-first: their controllers, FormRequests, and Vue pages all run from the package (only their Models stay inapp/). Runsk:eject <Module>to pull them into the app — see the Module Ownership table in the README
Vendor-resident runtime domains (src/Domain/, Lvntr\StarterKit\Domain\) — Actions, DTOs, Queries, Events, Listeners, and Services for these modules run from the package and are not copied into your app on a fresh install. App\Domain\<Module>\... imports stay working through class_alias; a local app/Domain/<Module>/ copy from an eject or older install takes precedence:
ActivityLogApiClientApiRouteFileManagerLogsMediaRoleSessionSettingSharedUser
See ddd.md for the full vendor-resident model and reconcile steps.
Typical Request Flow
- Route resolves to a thin controller.
- Validation is handled by a Form Request when needed.
- Payload is mapped into a DTO where the feature uses DTOs.
- Business logic lives in Action classes — under
app/Domain/.../Actionsfor scaffolded domains, orsrc/Domain/.../Actions(vendor namespace) for vendor-resident ones. - Query classes prepare listing and filter data when needed.
- Responses are returned through Inertia or
to_api().
Domain Events
Kit-provided audit event/listener pairs for vendor-resident User, Role, and Logs runtime are registered in StarterKitServiceProvider::registerEventListeners() with vendor FQCNs:
UserCreated -> LogUserCreatedUserUpdated -> LogUserUpdatedUserDeleted -> LogUserDeletedRoleCreated -> LogRoleCreatedRoleUpdated -> LogRoleUpdatedRoleDeleted -> LogRoleDeletedLogFilesDeleted -> LogActivityForLogFilesDeleted
The scaffolded app/Providers/DomainServiceProvider.php is left for your own application events. sk:eject can add bindings there when you copy a kit domain back into app/Domain/.
Frontend Areas
resources/js/pages/for Inertia pagesresources/js/layouts/for shared layoutsresources/js/components/Lvntr-Starter-Kit/for reusable starter-kit componentsresources/js/composables/for client-side behaviorsresources/js/routes/andresources/js/actions/for Wayfinder-generated helpers
Inertia Pages
Pages live under resources/js/pages/. Examples:
resources/js/pages/Admin/Usersresources/js/pages/Admin/Rolesresources/js/pages/Admin/Settingsresources/js/pages/Admin/ApiRoutesresources/js/pages/Admin/Filesresources/js/pages/Admin/Logsresources/js/pages/Profile
Reusable UI Toolkit
The admin panel uses shared UI building blocks exposed through the @lvntr/* alias. Examples:
@lvntr/components/DatatableBuilder/core@lvntr/components/FormBuilder/core@lvntr/components/TabBuilder/core@lvntr/components/ui/AppDialog.vue
Request Patterns
- browser pages use Inertia
- JSON endpoints use
to_api()andApiResponse - list-heavy admin screens use datatable query classes
- settings and other writes should flow through Form Requests and Actions
Authentication Runtime
- Fortify renders the browser auth screens through Inertia pages under
resources/js/pages/Auth - the login pipeline includes rate limiting, Turnstile validation, inactive-user blocking, and optional two-factor redirection
- Passport handles
/api/v1/auth/*personal-access-token flows for API consumers
Routing Strategy
Route files are split by feature. routes/web.php loads files from routes/web/, and routes/api.php loads files from routes/api/.
- public routes are loaded first
- authenticated routes are grouped under
authandverified - permission-protected route files are wrapped with
check.permission - API routes are grouped under
/api/v1with throttle andauth:apirules
Service Routes for the Frontend
routes/web/service-route.php is loaded inside the authenticated web group:
GET /definitionspowersuseDefinition()and builder-driven option loadingGET /roles/optionsprovides select options for admin forms and filters
Public Helper Routes
routes/web/public-route.php holds lightweight public helper routes:
POST /localeupdates the active interface language in session
Feature-Specific Admin Routes
Some admin screens are isolated into dedicated route files:
routes/web/developer-route.phploads theapi-routes.*screenroutes/web/files-route.phpopens the global file manager asfiles.indexroutes/web/log-route.phpexposes the system-admin log viewer atlogs.*routes/web/profile-route.phpcontains profile, avatar, and browser-session endpoints
Shared Building Blocks
- helpers from
app/Helpers/sk-helpers.phpandapp/Helpers/custom.php ApiExceptionandApiExceptionHandler- permission middleware (
check.permission) - security headers middleware
- definitions system
Global Overlays in AdminLayout
AdminLayout.vue renders the shared overlays once:
ConfirmDialogComponentToastComponentAppDialogImageLightbox
Definitions
The current UI favors database-backed definitions over a separate enum-sharing layer.
_02_DefinitionSeeder.phpseeds keys such asuserStatus,gender,identityType, andyesNoDefinitionService(vendor-residentLvntr\StarterKit\Domain\Shared\Services\, reachable via theApp\Domain\Shared\Services\DefinitionServicealias) groups and caches definition items per localeuseDefinition()reads them fromGET /definitions- definition records carry label, severity, and optional icon metadata
SkDatatableandSkFormcan bind directly to definition keys such as.tag('definition').tagKey('userStatus')and.definitionOptions('gender')SkDatatablerenders definition tags through PrimeVue's<Tag>, so DB-driven metadata can be combined with column-levelcolors(),icons(), and tag style helpers
Flash Messages
Controllers redirect with flash messages, and AdminLayout.vue turns them into PrimeVue toasts.
Local Composables
Project-specific composables live under resources/js/composables/. The admin sidebar keeps menu definitions in useAdminMenu() and shares filtering / active-state logic through useMenuBuilder().
Suggested Reading
Getting started
- welcome.md — what the kit is and what ships inside it
- project-info.md — stack and high-level project overview
- install.md — installation flow
- update.md — pulling updated stubs (hash-tracked)
- UPGRADE.md — version upgrade notes
Backend & DDD
- ddd.md — domain layout and the vendor-resident model
- auth.md — Fortify (web) + Passport (API) authentication
- roles-permissions.md — permission resources and seeding
- api.md — API response envelope and conventions
- api-clients.md — Passport clients & token management
- api-routes.md — API route inventory screen
- module-routes.md — modular route registry
- definitions.md — shared label/value lookups
- settings.md — application settings module
- activity-logs.md — audit/activity logging
- logs.md — application log viewer
Frontend & UI builders
- formbuilder.md — FormBuilder (FB)
- datatable.md — DatatableBuilder (DB)
- tabs.md — TabBuilder (TB)
- composables.md — Vue composables
- admin-components.md — admin page style guide
- ui-components.md — reusable UI primitives
- theme.md — theme system
- wayfinder.md — type-safe route helpers
Features
- file-manager.md — file manager
- files.md — file uploads
- i18n.md — internationalization
- translatable-fields.md — multi-language model fields
Tooling
- artisan-commands.md —
sk:*command reference - claude-skills.md — shipped Claude Code skills