New
-
Sync delete strategy. CRM Mirror syncs can now delete destination records whose source disappeared, instead of only archiving or ignoring them. Opt-in per sync. Enabling it on a live sync shows a confirmation, and deletions flow through normal publish review before anything hits the service.
-
Weekly and monthly schedules, with timezone support. Pull, sync, and routine schedules now offer weekly and monthly frequencies alongside the existing fixed intervals, each with a "when to run" picker (time of day for daily; day of week + time for weekly; day of month + time for monthly). Schedules are now timezone-aware: they fire at your local wall-clock time and track DST.
-
HubSpot: much more complete field coverage. Activity and commerce objects (Meetings, Calls, Notes, Tasks, etc.) were previously showing only 7 to 8 generic fields. They now surface their actual content. Association columns (contacts, companies, deals) appear as foreign-key links, and column labels use HubSpot's own property display names instead of raw identifiers.
-
Desktop: Publish all shows what's waiting. The Publish all button now shows a count of approved-but-unpublished changes, and hovering it opens a breakdown by connection and data folder.
Better
-
Shopify products grid leads with the editable body field. The default view was showing the read-only plain-text
description;descriptionHtml, the writable field, was buried in the column overflow. Now it's up front. -
Attio values render cleanly in the grid. Attio stores every attribute as a value array, so cells were showing raw JSON. They now render as text, numbers, checkboxes, and URLs as appropriate.
-
Sync routines discard leftover pending changes before running. A routine starting with stray, never-published edits in the working tree could pollute the pull → sync → publish chain. The routine now clears that state first and reports what was discarded.
-
Record matching works in both directions. Syncing from Postgres to Notion (and other object-valued services) was failing with "invalid value for record matching field." The match comparison wasn't extracting the canonical primitive from each side independently. Fixed.
-
Desktop tables with no schema file now show their data instead of blank pages.
Fixed
-
Connector record deletes were silently dropped on publish, a regression from last week's delete-path rework. Deletes now route correctly to the connector repo and publish.
-
Desktop sidebar Scratch section wasn't refreshing after folder create or delete.
-
Validation crashed on folders with tens of thousands of records due to a SQLite variable limit. Fixed.
-
Approved-edit files corrupted with trailing NUL bytes (from cloud-sync placeholders or power-loss zero-fill) now self-heal on read instead of hard-blocking all review and publish operations.
-
Notion: empty-value clearing and publish failure double-counting.
Under the hood
- Bearer-token auth between the server and the scratch-git service is wired up (receiving end live, stays backward-compatible while the sending side rolls out).
- Admin tooling to diagnose and repair a corrupt connection git repo.
- Airtable OAuth scope expanded to include
schema.bases:write. - Storybook added to the desktop design system.
- Validator: error severity now beats warning at a shared path, anyOf/oneOf nullable-object members are recursed correctly, and dedup uses path segment vectors instead of joined strings so literal-dot keys don't collide with nested paths.