Edit-as-draft buffer
Quay’s biggest safety differentiator: no edit hits the database until you say so.
The buffer
Section titled “The buffer”Every cell edit, every row insert, every row delete in the data grid goes into a pending-edits buffer scoped to the current session. The buffer is in-memory; closing the session drops it (Quay asks first if there’s anything pending).
You can see what’s pending at any moment:
- Amber dot in the breadcrumb — there’s at least one pending edit
- PendingEditsStrip at the top of the grid — count + Discard +
Commit (
⌘S) - Review modal (opens at >1 pending edit, or always on prod) — full diff per edit, target table, old → new value
⌘S commits the buffer through one transaction:
- Non-prod: commits silently if everything looks normal. If the buffer has more than 1 edit, opens the review modal first as a consistency check.
- Prod-tagged connection: review modal always opens. You type the connection name to enable the Commit button. See Confirmation rules.
⌘R refreshes the data — discards the pending buffer (asks first if
non-empty), refetches the rows.
What goes in the buffer
Section titled “What goes in the buffer”| Operation | Captured? |
|---|---|
| Cell edit (UPDATE one column) | ✅ |
| Row insert (new row) | ✅ |
| Row delete | ✅ |
| Multi-cell paste | ✅ (one entry per cell) |
| Bulk transform (e.g. uppercase column) | ✅ (one entry per row) |
| Schema change (ALTER TABLE) | ❌ — runs immediately, requires typed-name confirm if destructive |
| TRUNCATE / DROP via the dropdown | ❌ — typed-name confirm, immediate execution |
Direct SQL in the editor (UPDATE …) | ❌ — runs as written, no buffer |
The buffer covers the grid editing path — direct SQL in the editor doesn’t go through it because the user already typed the SQL (they know what they’re doing). The buffer protects against the common case: you edited a cell at 3am and didn’t realise.
Across all engines
Section titled “Across all engines”Edit-as-draft works on every engine that supports row-level updates:
- SQL family (PG / MySQL / SQLite / MSSQL / DuckDB / ClickHouse / etc.)
- MongoDB (per-document edits, batched into a single
bulkWrite) - Redis (key-value edits, batched into MSET / DEL on commit)
- Cassandra, DynamoDB, Firestore, Elasticsearch
For graph engines (Neo4j) and append-only engines (BigQuery), the buffer is read-only — you write through SQL/Cypher, not through the grid.
Review modal
Section titled “Review modal”When the modal opens, you see one row per pending edit:
[ ] users.email "ada@old.com" → "ada@new.com"[ ] users.subscription_tier "free" → "pro"[+] new row: orders ⏎ 12 fields[-] DELETE: products WHERE id=42 1 row affectedUncheck any row to skip it for this commit (the rest stays pending). The “Commit checked” button does exactly that. Targets that are prod-tagged require typing the connection name regardless of how many rows are checked.
Why it exists
Section titled “Why it exists”Database GUIs traditionally commit on focus-leave or on Enter. That makes single-cell edits cheap and bulk edits dangerous — the same keystroke that “saves my draft email” can run an UPDATE without WHERE. Quay’s buffer separates “I’m working on this” from “I’m shipping this” with a single explicit step (⌘S + the modal).
The cost is one extra keystroke per session of edits. The benefit is that “I just want to look at the row and not change anything” is the default — you can browse and tab through cells and never accidentally write.