Skip to content
Rowsafe
Docs

Marks

A named restore point you set before a risky change.

A Mark names a moment, like before-drop-legacy-orders, so you can rewind to exactly it: everything before is there, nothing after. Easier to find at 3 a.m. than a timestamp.

Set one before a migration, a backfill, a bulk delete, or anything an AI agent is about to run. Use the database's page, or:

rowsafe mark app before-migration-42

It returns once the Mark is safely in your bucket, usually in seconds. AI agents set Marks through Guard. To use one, click Restore a copy at this Mark on the Marks page.

Names

  • 1 to 63 characters: lowercase letters, digits, - and _, starting with a letter or digit. Unique per database.
  • No name: manual-<UTC time> (for example manual-20260924-140500). AI agents default to agent-<UTC time>.
  • In a project with a .rowsafe.json, skip the database: rowsafe mark before-drop.

List them

On the Marks page, or rowsafe marks app:

NAME                 STATUS    CREATED              RESTORE FROM BACKUP  LSN         BY
before-migration-42  archived  2026-09-24 14:05:12  20260921-010002F     0/5A000090  key:key_... (CLI · rowsafe CLI on laptop)
StatusMeaning
archivedConfirmed in your bucket. Safe to restore to.
unconfirmedWritten, but archiving didn't confirm it within the timeout (90 seconds by default). Usable only if the archive has since moved past it. You also get an alert.
pendingBeing created.

Restore from backup is the backup a restore to this Mark starts from. You only need it to restore by hand.

Good to know

  • Cheap: on PostgreSQL, two SQL calls and one WAL segment.
  • Needs an active database.
  • Never waits behind a running backup or Proof.
  • Recorded in the audit log with who set it.
  • Rowsafe sets one by itself before bringing back rows, rewinding a whole database or removing an index.

On PostgreSQL

Rowsafe calls pg_create_restore_point(name), then pg_switch_wal(), and waits until that segment is archived.

Edit on GitHub