Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Scheduled Action Laravel Package

devsrv/laravel-scheduled-action

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package addresses a recurring Laravel pattern: deferring a state transition or side effect on an Eloquent model until a future timestamp ("publish at", "expire at", "send reminder at", "auto-close after N days"). In most Laravel codebases this is currently implemented ad hoc via a scheduled_at/published_at column plus a scheduled console command.
  • The package appears to abstract that pattern into declarative model-level scheduling. That is architecturally reasonable and composes with Laravel's existing scheduler (routes/console.php / Kernel::schedule) and queue system rather than replacing them.
  • Fit is medium: it is a convenience layer over primitives we already own. It does not introduce a new runtime, broker, or datastore, so there is no architectural impedance — but it also does not eliminate any infrastructure we already operate.

Integration feasibility

  • Integration cost is low on paper: Composer install, publish config/migrations if any, add a trait to models, ensure the scheduler tick is registered in the deployment's cron/schedule:run.
  • The real cost is verification, not wiring. With 18 stars, 0 dependents, and a last release of 2023-03-27, we have no ecosystem signal for Laravel 11/12, PHP 8.3/8.4, or Octane/queued-listener behavior. A compatibility spike is mandatory before it touches a production model.
  • Estimated spike: 0.5–1 engineer-day to validate constraints, concurrency behavior, and failure semantics against our actual Laravel version.

Technical risk

  • Maintainer/bus-factor risk is the dominant risk. Single small vendor, no dependent packages, no release in ~2+ years. This is a "reference implementation" profile, not a "platform dependency" profile.
  • Correctness risk around concurrency. Scheduled model actions classically fail in three ways: duplicate execution across multiple app servers, lost execution when the action throws after the timestamp is consumed, and drift when the timestamp is written in a different timezone than the scheduler evaluates. Whether the package handles any of these (row locks, onOneServer, withoutOverlapping, atomic claim) is unknown and must be read from source, not from the README.
  • Silent-failure risk. Scheduler-driven designs fail quietly when cron dies or schedule:run is not registered in a new environment. There is no evidence of built-in monitoring/alerting.
  • Supply-chain surface is small but unaudited. MIT-licensed, low-traffic package; we would be trusting unreviewed code inside the model lifecycle.

Key questions

  1. Does it require a migration (dedicated table/columns), or does it operate on model attributes we define?
  2. What is the execution model — synchronous in the scheduler process, or dispatched to a queue? Is queue dispatch configurable per action?
  3. How is duplicate execution prevented across horizontally scaled app servers? Does it depend on a shared cache lock, a DB row lock, or nothing?
  4. What are the failure semantics — is the schedule consumed before or after the action runs, and is there a retry/dead-letter path?
  5. Is the scheduler tick a hard dependency, and does it provide any liveness signal we can alert on?
  6. Timezone handling: does it evaluate against app.timezone, UTC, or the DB session timezone?
  7. Declared constraint ranges in composer.json — do they actively support our Laravel/PHP versions, or merely permit them?
  8. What does the test suite cover, and is it run in CI against current Laravel?

Integration Approach

Stack fit

  • Fits a standard Laravel monolith or modular monolith on MySQL/Postgres with Redis available for locks. Redis presence is effectively a prerequisite if we want safe multi-node execution.
  • Poor fit for serverless/queue-only deployments (Vapor, Lambda) where a cron tick and long-lived scheduler process are not a given.
  • Poor fit for models with high-volume scheduling (per-second or high-cardinality per-tenant timing) — this pattern is a polling loop, not an event timer.

Migration path

  • Adopt behind an internal seam. Define our own SchedulesModelActions contract and a thin adapter that delegates to the package. If the package is abandoned, the swap is one class, not a codebase-wide refactor.
  • Prefer a spike-first, vendor-later path: build a 100-line reference implementation (column + scheduled command + onOneServer + structured logging) and compare. For a package this small, the realistic outcome is that our own implementation wins on control and observability, with the package used as a design reference.
  • If adopted: pin an exact version in composer.json, commit the lockfile, and record the decision with an explicit expiry date tied to a re-evaluation (e.g. 2 quarters).

