A calmer way to submit

Async actions,
handled.

One typed flow for pending states, confirmations, success, errors, and cancellation. Bring your form library. Keep your UI.

◈ Zero additional runtime dependencies. React is the peer.
Live example Interactive
flow.statusidleflow.pendingAction—
A small API

Keep the work. Lose the busywork.

Write the action once. Your components get useful state and thoughtful feedback automatically.

const flow = useSubmitFlow({
  save: {
    run: async (values) => saveProfile(values),
    pendingLabel: 'Saving…',
    success: 'Profile saved.',
  },
})
Made for real apps

Plays well with your stack.

↗

More than one button

Save, publish, delete, cancel, and back actions can share a form while keeping behavior clear.

◎

Dialogs that know the flow

Confirm a change, keep the dialog open while it saves, then show success or a clear error.

⌘

Works with what you use

Bring native forms, React Hook Form, your API client, and your existing visual system.

0

No added runtime dependencies

React is the required peer. No extra dialog, toast, or form-state package is pulled into your app.

See the dependency details →
Start with one action

Your next submit can feel effortless.

Read the quick start →