PHPackages                             tiknil/skipper - 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. [CLI &amp; Console](/categories/cli)
4. /
5. tiknil/skipper

ActiveLibrary[CLI &amp; Console](/categories/cli)

tiknil/skipper
==============

CLI application to manage multiple instances of local web applications

0.3.1(8mo ago)228MITPHPPHP ^8.0

Since May 23Pushed 8mo ago3 watchersCompare

[ Source](https://github.com/tiknil/skipper)[ Packagist](https://packagist.org/packages/tiknil/skipper)[ RSS](/packages/tiknil-skipper/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (8)Dependencies (4)Versions (9)Used By (0)

[Skipper](https://github.com/tiknil/skipper) is a tool for managing multiple local Laravel docker-compose deployment.

It is strongly opinionated towards the patterns used by [Tiknil](https://www.tiknil.com) while building a laravel application.

- [Install &amp; Update](#installation)
- [Usage](#usage)
- [Architecture](#architecture)
- [Mailpit for local emails](#mailpit)
- [Docker compose commands](#docker-compose-commands)
- [Project fields](#project)
- [Development](#development)
- [Troubleshooting](#troubleshooting)

### Installation

[](#installation)

```
composer global require tiknil/skipper

```

Make sure that the composer binaries directory is in your `$PATH`

You can update Skipper to the latest version by running

```
composer global update tiknil/skipper

```

### Usage

[](#usage)

Register the current path as a skipper project:

```
# No options, sane defaults will be used and you will be asked to confirm the main fields
skipper init

# All fields can also be set via command line options
skipper init --host=[host] --name=[name] \
        --compose-file=docker/docker-compose.yml \
        --env-file=docker/.env \
        --http-container=nginx
        --php-container=php-fpm
```

You will be asked to automatically install the default [laravel docker compose](https://github.com/tiknil/laravel-docker-compose) files.

See [Project](#project) for details about each field.

---

Start the project containers

```
skipper sail
```

---

Stops the project containers

```
skipper dock
```

---

Install caddy root certificate

```
skipper proxy:certs
```

---

Once a project is running, skipper provides some useful commands to directly interact with it.

```
skipper bash                  # Start a new bash shell inside the PHP container
skipper composer [command...] # Run a composer command (use instead of composer [command]
skipper artisan [command...]  # Run an artisan command (use instead of php artisan [command]
skipper tinker                # Start a new Laravel Tinker shell
skipper backup                # Create a new MySQL backup
skipper restore --file [file] # Restore a MySQL backup
```

Run `skipper` without arguments for a complete list of available commands

### Architecture

[](#architecture)

Skipper runs a [Caddy](https://caddyserver.com/) container, running as reverse proxy and forwarding requests to the corresponding project instance. Caddy is also able to generate HTTPS certificates for local domains, enabling a local environment very similar to a production deployment.

Skipper install its files inside the `~/.skipper` directory.

### Mailpit

[](#mailpit)

Skipper also runs a [Mailpit](https://github.com/axllent/mailpit) container by default. You can see the web dashboard at [localhost:8025](http://localhost:8025)

Laravel should use the host `host.docker.internal` and port `1025` with driver SMTP:

```
MAIL_MAILER=smtp
MAIL_HOST=host.docker.internal
MAIL_PORT=1025

```

This avoids running a separate mailpit/mailhog instance for each project.

### Docker compose commands

[](#docker-compose-commands)

You may need to run custom docker compose command for a project, e.g. `ps` to see running containers.

You can use the `compose` command:

```
skipper compose [command]

```

Basically, replace each `docker-compose [command]` with `skipper compose [command]`. This is *required* because skipper attaches some options to the docker-compose command that are required, such as the name or the env file path.

### Project

[](#project)

For the reverse proxy to work, skipper need to know about a project and update the caddy configuration file. A new project is registered using the `init` command.

> All available projects are registered inside the `~/.skipper/config.yaml` configuration file.

- **name**: The project name is used as the docker compose prefix for each container, volume or network related to the project. As a consequence, it must be unique and an update can result in data loss (new docker volumes will be used).
- **host**: The domain to register in the reverse proxy
- **path**: The path to the project root
- **composeFile**: relative path to the docker-compose file.
- **envFile**: relative path to the .env file for the docker-compose file
- **httpContainer**: name of the http container, where caddy should forward the requests
- **phpContainer**: name of the php container, where the utility commands should be run.

### Development

[](#development)

Skipper leverages strongly the Symfony [console](https://symfony.com/doc/current/components/console.html)and [process](https://symfony.com/doc/current/components/process.html) components.

If you are developing skipper and you need to test your edits, you have two choices:

- Run the `bin/skipper` binary directly (e.g. `bin/skipper list`)
- Update your global composer.json file with a reference to the local project:

```
"repositories": [
    {
        "type": "path",
        "url": "path/to/your/local/project"
    }
],

```

Now running `composer global require tiknil/skipper` your local version will be used instead of the published version.

See [CONTRIBUTING.md](./CONTRIBUTING.md) for additional technical informations.

### Troubleshooting

[](#troubleshooting)

#### Invalid SSL certificates on a new project

[](#invalid-ssl-certificates-on-a-new-project)

In case of ssl errors after launching a new project, you probably need to install the Caddy root certificate into your system.

```
skipper proxy:certs
```

Note that the browser may cache the ssl error, you may need to wait a while after installing the certificate for the browser to stop showing warnings

#### Invalid SSL certificates on a running project (INVALID\_DATE)

[](#invalid-ssl-certificates-on-a-running-project-invalid_date)

In case ssl errors start occurring after the project is running for a while, it is probably caused by a [time drift](https://github.com/docker/for-mac/issues/1260) between your PC datetime and the container internal clock. You can reload the caddy container to resolve:

```
skipper proxy:reload
```

#### command not found: skipper

[](#command-not-found-skipper)

If your shell does not find the skipper command after the [global installation with composer](#installation), you probably do not have the composer `bin` directory into your `$PATH`.

Add the following line to your `~/.zshrc`:

```
export PATH=$PATH:$HOME/.composer/vendor/bin

```

Then reload the file:

```
source ~/.zshrc
```

> If you are not using zsh as your shell, refer to your preferred shell configuration file instead of ~/.zshrc

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance60

Regular maintenance activity

Popularity10

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity44

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 ~119 days

Recently: every ~200 days

Total

8

Last Release

252d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/369107c31af2371c739637d462c85da5fd4e88695e37c36cb2059efa88ab0471?d=identicon)[gbalduzzi](/maintainers/gbalduzzi)

![](https://www.gravatar.com/avatar/42b12aba827e2dd147e7342a23536cce28fa55f1e9b2e406bee03ea597f4a4c3?d=identicon)[rickytribbia](/maintainers/rickytribbia)

---

Top Contributors

[![gbalduzzi](https://avatars.githubusercontent.com/u/4761858?v=4)](https://github.com/gbalduzzi "gbalduzzi (18 commits)")

---

Tags

dev-opsdocker-composelaravellocalhostclilaraveldocker

###  Code Quality

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/tiknil-skipper/health.svg)

```
[![Health](https://phpackages.com/badges/tiknil-skipper/health.svg)](https://phpackages.com/packages/tiknil-skipper)
```

###  Alternatives

[fly-apps/dockerfile-laravel

Dockerfile generator and Fly.io helper.

30105.0k](/packages/fly-apps-dockerfile-laravel)

PHPackages © 2026

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