Autosave with save indicator
No save button: edits persist on their own, and a small label tells you whether the work is actually safe.
See it
What it is
Two halves that only work together. The autosave persists edits on its own, usually debounced 500ms to 2s after typing stops, plus a forced write on blur and on 'visibilitychange' or 'pagehide'. Not on unload: an async request fired as the page goes away usually dies with the page. The indicator is the small status cue that cycles through 'Editing', 'Saving...', 'Saved 2:41pm' so the user can see their work is safe. Google Docs made the pattern famous with 'All changes saved in Drive'; Notion and Figma made people expect it everywhere.
Reach for it in editors and drafts, where losing work costs real time and every edit is reversible anyway. Skip it where the save has side effects the user should aim at deliberately: publishing, sending, charging a card. Those want an explicit commit button.
Gotcha: autosave that fails quietly is worse than no autosave, because people stop watching. If the network drops, the label has to say 'Couldn't save, retrying' and keep a local copy, not keep showing 'Saved'. Make that local copy the newest draft rather than the last thing the server accepted, or the crash takes precisely the edits that had not landed yet. Two smaller traps: flashing 'Saved' for 80ms means nobody sees it (hold it a second or two), and autosave without version history is just a very fast way to overwrite something good.
Ask AI for it
Implement autosave with a save indicator for this editor. Debounce a versioned save to 800ms after the last keystroke, and write the newest draft to local storage immediately on every change so unsaved edits survive a crash. Flush on blur and on 'visibilitychange' or 'pagehide'; do not depend on an async request fired from 'beforeunload', and reach for 'sendBeacon' only if the endpoint accepts it. Drive a small status label next to the title through the states that matter: idle (blank), 'Saving...' with a subtle spinner, 'Saved <relative time>' with a check, and 'Offline, unsaved changes' in a warning color with a manual 'Retry' action. Hold the saved state visible for at least 1.5s so it is readable, never let the label show 'Saved' while a write is failing, and on reload compare the local draft with the server copy and offer to restore the newer one.