Undo is a great UX improvement for destructive actions. My approach is: on destroy, soft-delete the record (or keep enough data to restore), remove it from the list via turbo_stream.remove, and append a toast with an “Undo” link. Clicking “Undo” hits a restore action that re-inserts the item via turbo_stream.prepend. This pattern keeps everything server-driven, and it works across tabs if you add broadcasts later. It’s also safer than a client-only undo because the server remains authoritative about whether restoring is allowed. The main detail is to store deleted records (soft delete) or keep a window during which restore is possible. I often use a discarded_at column or a deleted_at timestamp and scope queries accordingly.