zpm-packages/cron-manager
Cron Manager for Laravel lets you define, organize, and monitor scheduled tasks in one place. Manage cron jobs from code or a dashboard, enable or disable entries, and track upcoming and past runs without digging through server crontabs.
Architecture fit. A cron manager targets a real, recurring gap in Laravel estates: the native scheduler is code-defined and engineer-only, so business stakeholders have no visibility into what runs, when, whether it succeeded, or how to pause a misbehaving job at 2am without a deploy. Packages in this category typically wrap Illuminate\Console\Scheduling\Schedule with a persistence layer (a scheduled_tasks table), an execution log, and a control surface to enable/disable/run-now. That maps cleanly onto a standard Laravel app: service provider auto-discovery, one or two migrations, published config. The architectural question that matters is whether it wraps the existing schedule:run entry (low blast radius, additive) or replaces it with its own runner invoked from cron (higher blast radius — you inherit its overlap, mutex, and timezone semantics). That distinction drives most of the risk below and should be the first thing confirmed in code review.
Integration feasibility. Mechanically straightforward for any team already on Laravel 10–12: Composer install, run migrations, point the existing * * * * * php artisan schedule:run entry at whichever command the package exposes. No infrastructure change, no new runtime dependency beyond the database you already have. If it ships a web UI, add auth middleware and a policy gate. Realistic effort for a spike is 1–2 engineer-days.
Technical risk. This is where the assessment turns negative, and the TPM should say so plainly. Zero stars, zero dependents, and a composite score of 10.3 means the package has no production evidence and no external review surface. Three specific concerns:
composer require. Treat a mismatch as disqualifying pending explanation.withoutOverlapping, onOneServer, timezone handling, or runInBackground can change behavior of jobs that currently work correctly. These failures are quiet and often discovered via downstream data corruption, not alerts.Key questions for the maintainer (or the code, if no maintainer responds).
schedule:run or replace it with a custom runner?withoutOverlapping and onOneServer enforced — cache locks, DB rows, or not at all? Which cache driver is required?Stack fit. Assume Laravel 10+ on PHP 8.1+, MySQL/Postgres, Redis available. The package is additive to the existing app/Console/Kernel.php or routes/console.php definitions — no rewrite of job code required. If a UI is bundled, confirm whether it ships prebuilt assets or requires npm in your pipeline; prebuilt is strongly preferred for an internal tool.
Migration path. Do not adopt fleet-wide. Select one internal, low-consequence application — an admin back-office or reporting service, not anything touching payments, provisioning, or customer data. Install behind a feature branch, run migrations in staging first, and mirror only two or three idempotent, read-mostly scheduled commands. Run in parallel with the existing scheduler for one to two weeks and diff the execution records. Promote only on clean parity.
Compatibility. Check for collisions with anything already providing schedule observability (spatie/laravel-schedule-monitor is common). Two systems both writing execution state produce confusing incident timelines. Confirm migration timestamps don't clash and that the published config file name is namespaced. Verify the package's Composer constraints actually resolve against your locked framework version rather than relying on the README.
Sequencing.
Given zero dependents, fork-and-own should be treated as a first-class outcome, not a fallback. The valuable part of this package is the pattern, not the artifact.
Maintenance. Realistically, you inherit it. Zero dependents means no upstream issue pressure, no third-party bug reports surfacing problems before you hit them, and no signal that the maintainer is resourced to respond. Budget explicit ownership: pinned version in composer.json, a named internal owner, and a scheduled quarterly review to check for releases or framework incompatibility. A fork gives you control at the cost of permanent maintenance; an unowned dependency gives you neither.
Support. No community, no Stack Overflow corpus, no track record of responsive triage. Your team's internal runbook is the documentation. Require the adopting engineer to write a one-pager covering: how to disable a runaway job, how to clear a stuck lock, how to roll back migrations, and who to page.
Scaling. The persistence layer is the scaling concern. DB-backed schedule tables become write-contention points at high task counts or short intervals, and execution logging grows unbounded unless retention is configured — plan a prune job from day one. Multi-node deployments need onOneServer semantics backed by a shared cache (Redis); file-based cache locks will silently allow duplicate execution on every node. Confirm this before any horizontal scaling.
Failure modes to instrument. Silent job failure with no alert (the package does not replace your alerting); drift between DB-defined and code-defined schedules after a deploy; orphaned locks halting a job indefinitely; log/output tables filling the primary database; misconfigured auth leaving the control surface publicly reachable — this last one is the most severe and the easiest to miss during a quick pilot. Each should have a detection: alert on missed expected executions, a lock-age monitor, a table-size check, and a route-level auth test in CI.
Ramp-up. Low. A Laravel-comfortable engineer will be productive in an afternoon; the package surface is small and the domain is familiar. The cost is not learning curve, it is verification — the hours go into reading the scheduler wrapper and the locking code, not into learning an API.
Recommendation. Conditional go for a single internal tool where a bad cron job is an inconvenience. No-go for customer-facing, financial, or compliance-scoped applications until provenance is explained and the runner/locking semantics are read and verified by your own engineer. The underlying need — ops visibility into scheduled jobs for non-engineers — is legitimate and worth solving; this specific package has not yet earned the trust that solving it requires.
How can I help you explore Laravel packages today?