satoved/laravel-livewire-steps
Lightweight Livewire component for building wizards (multi-step forms). Each step is a Livewire 3 form object, while a single WizardComponent handles navigation. Extend WizardComponent, list your steps as public properties, and render the current step with minimal code.
Build vs. buy for multi-step flows. The core decision this package informs is whether a wizard is worth building in-house. It is roughly two base classes on top of Livewire 3 form objects, so the honest comparison is "~1–2 days of engineering to hand-roll" versus "one Composer require." Verdict: buy when the flow is linear and server-validated; build when the flow is branching, resumable, or regulated.
Scoping onboarding, intake, and signup flows. The credible first use cases are 2–3 step linear flows: onboarding intake, newsletter/lead capture, contact-with-confirmation, KYC-lite questionnaires. These are exactly the flows that otherwise sit in the backlog because "it's just a form" — this package makes them a small, scheduled ticket instead of a vague one.
Deliberately not checkout or payments. The package provides step sequencing and per-step validation and nothing else. Payment idempotency, stock, retries, and audit logging remain product-owned work. This is a scoping decision, not a technical one: keep high-stakes flows off this until the team has run two low-stakes wizards through it.
Roadmap sequencing for "resumable" and "progress UI." Two capabilities product will inevitably ask for are explicitly out of scope of the package: persistence across refresh (defaults restart at step one) and any progress bar, back button, or step labels. Treating them as known roadmap line items — not surprises — is the right framing when sizing a wizard epic.
Reusability as an architectural commitment. Steps are reusable form objects, so the same "EmailStep" can be embedded in more than one wizard. That supports a product decision to standardise on shared step definitions (e.g. one canonical address block) rather than letting each flow invent its own, which reduces drift in validation rules across surfaces.
Conditional/skip logic is available but unowned. Skip-step landed in v1.1.0 and is undocumented. A PM can decide to not commit to conditional flows in a release until engineering has read the source and confirmed semantics — cheaper to defer a feature than to ship a wrong branch.
Vendor and platform-support risk is low but should be tracked. Recent releases are compatibility bumps (Livewire 4, Laravel 13), which is a healthy signal for a package this small: it is being kept alive against the framework. The counter-signal is 6 stars and zero dependents — effectively one maintainer. Because the surface area is two classes and the licence is MIT, the mitigation is cheap (fork or vendor), so this should not block adoption, but it should be a line in the risk register rather than an unstated assumption.
Consider it when all of the following hold:
spatie/laravel-livewire-wizard, which costs two component requests per step. If step latency or request count is a live concern, this is the differentiator.app/.Look elsewhere, or budget for real engineering, when:
For executives (one line): It turns our recurring "multi-step form" backlog items into small tickets without adding a dependency we can't walk away from — it's ~two classes of code under a permissive licence, so the downside is bounded and the time saved is per-flow.
For engineering leadership:
BaseWizard in app/ that every wizard extends, route all step markup through Blade views rather than the README's inline strings, and qualify every wire:model and @error with the step property name. That single wrapper is our exit ramp — if the package stalls or a Livewire upgrade breaks it, we swap one file, not every wizard.BaseWizard seam makes replacement a contained task. Recommend adoption for low-stakes linear flows only, with the first two wizards treated as a deliberate trial before any high-stakes flow is committed to it.How can I help you explore Laravel packages today?