nunomaduro/laravel-starter-kit
A minimal, opinionated Laravel starter kit that provides a clean foundation with Pest, Laravel Pint, PHPStan, and GitHub Actions preconfigured. Skip boilerplate setup and start building your next Laravel app faster.
Architecture fit. This is not a Composer library — it is a project skeleton. dependents: 0 is the tell: nothing requires it, because you consume it by scaffolding (laravel new, composer create-project, or repo-template clone) and then own the result outright. That reframes the whole evaluation: the artifact under assessment is a golden-path baseline, not a dependency. Its opinionated shape is PHP 8.5 + Laravel 13 + Larastan v3 (max strictness) + Rector v2 + Pint v1 + Pest v5/PHPUnit 13 + Tailwind v4 + Laravel Boost v2 MCP, plus in-repo AGENTS.md / .cursor/rules agent guidance. That last part is the genuine differentiator — it ships machine-readable conventions alongside the code style, which is what most internal starter kits fail to do.
What v1.9.0 changes. Not much structurally, but three data points are worth recording. (1) The release notes describe CI behaviour, which confirms the skeleton ships a GitHub Actions pipeline in-repo — this partially resolves the highest-priority open question below, though not whether it gates merges or merely runs. (2) Rector and PHPStan caches moved from system /tmp to a project-relative tmp/ folder — minor in isolation, but it is the correct call for containerized runners with read-only or ephemeral filesystems, and it makes cache persistence/cleanup the project's own problem rather than the host's. (3) Dependency floors moved to Laravel ^13.33.0 and Boost ^2.10.0, and Actions pins moved to checkout@v7 / cache@v6 / upload-artifact@v7. There are no breaking changes, no deprecations, and no new capability. Treat v1.9.0 as maintenance evidence rather than a re-evaluation trigger — the architectural verdict is unchanged.
Integration feasibility. Greenfield: high — it is exactly the intended use case. Brownfield: low-to-moderate — you would be cherry-picking phpstan.neon, rector.php, pint.json, Pest bootstrap, and CI workflows into an existing app, one at a time. There is no upgrade path, no changelog contract, and no way to pull improvements without a manual diff. v1.9.0 is a clean illustration of this cost: the cache-path fix is exactly the kind of small quality-of-life change you cannot receive via composer update, only by diffing and porting by hand.
Technical risk.
^13.33.0, so any service scaffolded earlier sits below the current baseline until it is re-scaffolded or manually bumped.laravel/mcp v0 and laravel/prompts v0 carry no backward-compatibility guarantee; they are load-bearing for the Boost/agent workflow. Boost is now floored at ^2.10.0, which is a wider blast radius than before.Key questions.
tmp/ caches live relative to .gitignore and .dockerignore, and do the shipped CI cache keys cover them? A mis-scoped cache directory is a silent, slow CI regression.Stack fit. Strong for teams already on Laravel 12/13 with a GitHub Actions or GitLab CI pipeline, container-based deploys, and any existing AI-assisted development practice — the shipped AGENTS.md and Cursor rules mean the kit encodes conventions for both humans and agents, which most internal standards docs do not. Weak fit for teams on shared hosting, on PHP 8.2/8.3, or with a large legacy Laravel app they cannot re-scaffold.
Migration path — two distinct lanes.
--dry-run only → Larastan with a generated baseline → ratchet level directory-by-directory. Adopt the project-relative cache setting from v1.9.0 when you do port Rector/PHPStan — it is a two-line change and a real CI win. Copy the agent rule files verbatim and then correct them against your actual pinned versions. Never port the app structure.Compatibility. Validate before committing: PHP 8.5 availability on the target runtime and in CI images; availability of required extensions; whether any existing first-party or vendor packages declare a Laravel 13 constraint ceiling; and whether the ^13.33.0 / ^2.10.0 floors are satisfiable against your current lockfile and any private registry mirrors. Note the internal contradiction on PHPUnit (v13 vs v12) and frontend tooling (npm vs bun) — resolve it explicitly and pin, rather than inheriting the ambiguity. The Actions bumps to checkout@v7 / cache@v6 / upload-artifact@v7 assume GitHub-hosted runner compatibility; if you are on self-hosted or GitLab, that whole workflow file is a reference document, not something you port.
Sequencing.
tmp/ caches are ignored by git and docker contexts.composer.lock and the project-relative cache path, and a separate fast lint job from the slow analysis job.AGENTS.md from actual composer.lock versions on a schedule.Maintenance. Fork-and-own, not dependency-managed. There is no composer update that improves the skeleton; upstream improvements arrive only if someone diffs the repo and ports them. Budget a recurring, low-frequency owner task (quarterly diff against upstream, version-matrix refresh, agent-rule regeneration). v1.9.0 is a useful calibration of that task's size: a cache-path change plus version bumps is roughly a 30–60 minute port for a single service, so a three-to-five service footprint is a half-day of work per upstream release. The compensating benefit is real: because it is not a dependency, it introduces zero transitive supply-chain risk into composer.json.
Support. Community/author-maintained, no apparent LTS, no guaranteed security policy, no dependents to seed ecosystem answers. Assume full internal ownership from day one, including a named maintainer for the template. If the kit breaks against a Laravel point release, you fix it — there is no upstream SLA to escalate to. Release cadence now looks healthy (active enough to keep Actions and dependency floors current), which is reassuring about abandonment but should not be confused with a support commitment.
Scaling. Scales well as an organizational golden path: one template, N services, uniform quality gates, and agent guidance embedded per-repo. The cost center is CI: max-level Larastan plus Rector plus Pest 5 on every PR is materially slower than a default Laravel pipeline. Mitigate with path filtering, incremental analysis caches (now project-local, which makes them easier to persist and to invalidate), a parallel job graph, and nightly full runs rather than blocking every PR on the complete suite. Expect the strictness to also raise PR cycle time and review depth — a throughput tradeoff that should be an explicit, sponsor-approved decision, not a side effect.
Failure modes.
@phpstan-ignore widely, silently eroding the guarantee the kit exists to provide.laravel/mcp or laravel/prompts releases a breaking change; the agent/Boost workflow degrades with no obvious symptom until someone relies on it. The ^2.10.0 Boost floor widens exposure here.^13.33.0 floor raises the minimum bar for every new scaffold.tmp/ caches committed to git or copied into Docker build contexts bloat images and can produce stale analysis results across builds. Worth a one-line check in the template.Ramp-up. Non-trivial. Engineers without prior exposure to max-level static analysis, PHPDoc array-shape typing, generics, Pest 5 idioms, and Rector will need a guided spike — realistically 1–2 days of pairing per engineer, plus a documented "how to satisfy the analyzer" runbook, before the gates are net-positive. Track a small set of leading indicators through the first two months: analysis failure volume per PR, baseline entry count, CI wall-clock time, and PR time-to-merge versus the pre-adoption baseline. If analysis failures are not trending down by week six, the strictness level is set wrong for the team and should be ratcheted, not abandoned.
Recommendation. Unchanged by v1.9.0. Pilot on one greenfield service with a named owner and a hard PHP 8.5 runtime confirmation up front; adopt the tooling and agent-rule artifacts (including the project-relative cache setting) into existing services selectively; do not treat the skeleton as a package, a dependency, or an upgrade-managed asset. Baseline the internal template on v1.9.0 and re-run this assessment only when a release note contains "breaking," a major version bump, or a change to the toolchain matrix.
How can I help you explore Laravel packages today?