VDIRSYNCER(1) vdirsyncer VDIRSYNCER(1) (NAME) vdirsyncer - vdirsyncer o o vdirsyncer . <> . vdirsyncer . vdirsyncer / . OfflineIMAP . VDIRSYNCER (WHEN DO I NEED VDIRSYNCER?) Dropbox + todo.txt (Why not Dropbox + todo.txt?) todo.txt . vim . : " Dropbox ". . . . git todo.txt . (Dropbox git ...) + vdir (Why not file sync (Dropbox, git, ...) + vdir?) vdir <> : o Syncthing o Dropbox o unison o git sshd. : o todo.txt Dropbox ( ). Dropbox . . khal UID . git : vdirsyncer . o . vdirsyncer CardDAV/CalDAV DAVx . / : o Arch Linux o Ubuntu Debian x86_64 ( ) o GNU Guix o macOS (homebrew) o NetBSD o OpenBSD o Slackware ( SlackBuild Slackbuilds.org) vdirsyncer 0.21.0 . . . Debian Fedora "stable" () vdirsyncer . . vdirsyncer . (copy-and-paste) . vdirsyncer Python "pip" . : o Python 3.9 3.14 pip. o libxml libxslt o zlib o Linux macOS. Windows #535 . Linux Ubuntu: sudo apt-get install libxml2 libxslt1.1 zlib1g python3 . Python . pipx: pipx Python . pipx (man pages) systemd . pipx vdirsyncer ~/.local/pipx/venvs/vdirsyncer . pipx vdirsyncer : pipx install vdirsyncer : pipx upgrade vdirsyncer : pipx uninstall vdirsyncer vdirsyncer ..SS pipx vdirsyncer : pip install --ignore-installed vdirsyncer o --ignore-installed (Debian) ( ImportError Requests <#debian-urllib3> ). : Pip . vdirsyncer ~/.local/lib/python* vdirsyncer . pip . : virtualenv . : virtualenv ~/vdirsyncer_env ~/vdirsyncer_env/bin/pip install vdirsyncer alias vdirsyncer="~/vdirsyncer_env/bin/vdirsyncer" .bashrc .bash_profile . : o ~/vdirsyncer_env/ . . o vdirsyncer ~/vdirsyncer_env/ . (TUTORIAL) vdirsyncer <>. . (Installation) <#installation> . (Configuration) : o config.example . o . type = "carddav" type = "caldav" fileext = ".vcf" fileext = ".ics" . o Known Problems <> . vdirsyncer : o VDIRSYNCER_CONFIG . o ~/.vdirsyncer/config. o $XDG_CONFIG_HOME/vdirsyncer/config ~/.config/vdirsyncer/config . XDG-Basedir . general <#general-config> status_path . : [general] status_path = "~/.vdirsyncer/status/" general pair storage . vdirsyncer . storage <#storage-config> pair <#pair-config>. OfflineIMAP repository account . ownCloud ~/.contacts/ : [pair my_contacts] a = "my_contacts_local" b = "my_contacts_remote" collections = ["from a", "from b"] [storage my_contacts_local] type = "filesystem" path = "~/.contacts/" fileext = ".vcf" [storage my_contacts_remote] type = "carddav" # We can simplify this URL here as well. In theory it shouldn't matter. url = "https://owncloud.example.com/remote.php/carddav/" username = "bob" password = "asdf" : Servers <#supported-servers> . vdirsyncer discover vdirsyncer sync ~/.contacts/ .vcf VCARD . [1] vdirsyncer sync CalDAV . filesystem <#storage-filesystem> carddav <#storage-carddav> . [2]. vdirsyncer discover . [1] <>. [2] ..SS " (More Configuration)" (Conflict resolution) vdirsyncer : 1. vdirsyncer () 2. vdirsyncer 3. vdirsyncer . "conflict_resolution" pair . "a wins" "b wins" : [pair my_contacts] ... conflict_resolution = "b wins" b = "my_contacts_remote" vdirsyncer . "conflict_resolution" "command" . : [pair my_contacts] ... conflict_resolution = ["command", "vimdiff"] vimdiff . . . Pair Section <#pair-config> . (Metadata synchronization) vdirsyncer <<>> ( "displayname" ) . . : [pair my_calendars] a = "my_calendars_local" b = "my_calendars_remote" collections = ["from a", "from b"] metadata = ["color"] [storage my_calendars_local] type = "filesystem" path = "~/.calendars/" fileext = ".ics" [storage my_calendars_remote] type = "caldav" url = "https://owncloud.example.com/remote.php/caldav/" username = "bob" password = "asdf" vdirsyncer discover . vdirsyncer metasync color ~/.calendars/ ownCloud . color ..SS <<>> ("Collection") . Carddav Caldav <<>> . (storage) << >> ("collection name") . filesystem <# storage-filesystem>-storage DAV URL . collections pair . "displayname" [3] . ( iCloud Google) (displayname) . [3] metasync metadata = ["displayname"] . : o "from a" "from b": vdirsyncer discover A/B . o null: (discovery) . . : [pair foobar] a = "foo" b = "bar" collections = ["from a", "from b"] [storage foo] type = "filesystem" fileext = ".vcf" path = "./contacts_foo/" [storage bar] type = "filesystem" fileext = ".vcf" path = "./contacts_bar/" ./contacts_foo/ ./contacts_bar/ . vdirsyncer . collections = null ./contacts_foo/ ./contacts_bar/ . ./contacts_foo/ ./contacts_bar/ .vcf .vcf . DAV . url carddav <#storage-carddav>- caldav <#storage- caldav>-storage CalDAV/CardDAV . null google_contacts <#storage-google_contacts> google_calendar <# storage-google_calendar> . ( ) . . vdirsyncer ( UUID ). . "Test" NextCloud iCloud . : NextCloud: https://example.com/remote.php/dav/calendars/user/test iCloud: https://p-XX.caldav.icloud.com/YYY/calendars/3b4c9995-5c67-4021-9fa0-be4633623e1c DAV . test 3b4c9995-5c67-4021-9fa0-be4633623e1c . <<>> (pair) : [pair doublecloud] a = "my_nextcloud" b = "my_icloud" collections = [["mytest", "test", "3b4c9995-5c67-4021-9fa0-be4633623e1c"]] mytest vdirsyncer sync doublecloud/mytest : " ". : displayname vdirsyncer "Test" ( "displayname" ) : o displayname . o displayname () . o displayname . . SSL . (Pinning by fingerprint) : [storage foo] type = "caldav" ... verify_fingerprint = "6D:83:EA:32:6C:39:BA:08:ED:EB:C9:BC:BE:12:BB:BF:0F:D9:83:00:CC:89:7E:C7:32:05:94:96:CA:C5:59:5E" SHA256 MD5 SHA-1 . CA . SHA256 : echo -n | openssl s_client -connect unterwaditzer.net:443 | openssl x509 -noout -fingerprint -sha256 Let's Encrypt . (self-signed) . (Custom root CAs) vdirsyncer CA : [storage foo] type = "caldav" ... verify = "/path/to/cert.pem" Vdirsyncer aiohttp `ssl.SSLContext https://docs.python.org/3/library/ssl.html#ssl.SSLContext`_ . . python aiohttp . verify verify_fingerprint . (Client Certificates) auth_cert . : [storage foo] type = "caldav" ... auth_cert = "/path/to/certificate.pem" : [storage foo] type = "caldav" ... auth_cert = ["/path/to/certificate.crt", "/path/to/key.key"] 0.7.0: . Vdirsyncer . (Command) : [storage foo] type = "caldav" url = ... username = "foo" password = "bar" (cleartext) . : [storage foo] type = "caldav" url = ... username = "foo" password.fetch = ["command", "~/get-password.sh", "more", "args"] : [storage foo] type = "caldav" url = ... username.fetch = ["command", "~/get-username.sh"] password.fetch = ["command", "~/get-password.sh"] storage. (shell) : [storage foo] ... password.fetch = ["shell", "~/.local/bin/get-my-password | head -n1"] pass : password.fetch = ["command", "pass", "caldav"] (Accessing the system keyring) command . . keyring . : pip install keyring : password.fetch = ["command", "keyring", "get", "example.com", "foouser"] : [storage foo] type = "caldav" username = "myusername" password.fetch = ["prompt", "Password for CalDAV"] (Environment variable) : [storage foo] type = "caldav" username = "myusername" password.fetch = ["command", "printenv", "DAV_PW"] ( CardDAV CalDAV). bash export : read -s DAV_PW "DAV Password: " && export DAV_PW (SYNCING WITH READ-ONLY STORAGES) WebCAL ( ) vdirsyncer A B B . : (Step 1: Create the target calendar) WebCAL . . URL CalDAV . URL . : (Step 2: Creating the config) vdirsyncer : [pair holidays] a = "holidays_public" b = "holidays_private" collections = null [storage holidays_public] type = "http" # The URL to your iCalendar file. url = "..." [storage holidays_private] type = "caldav" # The direct URL to your calendar. url = "..." # The credentials to your CalDAV server username = "..." password = "..." vdirsyncer discover holidays vdirsyncer sync holidays ..SS " : partial_sync" 0.14 . holidays . vdirsyncer sync (revert) . vdirsyncer (public holidays-calendar) . partial_sync ignore : [pair holidays] a = "holidays_public" b = "holidays_private" collections = null partial_sync = ignore <#partial-sync-def> . (FULL CONFIGURATION MANUAL) vdirsyncer ini . JSON JSON (string) : x = "foo" # String x = foo # Shorthand for same string x = 42 # Integer x = ["a", "b", "c"] # List of strings x = true # Boolean x = false x = null # Also known as None (General Section) [general] status_path = ... o status_path: vdirsyncer . . . << >> . (Pair Section) [pair pair_name] a = ... b = ... #collections = null #conflict_resolution = null o (Pair names) - (underscore) . o a b . o collections: (collections) vdirsyncer sync. << >> <#collections-tutorial> . "from a" "from b" vdirsyncer (autodiscovery) . A / B . ["config_name", "name_a", "name_b"] . name_a A name_b B . config_name CLI (logging) . : o collections = ["from b", "foo", "bar"] vdirsyncer B "foo" "bar" . o collections = ["from b", "from a"] vdirsyncer . o collections = [["bar", "bar_a", "bar_b"], "foo"] vdirsyncer bar_a A bar_b B foo . o conflict_resolution: (conflicts) . ( ) . << >> <# conflict-resolution-tutorial> . : o null . o "a wins" "b wins" . o ["command", "vimdiff"]: vimdiff . . o vimdiff . POSIX ["command", "cp"] "a wins" . o . ["command", "vimdiff", "--noplugin"] vimdiff --noplugin . vdirsyncer << >> . o partial_sync: A - (read-only) B . B vdirsyncer A . o error: . o ignore: . : B A . o revert (): . << ->> <#partial-sync- tutorial> . o metadata: vdirsyncer metasync . : metadata = ["color", "displayname", "description", "order"] : o color: http://apple.com/ns/ical/:calendar-color o displayname: DAV:displayname o description: CalDAV:calendar-description CardDAV:addressbook-description o order: http://apple.com/ns/ical/:calendar-order conflict_resolution . o implicit: (collections). : implicit = "create" "create" . . Storage [storage storage_name] type = ... o storage - (underscore) . o type . Supported Storages . o read_only . true . false . o storage . (Supported Storages) CalDAV CardDAV : Servers <#supported-servers> . caldav CalDAV. [storage example_for_caldav] type = "caldav" #start_date = null #end_date = null #item_types = [] url = "..." #username = "" #password = "" #verify = /path/to/custom_ca.pem #auth = null #useragent = "vdirsyncer/0.16.4" #verify_fingerprint = null #auth_cert = null start_date end_date . datetime.datetime . : start_date = "datetime.now() - timedelta(days=365)" end_date = "datetime.now() + timedelta(days=365)" . . item_types . ( (task) ) item_types = ["VEVENT"] . VJOURNAL item_types = ["VEVENT", "VTODO"] . o start_date -- -inf . o end_date -- +inf . o item_types -- . . . o url -- URL URL . o username -- . o password -- . o verify -- . SSL. SSL and certificate validation <#ssl-tutorial> . o verify_fingerprint -- . SHA256 . SSL and certificate validation <#ssl-tutorial> . o auth -- . basic digest guess. Basic auth . . guess . o auth_cert -- . . o useragent -- vdirsyncer . carddav CardDAV. [storage example_for_carddav] type = "carddav" url = "..." #username = "" #password = "" #verify = /path/to/custom_ca.pem #auth = null #useragent = "vdirsyncer/0.16.4" #verify_fingerprint = null #auth_cert = null #use_vcard_4 = false o url -- URL URL (addressbook). o username -- . o password -- . o verify -- . SSL. SSL and certificate validation <#ssl-tutorial> . o verify_fingerprint -- . SHA256 . SSL and certificate validation <#ssl-tutorial> . o auth -- . basic digest guess. Basic auth . . guess ..IP o 2 auth_cert -- . . o useragent -- vdirsyncer. o use_vcard_4 -- vCard 4.0 . Google Vdirsyncer Google VTODO . Google CardDAV API . CardDAV . . . Google CATEGORIES vCard ( #814 #36761530 ) BDAY ( ) . Google . : pip install vdirsyncer[google] vdirsyncer client_id client_secret (hardcode) Google [googleterms] <#googleterms>: 1. Google API Manager 2. . 2. API "CalDAV" "CardDAV" ( API Calendar Contacts ). . 3. "Credentials" "Create Credentials" "OAuth Client ID" . OAuth consent screen . . (consent screen) "OAuth Client ID' . "Desktop application" . 4. Client ID Client secret . . token_file vdirsyncer . . [googleterms] (ToS) "Confidential Matters". : Google vdirsyncer . google_calendar Google. [storage example_for_google_calendar] type = "google_calendar" token_file = "..." client_id = "..." client_secret = "..." #start_date = null #end_date = null #item_types = [] item_types caldav . (Parameters) o token_file -- . o client_id/client_secret -- OAuth Google API Manager. google_contacts Google. [storage example_for_google_contacts] type = "google_contacts" token_file = "..." client_id = "..." client_secret = "..." (Parameters) o token_file -- . o client_id/client_secret -- OAuth Google API Manager. Google . #975 ..SS (Local) filesystem . [storage example_for_filesystem] type = "filesystem" path = "..." fileext = "..." #encoding = "utf-8" #post_hook = null #pre_deletion_hook = null #fileignoreext = ".tmp" khal . The Vdir Storage Format <> . . (Parameters) o path -- vdir/ (collection). collections pair vdir . o fileext -- ( .txt). href ( ). vset .vcf .ics . metasync . o encoding -- . o post_hook -- . / . o pre_deletion_hook -- . . o fileeignoreext -- . fileext . .tmp . singlefile .vcf .ics . . 0.1.6 . : . filesystem . (Parameters) o path -- . %s . o encoding -- . UTF-8 . caldav: [pair my_calendar] a = my_calendar_local b = my_calendar_remote collections = ["from a", "from b"] [storage my_calendar_local] type = "singlefile" path = ~/.calendars/%s.ics [storage my_calendar_remote] type = "caldav" url = https://caldav.example.org #username = #password = caldav null: [pair my_calendar] a = my_calendar_local b = my_calendar_remote [storage my_calendar_local] type = "singlefile" path = ~/my_calendar.ics [storage my_calendar_remote] type = "caldav" url = https://caldav.example.org/username/my_calendar #username = #password = read_only true . read_only false . http .ics ( ) . webcal:// webcal:// http:// https:// . [pair holidays] a = holidays_local b = holidays_remote collections = null [storage holidays_local] type = "filesystem" path = ~/.config/vdir/calendars/holidays/ fileext = .ics [storage holidays_remote] type = "http" url = https://example.com/holidays_from_hicksville.ics #filter_hook = null WebCAL (UID) VEVENT (on-the-fly) UID . . Vdirsyncer UID http . (Parameters) o url -- (URL) .ics. o username -- . o password -- . o verify -- . SSL . SSL : <#ssl-tutorial> o verify_fingerprint -- . (fingerprint) SHA256 . SSL : <#ssl-tutorial> o auth -- . basic digest guess. Basic auth . (roundtrip) . guess . o auth_cert -- . . o useragent -- vdirsyncer . o filter_hook -- . stdin stdout . . . (OTHER TUTORIALS) vdirsyncer . vdirsyncer . . : <>! (stub) . Vdirsyncer Claws Mail Claws-Mail (read-only) vCard . . vdirsyncer : <>. : mkdir ~/.vdirsyncer mkdir ~/.contacts vdirsyncer . ~/.vdirsyncer/config . : [general] status_path = "~/.vdirsyncer/status/" [storage local] type = "singlefile" path = "~/.contacts/%s.vcf" [storage online] type = "carddav" url = "CARDDAV_LINK" username = "USERNAME" password = "PASSWORD" read_only = true [pair contacts] a = "local" b = "online" collections = ["from a", "from b"] conflict_resolution = "b wins" o general (status) . o local . o online url username password . read-only . Claws-Mail vdirsyncer . . o (conflict) ( ). . : vdirsyncer discover contacts vdirsyncer sync contacts Claws-Mail . Tools => Addressbook . Addressbook => New vCard . . ~/.contacts/ vCard . ok . : Claws-Mail . Crontab crontab vdirsyncer : crontab -e : */30 * * * * /usr/local/bin/vdirsyncer sync > /dev/null ! systemd.timer vdirsyncer (unit files) ( +- ) . : pip . pip systemd vdirsyncer.service vdirsyncer.timer /etc/systemd/user/ ~/.local/share/systemd/user . systemctl --user enable vdirsyncer.timer . journalctl --user -u vdirsyncer . " " . : systemctl --user edit vdirsyncer.timer : OnBootSec=5m # This is how long after boot the first run takes place. OnUnitActiveSec=15m # This is how often subsequent runs take place. iCalendar VTODO : .ics. CalDAV vdirsyncer . todoman (CLI) vdir <> . Taskwarrior todo.txt . filesystem <# storage-filesystem> . vdirsyncer NextCloud . : [general] status_path = "~/.vdirsyncer/status/" [pair calendars] conflict_resolution = "b wins" a = "calendars_local" b = "calendars_dav" collections = ["from b"] metadata = ["color", "displayname"] [storage calendars_local] type = "filesystem" path = "~/.calendars/" fileext = ".ics" [storage calendars_dav] type = "caldav" url = "https://nextcloud.example.net/" username = "..." password = "..." vdirsyncer sync NextCloud ~/.calendar/ . todoman ~/.config/todoman/config.py : path = "~/.calendars/*" glob path ~/.calendars/ . todoman NextCloud vdirsyncer sync . CalDAV : o Tasks iOS o OpenTasks Android o Tasks NextCloud : o khal CLI vdir <>. filesystem <#storage-filesystem> . o dayplanner Orage rainlendar .ics . singlefile <# storage-singlefile> . o khard vdir <>. filesystem <#storage-filesystem> . o contactquery.c vdir mutt . o mates vdir <>. o vdirel vdir <> Emacs. Baikal Vdirsyncer Baikal . o Baikal 0.2.7 SabreDAV ownCloud #160 . . DavMail (Exchange, Outlook) DavMail () Card- CalDAV Outlook . vdirsyncer Outlook . DavMail . Exchange ( ) . DavMail : [storage outlook] type = "caldav" url = "http://localhost:1080/users/user@example.com/calendar/" username = "user@example.com" password = "..." o DavMail URL (case-insensitively) . #144 . o DavMail Exchange . Calendar Checking Tool for Outlook . o : error: my_calendar/calendar: Storage "my_calendar_remote/calendar" contains multiple items with the same UID or even content. Vdirsyncer will now abort the synchronization of this collection, because the fix for this is not clear; It could be the result of a badly behaving server. You can try running: error: error: vdirsyncer repair my_calendar_remote/calendar error: error: But make sure to have a backup of your data in some form. The offending hrefs are: [...] Remove-DuplicateAppointments.ps1 . FastMail Vdirsyncer FastMail . . FastMail : [storage cal] type = "caldav" url = "https://caldav.fastmail.com/" username = "..." password = "..." [storage card] type = "carddav" url = "https://carddav.fastmail.com/" username = "..." password = "..." vdirsyncer Google Calendar 0.10 . google_contacts <#storage-google_contacts> google_calendar <# storage-google_calendar> . issue #202 issue #8 . iCloud vdirsyncer iCloud . [storage cal] type = "caldav" url = "https://caldav.icloud.com/" username = "..." password = "..." [storage card] type = "carddav" url = "https://contacts.icloud.com/" username = "..." password = "..." : o vdirsyncer (two-factor auth) iCloud ( API DAV ). (app-specific passwords) . o iCloud . vdirsyncer Apple ( iCloud) . o iCloud . o vdirsyncer (tasklists) . nextCloud vdirsyncer nextCloud : [storage cal] type = "caldav" url = "https://nextcloud.example.com/" username = "..." password = "..." [storage card] type = "carddav" url = "https://nextcloud.example.com/" o WebCAL vdirsyncer . issue : . ownCloud vdirsyncer ownCloud : [storage cal] type = "caldav" url = "https://example.com/remote.php/dav/" username = ... password = ... [storage card] type = "carddav" url = "https://example.com/remote.php/dav/" username = ... password = ... o 7.0.0: ownCloud SabreDAV (race-conditions) . SabreDAV 7.0.0 ownCloud . issue #16 . Radicale CalDAV CardDAV . . Xandikos <> . vdirsyncer git PyPI Radicale . o Vdirsyncer Radicale (collection) . o Radicale calendar-query CalDAV start_date end_date caldav <#storage-caldav> . o Radicale 0.9b1 RFC . vdirsyncer item_types = ["VTODO", "VEVENT"] caldav <#storage-caldav> . Xandikos Xandikos CalDAV CardDAV git . vdirsyncer . ./bin/xandikos --defaults -d $HOME/dav vdirsyncer Xandikos : [storage cal] type = "caldav" url = "https://xandikos.example.com/" username = "..." password = "..." [storage card] type = "carddav" url = "https://xandikos.example.com/" username = "..." password = "..." (KNOWN PROBLEMS) Support and Contact <> . ImportError Requests ImportError: No module named packages.urllib3.poolmanager ImportError: cannot import name iter_field_objects requests requests . . #82 #140 . vdirsyncer (virtual environment) Manual installation <#manual-installation> . (CONTRIBUTING TO THIS PROJECT) : o Support and Contact <> . o pimutils Code of Conduct . (GitHub issues) . : o "Planning" . o "Blocked" . . o "Ready" . "ready" . "Planning" . . waffle.io . . <> . o (Known Problems) <> . o vdirsyncer . Debian Fedora . (upstream) vdirsyncer. o vdirsyncer --verbosity=DEBUG . vdirsyncer . vdirsyncer <> . o ( ). o . . o . o AUTHORS.rst CHANGELOG.rst . CI . CI . virtualenv : # Install development dependencies, including: # - vdirsyncer from the repo into the virtualenv # - style checks and formatting (ruff) make install-dev # Install git commit hook for some extra linting and checking pre-commit install : pytest # The normal testsuite pre-commit run --all # Run all linters (which also run via pre-commit) make -C docs html # Build the HTML docs, output is at docs/_build/html/ make -C docs linkcheck # Check docs for any broken links Makefile . . DAV DAV_SERVER : make DAV_SERVER=xandikos test docker . (issue) ..SS " (Structure of the testsuite)" tests/ : o system . : . o unit . o storage . : . unit system storage . VDIR (THE VDIR STORAGE FORMAT) . Vdirsyncer filesystem <#storage- filesystem> vdir . vdir ( ) . (Basic Structure) () ( collections) ( items) . "collection" "addressbook" "calendar" . : o vCard .vcf o iCalendar .ics . UID vCard iCalendar . UID . . VEVENT/VTODO/VCARD VEVENT . UID . . . (Metadata) . . o color vdir vdir (UI) . hex-RGB ASCII #RRGGBB . #FF0000 vdir ( ) . red ( CSS ) . # . o displayname description / UTF-8 vdir . o order vdir . vdir (Writing to vdirs) . . .tmp . ..SS vdir o .tmp . o ident . CardDAV CalDAV . vdir (index) . : . . vdirsyncer . (modification time) . (PACKAGING GUIDELINES) vdirsyncer ! . (patch) issue . (upstream) vdirsyncer . PyPI . wheel GitHub (mirror) . "Source Code" GitHub (build) . git . GitHub . ( 0.16.8 ) tarball wheel CI . . Python setup.py vdirsyncer . . . Makefile PyPI . pytest ( ) . : make install-dev pip . test pyproject.toml . vdirsyncer . cd . : pytest Hypothesis . (deterministic) DETERMINISTIC_TESTS "true" : make DETERMINISTIC_TESTS=true test vdirsyncer . "" . CI vdirsyncer ..SS Sphinx HTML PDF (manpage) . HTML . pyproject.toml project.optional-dependencies docs . pip : pip install '.[docs]' docs/ Makefile ( make ). (Contrib) systemd.service systemd.timer . systemd . (SUPPORT AND CONTACT) o IRC #pimutils Libera.Chat . ( ) . o () issue GitHub . o contact@pimutils.org . (CHANGELOG) . git . GitHub . 0.21.0 o google (rate limit). o tenacity . o Python 3.8. o (nullipotent). o Python 3.14. 0.20.0 o atomicwrites. o filter_hook HTTP. o Python 3.7. o Python 3.12 Python 3.13. o . (file descriptors) . o aiostream 0.7.x. 0.19.3 o no_delete . issue #1090 o (crash) vdirsyncer repair . issue #1019 o vCard v4.0. issue #1066 o BEGIN END vobject. issue #1103 o Docker Vdirsyncer Vdirsyncer DOCKERIZED . o digest. issue #1137 o filter_hook http <# storage-http>. issue #1136 o SingleFileStorage. issue #818 o Google Contacts. o . issue #1033 o filesystem type = "filesystem/icalendar" type = "filesystem/vcard" . Rust vdirsyncer . o Python 3.10 3.11 . o Google CalDav/CardDav . "Desktop applications" . "Web application" . issue #1078 0.19.1 (Version 0.19.1) o Google Contacts. issue #994 o HTTP_PROXY HTTPS_PROXY . issue #1031 o Google CalDav/CardDav . "Web Application" . issue #975 o . 0.19.0 (Version 0.19.0) o "shell" . o "description" "order" . CalDAV: calendar-description CardDAV:addressbook-description apple-ns:calendar-order . o showconfig. JSON . vdirsyncer . o implicit pair <# pair-config>. "create" . . o TLS MD . issue #903 o pytest-httpserver trustme . o pytest-localserver . o (Multithreaded) . "--max-workers . o asyncio . discovery metasync sync . . issue #906 o google requests-oauthlib python-aiohttp-oauthlib . o Vdirsyncer EteSync . . EteSync . EteSync etesync-dav . o plist macOS . homebrew . macOS . SSL (Changes to SSL configuration) (fingerprints) md5 sha1 . sha256 . verify_fingerprint CA . verify_fingerprint CA . . verify CA . verify verify_fingerprint ..SS 0.18.0 : 0.17 . 0.18 0.16 . o Python 3.5 3.6 . vdirsyncer . o click 8 click-threading 0.5.0 . o pipsi pipx . o Python 3.9 . o Debian/Ubuntu . . 0.16.8 09 2020 o Python 3.7 3.8. 0.16.7 . Python . Python 3.5 3.6 . 0.16.7 19 2018 o Python 3.7 0.16.6 13 2018 o : vdirsyncer . 0.16.5 13 2018 o : click-log 0.3 . o stderr ( click-log). 0.16.4 05 2018 o Hypothesis. ( ) 0.16.3 03 2017 o Debian Ubuntu. #663 . o ASCII . #626 . o : Python 3.3 . (pull request) #674 . 0.16.2 24 2017 o daterange item_type google_calendar <#storage-google_calendar> #657 . o : 0.2.0 click-log. click-log . 8 2017 o remoteStorage #647 . o requests #660 . 0.16.0 2 2017 o METHOD:PUBLISH #502 . o (crash) Google . o DAV RFC #585 . o vdirsyncer Xandikos #601 . o filesystem . . o sqlite . . . sqlite3 vdirsyncer . o Vdirsyncer 3- BSD #610 . o vdirsyncer EteSync #614 . o vdirsyncer . / (CPU/IO) . o : systemd.service systemd.timer . systemd . 0.15.0 28 2017 o . JSON . o Google #549 #552 . o google_contacts <#storage-google_contacts> #564 . o iCloud Travis #567 . 0.14.1 05 2017 o vdirsyncer repair "UID " . #527 . o . 0.14.0 26 2016 o vdirsyncer sync . . o partial_sync pair. <#partial-sync- def> . o vdirsyncer . . o khal . o (collection discovery) . 0.13.0 o Python 2 . #219 : . o . [storage foo] [pair foo] . . #459 : . o . #127 : . o http <#storage-http> UID . . 0.12.1 o Google DAV. #492 : . o URL-encoding DavMail. #491 : . 0.12 o singlefile <#storage-singlefile> . #488 : . 0.11.3 o auth guess basic Apple Calendar Server ( #457 ) . #461 : . o : click-threading >=0.2 . . #478 : . o XML DAV vdirsyncer . #480 : . o (redirect chains) well-known . #481 : . 0.11.2 o . 0.11.1 o . o (debug). o . 0.11.0 o (Discovery) vdirsyncer sync . vdirsyncer discover . o .plist Mac OS X. o Python 2 . o . . o Vdirsyncer passwordeval password_command . o keyring . o 0.4 . status . o google_calendar <#storage-google_calendar> google_contacts <# storage-google_contacts> . o --config . : . o collections . o : lxml . o XML . vdirsyncer . 0.9.3 o singlefile <#storage-singlefile> http <#storage- http> . o . o pimutils GitHub. . 0.9.2 o . : . 0.9.1 o vdirsyncer discover 3d856749f37639821b148238ef35f1acba82db36 . o metasync . : . o Packaging Guidelines . 0.9.0 o collections . Vdirsyncer . : . 0.8.1 o . keyring . 0.8.0 o Keyring password.fetch = ["keyring", "example.com", "myuser"] . : password.fetch = ["command", "keyring", "get", "example.com", "myuser"] . . o Python 2 . : . o remotestorage CLI OAuth . o vdirsyncer lxml . 0.7.4 (Version 0.7.4) o #290 #300 . o threadpool #291 . o - (read-only) ed22764921b2e5bf6a934cf14aa9c5fede804d8e . o Etag . . #257 . o remotestorage GUI . o (Packagers): lxml>=3.1 ( ). 0.7.3 (Version 0.7.3) o remotestorage (remotestorage-dependencies). 0.7.2 (Version 0.7.2) o (testsuite). 0.7.1 (Version 0.7.1) o (Packagers): (extras) setuptools keyring remotestorage . . setup.py . o remoteStorage . . o password_command . 0.7.0 (Version 0.7.0) o (Packagers): click_threading click_log click>=5.0. o password_command . Keyring . (Storing passwords) <> . 0.6.0 (Version 0.6.0) o password_command ( ) . o Vdirsyncer . metadata = ["displayname"] vdirsyncer metasync . o (Packagers): tarball PyPI . o (Packagers): build.sh Makefile tarball . Makefile . o verify_fingerprint verify . 15 2015 o Vdirsyncer . o Vdirsyncer UID . o Vdirsyncer href UID . UID ASCII . 0.5.1 (Version 0.5.1) 29 2015 o : 0.5.0 PyPI . o requests-toolbelt 0.4.0. o ( ) . o iCloud. o worker (debug mode). o verify=false vdirsyncer verify_fingerprint . o DAV vdirsyncer useragent (collection discovery) . 0.4.4 (Version 0.4.4) 12 2015 o auth_cert 182 pull request 183 . o icalendar . o . 0.4.3 (Version 0.4.3) 20 2015 o singlefile. o post_hook filesystem. o SabreDAV Baikal ownCloud . o Radicale. Radicale . o iCloud. o Vdirsyncer repair . 0.4.2 (Version 0.4.2) 30 2015 o Vdirsyncer . Zimbra . o status_path . o SabreDAV. 166 : . o (threading) vdirsyncer . 167 : . o Vdirsyncer atomicwrites . o singlefile. o UID filesystem . 173 : . o create . vdirsyncer . o True False on off None . o UID CardDAV CalDAV . o Baikal . 0.4.0 o passwordeval password_command . o . o (Collection discovery) . vdirsyncer . vdirsyncer discover . o (pair) (storage) . vdirsyncer . o vdirsyncer XDG-Basedir . VDIRSYNCER_CONFIG ~/.vdirsyncer/config $XDG_CONFIG_HOME/vdirsyncer/config . o CardDAV CalDAV FastMail . URI .well-known . 0.3.4 o . 0.3.3 o vdirsyncer iCloud . etag . o vdirsyncer CalDAV CardDAV . Zimbra SoGo . o vdirsyncer CalDAV . Davmail/Outlook . o item_types caldav <#storage-caldav> . o vdirsyncer unsafe_href_chars caldav <# storage-caldav> carddav <#storage-carddav> . 0.3.2 o 0.4.0 . vdirsyncer . 0.3.1 o A B vdirsyncer . vdirsyncer A . . o . o processes . --max-workers . . o Read The Docs . . . o verify_fingerprint http <#storage-http> caldav <#storage-caldav> carddav <# storage-carddav> #99 #106 . o passwordeval General Section <#general-config> #108 #117 . o ( ) #113 . Davmail . 0.2.5 o #101 . o DAV. 0.2.4 o Radicale. o changelog #97 #98 . 0.2.3 o vdirsyncer --version #92 . o URL #49 . 0.2.2 o DAV . . #87 #91 . o #88 . o . 0.2.1 o vdirsyncer CardDAV Zimbra . o keyring . o (debug). o vdirsyncer argvard click . 0.2.0 o vdirsyncer icalendar PyPI . o vdirsyncer requests_toolbelt . basic . o caldav carddav etag (href, etag) upload . vdirsyncer . o singlefile <#storage- singlefile>. #48 . o collections pair from a from b . Pair Section <#pair-config> . o read_only . Storage Section <#storage-config> . 14 2014 o (changelogs) o o o vdirsyncer UID . o vdirsyncer . 42 : . (CREDITS AND LICENSE) : o Ben Boeckel o Bleala o Christian Geier o Clement Mondon o Corey Hinshaw o Kai Herlemann o Hugo Osvaldo Barrera o Jason Cox o Julian Mehne o Malte Kiefer o Marek Marczykowski-Gorecki o Markus Unterwaditzer o Michael Adler o rEnr3n o Thomas Weissschuh o Witcher01 o samm81 : o FastMail . o Packagecloud Debian vdirsyncer . (c) 2014-2020 Markus Unterwaditzer . AUTHORS.rst . . : o . o / . o . " " . ( ) ( ) ..SH " (DONATIONS)" vdirsyncer . . . ! o (Bitcoin): 13p42uWDL62bNRH3KWA6cSpSgvnHy1fs2E. o Ko-fi . o liberapay . (AUTHORS) Markus Unterwaditzer (COPYRIGHT) 2014-2026, Markus Unterwaditzer 0.21 September 5, 2026 VDIRSYNCER(1)