A Laravel-native db:pull.
Finally.

Reads your .env. Pre-fills storage/app/public/. Runs php artisan as a post-pull hook. Every project, same ritual, one click.

Ferry running a database pull on a Laravel project

Ferry detects Laravel the moment you point it at a project folder — the artisan file is the tell. It reads DB_HOST, DB_DATABASE, DB_USERNAME, and DB_PASSWORD out of your .env file and fills in the config form. You don't retype credentials you already have in the project.

Laravel's config lives in files, not the database, so pulling production doesn't drag in a pile of URL gotchas. A plain Pull database is usually enough — your APP_URL stays whatever you set it to locally, because it never lived in a DB row in the first place. Hostname replacement is available if you need it for packages that do store URLs in the database, but most Laravel apps don't need it at all.

Where Ferry shines for Laravel is the hook slots. Every operation has pre/post hooks that run from your local document root with zsh, so you can chain php artisan migrate --force, php artisan cache:clear, php artisan queue:restart, and whatever else your pull-down routine involves. Write them once per site and forget about them.

What Ferry handles out of the box.

Reads .env automatically

Parses DB_* keys from your Laravel .env. Handles quoted values, inline comments, and host:port forms. Works with Sail, Valet, Herd, and anything else that sticks to the Laravel convention.

storage/app/public pre-filled

The default file sync path matches Laravel's convention for user uploads. Add more paths if your app stores media elsewhere — one site can have as many sync pairs as you need.

Artisan hooks, built in

Post-pull, post-push, pre-pull, pre-push — run any php artisan command from your local doc root. Ferry cds into the right directory before executing.

Pulls across MySQL versions

Point Ferry at any mysql binary per site — Homebrew, MAMP, DBngin, a project-specific MariaDB. One site can use MySQL 8; another can use MariaDB 10.

Skip the cache tables

Configure table exclusions to skip cache, sessions, failed_jobs, telescope_entries, or any other high-volume table you don't need locally. Schema-only or full omit — your call.

Keys in Keychain

Database and SSH passwords are stored in the macOS Keychain — never in Ferry's data files, never in logs. SSH keys stay where they are; Ferry stores the path, not the key.

Every sync a Laravel team runs.

Pull

Pull the production database

mysqldump over SSH, stream, import. Your post-pull hook runs php artisan migrate --force and clears cache. Thirty seconds, no custom scripts.

Database pull running on a Laravel project
Pull

Sync storage/app/public

rsync-backed file pull. Pulls down the user uploads that storage:link exposes publicly, nothing else. Excludes are per-path — skip cache/ and sessions/ inside storage without thinking about it.

File pull syncing storage/app/public
Push

Push to staging for a demo

Push the local database to staging so the client can review features in context. Production pushes require a confirmation sheet and optionally run a remote backup first.

Database push to a Laravel staging site
Local

Backup before a migration

One-click backup before you run a risky migration. Timestamped, local, reversible. Restore is gunzip | mysql from the terminal.

Backup operation history on a Laravel project

Free while we build it.

Ferry is in early access beta. Download it, use it on real projects, tell us what breaks. Pricing comes later.

Download for macOS
macOS 14+ required Developer ID signed & notarized