Parity

Sheets ↔ MySQL sync engine · 2026
operational

Teams live in Google Sheets, but their apps need a real database. Parity keeps the two in sync both ways, in real time, without anyone exporting a CSV again. When both sides change the same row, the last write wins.

# numbers

throughput
52K
rows/sec written
tests
99
unit · int · e2e
load test
10K rows
run in CI
setup
1 command
docker compose up

# how it works

sheet → db
Google Sheetsuser edits a cell
Apps ScriptonEdit → webhook
db → sheet
MySQLapp writes a row
Pollerrow fingerprint diff
coreRedis + BullMQdedupe bursts · backoff retries
Sync workerlast-write-wins · new cols → new MySQL cols
Dashboardlive via WebSockets
Both directions land on one queue, so every conflict resolves in one place.Google API mocked in benchmarks

# decisions

A queue, not direct writesSheets fires bursts of edits. BullMQ dedupes them and retries with backoff, so a flaky API never loses a row.
Last write winsSimple and predictable for spreadsheet users, who expect their latest edit to stick.
Dynamic schemaA new column in the sheet becomes a new MySQL column, so nobody writes a migration for a spreadsheet change.

# stack

Node.jsExpressMySQLRedisBullMQWebSocketsReactDocker ComposeGitHub ActionsJestApps Script