philo/artisan-remote
philo/artisan-remote is a Laravel package for executing Artisan commands on remote applications through a secure, configurable connection. Run migrations, clear caches, and inspect command output without SSH, simplifying maintenance across environments.
Architecture fit. philo/artisan-remote inverts Laravel's normal operational model: Artisan is designed to run in-process via CLI, the scheduler, or queue workers, not to be invoked over HTTP by an external caller. For most production Laravel estates this is an architectural anti-pattern — it creates a network-reachable command-execution endpoint that bypasses the deployment, CI, and SSH/Bastion controls that normally gate privileged operations. The legitimate fit is narrow: internal ops dashboards, ephemeral demo/lab environments, legacy hosts where shell access is unavailable, or tooling where a scheduler cannot be reached. A TPM should treat this as an exception path, not a platform component, and require an explicit justification before adoption.
Integration feasibility. Low-to-moderate effort to install (Composer, service provider auto-discovery, published config), high effort to make safe. Three gates must clear before any pilot:
--env, --force, shell metacharacters in args) is the dominant exploit vector.Artisan::call() with buffered output. That is fine for cache:clear, dangerous for migrate, queue:work, or anything long-running.Technical risk. High, and concentrated in three areas. Security: an HTTP-exposed Artisan endpoint is a remote code execution surface; the package's own hygiene is not a substitute for network isolation and WAF rules. Currency: last release January 2021, zero dependents, 82 stars — it predates Laravel 9/10/11/12 and PHP 8.2+, and is almost certainly untested against modern Symfony Process and Illuminate Console internals; expect composer update conflicts. Bus-factor: single-maintainer, low-visibility package with no downstream consumers means no community pressure to patch. Treat it as an unmaintained dependency from day one.
Key questions for the maintainer/sponsor.
Stack fit. Reasonable only for Laravel 6–8-era applications on PHP 7.4/8.0. For Laravel 9+ or PHP 8.2+, assume incompatibility until proven otherwise; budget a compatibility spike before committing. It is a poor fit for multi-tenant SaaS, PCI/HIPAA-scoped workloads, or any environment where a new internet-reachable endpoint triggers a security review.
Migration path. Do not adopt as a long-term dependency. Two viable paths:
auth + custom IP middleware, allowlist 3–5 benign commands (cache:clear, config:cache, queue:restart), and run for two weeks to validate the actual operational need.The alternative worth putting on the table immediately: a small internal controller (30–50 lines) calling Artisan::call() behind existing middleware achieves the same outcome with no third-party dependency. That is usually the right answer for a TPM.
Compatibility. Expect friction on Symfony Process version, Illuminate\Console\Application signature changes, and PHP 8 deprecations. No published compatibility matrix and no dependents to learn from — validation is entirely on us.
Sequencing.
Maintenance. Effectively unmaintained. No releases in over four years, no dependents to surface regressions, single maintainer. Ownership of patches, security advisories, and Laravel upgrades transfers to our team the moment it ships. Budget an ongoing ~10–15% of one engineer for the fork, plus re-validation at every framework upgrade.
Support. Community support is minimal — 82 stars implies a thin issue tracker and no vendor SLA. Internal escalation means reading the source. Document the allowlist, the auth model, and the failure semantics before go-live, because there is no upstream to ask.
Scaling. Poor. Execution is synchronous and in-request: each command occupies a PHP-FPM worker for its full duration. Long commands (migrate, queue:work, storage:link on large buckets) will exhaust workers under concurrency, and there is no queue, retry, or backpressure. Output is buffered in memory, so verbose commands risk memory-limit failures. This is an admin tool, not a control plane — cap concurrency at 1–2 and keep it off the public request path.
Failure modes to design around.
migrate leaves the schema in an indeterminate state.Ramp-up. Installation is under an hour; safe operation is not. Expect 1–2 days for an engineer to understand the auth model, build the allowlist, wire audit logging, and write runbook entries. The TPM-facing cost is the security review and the exception approval, not the engineering. Ramp-up for on-call is low if the endpoint is isolated and allowlisted; it becomes a pager-noise source the moment it is broadly reachable.
Recommendation. Treat philo/artisan-remote as a short-lived evaluation artifact, not a platform dependency. The 0.72 score, zero dependents, four-year release gap, and RCE-shaped surface argue for the in-house controller alternative in nearly every case. Approve only for a time-boxed pilot behind network isolation, with a named owner, an explicit allowlist, and a scheduled decision to fork or retire.
How can I help you explore Laravel packages today?