lexal/http-stepped-form
A Laravel package for building HTTP-driven multi-step forms, where each step is handled by its own request while preserving state, validation, and navigation across the flow. Ideal for wizard-style forms that need server-side step management.
Architecture fit. The underlying pattern — server-rendered, one HTTP request per step, state persisted between requests — is a legitimate and often superior alternative to client-side wizards for regulated or high-friction flows (onboarding, KYC, claims intake, multi-part applications). It degrades gracefully without JavaScript, keeps validation server-authoritative, and produces an auditable request trail. Fit is strong only if the host application is a classic Laravel stack (Blade + session + POST/redirect/GET). If the target surface is Inertia/React/Vue or Livewire, the package duplicates state ownership that the frontend already holds, and you will end up with two competing sources of truth for "current step." That is an integration tax, not a feature.
Integration feasibility. Low-to-moderate, with one gating unknown: whether the package targets Laravel's HTTP kernel (Illuminate\*, Symfony HttpFoundation) or is framework-agnostic (PSR-7/PSR-15 middleware, or a plain PHP state machine). If it is PSR-15, it will not drop into Laravel's middleware pipeline without an adapter, and you should budget for that explicitly rather than discovering it mid-sprint. Composer installation itself is trivial; the real work is wiring step definitions, validation handoff (FormRequest vs. package-owned rules), and rendering. There is no evidence of a Laravel service provider, config publish, or facade, so assume you own the glue code until proven otherwise.
Technical risk — high. Concretely:
Key questions to resolve before any commitment:
composer.json PHP and illuminate/* (or framework) constraints, and is Laravel 11/12 supported?Stack fit. Assume a Laravel monolith on PHP 8.2+, Blade views, session driver backed by Redis or database. That is the happy path. Explicitly out of scope: stateless API-only services, multi-tenant apps where session scoping is per-tenant, and anything running on Laravel Octane unless question 5 above clears. For Inertia or Livewire frontends, prefer implementing the wizard in the frontend framework and using this package only as a reference design.
Migration path. Do not adopt as a dependency of record on day one. Instead:
SteppedForm contract in your domain layer and implement it with the package behind an adapter. Controllers, Blade partials, and tests talk to your interface only. This makes the escape hatch — swap to a hand-rolled state machine or a Livewire wizard — a one-file change, and it is the single highest-value decision in this engagement.composer.lock, and mirror the repo to an internal fork you control so a deleted repository cannot break your build.Compatibility. Validate against your actual session driver, not the default file driver — Redis/database sessions change expiry semantics for partially completed forms. Confirm behavior behind a load balancer with multiple app nodes and a shared session store. Check interaction with VerifyCsrfToken, TrimStrings, and ConvertEmptyStringsToNull in the global middleware stack, since these mutate step payloads before the package sees them. Confirm route-level middleware (auth, throttle, verified) composes cleanly with whatever routes the package registers or expects.
Sequencing.
Maintenance. You should plan to own this code in practice, regardless of what the license says. MIT grants you the right to fork; assume you will. Budget a recurring line item — roughly 1–2 engineer-days per quarter — for dependency review, composer audit triage, and upstream-drift checks. Because adoption is near zero, you will receive no incidental bug reports from the community; every defect is one your own users find.
Support. No Stack Overflow corpus, no tutorial ecosystem, no third-party blog coverage. Onboarding material must be written internally: a one-page architecture note plus a working example flow. Treat upstream documentation as a hint, not a contract; read the source for anything load-bearing.
Scaling. The scaling concern is not throughput — form steps are low-QPS — it is state accumulation. Every abandoned flow leaves a persisted step snapshot. Estimate: at 10k monthly starts and a 40% abandonment rate, you are storing 4k orphaned partial records per month. That requires a TTL and a scheduled pruning job from day one, plus an index on the (user, flow, updated_at) key. On the read path, verify the package does not perform an unbounded query for step history. Session-driver-backed state is cheaper but caps at your session TTL, which will silently expire long forms — decide the maximum acceptable form duration explicitly.
Failure modes to design against:
Ramp-up. The API surface is almost certainly small, so individual developer ramp-up is fast — half a day for a mid-level Laravel engineer to be productive inside the adapter. The real ramp-up cost is institutional: nobody outside the team has written about this package, so the knowledge is entirely tribal. Mitigate with the internal architecture note and one canonical example flow in the codebase.
TPM recommendation. Treat lexal/http-stepped-form as a reference implementation and pattern source, not a dependency. The problem it addresses is real and the opportunity score (31.63) suggests genuine demand; the artifact (16.27, 1 star, 0 dependents, single maintainer, future-dated release) does not meet the bar for a customer-facing dependency. Run the spike, mine the source for the state-machine and step-advance logic, and implement the adapter yourself if the pattern proves out. You keep the 2–3 days of design thinking that is genuinely valuable and shed the abandonment, security-review, and support risk that is not.
How can I help you explore Laravel packages today?