I was building MiniSlack, a hands-on project to learn system design and microservices, when I hit a wall in a form component.

It was just three fields, but once I added client-side validation, the setup no longer looked clean.

The app was going to have more forms, so reaching for a form library made sense. I wanted something more powerful than a thin wrapper over native form elements, which ruled out Radix Form. But the more powerful options, Formik, React Hook Form, and TanStack Form, all felt heavier than form management should need to be.

I had built a form library for Lit before, so I thought I might build one for React too, as a learning experience.

As soon as I started prototyping, I ran into state management.