iso-doss/laravel-meridian
Laravel Meridian is a lightweight Laravel package from iso-doss that provides a clean, configurable integration for adding Meridian functionality to your app, with a developer-friendly API, sensible defaults, and minimal setup.
Architecture fit
php artisan meridian + pcntl/posix). This release improves both, but the balance of new risk lands on the write side — auto-scaling strategy and master memory limit are both supervisor behaviours that can change production outcomes.meridian:listen is a developer-experience feature with no production footprint, and the watch option adds a config surface (polled directories, --poll seconds). Keep it out of production review; it is a ramp-up and DX win only.Integration feasibility
composer require + meridian:install, Blade dashboard, no front-end build. v1.6.0 adds meridian:listen which removes the last Node/npm dependency from local dev — this matters for CI images and for teams that refuse a JS toolchain, and it makes the package materially easier to evaluate, not just to run.pcntl/posix for the supervisor. v1.6.0 introduces a memory_limit config key (default 64 MB) and a watch key; published configs and published Blade views now require attention at upgrade time, which is a small but real new upgrade step.composer update, no migration — but the behavioural changes are the integration risk, not the schema:
waits now falls back to '*', and to 60 seconds when '*' is not set. Previously it was ignored. Any team that never configured waits will go from "no long-wait alerts" to "alerting at 60s across every queue" the moment they upgrade. This is the single most likely way this release causes an incident.silenced) until meridian:prune removes them, and they now count in metrics. Prune configuration is no longer a nice-to-have on upgrade; it is a prerequisite.viewMeridian gate and route configuration are unchanged, so the authorization seam is intact. Payload/exception retention questions remain unanswered by this release.Technical risk
jobs-table fallback. Nothing in this release reduces that coupling. Upgrade-testing against each Laravel minor is still required.0 to disable) means the master exits with code 12 after draining running jobs, firing MasterSupervisorOutOfMemory. That is the correct design — graceful drain, not a kill — and it closes a real leak. But it transfers responsibility: it assumes a process monitor exists and actually restarts on exit 12. Without one, the new behaviour converts a slow memory leak into a clean but permanent shutdown. It also introduces a tuning hazard: 64 MB is low for a process supervising many workers, and a mis-set limit produces a restart loop rather than an outage you can see.log strategy allocates worker processes by the logarithm of each queue's pending depth, so one huge queue cannot monopolise the pool. That is a better default for multi-queue deployments, but it is a second behaviour (alongside auto/simple/none) that changes how many workers a given queue actually gets. Teams should not change scaling strategy and supervisor ownership in the same change window.Key questions
memory_limit default: what master size should be expected per N workers, and what restart backoff does the maintainer recommend so exit-12 does not become a flapping loop?redis/sqs support that changes the Horizon comparison?autoScalingStrategy, and how log interacts with queue priority and auto — what happens on worker crash under each?php artisan meridian intended as a singleton (multi-node, Octane)? Unchanged and still important.meridian:prune defaults and per-status retention — specifically, is silenced retention separately configurable from completed?meridian_* migrations and config keys (the "defaults apply when missing" pattern is good — is it a guarantee)?Stack fit
queue:work under systemd/supervisord, no Redis and no appetite to add it.log strategy, and dev teams gain a no-Node local listener. It narrows fit nowhere.Migration path
composer update, then two config additions (memory_limit, watch — defaults apply if missing), then republish Blade views if they were published. No migration, no data backfill.queue:work processes via heartbeats, so observability can land before supervision.waits before upgrading. Either populate waits explicitly per queue, or consciously accept the 60s default, or set 0 on queues that should not alert.Compatibility
pcntl/posix present in the built production image.snapshot/prune) for multi-node deploys; unchanged.--poll tuning on network filesystems / Docker-on-macOS bind mounts where file-change polling is unreliable.Sequencing
waits config and decide per queue: explicit wait, 0 to disable, or accept 60s. Populate config first, then upgrade, so the new default never takes effect unconfigured.memory_limit and watch keys, run migrations if new, enable history on one low-volume queue. Measure row growth including silenced jobs. No supervisor change.viewMeridian mapped to real roles, middleware/domain/prefix set, JSON API confirmed non-anonymous, payload retention decided, Silenced tab included in the authorization test. Add a 403 assertion for both web and API routes.meridian:prune cadence against measured growth, confirming silenced retention is covered. Tune LongWaitDetected to a single owner per connection:queue.log only after baseline load is understood. Keep queues disjoint from legacy workers.meridian:listen out to the team as the standard local workflow, with --poll guidance for Docker/WSL.queue:work.Maintenance
memory_limit is mis-set.memory_limit, watch, waits semantics, autoScalingStrategy). Config drift across environments becomes a plausible failure source; keep config/meridian.php in version control and diff it at upgrade.jobs table shape). Pin the package, upgrade alongside Laravel, and keep a staging queue that exercises batch/bulk/pushRaw paths.Support
meridian:listen feature reduces a specific support burden — dev-environment setup issues — which is a genuine, if modest, operational saving.meridian:status, pause/continue/terminate, retry/cancel, what "long wait" means (now 60s by default), what exit code 12 means and what to do, and how to tell a scaling-strategy problem from a throughput problem.Scaling
jobs-table polling cost, worker count against one database. Silenced-job retention adds to the first, and it is the one that will surprise teams who sized prune before upgrading.log auto-scaling strategy is a real improvement for multi-queue deployments — it prevents head-of-line queues from starving small ones — but it does not add throughput. The database remains the ceiling. Keep the pre-agreed exit threshold (sustained volume or wait time at which the team moves to Redis/SQS + Horizon).snapshot/prune execution.Failure modes
waits config go from silent to 60s alerting on every queue simultaneously. Mitigation: populate waits before upgrading; single recipient per queue; flap suppression.memory_limit set too low for the worker count → exit 12 → restart → exit 12. Mitigation: size the limit against worker count, add a restart-rate alarm (not just a liveness check), and know that 0 disables the guard entirely.silenced, re-baseline retention at pilot.pcntl/posix absent: supervisor cannot start in the target image; may only surface in production if dev images differ. Mitigation: verify in the built image, add a startup assertion.log under-allocates workers to a genuinely large single queue in some shapes; changing strategy and supervisor ownership in the same window makes the regression hard to attribute. Mitigation: sequence the changes.Ramp-up
meridian:listen makes local setup meaningfully faster — no Node, no npm, one command. Install/config/staging verification remains ~0.5 day.waits audit and long-wait re-baselining, plus memory_limit sizing against expected worker count.log scaling) and one alerting default change, offset by reduced maturity and dev-setup risk.queue:work, and a confirmed waits configuration that was in place before the upgrade.How can I help you explore Laravel packages today?