aaronfrancis/airdrop
Airdrop is a Laravel package for transferring files between your local machine and remote servers. Simple Artisan commands let you upload and download files, making it easy to sync assets, logs, or backups without manual FTP or SSH setup.
What it does: Airdrop is a deploy-time optimization for Laravel apps that skips frontend asset compilation (npm ci && npm run build) when the inputs that affect the build—package.json, lockfile, bundler config, resources/js, resources/css, etc.—are byte-identical to a previously recorded build. It is not a runtime dependency in the traditional sense; it is a CI/deploy-pipeline dependency.
Architecture fit: Good fit for teams running Laravel with Vite and a repeatable deploy pipeline (Forge, Envoyer, Ploi, Laravel Cloud, GitHub Actions, GitLab CI, or a containerized build). The value proposition is narrow but real: build minutes and deploy latency on deploys that touch only PHP, config, or templates. It is a poor fit for apps with no frontend build step, or apps where the build is already fast (<30–60s), because the coordination cost exceeds the savings.
Integration feasibility: Low-to-moderate. Typically one composer require, publishing a config file, and wiring one command into the deploy script plus persisting the state/manifest file between runs. The hard part is not the PHP—it is ensuring the state file survives across ephemeral CI runners and is shared correctly across concurrent deploys. That is a pipeline design problem the package cannot solve for you. As of v2.0.0 the require line itself changed (wilbergroup/airdrop), so this is no longer a zero-touch dependency.
What changed in v2.0.0 (and why it matters here):
aaronfrancis/airdrop → wilbergroup/airdrop. Functionally a drop-in, but not a drop-in at the Composer level: composer.json, composer.lock, SBOM/composer audit output, CI cache keys derived from the lockfile, and any vendor/ path assumptions all change. Treat it as a dependency-identity change requiring a dedicated PR and deploy.aaronfrancis, repo pointed at a fork) is now resolved by declaring the fork canonical. This is a positive, but it is a governance improvement, not a capacity improvement.Technical risk:
VITE_* variables baked at build time, postcss/tailwind config in unusual locations, a dependency pulled from a git URL, Node/bundler version drift) produces a false "no change" and ships stale or wrongly-configured assets. This is a silent production defect class, and v2 does not address it.Key questions for the maintainer / your own team:
.npmrc, private registry config)? Partially answered: trigger class names are included.aaronfrancis/airdrop marked abandoned on Packagist with a pointer to wilbergroup/airdrop, and is v1.x receiving security fixes?--force / bypass flag for hotfixes and rollbacks?php artisan down/queue restarts in the same release hook?Stack fit: Laravel 10–13 (13 added in v2.0.0) with Vite, Composer 2, Node 18/20/22, PHP 8.5 covered in the upstream test matrix. Requires a deploy pipeline that (a) runs a PHP command before the build step and (b) can persist a small file between deploys. If your pipeline is a single Docker build stage, you need a cache mount or a remote cache to make it work.
Migration path (low-risk, reversible):
composer remove aaronfrancis/airdrop && composer require wilbergroup/airdrop, re-publish the config file if the tag changed, and grep the deploy scripts and CI configs for the old name. Diff the lockfile to confirm nothing else moved.Compatibility considerations: Pin the new package name explicitly in composer.json (do not rely on a replace shim). Confirm Laravel version constraints against your app — v2 extends the ceiling to 13, which removes a likely blocker on your next framework upgrade. Confirm the artisan command signature is unchanged from v1 so deploy scripts need no edits. Confirm the command is non-interactive and returns sane exit codes for CI, does not assume a specific storage disk or APP_ENV, and that a missing Vite manifest forces a build rather than a skip.
Sequencing: Two distinct pieces of work, deliberately not bundled. (a) The v2 rename is a small dependency-hygiene change — do it on its own deploy, during a quiet window, and watch for the expected one-time rebuild. (b) The shadow-mode pilot is a pipeline improvement — do not bundle it with a framework upgrade or a Vite migration, since bundling makes it impossible to attribute a bad deploy to the right change. If you happen to be planning a Laravel 13 upgrade, note that v2's Laravel 13 support makes those two changes compatible but does not make them safe to ship together.
Maintenance: The code surface is small, but the failure mode is asymmetric — it saves seconds and can cost an incident. Budget for one owner who reviews the package before each Laravel/Node major upgrade, because both change the asset-input surface. Pin the exact version, and record that the canonical name is now wilbergroup/airdrop anywhere the old name appears (runbooks, ADRs, onboarding docs, internal allowlists) — stale references will send the next on-call engineer to an unmaintained package. The v2.0.0 upgrade itself needs a two-line runbook entry: "rename performed, one forced rebuild expected on first deploy, verify second deploy skips."
Support: Expect questions of the form "why didn't my CSS change deploy?" Write a short runbook: how to read the decision log, how to force a rebuild, how to clear the state, and who to page. Add the bypass flag to the hotfix checklist so on-call never debugs this at 2 a.m. Add one more scenario now: "we renamed the package / refactored a trigger class and assets rebuilt unexpectedly" — that is expected behavior, not a regression, and support should be able to say so immediately rather than escalating.
Scaling: Scales fine technically — it is a hash comparison. It scales poorly organizationally: as repos, apps, and deploy targets multiply, each pipeline needs its own state store and its own input list. Gains are highest for apps with slow builds and frequent PHP-only deploys; negligible for monorepos where any change triggers a full rebuild anyway. Parallel/concurrent deploys to the same environment are the main scaling hazard — require per-environment state keys. If you run many apps, the v2 rename is a multiplier on toil: it is a one-line change per repo, but a one-line change times N plus a lockfile diff each, so schedule a sweep rather than discovering it repo-by-repo.
Failure modes and mitigations:
wilbergroup/airdrop, confirm the old name is marked abandoned upstream, and add a dependency-review rule so the old name cannot reappear.Ramp-up: Half a day for the engineer wiring it into the pipeline, plus roughly an hour for the v2 rename PR and its verification if already adopted. A one-hour briefing for the on-call rotation; a short ADR recording the decision, the measured savings, the input list, the bypass procedure, and the new canonical package name. The v2.0.0 release is a net-positive maintenance signal and removes the framework-upgrade blocker, but it does not change the economics: the payoff is still small and still must be measured. Recommendation: migrate to wilbergroup/airdrop v2 as routine dependency hygiene on its own deploy, expect and verify exactly one rebuild, then continue the standing plan — pilot in shadow mode, adopt only if skip rate and savings clear a pre-agreed threshold, and treat production enablement as a reversible, flag-gated change.
How can I help you explore Laravel packages today?