Compatibility

  • Verify against our pinned Laravel and PHP versions in a throwaway branch with a real model and a real scheduler tick — not just composer require.
  • Confirm behavior under Octane and under multiple queue workers; confirm soft deletes and model events do not cause double-firing.
  • Confirm the package does nothing unexpected during migrate, db:seed, or test boot (a common failure mode for packages that register global hooks).

Sequencing

  1. Compatibility + source-read spike (0.5–1 day). Gate: does it handle concurrency and failure atomically?
  2. Parallel build of the internal seam and reference implementation for cost comparison.
  3. Decision gate: adopt-as-dependency vs. adopt-as-inspiration. Default posture is the latter given the maintenance signals.
  4. Pilot on one low-risk, reversible action (e.g. "archive stale draft"), with alerting on execution count.
  5. Expand only after a full release cycle with no silent-drop incidents.

Operational Impact

Maintenance

  • We would own the upgrade burden. A dependency with no release since March 2023 will eventually block a Laravel major upgrade; at that point we either fork it or remove it. Budget for that as a known future cost.
  • Small codebase means a fork is genuinely cheap — this is a mitigation, not a blocker, but it should be an explicit line item.

Support

  • Community, best-effort, single-maintainer support. No SLA, no security disclosure process we can verify, no vendor to escalate to.
  • Internal enablement is required: the team must document how schedules are created, inspected, and canceled, or debugging becomes archaeology.

Scaling

  • Scales to the extent the scheduler tick scales: a single everyMinute pass must find, claim, and dispatch all due actions. Fine at hundreds to low thousands per minute; degrades beyond that and needs sharding by tenant or moving to a per-action queue delay model.
  • Horizontal app scaling requires shared locks (onOneServer + Redis). Without that, duplication is guaranteed, not hypothetical.
  • Database load is a periodic scan; an index on the scheduled timestamp column is mandatory.

Failure modes

  • Scheduler down → nothing fires, no error surfaces to users; only detectable via a heartbeat/expected-volume alert.
  • Action throws → depends on consume-before vs. consume-after semantics; worst case is silent loss of a business-critical transition (expiry, billing, notification).
  • Duplicate execution → double emails, double charges, double state transitions in multi-node deployments.
  • Timezone drift → actions fire hours early/late, often only noticed by users.
  • Upgrade breakage → a framework bump makes the package's internals incompatible, potentially failing at boot rather than at the scheduled path.

Ramp-up

  • Low for any Laravel developer: the concept maps to familiar scheduler and Eloquent idioms, roughly 2–4 hours to first productive use.
  • Non-trivial for on-call: understanding why a scheduled action did not fire requires knowing the cron registration, the lock backend, the queue path, and the package's claim logic. That knowledge is tribal unless written down.
  • Recommend a runbook before pilot: how to list pending actions, how to force-run one, how to alert on missed volume, and how to disable the whole subsystem safely.

TPM recommendation: Do not adopt as a platform dependency at this maturity level. Use it as a reference implementation for an internally owned ~100-line scheduled-action primitive behind our own interface. Revisit if adoption, releases, or a maintained fork appear.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
dakiquang/laravel-oauth-refresh-lock
woda/laravel-worktrees
dalefranks/ramasite
faghy/laracashbook
roundly-consulting/google-places-for-laravel
roundly-consulting/kubernetes-api-for-laravel
roundly-consulting/plausible-for-laravel
gvp/gvp-laravel-template
metasyncsite/laravel-metasync-client
roundly-consulting/onboarding-for-laravel
andydefer/laravel-notification
adachsoft/cli-process-tester
jhaskell13/laraflow
sebastienheyd/boilerplate-media-manager
ccast/tagixo-primix
pretendtrue/laravel-builder
sawmainek/laravel-scout-tntsearch-driver
tomshaw/laravel-calendar-table
dibakar/laravel-ownership
adachsoft/changelog-linter