Web Engineering

Forms deserve the boring states

1 min read

The empty state is only the opening scene.

A real form moves through empty, dirty, invalid, waiting, failed, saved, restored, and permission-blocked states. Those labels do not need to appear in the interface, but the implementation needs to account for them.

Empty should provide enough context to start. Dirty should protect work if the page changes or the tab closes. Invalid should identify the field and the correction. Pending should keep the request alive without allowing the same intent to fire repeatedly. Success should describe what happened, especially if a background job or side effect started.

Recovery exposes the quality of the design. Can a user fix one field without redoing the rest? Can they distinguish a timeout from a successful submission? Can they return to a draft? Can they recover from a partial save?

A form that survives those questions is doing product work. A form that only survives the screenshot is still a mockup.

Jeremy London

About Jeremy London

Engineering leader and builder in Denver. I write about AI platforms, agents, security, reliability, homelab infrastructure, and the parts of engineering work that have to survive production.