Ferry for Laravel
db:pull.Reads your .env. Pre-fills storage/app/public/. Runs php artisan as a post-pull hook. Every project, same ritual, one click.
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.
Built for Laravel workflows
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.
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.
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.
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.
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.
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.
Operations
mysqldump over SSH, stream, import. Your post-pull hook runs php artisan migrate --force and clears cache. Thirty seconds, no custom scripts.
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.
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.
One-click backup before you run a risky migration. Timestamped, local, reversible. Restore is gunzip | mysql from the terminal.
Pricing
Ferry is in early access beta. Download it, use it on real projects, tell us what breaks. Pricing comes later.
Download for macOS