Repository navigation
v2.0.1
Contrack 2.0.1 adds a CardDAV connector for two-way or pull-only contact sync with Nextcloud, iCloud, Fastmail, Radicale, and Baïkal (#108), walks admins through Google OAuth setup directly in Settings, hardens background connector sync across Google, Gmail, IMAP, ICS, and CardDAV, and refines every section of Settings.
Added
- CardDAV connector (#235, #244): Sync contacts two-way or pull-only with Nextcloud, iCloud, Fastmail, Radicale, and Baïkal.
- Discovers address books automatically via
/.well-known/carddav,current-user-principal, andaddressbook-home-set(including cross-host partition servers such as iCloud), and lets you choose which writable address book to sync when a server hosts more than one. - Uses incremental
sync-collection(RFC 6578) reports with automatic fallback toPROPFINDETag scans andaddressbook-multigetbatching. - Preserves server-owned vCard properties (
PHOTO,NICKNAME, structuredADR, AppleITEM1.*labels,UID, and customX-*fields) when pushing local edits, guards updates withIf-Match/If-None-Match: *, and safely unlinks server-deleted or book-switched cards without moving your Contrack contacts to Trash.
- Discovers address books automatically via
Changed
- Guided Google OAuth setup (#237):
Settings → Administration → Generalnow walks through the five Google Cloud Console steps inline with a one-click copyable redirect URI, and the Connect Google dialog explains where an admin configures OAuth when credentials are not yet set.
Fixed
- Connectors & background sync (#236, #244):
- Retry connectors in
errorstate with exponential backoff (up to 6 hours) while pausing connectors that require re-authentication (needs_reauth). - Merge incoming Google Contacts fields into matched existing contacts instead of overwriting them, and only overwrite avatar photos when changed.
- Advance the Gmail
historyIdcursor only up to the last processed message when a run hits the per-run cap so remaining messages are picked up on the next sync. - Deduplicate cross-folder IMAP messages by
Message-ID, stream body fetches in bounded batches, and preserve all-day recurring ICS event IDs across time zones.
- Retry connectors in
- Settings — You (#238): Normalize usernames and emails before saving, skip no-op passkey renames, reject blank or unchanged passwords, refresh device sessions after a password change, and standardize error toasts across Account, Passkeys, Appearance, Network, Keyboard, and Privacy.
- Settings — Tools (#239): Reject empty or oversized import files upfront, clear stale errors when switching import tabs, lock duplicate merge/dismiss actions while a mutation is in flight, and avoid flashing an empty state when clearing an enrichment search.
- Settings — Your data (#240): Add search filters to Archived contacts and Trash, offer Undo when restoring an archived contact, allow case-only tag merges, prune hidden selections when filtering, and keep cached rows on screen when a background refetch fails.
- Settings — Connect (#241): Accept
webcal://calendar URLs, stripimaps:///imap://prefixes and ports pasted into IMAP host fields, preserve leading/trailing spaces in CardDAV and IMAP passwords, and add a search filter and optional contact name prompt to Correspondents. - Settings — Administration (#242): Keep cached AI settings and Audit log entries on screen when a background refetch fails, reject non-decimal SMTP port strings, clamp numeric retention inputs on blur, and validate invitation email addresses as you type.
Full Changelog: v2.0.0...v2.0.1