Matt Milton is a senior Elixir engineer from Portland, OR who has shipped production systems for virtual power plants, smart home devices, and consumer fintech. He currently works as a Senior Software Engineer at Array. This is his first conference talk.
Every Phoenix app starts with a router. But when your UX requires multi-step flows, conditional branching, and resumable progress, the router becomes a state machine in disguise — and a poorly designed one.
This talk introduces a better pattern: modeling workflows as explicit, immutable data. Instead of routes that encode user state, each workflow is a struct that knows the current screen, the path ahead, and the path behind. Navigation is a state transition, not a redirect.
The UX case is just as strong as the technical one. Exploratory interfaces — hub pages full of links — put the cognitive burden on users to figure out where to start. Guided workflows constrain the possible paths on purpose. Each screen has one job. Users don’t navigate; they progress.
We’ll also look at how compile-time error boundaries apply Erlang’s “let it fail” philosophy at the UX layer — catching failures at the boundary and returning users to safe state, rather than scattering defensive code everywhere. This talk is about knowing when you’ve outgrown the router.
Key takeaways:
Target audience:
This talk will appeal to Phoenix and LiveView developers who have built multi-step flows and felt the strain of encoding user progress in routes and session state. It will also resonate with JavaScript developers familiar with Elm or Redux who are curious how unidirectional, state-driven UI patterns translate into Elixir.
More broadly, anyone building applications where user experience depends on guiding people through a process — onboarding, enrollment, checkout, configuration — will find the architectural pattern immediately applicable to their own work.