iPad - Contacts don’t sync avatars

Issue Description

Contacts on iPadOS 26 do not appear to be syncing avatars (either upload or download).

Can confirm on android with dav5x it works fine on that device.

Stalwart Version

v0.16.x

Installation Method

Binary (Linux)

Database Backend

PostgreSQL

Blob Storage

PostgreSQL

Search Engine

PostgreSQL

Directory Backend

Internal

I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.

on

I have searched this support forum (open and closed topics) and confirm this is not a duplicate.

on

I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.

on

The contact card implementation uses the calcard library’s JSContactValue with a BlobId type, meaning photos/avatars are represented as blobs in JSContact. The search of the server source code found no explicit photo or avatar handling beyond what the calcard library provides. Let me check whether this is a known iPadOS-specific issue or a CardDAV protocol-level limitation.

I couldn’t spot a server-side fault in the photo round-trip from the code alone, so I need the actual payload to go further. Could you grab the vCard the iPad receives for one affected contact (curl the contact’s .vcf with the header CardDAV-Max-Version: 3.0, or capture what iOS GETs) and paste the PHOTO line? And was the photo originally added on an Apple device or elsewhere? That decides whether it’s stored as an inline v3 photo or a v4 data: URI.

One thing I want to rule out: in the v3 downgrade we emit PHOTO;ENCODING=b: without a TYPE= media-type parameter, and some iOS versions are picky about that. The .vcf will tell me if that’s what’s happening. It’s also worth confirming iOS is actually re-fetching the changed cards (the sync-token/CTag advancing) rather than skipping them.