caneara/quest
Quest is a Laravel package for adding a lightweight quest and task system to your app. Define multi-step quests, track user progress, and reward completion through a simple, fluent API with ready-to-use models and migrations.
Architecture fit. Quest is a lightweight finite-state-machine layer for Eloquent models: models adopt a trait, a Quest class declares ordered steps and transitions, and triggers drive state changes. This fits Laravel's idiomatic patterns well — it is container-resolved, config-aware, and does not impose a persistence schema of its own. v4.0.0 introducing configuration options moves the package toward the framework's standard config/quest.php + vendor:publish convention, which is a positive architectural signal: behavior that was previously hard-coded becomes tunable per application. For teams already modeling approval flows, onboarding, or order lifecycles, this is a reasonable alternative to heavier workflow engines.
Integration feasibility. Low-to-moderate effort. Integration is a composer require, a published config file, a HasQuests trait on the target model, and one or more Quest subclasses. No external services, queues, or migrations are mandated. The main integration work is domain modeling, not plumbing.
Technical risk. The headline risk is release hygiene, not code. A major semver bump (3.x → 4.0.0) with a changelog consisting of a single PR titled "Added configuration options" is a mismatch: either the config work carried breaking changes that are undocumented, or the major bump was applied loosely. Both cases are problematic for a production dependency. Secondary risks: a very small maintainer base with a first-time contributor driving the only change; unknown test coverage and PHP/Laravel version matrix for v4; and expanded config surface area that may silently alter default transition behavior.
Key questions.
composer.json?Stack fit. Fits any Laravel 9/10/11 application on PHP 8.1+. It composes cleanly with Eloquent observers, domain events, queued jobs, and policy-based authorization — transitions can be wrapped in transactions and dispatched to listeners without fighting the framework.
Migration path. Treat v4 as an unproven upgrade, not a routine minor bump:
^3.0 immediately so a transitive composer update cannot pull v4 unannounced.^4.0, publish the config, and diff the published config against hard-coded v3 assumptions to enumerate behavioral deltas.Compatibility. Verify composer.json constraints before anything else — a narrowed Laravel or PHP constraint is the most common cause of a surprise failure here, and it will not appear in release notes. Confirm that any app-level subclasses of Quest or overridden transition hooks still resolve against the v4 method signatures.
Sequencing.
Maintenance. This is a single-maintainer package with a recent first-time contributor. Bus factor is 1. Recommend vendoring or forking into an internal namespace, or at minimum a documented contingency plan, before making it load-bearing for a revenue-critical workflow.
Support. Configurability cuts both ways: it reduces the need to patch the vendor, but it increases the surface for misconfiguration. Internal documentation should enumerate every published key, its default, and the v3 behavior it replaces. Without that, "why did this record transition?" becomes an unbounded debugging exercise.
Scaling. Transitions are DB writes; concurrency is the scaling concern, not throughput per se. Two actors triggering transitions on the same record can produce lost updates or invalid intermediate states. Wrap transitions in transactions and evaluate optimistic locking (updated_at / version column) for high-contention models. Keep quest definitions in code, not per-tenant config, or you will lose the ability to reason about state globally.
Failure modes.
Ramp-up. Moderate. The quest/step/transition mental model is learnable in an afternoon, but contributors need a written convention for where quests live, how transitions are authorized, and how failures are handled. Budget one onboarding doc and one reference implementation before broadening adoption beyond the first team.
How can I help you explore Laravel packages today?