pixelworxio/livewire-workflows
Build multi-step Livewire workflows in Laravel with zero boilerplate. Define onboarding, checkouts, and surveys using an expressive DSL and get automatic route registration, guard-based navigation, state persistence, and Livewire 4.x support.
passes() = true → skip step, false → show step) makes "conditional step" a first-class product primitive instead of a branching flowchart. This lets you ship a long onboarding as one workflow and add/drop steps per segment (verified vs. unverified, business vs. consumer) without re-architecting navigation — useful for A/B tests and progressive rollout of new required steps.resumeUrlFor() links plus WorkflowAdvanced/WorkflowCompleted events give you the two things you need to justify investment in re-engagement: a deep link back into the exact incomplete step, and an event stream for funnel analytics. If your funnel data shows drop-off at step 3, this package makes the recovery experiment cheap.#[WorkflowState(encrypt: true)] and a swappable state repository (session / Eloquent / null) mean "where does partial checkout data live, and how long do we keep it?" becomes a config decision you can make with legal/security early, not a refactor later.routes/workflows.php (with make:workflow, workflows:scan, workflows:audit) makes the flow diagram a reviewable artifact in code review, rather than tribal knowledge in a Figma file. That's a real lever on onboarding new engineers and on QA test-plan generation.Consider it when:
#[WorkflowStep], #[WorkflowName], #[WorkflowState]) — the ergonomics depend on them.Look elsewhere when:
order; there's no native branching into divergent parallel tracks or merge points. Complex approval chains with re-entry and rejection loops will fight the model.passes() = true means skip this step).Adoption gate for a pilot: pick one non-critical, non-regulated journey (employee onboarding or a preferences flow, not checkout), run it with the Eloquent repository, and confirm two things — that your team reads guards correctly without a doc lookup, and that the events give you funnel data you'd actually act on.
For executives (one paragraph): Every product we ship seems to grow a guided, multi-step setup experience — onboarding, verification, checkout, application intake. Today each one is bespoke plumbing: routing, step order, back buttons, progress, "where did this user stop." This package is a small, MIT-licensed Laravel library that makes that plumbing declarative — about a page of configuration instead of weeks of engineering — and hands us funnel analytics, abandonment resume links, and encrypted partial-state storage as defaults. The trade-off is maturity: it's early (small community, no downstream dependents), so we're proposing a contained pilot on one internal-facing journey rather than betting a revenue-critical flow on it. Upside is measured in saved engineering weeks per journey and faster experimentation on where users drop off; downside is bounded because the license lets us fork if the maintainer stalls.
For engineering: Expressive DSL in routes/workflows.php with auto-registered routes (including dynamic params and route model binding), guard-based navigation via Laravel's Pipeline, and a InteractsWithWorkflows trait for Livewire components. State persistence is a repository-pattern abstraction — session, Eloquent, or null — swappable via config, with #[WorkflowState] attributes handling auto-hydration, namespacing, and encryption. Progress API, lifecycle events, and make:workflow / make:workflow-guard / workflows:scan / workflows:audit generators cover scaffolding and CI validation. Requires PHP 8.3+, Laravel 11–13, Livewire 3 or 4; tested with Pest, PHPStan level 2, Pint. Two caveats to plan around: guard semantics are inverted (passes() = true skips the step — enforce this in code review), and resume URLs require the Eloquent repository plus a set APP_KEY. Treat the dependency as forkable: pin the version, read the changelog on upgrade, and keep our workflow definitions thin enough that swapping the engine is a contained change.
How can I help you explore Laravel packages today?