I got tired of rebuilding multi-step form logic from scratch, so I built FormFlow
Every project I've worked on that needed a multi-step form ended up the same way: a tangle of useReducer, scattered localStorage calls, and validation logic duplicated across steps. The fifth time ...

Source: DEV Community
Every project I've worked on that needed a multi-step form ended up the same way: a tangle of useReducer, scattered localStorage calls, and validation logic duplicated across steps. The fifth time I found myself writing the same "which step are we on?" state machine, I stopped and built something reusable. That thing is FormFlow — a headless React hook for multi-step forms with conditional branching, Zod validation, and optional persistence baked in. The problem it solves Multi-step forms sound simple until you're deep in them: Conditional steps — "Show the salary step only if they're applying full-time" Partial saves — users abandon halfway through; you need to restore their progress Per-step validation — Zod schemas that gate the Next button before advancing Back navigation — going back shouldn't wipe the work they already did All of this is solvable, but it's a lot of boilerplate you rewrite every time. What FormFlow looks like import { useFormFlow } from '@shngffrd/formflow' import