PHPackages                             igne-agency/laravel-boot-up - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [DevOps &amp; Deployment](/categories/devops)
4. /
5. igne-agency/laravel-boot-up

ActiveLibrary[DevOps &amp; Deployment](/categories/devops)

igne-agency/laravel-boot-up
===========================

Boot a Laravel project on any machine with one command: app:serve installs missing tools (PHP, Node, Composer, Herd, Docker), creates .env, sets up the database, runs migrations, builds assets, starts a queue worker and serves via Herd, Sail or artisan serve; app:down cleanly stops everything it started. Also exports deployment scripts for Laravel Forge and fortrabbit (app:deploy-script) and generates CI/CD pipelines with linting, tests and webhook deploys for GitHub Actions and Bitbucket Pipelines (app:pipeline). Development only - not for production use.

v2.0.0(1mo ago)184↓28.1%[1 PRs](https://github.com/IGNE-Agency/laravel-boot-up-package/pulls)MITPHPPHP ^8.3

Since Jul 15Pushed 1w agoCompare

[ Source](https://github.com/IGNE-Agency/laravel-boot-up-package)[ Packagist](https://packagist.org/packages/igne-agency/laravel-boot-up)[ RSS](/packages/igne-agency-laravel-boot-up/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (12)Versions (9)Used By (0)

Laravel Boot-Up
===============

[](#laravel-boot-up)

Boot a Laravel project on any machine — even a blank one — with two commands:

```
composer install
php artisan app:serve
```

`app:serve` installs or updates the tools you're missing (Homebrew, PHP, Node, Composer, Docker, Herd, bun/yarn/npm/pnpm), creates your `.env`, sets up the database (prompting for credentials when they're missing), runs pending migrations, installs dependencies, builds or watches assets, starts a queue worker when your project needs one, and serves the app via **Herd**, **Sail**, or **`php artisan serve`**. `app:down` cleanly stops everything it started — and nothing it didn't.

> Development only. Requires PHP 8.3+, Laravel 13, macOS or Linux (native Windows fails fast with a clear message — use WSL2).

Installation
------------

[](#installation)

```
composer require igne-agency/laravel-boot-up --dev
```

The package auto-registers via Laravel's package discovery. Always use `--dev`; this package has no business in production.

Usage
-----

[](#usage)

```
php artisan app:serve            # prompts for a server on first run
php artisan app:serve herd       # or: sail | laravel
php artisan app:serve --seed     # run db:seed (always — even with nothing to migrate)
php artisan app:serve --fresh    # migrate:fresh instead of pending migrations (asks first)
php artisan app:serve --update   # update dependencies instead of installing
php artisan app:serve --no-migrate --without-queue --without-assets

php artisan app:deploy           # dependencies + project commands + migrations, no server
php artisan app:status           # what is running: server, tracked processes, log paths
php artisan app:down             # stop tracked processes + the server app:serve started

php artisan app:deploy-script forge production        # export a hosting deployment script
php artisan app:deploy-script fortrabbit staging      # (see "Exporting a deployment script")

php artisan app:pipeline github                       # generate a CI/CD pipeline + scripts/ci + .env.pipeline
php artisan app:pipeline bitbucket                    # (see "Generating a CI/CD pipeline")
```

### What `app:serve` does, in order

[](#what-appserve-does-in-order)

Every step is a small class; the full ordered list is published config you can reorder, trim, or extend (`boot-up.serve_steps`):

1. Create `.env` from `.env.example` when missing
2. Guard against non-local environments (a fresh `.env` counts as local)
3. Generate `APP_KEY` when empty
4. Install missing tools / update ones that violate your version constraints (including the selected frontend package manager)
5. Start the chosen server (Herd link+secure · Docker+Sail up · `php artisan serve`)
6. `composer install` (or `--update`)
7. Frontend install with bun/yarn/npm/pnpm
8. Prompt for missing `DB_*` env values and write them to `.env`
9. Create the database when it doesn't exist, verify the connection
10. Your project's `beforeMigrations()` commands
11. Run migrations — only when there are pending ones (`--fresh` rebuilds from scratch after a confirmation; `--seed` always seeds, migrated or not)
12. Your project's `afterMigrations()` commands
13. Optional framework caching (off by default) + finalize (`storage:link`)
14. Start `queue:work` — only when `QUEUE_CONNECTION` is not `sync` (skipped in favor of Horizon when `laravel/horizon` is installed)
15. Start Horizon and Reverb when the project requires them, and the scheduler when you opt in (`BOOT_UP_SCHEDULER=true`)
16. Build or watch assets
17. Announce the URL and open your browser

Long-running processes (queue worker, asset watcher, `php artisan serve`) run detached in the background with their output in `storage/logs/boot-up/` and their PIDs tracked in `storage/framework/boot-up/`, so `app:down` can reap exactly them. Set `BOOT_UP_QUEUE_RUN_IN=terminal` (or `BOOT_UP_ASSETS_WATCH_IN=terminal`) to open real terminal windows instead.

### Shutdown behavior

[](#shutdown-behavior)

- `app:down` (and Ctrl-C during `app:serve`) stops every tracked background process, then asks whether to stop the server — **only the server that `app:serve` itself started**. A Herd or Sail that was already running before you served is left alone.
- Stopping Herd is machine-wide (`herd stop` halts *all* Herd sites), so it only ever happens after an explicit yes — never silently via `shutdown.stop_server_by_default`.
- A process that survives TERM *and* KILL stays in the ledger with a warning instead of being forgotten; `app:status` shows it and a later `app:down`retries. Dead ledger entries are pruned automatically on the next `app:serve`.
- Re-running `app:serve` never stacks duplicate workers or watchers, and a second `app:down` is a friendly no-op.

Configuration
-------------

[](#configuration)

```
php artisan vendor:publish --tag=boot-up-config
```

Highlights of `config/boot-up.php`:

```
'server' => [
    'default' => env('BOOT_UP_SERVER'),           // 'herd' | 'sail' | 'laravel' | null = prompt
    'drivers' => [ /* add your own Server implementations here */ ],
    'herd' => [
        'site' => env('BOOT_UP_HERD_SITE'),       // https://{site}.test; null = prompt (folder name as default)
    ],
    'artisan' => [
        'host' => env('BOOT_UP_ARTISAN_HOST', '127.0.0.1'),  // where php artisan serve binds
        'port' => env('BOOT_UP_ARTISAN_PORT', 8000),
    ],
],

'tools' => [
    'auto_install' => true,
    'auto_update' => true,                          // update when the constraint is violated
    'required' => [
        'php' => env('BOOT_UP_PHP_VERSION', '*'), // composer-style constraints: '^8.3', '*'
        'node' => env('BOOT_UP_NODE_VERSION', '*'),
        'composer' => env('BOOT_UP_COMPOSER_VERSION', '*'),
    ],
],

'frontend' => [
    'package_manager' => env('BOOT_UP_PACKAGE_MANAGER', 'bun'), // bun | yarn | npm | pnpm
    'assets' => env('BOOT_UP_ASSETS', 'watch'),                 // watch | build | skip
],

'services' => [
    'scheduler' => ['enabled' => env('BOOT_UP_SCHEDULER', false)], // schedule:work, opt-in
    'horizon' => ['enabled' => env('BOOT_UP_HORIZON', true)],      // starts when laravel/horizon is installed
    'reverb' => ['enabled' => env('BOOT_UP_REVERB', true)],        // starts when laravel/reverb is installed
],

'serve_steps' => [ /* the entire pipeline, reorderable */ ],
'deploy_steps' => [ /* what app:deploy runs */ ],
```

Sail extras: when serving with Sail, the package offers (once, with your consent) to add the `sail` alias to your shell profile, and rewrites every app-level command to run inside the containers (`./vendor/bin/sail artisan ...`).

Herd extras: `app:serve herd` verifies Herd's site registry against the actual project path. A link pointing at a moved project (the classic "folder-was-relocated 404") is replaced automatically; a name owned by another live project is only taken over after you confirm. On first link you choose the site name — the folder name is the default, so `https://{name}.test` can differ from the directory. Pin it with `BOOT_UP_HERD_SITE` to skip the prompt.

Exporting a deployment script
-----------------------------

[](#exporting-a-deployment-script)

`app:deploy-script` turns this package's config (package manager, migrations, finalize commands, queue usage, and your bound project commands) into a paste-ready deployment script for your hosting platform:

```
php artisan app:deploy-script forge production        # zero-downtime release script (Forge's default)
php artisan app:deploy-script forge production --classic   # for older sites without zero-downtime deployments
php artisan app:deploy-script fortrabbit staging      # "Build commands" + "Post deploy commands" sections
php artisan app:deploy-script                         # prompts for platform + environment
php artisan app:deploy-script forge production --output=deploy.sh
```

- **Forge** — the zero-downtime script uses Forge's release macros (`$CREATE_RELEASE()`, `$ACTIVATE_RELEASE()`, `$RESTART_QUEUES()`); paste it into your site's deployment script. The `--classic` variant (git pull + PHP-FPM reload) is for sites created without zero-downtime deployments — the two styles cannot be mixed.
- **Fortrabbit** — outputs the two command lists the fortrabbit dashboard expects per environment: *Build commands* (composer + frontend build; the package manager is `npm i -g`-installed when it isn't npm) and *Post deploy commands* (migrations, optimize, finalize, queue restart).
- The **environment** argument tunes the script: `development` keeps dev dependencies and skips `artisan optimize`; `staging`/`production` add `--no-dev` and framework caching.
- Your `ProvidesProjectCommands` binding is embedded at the right positions (before/after migrations), with descriptions as comments.

Generating a CI/CD pipeline
---------------------------

[](#generating-a-cicd-pipeline)

`app:pipeline` writes a thin provider pipeline, the shared shell scripts it calls, and a `.env.pipeline` test environment — all at their canonical paths:

```
php artisan app:pipeline github       # .github/workflows/ci.yml + scripts/ci/* + .env.pipeline
php artisan app:pipeline bitbucket    # bitbucket-pipelines.yml + scripts/ci/* + .env.pipeline
php artisan app:pipeline              # prompts for the provider
php artisan app:pipeline github --force   # overwrite existing files without asking
```

All logic lives in **`scripts/ci/*.sh`** — the YAML only wires them up, so both providers run byte-identical sequences and every stage reproduces locally (`bash scripts/ci/test.sh`):

- `bootstrap.sh` — composer install, `cp .env.pipeline .env`, Nova publish (only with `laravel/nova`; composer auth comes from a `COMPOSER_AUTH` secret), then a lockfile-strict Node install. The package manager is **detected from the committed lockfile at run time**, so switching from npm to pnpm never requires regenerating.
- `lint.sh` / `build.sh` / `test.sh` — three parallel status checks: Pint (only when installed), frontend build + an `artisan optimize` round-trip (mirrors what the deploy scripts run, so un-cacheable config or routes fail CI instead of the deploy), and the test suite with finalize/project commands around `migrate --force`.
- `deploy-hook.sh` — POSTs the environment's deploy webhook with retries, HTTPS enforcement and status checking. It always sends the `User-Agent: fortrabbit`header fortrabbit's webhook endpoint requires (without it, fortrabbit answers 403); other hosts ignore it.

The pipeline behaves the same on both providers:

- **Checks** run on every pull request and on pushes to the deploy branches, against in-memory SQLite (`.env.pipeline` carries the config — commit it; the generated `APP_KEY` is only ever used in CI).
- **Deploys** are environment-scoped: `boot-up.pipeline.branches` maps each branch to a deployment environment (defaults: `develop` → `development`, `staging` → `staging`, `master` → `production`). Create the environment on your provider (GitHub → Settings → Environments; Bitbucket → Repository settings → Deployments) and give each one a `DEPLOY_HOOK` secret holding your host's deploy trigger URL — for fortrabbit that's `https://api.fortrabbit.com/webhooks/environments/{app-env-id}/deploy/{secret}`from the dashboard. An unset hook skips that deploy with a notice; a green push then deploys only its own branch's environment, and in-flight deploys are never cancelled. Want production approvals? Add required reviewers to the GitHub environment, or `trigger: manual` to the Bitbucket step.
- **PHP version** comes from your `composer.json` `require.php` (setup-php on GitHub, the `laravelsail/php{XY}-composer` image on Bitbucket).
- After generating, the command prints a table of exactly which secrets to create, where to add them, and what value goes in each — plus provider notes (branch protection checks, enabling Bitbucket Pipelines once).

Extending the package
---------------------

[](#extending-the-package)

Four extension points, none of which require touching package code:

1. **Project commands** — generators and warmers that run before/after migrations. See [CUSTOM\_COMMANDS.md](CUSTOM_COMMANDS.md) and [examples/ProjectCommands.php](examples/ProjectCommands.php).
2. **Custom pipeline steps** — implement `Serve\Step` and insert the class anywhere in the published `serve_steps` / `deploy_steps` arrays.
3. **Custom servers** — implement `Servers\Server` and register it under `server.drivers` (e.g. `'valet' => ValetServer::class`). It becomes selectable by argument, config, and prompt, and participates in state tracking, shutdown, and command rewriting automatically. Since v2 the interface also declares three capability methods: `providesDatabase()` (the server provisions the DB itself, so creation is skipped), `databaseReachableFromHost()` (false routes DB checks and migrations through your command rewrites, like Sail), and `stopImpact()` (a non-null warning makes stopping require an explicit yes, like Herd's global stop).
4. **Custom tools** — implement `Tools\InstallsTool` and map it under `tools.installers` with a constraint under `tools.required`. Config wins on key collision, so you can also replace a built-in installer (e.g. install Node via nvm).
5. **Custom deployment platforms** — implement `Deploy\Scripts\ScriptGenerator`and register it under `deploy.script_generators` (e.g. `'envoyer' => EnvoyerScriptGenerator::class`); it becomes selectable in `app:deploy-script` alongside Forge and Fortrabbit.
6. **Custom git providers** — implement `Pipelines\PipelineGenerator` (`files()`returns the `GeneratedFile`s to write, `secrets()` the rows of the instructions table) and register it under `pipeline.generators` (e.g. `'gitlab' => GitlabPipelineGenerator::class`); it becomes selectable in `app:pipeline` alongside GitHub and Bitbucket. Reuse `Pipelines\CiScripts` to ship the same shared scripts, and `Support\Lines` to build documents.

Testing
-------

[](#testing)

```
composer test          # Pest 4 suite (unit + feature + architecture tests)
vendor/bin/pint        # code style
```

License
-------

[](#license)

MIT — see [LICENSE](LICENSE).

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance95

Actively maintained with recent releases

Popularity15

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

3

Last Release

45d ago

Major Versions

v1.1.0 → v2.0.02026-07-16

### Community

Maintainers

![](https://www.gravatar.com/avatar/97a26aa304e1e643b5efcfbcc97149ba134246e1c5d899b2a79f181e5b3a5b2e?d=identicon)[Rick Blanksma](/maintainers/Rick%20Blanksma)

---

Top Contributors

[![Rick-Blanksma](https://avatars.githubusercontent.com/u/148454049?v=4)](https://github.com/Rick-Blanksma "Rick-Blanksma (32 commits)")

---

Tags

laraveldevelopmentdeploymentonboardingGithub Actionsforgesailci-cddev-toolsfortrabbitlocal-developmentherdboot-upbitbucket-pipelines

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/igne-agency-laravel-boot-up/health.svg)

```
[![Health](https://phpackages.com/badges/igne-agency-laravel-boot-up/health.svg)](https://phpackages.com/packages/igne-agency-laravel-boot-up)
```

###  Alternatives

[spatie/laravel-medialibrary

Associate files with Eloquent models

6.2k47.7M734](/packages/spatie-laravel-medialibrary)[laravel/ai

The official AI SDK for Laravel.

1.1k6.4M360](/packages/laravel-ai)[illuminate/queue

The Illuminate Queue package.

20433.5M1.9k](/packages/illuminate-queue)[laravel/boost

Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.

3.6k31.1M882](/packages/laravel-boost)[spatie/laravel-health

Monitor the health of a Laravel application

89313.5M195](/packages/spatie-laravel-health)[psalm/plugin-laravel

Psalm plugin for Laravel

3365.5M359](/packages/psalm-plugin-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
