VCard VCF Standards

2025-10-02 · 6 min read

Standards are a myth. radicale

There exists a vCard standard in RFC 6350, it's well-described at https://www.rfc-editor.org/rfc/rfc6350. Unfortunately, no one seems to follow it, even the big players like Google and Microsoft.

This story starts with a nagging sense to complete my migration away from Google Contacts, which I recently realized was a task for Radicale. I'm already using Radicale to store and sync my calendar, and there is a provision to upload a .vcf (vCard contacts file) into a user's WebDAV account on Radicale to sync contacts as well as calendar.

The idea is that the WebDAV Contacts object is synced to the client, in my case, an Android contacts client app. Radicale and the Android client do a lot of heavy lifting here so that the contacts are simply picked up from Radicale and integrated into the contacts app automagically. It's a bit of a mystery to me how they work, exactly, but WebDAV is one of the Dark Arts, as far as I've known.

The first thing to do is get a vcf contacts file export.

These files are completely unencrypted and human-readable, so I encourage you to take a look at their structure, which is pretty simple: all entries are defined between the tags BEGIN VCARD and END VCARD.

You probably have an Apple or Google export, either from your phone or at https://contacts.google.com, where you can clean up and export your contacts.

Next, import them with the blue up arrow: Contacts upload dialog

And you may get this delightful response: Contacts upload error

I repeatedly tried to upload different versions of this vcf to no avail. So off to Github, where the answer was forthcoming:

Error message from logs:

Bad PUT request on '/user/container-data/': Failed to serialize item None from 'user/container-data': 'VCARD components must contain at least 1 FN'

I've found a workaround for this problem by editing file manually. Deletion of those two records from contacts.vcf makes import run successfully:

This was my issue. Several of my contacts had no valid FN value (First Name), like when I named a contact using the "company" field, it had no FN value. 2 other contacts had no FN value, either. Rather than use the vi substitution regex pattern as argued about in the Github issue, I simply used search/replace in gedit to fix this. Anyway, it doesn't matter what you use, you just need a value in FN for each contacts.

Now I have a working, privately run, syncing contacts list and I've been able to trash all the contacts I had previously at Google. Closer to being free of G.

Address Book Added

Addendum: It turns out that VCF version should also be search/replaced to avoid breaking Radicale; VERSION:2.1 needs to be replaced with VERSION:3.0, something to do with it being complicated to intake v2.1 vcard files.

*
Jules