Scott
Scott

Published on Oct 13, 2026, updated on Oct 13, 2026

Undo and redo are safety controls for creative work. They should make the last reversible change obvious, preserve the user’s place, and explain what will be restored. Begin with a clear history model, then test compound actions and collaboration conflicts. A shared UI design collaboration workspace helps teams review the before-and-after states instead of debating an abstract rule.

Undo and redo UX showing before and after states with a change history

Model the change history users can predict

Users do not need an implementation diagram; they need to know what one undo will remove. Group actions by the user’s intention, not every low-level property update. “Move card and update its label” can be one history step when both changes came from a single gesture. Keep the label concrete enough to identify the affected object.

  • Show the action name and the object or area it affects.
  • Keep undo and redo available while the history has a valid next state.
  • Do not silently discard a branch when a new edit is made; explain what happens.

Design recovery for destructive or expensive edits

For deletion, bulk replacement, or a long-running generation, offer a reversible path close to the action. A toast can restore a small change; a confirmation dialog is useful when the consequences are broad or the action cannot be undone. Do not use a confirmation dialog to compensate for an unclear button label.

When undo restores a previous state, keep the viewport, selection, and focus stable whenever possible. If the user cannot see what changed, show a short highlight or a before-and-after preview. Recovery should reduce investigation, not create a second mystery.

Handle branches, shortcuts, and collaboration

Keyboard shortcuts should match the visible controls and work with the user’s platform conventions. If a new edit after undo creates a new branch, tell the user whether redo is still available. In a collaborative file, distinguish a local undo from reversing another person’s change; never imply that a personal undo rewrites the whole team’s history without confirmation.

  1. Test a single edit, a grouped edit, and a bulk edit.
  2. Test undo after switching frames, pages, or selection.
  3. Test a concurrent change and a reconnect after offline work.
  4. Test the empty-history and end-of-history states.

Make the branch rule visible

Consider a user who moves a card, presses Undo, and then changes its title. The title edit starts a new branch. If the earlier move is no longer available through Redo, say so in the history and keep the restored card position intact; if both branches can be recovered, show which one the next action selects. Test the sequence as a visible story: move, undo, edit, inspect Redo, reload, and reconnect. A user should never discover the branch rule only after losing work.

Check the boundary states

StateExpected feedback
Empty historyUndo is unavailable and no stale action label is shown.
End of historyRedo is unavailable after the newest state is restored.
Reconnect after offline workThe user can tell which local changes were kept, merged, or need review.
Concurrent editUndo identifies the local change and does not imply that a teammate’s edit was erased.

Review the recovery path in the prototype

Use a prototype to walk through the accidental-change story: make the edit, undo it, verify the restored state, and redo it. In Pixso, place the history states beside the main screen and leave a comment that names the expected recovery result. This gives reviewers a concrete path to inspect before the control is handed to development.

Pixso version timeline used to compare design iterations and recovery states

Measure success by recovery confidence: can someone identify the affected change, restore it, and continue without losing unrelated work? If not, simplify the history language or move the recovery affordance closer to the consequence.

Back to top
Share on X
Share on Facebook