feat: add Airtable CMS sync integration by tristan-mouchet · Pull Request #127 · ycode/ycode

added 10 commits

April 1, 2026 17:18
- Add human-readable field type labels in mapping UI
- Filter attachments by MIME type based on target CMS field
- Extract correct property from button/collaborator fields by CMS type
- Skip complex objects in lookup/rollup value transforms
- Hoist compatibility Sets to module scope for O(1) lookups
- Precompute mapping grid lookups with useMemo
- Fix stale connections reference after sync refresh
- Block collection deletion when Airtable connections exist
- Clean up Airtable webhooks on app disconnect
- Add disable auto-sync option in connection dropdown
- Add daily cron to refresh webhooks before expiration
- Clear webhook fields and show expiration notice on refresh failure
- Track webhookExpiredAt to surface expired state in UI
- Ping notification URL to detect auth/reachability issues early
- Use ToastError for structured title + description error toasts

@tristan-mouchet

- Extract shared sync setup into prepareSyncState, classifyRecords,
  and executeBatchOperations so both full and incremental paths reuse
  the same logic
- Add listRecordsByIds using filterByFormula to fetch only changed
  records from Airtable
- Webhook handler now parses per-record changes from payloads and
  runs incremental sync, falling back to full sync above 100 records

@liamwalder

@liamwalder

@liamwalder

Reuse the shared URL utility instead of an inline fallback chain,
picking up VERCEL_PROJECT_PRODUCTION_URL for zero-config Vercel deploys.

Made-with: Cursor

liamwalder