New
-
Transactional emails are live. Scratch now sends three emails via SendGrid: one when your waitlist request is approved, one when you're invited to a workspace, and one when someone accepts your invite. They come from support@scratch.md.
-
The Affinity connector picks up two new tables: Notes and Entity Files. If you're syncing Affinity data, those are now available as data folders.
-
Shopify connections now use a custom app setup flow instead of OAuth. The old OAuth path had friction around app approval; the new guide walks you through creating a custom app directly.
Better
- The macOS dock icon was comically oversized. It now has proper margins and sits at the right size alongside your other apps.
- Pull-in-progress modal in the desktop app only appears when there are actually active jobs. Previously it could flash up and disappear for no reason.
- Column focusing in the desktop grid now works correctly when a filter is active.
- Null values in the desktop grid display cleanly instead of causing rendering oddness.
- The connection setup screen shows more information upfront so you can confirm details without extra clicks.
- HubSpot publishing now skips read-only properties instead of trying (and failing) to push them.
- WordPress error messages are more specific when something goes wrong during sync.
Under the hood
The biggest internal change: pull-all staging now uses a SQLite index instead of walking the filesystem on every batch read. The old approach had O(n^2) I/O that caused a production incident on April 17 for large pulls; this fixes it and makes jobs resumable after crashes. Pull job V1 and its feature flag are fully removed. Postgres and Supabase connectors now share logic instead of duplicating it. CI gained Windows build support and a fix for a race condition in draft releases, and Terraform alerts for the scratch-git VM got corrected.