Open-Source Wikis

/

Laravel

/

How to contribute

/

Tooling

laravel/laravel

Tooling

The skeleton's tooling surface is small but opinionated. This page lists every tool the repo references, what it does, and how it's wired in.

PHP toolchain

Composer

The PHP package manager. composer.json declares both the runtime require (php ^8.3, laravel/framework ^13.7, laravel/tinker ^3.0) and a dev require list:

Dev package Purpose
fakerphp/faker Faker library for database/factories/UserFactory.php
laravel/pail Live log tailer — php artisan pail
laravel/pao Recently added — see CHANGELOG.md v13.4.0
laravel/pint Code style fixer (Laravel preset)
mockery/mockery Mocking library used by tests
nunomaduro/collision Pretty exception output for the CLI
phpunit/phpunit Test runner

composer.json also defines the named scripts that contributors run:

"scripts": {
    "setup": [...],
    "dev": ["Composer\\Config::disableProcessTimeout", "npx concurrently ..."],
    "test": ["@php artisan config:clear --ansi @no_additional_args", "@php artisan test"],
    "post-autoload-dump": ["...", "@php artisan package:discover --ansi"],
    "post-update-cmd": ["@php artisan vendor:publish --tag=laravel-assets --ansi --force"],
    "post-root-package-install": ["...copy .env.example..."],
    "post-create-project-cmd": ["...key:generate, touch sqlite, migrate..."],
    "pre-package-uninstall": ["..."]
}

The Composer\\Config::disableProcessTimeout token in dev is a special Composer directive that disables the default 5-minute script timeout (otherwise the concurrently invocation would be killed mid-development).

Artisan

The framework's CLI. artisan is the entry-point script:

php artisan list                  # all commands
php artisan help <command>        # help for one
php artisan --version             # framework version

Important built-in commands the skeleton uses:

Command Used by / for
serve composer dev — runs PHP's built-in server
key:generate composer setup, post-create-project-cmd
migrate, migrate:fresh, migrate:rollback DB schema management
db:seed Run database/seeders/DatabaseSeeder
queue:listen, queue:work, queue:retry, queue:flush Queue worker control
pail composer dev — log tailer
tinker REPL
config:clear, config:cache Manage bootstrap/cache/config.php
route:list, route:cache, route:clear Routing introspection / caching
view:clear, view:cache Manage storage/framework/views/
optimize, optimize:clear Bulk cache / clear
vendor:publish Publish package assets/configs
package:discover Detect auto-discovered providers/aliases

Pint

Code style fixer, distributed by Laravel. The repo's preset is configured by .styleci.yml:

php:
  preset: laravel
  disabled:
    - no_unused_imports
  finder:
    not-name:
      - index.php
js: true
css: true

Run it:

vendor/bin/pint                  # fix everything
vendor/bin/pint --test           # check only, exit non-zero on violations
vendor/bin/pint --dirty          # only files modified vs the working tree
vendor/bin/pint app/             # path-scoped

There's no pre-commit hook bundled — running it before pushing is on you.

Pail

Real-time log tailer. Lives in composer.json requires-dev. Runs in the composer dev script alongside the web server, queue listener, and Vite. Reads from storage/logs/laravel.log (or whatever channel is active per config/logging.php).

php artisan pail
php artisan pail --level=error
php artisan pail --filter=User
php artisan pail --auth=42        # filter to a specific authenticated user

Tinker

REPL for the booted application:

php artisan tinker

laravel/tinker is a runtime requirement (not dev-only), so it's available in every environment. Don't ship code that depends on it — it's a tool, not a library.

Collision

nunomaduro/collision formats unhandled CLI exceptions. You don't invoke it directly — it's wired in by Laravel's exception handler whenever the app runs in CLI mode.

Frontend toolchain

Vite 8

Frontend dev server and build tool. Config in vite.config.js:

plugins: [
    laravel({
        input: ['resources/css/app.css', 'resources/js/app.js'],
        refresh: true,
        fonts: [bunny('Instrument Sans', { weights: [400, 500, 600] })],
    }),
    tailwindcss(),
],
server: {
    watch: {
        ignored: ['**/storage/framework/views/**'],
    },
},
Plugin Purpose
laravel-vite-plugin Maps Blade's @vite directive to dev/built asset URLs
laravel-vite-plugin/fonts/bunny Pulls Instrument Sans from fonts.bunny.net at build time
@tailwindcss/vite Tailwind v4 (no PostCSS, no separate config — pure plugin)
npm run dev       # vite dev server with HMR; writes public/hot
npm run build     # production build → public/build/

Tailwind v4

Entry imported in resources/css/app.css:

@import 'tailwindcss';

No tailwind.config.js — v4 reads everything from CSS via @source and @theme directives. The skeleton sets one custom theme variable (--font-sans) and four @source globs.

npm

.npmrc is short but opinionated:

ignore-scripts=true
audit=true

Both flags are security postures (added 2026-04-01 and 2026-04-15 respectively). package.json declares "type": "module", two dev scripts (build and dev), and zero runtime dependencies — only devDependencies.

CI / automation

.github/workflows/tests.yml

Runs php artisan test against PHP 8.3, 8.4, and 8.5 on every push and pull request. The matrix is short and the steps are explicit:

strategy:
  fail-fast: true
  matrix:
    php: [8.3, 8.4, 8.5]

.github/workflows/issues.yml

Triggers on issues: types: [labeled]. Delegates to laravel/.github/.github/workflows/issues.yml@main — the actual policy lives in laravel/.github, not here.

.github/workflows/pull-requests.yml

Triggers on pull_request_target: types: [opened]. Delegates to the same laravel/.github reusable workflow.

.github/workflows/update-changelog.yml

Triggers on release: types: [released]. After a tagged release, the workflow regenerates CHANGELOG.md and commits the update via github-actions[bot].

File-format tools

EditorConfig

.editorconfig enforces 4-space PHP indentation, 2-space YAML indentation, LF line endings, UTF-8 charset, and trailing-whitespace stripping (except for Markdown). Most editors auto-pick it up.

Git attributes

.gitattributes enforces LF line endings (* text=auto eol=lf), declares language-specific diffs (*.php diff=php, *.blade.php diff=html, *.md diff=markdown, *.css diff=css, *.html diff=html), and excludes .github/, CHANGELOG.md, and .styleci.yml from composer archive exports.

What is not here

The skeleton intentionally omits:

  • No PHPStan / Psalm / static analysis by default. Add phpstan/phpstan in dev if you want it.
  • No Husky / lint-staged / pre-commit hooks. Style and tests are runtime/CI checks.
  • No Pest (yet). The bundled test runner is PHPUnit. The PR history shows the team is happy to add Pest if a contributor proposes it correctly, but the default remains PHPUnit.
  • No Docker / docker-compose. Laravel Sail (laravel/sail) is a separate package that gets pulled in optionally — it isn't a default dependency in this skeleton.
  • No Telescope / Pulse / Horizon. All three are first-party Laravel packages but they're add-ons, not skeleton defaults. The phpunit.xml <env> block proactively disables them so they don't break tests if you install them later.

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

Tooling – Laravel wiki | Factory