1VDIRSYNCER(1) vdirsyncer VDIRSYNCER(1)
2
3
4
6 vdirsyncer - vdirsyncer Documentation
7
8 • Documentation
9
10 • Source code
11
12 Vdirsyncer is a command-line tool for synchronizing calendars and ad‐
13 dressbooks between a variety of servers and the local filesystem. The
14 most popular usecase is to synchronize a server with a local folder and
15 use a set of other programs to change the local events and contacts.
16 Vdirsyncer can then synchronize those changes back to the server.
17
18 However, vdirsyncer is not limited to synchronizing between clients and
19 servers. It can also be used to synchronize calendars and/or address‐
20 books between two servers directly.
21
22 It aims to be for calendars and contacts what OfflineIMAP is for
23 emails.
24
26 Why not Dropbox + todo.txt?
27 Projects like todo.txt criticize the complexity of modern productivity
28 apps, and that rightfully. So they set out to create a new, super-sim‐
29 ple, human-readable format, such that vim suffices for viewing the raw
30 data. However, when they're faced with the question how to synchronize
31 that data across multiple devices, they seemed to have reached the dead
32 end with their novel idea: "Let's just use Dropbox".
33
34 What does file sync software do if both files have changed since the
35 last sync? The answer is to ignore the question, just sync as often as
36 possible, and hope for the best. Because if it comes to a sync con‐
37 flict, most sync services are not daring to merge files, and create two
38 copies on each computer instead. Merging the two task lists is left to
39 the user.
40
41 A better idea would've been to use git to synchronize the todo.txt
42 file, which is at least able to resolve some basic conflicts.
43
44 Why not file sync (Dropbox, git, ...) + vdir?
45 Since vdirs are just a bunch of files, it is obvious to try file syn‐
46 chronization for synchronizing your data between multiple computers,
47 such as:
48
49 • Syncthing
50
51 • Dropbox or one of the gajillion services like it
52
53 • unison
54
55 • Just git with a sshd.
56
57 The disadvantages of those solutions largely depend on the exact file
58 sync program chosen:
59
60 • Like with todo.txt, Dropbox and friends are obviously agnostic/un‐
61 aware of the files' contents. If a file has changed on both sides,
62 Dropbox just copies both versions to both sides.
63
64 This is a good idea if the user is directly interfacing with the file
65 system and is able to resolve conflicts themselves. Here it might
66 lead to erroneous behavior with e.g. khal, since there are now two
67 events with the same UID.
68
69 This point doesn't apply to git: It has very good merging capabili‐
70 ties, better than what vdirsyncer currently has.
71
72 • Such a setup doesn't work at all with smartphones. Vdirsyncer, on the
73 other hand, synchronizes with CardDAV/CalDAV servers, which can be
74 accessed with e.g. DAVx⁵ or the apps by dmfs.
75
77 OS/distro packages
78 The following packages are user-contributed and were up-to-date at the
79 time of writing:
80
81 • ArchLinux
82
83 • Ubuntu and Debian, x86_64-only (packages also exist in the official
84 repositories but may be out of date)
85
86 • GNU Guix
87
88 • OS X (homebrew)
89
90 • BSD (pkgsrc)
91
92 • OpenBSD
93
94 We only support the latest version of vdirsyncer, which is at the time
95 of this writing 0.18.0. Please do not file bugs if you use an older
96 version.
97
98 Some distributions have multiple release channels. Debian and Fedora
99 for example have a "stable" release channel that ships an older version
100 of vdirsyncer. Those versions aren't supported either.
101
102 If there is no suitable package for your distribution, you'll need to
103 install vdirsyncer manually. There is an easy command to copy-and-paste
104 for this as well, but you should be aware of its consequences.
105
106 Manual installation
107 If your distribution doesn't provide a package for vdirsyncer, you
108 still can use Python's package manager "pip". First, you'll have to
109 check that the following things are installed:
110
111 • Python 3.7+ and pip.
112
113 • libxml and libxslt
114
115 • zlib
116
117 • Linux or OS X. Windows is not supported, see issue #535.
118
119 On Linux systems, using the distro's package manager is the best way to
120 do this, for example, using Ubuntu:
121
122 sudo apt-get install libxml2 libxslt1.1 zlib1g python
123
124 Then you have several options. The following text applies for most
125 Python software by the way.
126
127 The dirty, easy way
128 The easiest way to install vdirsyncer at this point would be to run:
129
130 pip install --user --ignore-installed vdirsyncer
131
132 • --user is to install without root rights (into your home directory)
133
134 • --ignore-installed is to work around Debian's potentially broken
135 packages (see Requests-related ImportErrors).
136
137 This method has a major flaw though: Pip doesn't keep track of the
138 files it installs. Vdirsyncer's files would be located somewhere in
139 ~/.local/lib/python*, but you can't possibly know which packages were
140 installed as dependencies of vdirsyncer and which ones were not, should
141 you decide to uninstall it. In other words, using pip that way would
142 pollute your home directory.
143
144 The clean, hard way
145 There is a way to install Python software without scattering stuff
146 across your filesystem: virtualenv. There are a lot of resources on how
147 to use it, the simplest possible way would look something like:
148
149 virtualenv ~/vdirsyncer_env
150 ~/vdirsyncer_env/bin/pip install vdirsyncer
151 alias vdirsyncer="~/vdirsyncer_env/bin/vdirsyncer"
152
153 You'll have to put the last line into your .bashrc or .bash_profile.
154
155 This method has two advantages:
156
157 • It separately installs all Python packages into ~/vdirsyncer_env/,
158 without relying on the system packages. This works around OS- or dis‐
159 tro-specific issues.
160
161 • You can delete ~/vdirsyncer_env/ to uninstall vdirsyncer entirely.
162
163 The clean, easy way
164 pipx is a new package manager for Python-based software that automati‐
165 cally sets up a virtualenv for each program you install. Assuming you
166 have it installed on your operating system, you can do:
167
168 pipx install vdirsyncer
169
170 and ~/.local/pipx/venvs/vdirsyncer will be your new vdirsyncer instal‐
171 lation. To update vdirsyncer to the latest version:
172
173 pipx upgrade vdirsyncer
174
175 If you're done with vdirsyncer, you can do:
176
177 pipx uninstall vdirsyncer
178
179 and vdirsyncer will be uninstalled, including its dependencies.
180
182 Before starting, consider if you actually need vdirsyncer. There are
183 better alternatives available for particular usecases.
184
185 Installation
186 See Installation.
187
188 Configuration
189 NOTE:
190
191 • The config.example from the repository contains a very terse ver‐
192 sion of this.
193
194 • In this example we set up contacts synchronization, but calendar
195 sync works almost the same. Just swap type = "carddav" for type =
196 "caldav" and fileext = ".vcf" for fileext = ".ics".
197
198 • Take a look at the Known Problems page if anything doesn't work
199 like planned.
200
201 By default, vdirsyncer looks for its configuration file in the follow‐
202 ing locations:
203
204 • The file pointed to by the VDIRSYNCER_CONFIG environment variable.
205
206 • ~/.vdirsyncer/config.
207
208 • $XDG_CONFIG_HOME/vdirsyncer/config, which is normally ~/.con‐
209 fig/vdirsyncer/config. See the XDG-Basedir specification.
210
211 The config file should start with a general section, where the only re‐
212 quired parameter is status_path. The following is a minimal example:
213
214 [general]
215 status_path = "~/.vdirsyncer/status/"
216
217 After the general section, an arbitrary amount of pair and storage sec‐
218 tions might come.
219
220 In vdirsyncer, synchronization is always done between two storages.
221 Such storages are defined in storage sections, and which pairs of stor‐
222 ages should actually be synchronized is defined in pair section. This
223 format is copied from OfflineIMAP, where storages are called reposito‐
224 ries and pairs are called accounts.
225
226 The following example synchronizes ownCloud's addressbooks to ~/.con‐
227 tacts/:
228
229 [pair my_contacts]
230 a = "my_contacts_local"
231 b = "my_contacts_remote"
232 collections = ["from a", "from b"]
233
234 [storage my_contacts_local]
235 type = "filesystem"
236 path = "~/.contacts/"
237 fileext = ".vcf"
238
239 [storage my_contacts_remote]
240 type = "carddav"
241
242 # We can simplify this URL here as well. In theory it shouldn't matter.
243 url = "https://owncloud.example.com/remote.php/carddav/"
244 username = "bob"
245 password = "asdf"
246
247 NOTE:
248 Configuration for other servers can be found at Servers.
249
250 After running vdirsyncer discover and vdirsyncer sync, ~/.contacts/
251 will contain subfolders for each addressbook, which in turn will con‐
252 tain a bunch of .vcf files which all contain a contact in VCARD format
253 each. You can modify their contents, add new ones and delete some [1],
254 and your changes will be synchronized to the CalDAV server after you
255 run vdirsyncer sync again. For further reference, it uses the storages
256 filesystem and carddav.
257
258 However, if new collections are created on the server, it will not au‐
259 tomatically start synchronizing those [2]. You need to run vdirsyncer
260 discover again to re-fetch this list instead.
261
262 [1] You'll want to use a helper program for this.
263
264 [2] Because collections are added rarely, and checking for this case
265 before every synchronization isn't worth the overhead.
266
267 More Configuration
268 Conflict resolution
269 What if the same item is changed on both sides? What should vdirsyncer
270 do? Three options are currently provided:
271
272 1. vdirsyncer displays an error message (the default);
273
274 2. vdirsyncer chooses one alternative version over the other;
275
276 3. vdirsyncer starts a command of your choice that is supposed to merge
277 the two alternative versions.
278
279 Options 2 and 3 require adding a "conflict_resolution" parameter to the
280 pair section. Option 2 requires giving either "a wins" or "b wins" as
281 value to the parameter:
282
283 [pair my_contacts]
284 ...
285 conflict_resolution = "b wins"
286
287 Earlier we wrote that b = "my_contacts_remote", so when vdirsyncer en‐
288 counters the situation where an item changed on both sides, it will
289 simply overwrite the local item with the one from the server.
290
291 Option 3 requires specifying as value of "conflict_resolution" an array
292 starting with "command" and containing paths and arguments to a com‐
293 mand. For example:
294
295 [pair my_contacts]
296 ...
297 conflict_resolution = ["command", "vimdiff"]
298
299 In this example, vimdiff <a> <b> will be called with <a> and <b> being
300 two temporary files containing the conflicting files. The files need to
301 be exactly the same when the command returns. More arguments can be
302 passed to the command by adding more elements to the array.
303
304 See Pair Section for the reference documentation.
305
306 Metadata synchronization
307 Besides items, vdirsyncer can also synchronize metadata like the ad‐
308 dressbook's or calendar's "human-friendly" name (internally called
309 "displayname") or the color associated with a calendar. For the purpose
310 of explaining this feature, let's switch to a different base example.
311 This time we'll synchronize calendars:
312
313 [pair my_calendars]
314 a = "my_calendars_local"
315 b = "my_calendars_remote"
316 collections = ["from a", "from b"]
317 metadata = ["color"]
318
319 [storage my_calendars_local]
320 type = "filesystem"
321 path = "~/.calendars/"
322 fileext = ".ics"
323
324 [storage my_calendars_remote]
325 type = "caldav"
326
327 url = "https://owncloud.example.com/remote.php/caldav/"
328 username = "bob"
329 password = "asdf"
330
331 Run vdirsyncer discover for discovery. Then you can use vdirsyncer
332 metasync to synchronize the color property between your local calendars
333 in ~/.calendars/ and your ownCloud. Locally the color is just repre‐
334 sented as a file called color within the calendar folder.
335
336 More information about collections
337 "Collection" is a collective term for addressbooks and calendars. Each
338 collection from a storage has a "collection name", a unique identifier
339 for each collection. In the case of filesystem-storage, this is the
340 name of the directory that represents the collection, in the case of
341 the DAV-storages this is the last segment of the URL. We use this iden‐
342 tifier in the collections parameter in the pair-section.
343
344 This identifier doesn't change even if you rename your calendar in
345 whatever UI you have, because that only changes the so-called "display‐
346 name" property [3]. On some servers (iCloud, Google) this identifier
347 is randomly generated and has no correlation with the displayname you
348 chose.
349
350 [3] Which you can also synchronize with metasync using metadata =
351 ["displayname"].
352
353 There are three collection names that have a special meaning:
354
355 • "from a", "from b": A placeholder for all collections that can be
356 found on side A/B when running vdirsyncer discover.
357
358 • null: The parameters give to the storage are exact and require no
359 discovery.
360
361 The last one requires a bit more explanation. Assume this config which
362 synchronizes two directories of addressbooks:
363
364 [pair foobar]
365 a = "foo"
366 b = "bar"
367 collections = ["from a", "from b"]
368
369 [storage foo]
370 type = "filesystem"
371 fileext = ".vcf"
372 path = "./contacts_foo/"
373
374 [storage bar]
375 type = "filesystem"
376 fileext = ".vcf"
377 path = "./contacts_bar/"
378
379 As we saw previously this will synchronize all collections in ./con‐
380 tacts_foo/ with each same-named collection in ./contacts_bar/. If
381 there's a collection that exists on one side but not the other,
382 vdirsyncer will ask whether to create that folder on the other side.
383
384 If we set collections = null, ./contacts_foo/ and ./contacts_bar/ are
385 no longer treated as folders with collections, but as collections them‐
386 selves. This means that ./contacts_foo/ and ./contacts_bar/ will con‐
387 tain .vcf-files, not subfolders that contain .vcf-files.
388
389 This is useful in situations where listing all collections fails be‐
390 cause your DAV-server doesn't support it, for example. In this case,
391 you can set url of your carddav- or caldav-storage to a URL that points
392 to your CalDAV/CardDAV collection directly.
393
394 Note that not all storages support the null-collection, for example
395 google_contacts and google_calendar don't.
396
397 Advanced collection configuration (server-to-server sync)
398 The examples above are good enough if you want to synchronize a remote
399 server to a previously empty disk. However, even more trickery is re‐
400 quired when you have two servers with already existing collections
401 which you want to synchronize.
402
403 The core problem in this situation is that vdirsyncer pairs collections
404 by collection name by default (see definition in previous section, ba‐
405 sically a foldername or a remote UUID). When you have two servers,
406 those collection names may not line up as nicely. Suppose you created
407 two calendars "Test", one on a NextCloud server and one on iCloud, us‐
408 ing their respective web interfaces. The URLs look something like this:
409
410 NextCloud: https://example.com/remote.php/dav/calendars/user/test/
411 iCloud: https://p-XX.caldav.icloud.com/YYY/calendars/3b4c9995-5c67-4021-9fa0-be4633623e1c
412
413 Those are two DAV calendar collections. Their collection names will be
414 test and 3b4c9995-5c67-4021-9fa0-be4633623e1c respectively, so you
415 don't have a single name you can address them both with. You will need
416 to manually "pair" (no pun intended) those collections up like this:
417
418 [pair doublecloud]
419 a = "my_nextcloud"
420 b = "my_icloud"
421 collections = [["mytest", "test", "3b4c9995-5c67-4021-9fa0-be4633623e1c"]]
422
423 mytest gives that combination of calendars a nice name you can use when
424 talking about it, so you would use vdirsyncer sync doublecloud/mytest
425 to say: "Only synchronize these two storages, nothing else that may be
426 configured".
427
428 NOTE:
429 Why not use displaynames?
430
431 You may wonder why vdirsyncer just couldn't figure this out by it‐
432 self. After all, you did name both collections "Test" (which is
433 called "the displayname"), so why not pair collections by that
434 value?
435
436 There are a few problems with this idea:
437
438 • Two calendars may have the same exact displayname.
439
440 • A calendar may not have a (non-empty) displayname.
441
442 • The displayname might change. Either you rename the calendar, or
443 the calendar renames itself because you change a language setting.
444
445 In the end, that property was never designed to be parsed by ma‐
446 chines.
447
449 All SSL configuration is done per-storage.
450
451 Pinning by fingerprint
452 To pin the certificate by fingerprint:
453
454 [storage foo]
455 type = "caldav"
456 ...
457 verify_fingerprint = "94:FD:7A:CB:50:75:A4:69:82:0A:F8:23:DF:07:FC:69:3E:CD:90:CA"
458 #verify = false # Optional: Disable CA validation, useful for self-signed certs
459
460 SHA1-, SHA256- or MD5-Fingerprints can be used. They're detected by
461 their length.
462
463 You can use the following command for obtaining a SHA-1 fingerprint:
464
465 echo -n | openssl s_client -connect unterwaditzer.net:443 | openssl x509 -noout -fingerprint
466
467 Note that verify_fingerprint doesn't suffice for vdirsyncer to work
468 with self-signed certificates (or certificates that are not in your
469 trust store). You most likely need to set verify = false as well. This
470 disables verification of the SSL certificate's expiration time and the
471 existence of it in your trust store, all that's verified now is the
472 fingerprint.
473
474 However, please consider using Let's Encrypt such that you can forget
475 about all of that. It is easier to deploy a free certificate from them
476 than configuring all of your clients to accept the self-signed certifi‐
477 cate.
478
479 Custom root CAs
480 To point vdirsyncer to a custom set of root CAs:
481
482 [storage foo]
483 type = "caldav"
484 ...
485 verify = "/path/to/cert.pem"
486
487 Vdirsyncer uses the requests library, which, by default, uses its own
488 set of trusted CAs.
489
490 However, the actual behavior depends on how you have installed it. Many
491 Linux distributions patch their python-requests package to use the sys‐
492 tem certificate CAs. Normally these two stores are similar enough for
493 you to not care.
494
495 But there are cases where certificate validation fails even though you
496 can access the server fine through e.g. your browser. This usually in‐
497 dicates that your installation of the requests library is somehow bro‐
498 ken. In such cases, it makes sense to explicitly set verify or ver‐
499 ify_fingerprint as shown above.
500
501 Client Certificates
502 Client certificates may be specified with the auth_cert parameter. If
503 the key and certificate are stored in the same file, it may be a
504 string:
505
506 [storage foo]
507 type = "caldav"
508 ...
509 auth_cert = "/path/to/certificate.pem"
510
511 If the key and certificate are separate, a list may be used:
512
513 [storage foo]
514 type = "caldav"
515 ...
516 auth_cert = ["/path/to/certificate.crt", "/path/to/key.key"]
517
519 Changed in version 0.7.0: Password configuration got completely over‐
520 hauled.
521
522
523 Vdirsyncer can fetch passwords from several sources other than the con‐
524 fig file.
525
526 Command
527 Say you have the following configuration:
528
529 [storage foo]
530 type = "caldav"
531 url = ...
532 username = "foo"
533 password = "bar"
534
535 But it bugs you that the password is stored in cleartext in the config
536 file. You can do this:
537
538 [storage foo]
539 type = "caldav"
540 url = ...
541 username = "foo"
542 password.fetch = ["command", "~/get-password.sh", "more", "args"]
543
544 You can fetch the username as well:
545
546 [storage foo]
547 type = "caldav"
548 url = ...
549 username.fetch = ["command", "~/get-username.sh"]
550 password.fetch = ["command", "~/get-password.sh"]
551
552 Or really any kind of parameter in a storage section.
553
554 With pass for example, you might find yourself writing something like
555 this in your configuration file:
556
557 password.fetch = ["command", "pass", "caldav"]
558
559 Accessing the system keyring
560 As shown above, you can use the command strategy to fetch your creden‐
561 tials from arbitrary sources. A very common usecase is to fetch your
562 password from the system keyring.
563
564 The keyring Python package contains a command-line utility for fetching
565 passwords from the OS's password store. Installation:
566
567 pip install keyring
568
569 Basic usage:
570
571 password.fetch = ["command", "keyring", "get", "example.com", "foouser"]
572
573 Password Prompt
574 You can also simply prompt for the password:
575
576 [storage foo]
577 type = "caldav"
578 username = "myusername"
579 password.fetch = ["prompt", "Password for CalDAV"]
580
582 If you want to subscribe to a public, read-only WebCAL-calendar but
583 neither your server nor your calendar apps support that (or support it
584 insufficiently), vdirsyncer can be used to synchronize such a public
585 calendar A with a new calendar B of your own and keep B updated.
586
587 Step 1: Create the target calendar
588 First you need to create the calendar you want to sync the WebCAL-cal‐
589 endar with. Most servers offer a web interface for this. You then need
590 to note the CalDAV URL of your calendar. Note that this URL should di‐
591 rectly point to the calendar you just created, which means you would
592 have one such URL for each calendar you have.
593
594 Step 2: Creating the config
595 Paste this into your vdirsyncer config:
596
597 [pair holidays]
598 a = "holidays_public"
599 b = "holidays_private"
600 collections = null
601
602 [storage holidays_public]
603 type = "http"
604 # The URL to your iCalendar file.
605 url = "..."
606
607 [storage holidays_private]
608 type = "caldav"
609 # The direct URL to your calendar.
610 url = "..."
611 # The credentials to your CalDAV server
612 username = "..."
613 password = "..."
614
615 Then run vdirsyncer discover holidays and vdirsyncer sync holidays, and
616 your previously created calendar should be filled with events.
617
618 Step 3: The partial_sync parameter
619 New in version 0.14.
620
621
622 You may get into a situation where you want to hide or modify some
623 events from your holidays calendar. If you try to do that at this
624 point, you'll notice that vdirsyncer will revert any changes you've
625 made after a few times of running sync. This is because vdirsyncer
626 wants to keep everything in sync, and it can't synchronize changes to
627 the public holidays-calendar because it doesn't have the rights to do
628 so.
629
630 For such purposes you can set the partial_sync parameter to ignore:
631
632 [pair holidays]
633 a = "holidays_public"
634 b = "holidays_private"
635 collections = null
636 partial_sync = ignore
637
638 See the config docs for more information.
639
641 Vdirsyncer uses an ini-like format for storing its configuration. All
642 values are JSON, invalid JSON will get interpreted as string:
643
644 x = "foo" # String
645 x = foo # Shorthand for same string
646
647 x = 42 # Integer
648
649 x = ["a", "b", "c"] # List of strings
650
651 x = true # Boolean
652 x = false
653
654 x = null # Also known as None
655
656 General Section
657 [general]
658 status_path = ...
659
660 • status_path: A directory where vdirsyncer will store some additional
661 data for the next sync.
662
663 The data is needed to determine whether a new item means it has been
664 added on one side or deleted on the other. Relative paths will be in‐
665 terpreted as relative to the configuration file's directory.
666
667 See A simple synchronization algorithm for what exactly is in there.
668
669 Pair Section
670 [pair pair_name]
671 a = ...
672 b = ...
673 #collections = null
674 #conflict_resolution = null
675
676 • Pair names can consist of any alphanumeric characters and the under‐
677 score.
678
679 • a and b reference the storages to sync by their names.
680
681 • collections: A list of collections to synchronize when vdirsyncer
682 sync is executed. See also More information about collections.
683
684 The special values "from a" and "from b", tell vdirsyncer to try au‐
685 todiscovery on a specific storage.
686
687 If the collection you want to sync doesn't have the same name on each
688 side, you may also use a value of the form ["config_name", "name_a",
689 "name_b"]. This will synchronize the collection name_a on side A
690 with the collection name_b on side B. The config_name will be used
691 for representation in CLI arguments and logging.
692
693 Examples:
694
695 • collections = ["from b", "foo", "bar"] makes vdirsyncer synchronize
696 the collections from side B, and also the collections named "foo"
697 and "bar".
698
699 • collections = ["from b", "from a"] makes vdirsyncer synchronize all
700 existing collections on either side.
701
702 • collections = [["bar", "bar_a", "bar_b"], "foo"] makes vdirsyncer
703 synchronize bar_a from side A with bar_b from side B, and also syn‐
704 chronize foo on both sides with each other.
705
706 • conflict_resolution: Optional, define how conflicts should be han‐
707 dled. A conflict occurs when one item (event, task) changed on both
708 sides since the last sync. See also Conflict resolution.
709
710 Valid values are:
711
712 • null, where an error is shown and no changes are done.
713
714 • "a wins" and "b wins", where the whole item is taken from one side.
715
716 • ["command", "vimdiff"]: vimdiff <a> <b> will be called where <a>
717 and <b> are temporary files that contain the item of each side re‐
718 spectively. The files need to be exactly the same when the command
719 returns.
720
721 • vimdiff can be replaced with any other command. For example, in
722 POSIX ["command", "cp"] is equivalent to "a wins".
723
724 • Additional list items will be forwarded as arguments. For exam‐
725 ple, ["command", "vimdiff", "--noplugin"] runs vimdiff --noplu‐
726 gin.
727
728 Vdirsyncer never attempts to "automatically merge" the two items.
729
730 • partial_sync: Assume A is read-only, B not. If you change items on B,
731 vdirsyncer can't sync the changes to A. What should happen instead?
732
733 • error: An error is shown.
734
735 • ignore: The change is ignored. However: Events deleted in B still
736 reappear if they're updated in A.
737
738 • revert (default): The change is reverted on next sync.
739
740 See also Syncing with read-only storages.
741
742 • metadata: Metadata keys that should be synchronized when vdirsyncer
743 metasync is executed. Example:
744
745 metadata = ["color", "displayname"]
746
747 This synchronizes the color and the displayname properties. The con‐
748 flict_resolution parameter applies here as well.
749
750 Storage Section
751 [storage storage_name]
752 type = ...
753
754 • Storage names can consist of any alphanumeric characters and the un‐
755 derscore.
756
757 • type defines which kind of storage is defined. See Supported Stor‐
758 ages.
759
760 • read_only defines whether the storage should be regarded as a
761 read-only storage. The value true means synchronization will discard
762 any changes made to the other side. The value false implies normal
763 2-way synchronization.
764
765 • Any further parameters are passed on to the storage class.
766
767 Supported Storages
768 CalDAV and CardDAV
769 NOTE:
770 Please also see Servers, as some servers may not work well.
771
772 caldav CalDAV.
773
774 [storage example_for_caldav]
775 type = "caldav"
776 #start_date = null
777 #end_date = null
778 #item_types = []
779 url = "..."
780 #username = ""
781 #password = ""
782 #verify = true
783 #auth = null
784 #useragent = "vdirsyncer/0.16.4"
785 #verify_fingerprint = null
786 #auth_cert = null
787
788 You can set a timerange to synchronize with the parameters
789 start_date and end_date. Inside those parameters, you can use
790 any Python expression to return a valid datetime.datetime ob‐
791 ject. For example, the following would synchronize the timerange
792 from one year in the past to one year in the future:
793
794 start_date = "datetime.now() - timedelta(days=365)"
795 end_date = "datetime.now() + timedelta(days=365)"
796
797 Either both or none have to be specified. The default is to syn‐
798 chronize everything.
799
800 You can set item_types to restrict the kind of items you want to
801 synchronize. For example, if you want to only synchronize events
802 (but don't download any tasks from the server), set item_types =
803 ["VEVENT"]. If you want to synchronize events and tasks, but
804 have some VJOURNAL items on the server you don't want to syn‐
805 chronize, use item_types = ["VEVENT", "VTODO"].
806
807 Parameters
808
809 • start_date -- Start date of timerange to show, default
810 -inf.
811
812 • end_date -- End date of timerange to show, default
813 +inf.
814
815 • item_types -- Kind of items to show. The default, the
816 empty list, is to show all. This depends on particular
817 features on the server, the results are not validated.
818
819 • url -- Base URL or an URL to a calendar.
820
821 • username -- Username for authentication.
822
823 • password -- Password for authentication.
824
825 • verify -- Verify SSL certificate, default True. This
826 can also be a local path to a self-signed SSL certifi‐
827 cate. See SSL and certificate validation for more in‐
828 formation.
829
830 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
831 of the expected server certificate. See SSL and cer‐
832 tificate validation for more information.
833
834 • auth -- Optional. Either basic, digest or guess. The
835 default is preemptive Basic auth, sending credentials
836 even if server didn't request them. This saves from an
837 additional roundtrip per request. Consider setting
838 guess if this causes issues with your server.
839
840 • auth_cert -- Optional. Either a path to a certificate
841 with a client certificate and the key or a list of
842 paths to the files with them.
843
844 • useragent -- Default vdirsyncer.
845
846 carddav
847 CardDAV.
848
849 [storage example_for_carddav]
850 type = "carddav"
851 url = "..."
852 #username = ""
853 #password = ""
854 #verify = true
855 #auth = null
856 #useragent = "vdirsyncer/0.16.4"
857 #verify_fingerprint = null
858 #auth_cert = null
859
860 Parameters
861
862 • url -- Base URL or an URL to an addressbook.
863
864 • username -- Username for authentication.
865
866 • password -- Password for authentication.
867
868 • verify -- Verify SSL certificate, default True. This
869 can also be a local path to a self-signed SSL certifi‐
870 cate. See SSL and certificate validation for more in‐
871 formation.
872
873 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
874 of the expected server certificate. See SSL and cer‐
875 tificate validation for more information.
876
877 • auth -- Optional. Either basic, digest or guess. The
878 default is preemptive Basic auth, sending credentials
879 even if server didn't request them. This saves from an
880 additional roundtrip per request. Consider setting
881 guess if this causes issues with your server.
882
883 • auth_cert -- Optional. Either a path to a certificate
884 with a client certificate and the key or a list of
885 paths to the files with them.
886
887 • useragent -- Default vdirsyncer.
888
889 Google
890 Vdirsyncer supports synchronization with Google calendars with the re‐
891 striction that VTODO files are rejected by the server.
892
893 Synchronization with Google contacts is less reliable due to negligence
894 of Google's CardDAV API. Google's CardDAV implementation is allegedly a
895 disaster in terms of data safety. See this blog post for the details.
896 Always back up your data.
897
898 At first run you will be asked to authorize application for Google ac‐
899 count access.
900
901 To use this storage type, you need to install some additional dependen‐
902 cies:
903
904 pip install vdirsyncer[google]
905
906 Furthermore you need to register vdirsyncer as an application yourself
907 to obtain client_id and client_secret, as it is against Google's Terms
908 of Service to hardcode those into opensource software [googleterms]:
909
910 1. Go to the Google API Manager and create a new project under any
911 name.
912
913 2. Within that project, enable the "CalDAV" and "CardDAV" APIs (not the
914 Calendar and Contacts APIs, those are different and won't work).
915 There should be a searchbox where you can just enter those terms.
916
917 3. In the sidebar, select "Credentials" and create a new "OAuth Client
918 ID". The application type is "Other".
919
920 You'll be prompted to create a OAuth consent screen first. Fill out
921 that form however you like.
922
923 4. Finally you should have a Client ID and a Client secret. Provide
924 these in your storage config.
925
926 The token_file parameter should be a filepath where vdirsyncer can
927 later store authentication-related data. You do not need to create the
928 file itself or write anything to it.
929
930 [googleterms]
931 See ToS, section "Confidential Matters".
932
933 NOTE:
934 You need to configure which calendars Google should offer vdirsyncer
935 using a rather hidden settings page.
936
937 google_calendar
938 Google calendar.
939
940 [storage example_for_google_calendar]
941 type = "google_calendar"
942 token_file = "..."
943 client_id = "..."
944 client_secret = "..."
945 #start_date = null
946 #end_date = null
947 #item_types = []
948
949 Please refer to caldav regarding the item_types and timerange
950 parameters.
951
952 Parameters
953
954 • token_file -- A filepath where access tokens are
955 stored.
956
957 • client_id/client_secret -- OAuth credentials, obtained
958 from the Google API Manager.
959
960 google_contacts
961 Google contacts.
962
963 [storage example_for_google_contacts]
964 type = "google_contacts"
965 token_file = "..."
966 client_id = "..."
967 client_secret = "..."
968
969 Parameters
970
971 • token_file -- A filepath where access tokens are
972 stored.
973
974 • client_id/client_secret -- OAuth credentials, obtained
975 from the Google API Manager.
976
977 EteSync
978 EteSync is a new cloud provider for end to end encrypted contacts and
979 calendar storage. Vdirsyncer contains experimental support for it.
980
981 To use it, you need to install some optional dependencies:
982
983 pip install vdirsyncer[etesync]
984
985 On first usage you will be prompted for the service password and the
986 encryption password. Neither are stored.
987
988 etesync_contacts
989 Contacts for etesync.
990
991 [storage example_for_etesync_contacts]
992 email = ...
993 secrets_dir = ...
994 #server_path = ...
995 #db_path = ...
996
997 Parameters
998
999 • email -- The email address of your account.
1000
1001 • secrets_dir -- A directory where vdirsyncer can store
1002 the encryption key and authentication token.
1003
1004 • server_url -- Optional. URL to the root of your custom
1005 server.
1006
1007 • db_path -- Optional. Use a different path for the data‐
1008 base.
1009
1010 etesync_calendars
1011 Calendars for etesync.
1012
1013 [storage example_for_etesync_calendars]
1014 email = ...
1015 secrets_dir = ...
1016 #server_path = ...
1017 #db_path = ...
1018
1019 Parameters
1020
1021 • email -- The email address of your account.
1022
1023 • secrets_dir -- A directory where vdirsyncer can store
1024 the encryption key and authentication token.
1025
1026 • server_url -- Optional. URL to the root of your custom
1027 server.
1028
1029 • db_path -- Optional. Use a different path for the data‐
1030 base.
1031
1032 Local
1033 filesystem
1034 Saves each item in its own file, given a directory.
1035
1036 [storage example_for_filesystem]
1037 type = "filesystem"
1038 path = "..."
1039 fileext = "..."
1040 #encoding = "utf-8"
1041 #post_hook = null
1042 #fileignoreext = ".tmp"
1043
1044 Can be used with khal. See The Vdir Storage Format for a more
1045 formal description of the format.
1046
1047 Directories with a leading dot are ignored to make usage of e.g.
1048 version control easier.
1049
1050 Parameters
1051
1052 • path -- Absolute path to a vdir/collection. If this is
1053 used in combination with the collections parameter in a
1054 pair-section, this should point to a directory of vdirs
1055 instead.
1056
1057 • fileext -- The file extension to use (e.g. .txt). Con‐
1058 tained in the href, so if you change the file extension
1059 after a sync, this will trigger a re-download of every‐
1060 thing (but should not cause data-loss of any kind). To
1061 be compatible with the vset format you have to either
1062 use .vcf or .ics. Note that metasync won't work if you
1063 use an empty string here.
1064
1065 • encoding -- File encoding for items, both content and
1066 filename.
1067
1068 • post_hook -- A command to call for each item creation
1069 and modification. The command will be called with the
1070 path of the new/updated file.
1071
1072 • fileeignoreext -- The file extention to ignore. It is
1073 only useful if fileext is set to the empty string. The
1074 default is .tmp.
1075
1076 singlefile
1077 Save data in single local .vcf or .ics file.
1078
1079 The storage basically guesses how items should be joined in the
1080 file.
1081
1082 New in version 0.1.6.
1083
1084
1085 NOTE:
1086 This storage is very slow, and that is unlikely to change.
1087 You should consider using filesystem if it fits your usecase.
1088
1089 Parameters
1090
1091 • path -- The filepath to the file to be written to. If
1092 collections are used, this should contain %s as a
1093 placeholder for the collection name.
1094
1095 • encoding -- Which encoding the file should use. De‐
1096 faults to UTF-8.
1097
1098 Example for syncing with caldav:
1099
1100 [pair my_calendar]
1101 a = my_calendar_local
1102 b = my_calendar_remote
1103 collections = ["from a", "from b"]
1104
1105 [storage my_calendar_local]
1106 type = "singlefile"
1107 path = ~/.calendars/%s.ics
1108
1109 [storage my_calendar_remote]
1110 type = "caldav"
1111 url = https://caldav.example.org/
1112 #username =
1113 #password =
1114
1115 Example for syncing with caldav using a null collection:
1116
1117 [pair my_calendar]
1118 a = my_calendar_local
1119 b = my_calendar_remote
1120
1121 [storage my_calendar_local]
1122 type = "singlefile"
1123 path = ~/my_calendar.ics
1124
1125 [storage my_calendar_remote]
1126 type = "caldav"
1127 url = https://caldav.example.org/username/my_calendar/
1128 #username =
1129 #password =
1130
1131 Read-only storages
1132 These storages don't support writing of their items, consequently
1133 read_only is set to true by default. Changing read_only to false on
1134 them leads to an error.
1135
1136 http Use a simple .ics file (or similar) from the web. web‐
1137 cal://-calendars are supposed to be used with this, but you have
1138 to replace webcal:// with http://, or better, https://.
1139
1140 [pair holidays]
1141 a = holidays_local
1142 b = holidays_remote
1143 collections = null
1144
1145 [storage holidays_local]
1146 type = "filesystem"
1147 path = ~/.config/vdir/calendars/holidays/
1148 fileext = .ics
1149
1150 [storage holidays_remote]
1151 type = "http"
1152 url = https://example.com/holidays_from_hicksville.ics
1153
1154 Too many WebCAL providers generate UIDs of all VEVENT-components
1155 on-the-fly, i.e. all UIDs change every time the calendar is
1156 downloaded. This leads many synchronization programs to believe
1157 that all events have been deleted and new ones created, and ac‐
1158 cordingly causes a lot of unnecessary uploads and deletions on
1159 the other side. Vdirsyncer completely ignores UIDs coming from
1160 http and will replace them with a hash of the normalized item
1161 content.
1162
1163 Parameters
1164
1165 • url -- URL to the .ics file.
1166
1167 • username -- Username for authentication.
1168
1169 • password -- Password for authentication.
1170
1171 • verify -- Verify SSL certificate, default True. This
1172 can also be a local path to a self-signed SSL certifi‐
1173 cate. See SSL and certificate validation for more in‐
1174 formation.
1175
1176 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
1177 of the expected server certificate. See SSL and cer‐
1178 tificate validation for more information.
1179
1180 • auth -- Optional. Either basic, digest or guess. The
1181 default is preemptive Basic auth, sending credentials
1182 even if server didn't request them. This saves from an
1183 additional roundtrip per request. Consider setting
1184 guess if this causes issues with your server.
1185
1186 • auth_cert -- Optional. Either a path to a certificate
1187 with a client certificate and the key or a list of
1188 paths to the files with them.
1189
1190 • useragent -- Default vdirsyncer.
1191
1193 The following section contains tutorials not explicitly about any par‐
1194 ticular core function of vdirsyncer. They usually show how to integrate
1195 vdirsyncer with third-party software. Because of that, it may be that
1196 the information regarding that other software only applies to specific
1197 versions of them.
1198
1199 NOTE:
1200 Please contribute your own tutorials too! Pages are often only
1201 stubs and are lacking full examples.
1202
1203 Client applications
1204 Vdirsyncer with Claws Mail
1205 First of all, Claws-Mail only supports read-only functions for vCards.
1206 It can only read contacts, but there's no editor.
1207
1208 Preparation
1209 We need to install vdirsyncer, for that look here. Then we need to
1210 create some folders:
1211
1212 mkdir ~/.vdirsyncer
1213 mkdir ~/.contacts
1214
1215 Configuration
1216 Now we create the configuration for vdirsyncer. Open ~/.vdirsyncer/con‐
1217 fig with a text editor. The config should look like this:
1218
1219 [general]
1220 status_path = "~/.vdirsyncer/status/"
1221
1222 [storage local]
1223 type = "singlefile"
1224 path = "~/.contacts/%s.vcf"
1225
1226 [storage online]
1227 type = "carddav"
1228 url = "CARDDAV_LINK"
1229 username = "USERNAME"
1230 password = "PASSWORD"
1231 read_only = true
1232
1233 [pair contacts]
1234 a = "local"
1235 b = "online"
1236 collections = ["from a", "from b"]
1237 conflict_resolution = "b wins"
1238
1239 • In the general section, we define the status folder path, for discov‐
1240 ered collections and generally stuff that needs to persist between
1241 syncs.
1242
1243 • In the local section we define that all contacts should be sync in a
1244 single file and the path for the contacts.
1245
1246 • In the online section you must change the url, username and password
1247 to your setup. We also set the storage to read-only such that no
1248 changes get synchronized back. Claws-Mail should not be able to do
1249 any changes anyway, but this is one extra safety step in case files
1250 get corrupted or vdirsyncer behaves erratically. You can leave that
1251 part out if you want to be able to edit those files locally.
1252
1253 • In the last section we configure that online contacts win in a con‐
1254 flict situation. Configure this part however you like. A correct
1255 value depends on which side is most likely to be up-to-date.
1256
1257 Sync
1258 Now we discover and sync our contacts:
1259
1260 vdirsyncer discover contacts
1261 vdirsyncer sync contacts
1262
1263 Claws Mail
1264 Open Claws-Mail. Go to Tools => Addressbook.
1265
1266 Click on Addressbook => New vCard. Choose a name for the book.
1267
1268 Then search for the for the vCard in the folder ~/.contacts/. Click ok,
1269 and you we will see your contacts.
1270
1271 NOTE:
1272 Claws-Mail shows only contacts that have a mail address.
1273
1274 Crontab
1275 On the end we create a crontab, so that vdirsyncer syncs automatically
1276 every 30 minutes our contacts:
1277
1278 crontab -e
1279
1280 On the end of that file enter this line:
1281
1282 */30 * * * * /usr/local/bin/vdirsyncer sync > /dev/null
1283
1284 And you're done!
1285
1286 Running as a systemd.timer
1287 vdirsyncer includes unit files to run at an interval (by default every
1288 15±5 minutes).
1289
1290 NOTE:
1291 These are not installed when installing via pip, only via distribu‐
1292 tion packages. If you installed via pip, or your distribution
1293 doesn't ship systemd unit files, you'll need to download
1294 vdirsyncer.service and vdirsyncer.timer into either /etc/sys‐
1295 temd/user/ or ~/.local/share/systemd/user.
1296
1297 Activation
1298 To activate the timer, just run systemctl --user enable
1299 vdirsyncer.timer. To see logs of previous runs, use journalctl --user
1300 -u vdirsyncer.
1301
1302 Configuration
1303 It's quite possible that the default "every fifteen minutes" interval
1304 isn't to your liking. No default will suit everybody, but this is con‐
1305 figurable by simply running:
1306
1307 systemctl --user edit vdirsyncer.timer
1308
1309 This will open a blank editor, where you can override the timer by in‐
1310 cluding:
1311
1312 OnBootSec=5m # This is how long after boot the first run takes place.
1313 OnUnitActiveSec=15m # This is how often subsequent runs take place.
1314
1315 Todoman
1316 The iCalendar format also supports saving tasks in form of VTODO-en‐
1317 tries, with the same file extension as normal events: .ics. Many CalDAV
1318 servers support synchronizing tasks, vdirsyncer does too.
1319
1320 todoman is a CLI task manager supporting vdir. Its interface is similar
1321 to the ones of Taskwarrior or the todo.txt CLI app. You can use
1322 filesystem with it.
1323
1324 Setting up vdirsyncer
1325 For this tutorial we will use NextCloud.
1326
1327 Assuming a config like this:
1328
1329 [general]
1330 status_path = "~/.vdirsyncer/status/"
1331
1332 [pair calendars]
1333 conflict_resolution = "b wins"
1334 a = "calendars_local"
1335 b = "calendars_dav"
1336 collections = ["from b"]
1337 metadata = ["color", "displayname"]
1338
1339 [storage calendars_local]
1340 type = "filesystem"
1341 path = "~/.calendars/"
1342 fileext = ".ics"
1343
1344 [storage calendars_dav]
1345 type = "caldav"
1346 url = "https://nextcloud.example.net/"
1347 username = "..."
1348 password = "..."
1349
1350 vdirsyncer sync will then synchronize the calendars of your NextCloud
1351 instance to subfolders of ~/.calendar/.
1352
1353 Setting up todoman
1354 Write this to ~/.config/todoman/todoman.conf:
1355
1356 [main]
1357 path = ~/.calendars/*
1358
1359 The glob pattern in path will match all subfolders in ~/.calendars/,
1360 which is exactly the tasklists we want. Now you can use todoman as de‐
1361 scribed in its documentation and run vdirsyncer sync to synchronize the
1362 changes to NextCloud.
1363
1364 Other clients
1365 The following client applications also synchronize over CalDAV:
1366
1367 • The Tasks-app found on iOS
1368
1369 • OpenTasks for Android
1370
1371 • The Tasks-app for NextCloud's web UI
1372
1373 Further applications, with missing pages:
1374
1375 • khal, a CLI calendar application supporting vdir. You can use
1376 filesystem with it.
1377
1378 • Many graphical calendar apps such as dayplanner, Orage or rainlendar
1379 save a calendar in a single .ics file. You can use singlefile with
1380 those.
1381
1382 • khard, a commandline addressbook supporting vdir. You can use
1383 filesystem with it.
1384
1385 • contactquery.c, a small program explicitly written for querying vdirs
1386 from mutt.
1387
1388 • mates, a commandline addressbook supporting vdir.
1389
1390 • vdirel, access vdir contacts from Emacs.
1391
1392 Servers
1393 Baikal
1394 Vdirsyncer is continuously tested against the latest version of Baikal.
1395
1396 • Baikal up to 0.2.7 also uses an old version of SabreDAV, with the
1397 same issue as ownCloud, see issue #160. This issue is fixed in later
1398 versions.
1399
1400 DavMail (Exchange, Outlook)
1401 DavMail is a proxy program that allows you to use Card- and CalDAV
1402 clients with Outlook. That allows you to use vdirsyncer with Outlook.
1403
1404 In practice your success with DavMail may wildly vary. Depending on
1405 your Exchange server you might get confronted with weird errors of all
1406 sorts (including data-loss).
1407
1408 Make absolutely sure you use the latest DavMail:
1409
1410 [storage outlook]
1411 type = "caldav"
1412 url = "http://localhost:1080/users/user@example.com/calendar/"
1413 username = "user@example.com"
1414 password = "..."
1415
1416 • Older versions of DavMail handle URLs case-insensitively. See issue
1417 #144.
1418
1419 • DavMail is handling malformed data on the Exchange server very
1420 poorly. In such cases the Calendar Checking Tool for Outlook might
1421 help.
1422
1423 • In some cases, you may see errors about duplicate events. It may look
1424 something like this:
1425
1426 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:
1427 error:
1428 error: vdirsyncer repair my_calendar_remote/calendar
1429 error:
1430 error: But make sure to have a backup of your data in some form. The offending hrefs are:
1431 [...]
1432
1433 In order to fix this, you can try the
1434 Remove-DuplicateAppointments.ps1 PowerShell script that Microsoft has
1435 come up with in order to remove duplicates.
1436
1437 FastMail
1438 Vdirsyncer is continuously tested against FastMail, thanks to them for
1439 providing a free account for this purpose. There are no known issues
1440 with it. FastMail's support pages provide the settings to use:
1441
1442 [storage cal]
1443 type = "caldav"
1444 url = "https://caldav.fastmail.com/"
1445 username = "..."
1446 password = "..."
1447
1448 [storage card]
1449 type = "carddav"
1450 url = "https://carddav.fastmail.com/"
1451 username = "..."
1452 password = "..."
1453
1454 Google
1455 Using vdirsyncer with Google Calendar is possible as of 0.10, but it is
1456 not tested frequently. You can use google_contacts and google_calendar.
1457
1458 For more information see issue #202 and issue #8.
1459
1460 iCloud
1461 Vdirsyncer is regularly tested against iCloud.
1462
1463 [storage cal]
1464 type = "caldav"
1465 url = "https://caldav.icloud.com/"
1466 username = "..."
1467 password = "..."
1468
1469 [storage card]
1470 type = "carddav"
1471 url = "https://contacts.icloud.com/"
1472 username = "..."
1473 password = "..."
1474
1475 Problems:
1476
1477 • Vdirsyncer can't do two-factor auth with iCloud (there doesn't seem
1478 to be a way to do two-factor auth over the DAV APIs) You'll need to
1479 use app-specific passwords instead.
1480
1481 • iCloud has a few special requirements when creating collections. In
1482 principle vdirsyncer can do it, but it is recommended to create them
1483 from an Apple client (or the iCloud web interface).
1484
1485 • iCloud requires a minimum length of collection names.
1486
1487 • Calendars created by vdirsyncer cannot be used as tasklists.
1488
1489 nextCloud
1490 Vdirsyncer is continuously tested against the latest version of
1491 nextCloud:
1492
1493 [storage cal]
1494 type = "caldav"
1495 url = "https://nextcloud.example.com/"
1496 username = "..."
1497 password = "..."
1498
1499 [storage card]
1500 type = "carddav"
1501 url = "https://nextcloud.example.com/"
1502
1503 • WebCAL-subscriptions can't be discovered by vdirsyncer. See this rel‐
1504 evant issue.
1505
1506 ownCloud
1507 Vdirsyncer is continuously tested against the latest version of
1508 ownCloud:
1509
1510 [storage cal]
1511 type = "caldav"
1512 url = "https://example.com/remote.php/dav/"
1513 username = ...
1514 password = ...
1515
1516 [storage card]
1517 type = "carddav"
1518 url = "https://example.com/remote.php/dav/"
1519 username = ...
1520 password = ...
1521
1522 • Versions older than 7.0.0: ownCloud uses SabreDAV, which had problems
1523 detecting collisions and race-conditions. The problems were reported
1524 and are fixed in SabreDAV's repo, and the corresponding fix is also
1525 in ownCloud since 7.0.0. See issue #16 for more information.
1526
1527 Radicale
1528 Radicale is a very lightweight server, however, it intentionally
1529 doesn't implement the CalDAV and CardDAV standards completely, which
1530 might lead to issues even with very well-written clients. Apart from
1531 its non-conformity with standards, there are multiple other problems
1532 with its code quality and the way it is maintained. Consider using e.g.
1533 Xandikos instead.
1534
1535 That said, vdirsyncer is continuously tested against the git version
1536 and the latest PyPI release of Radicale.
1537
1538 • Vdirsyncer can't create collections on Radicale.
1539
1540 • Radicale doesn't support time ranges in the calendar-query of CalDAV,
1541 so setting start_date and end_date for caldav will have no or unpre‐
1542 dicted consequences.
1543
1544 • Versions of Radicale older than 0.9b1 choke on RFC-conform queries
1545 for all items of a collection.
1546
1547 You have to set item_types = ["VTODO", "VEVENT"] in caldav for
1548 vdirsyncer to work with those versions.
1549
1550 Xandikos
1551 Xandikos is a lightweight, yet complete CalDAV and CardDAV server,
1552 backed by git. Vdirsyncer is continuously tested against its latest
1553 version.
1554
1555 After running ./bin/xandikos --defaults -d $HOME/dav, you should be
1556 able to point vdirsyncer against the root of Xandikos like this:
1557
1558 [storage cal]
1559 type = "caldav"
1560 url = "https://xandikos.example.com/"
1561 username = "..."
1562 password = "..."
1563
1564 [storage card]
1565 type = "carddav"
1566 url = "https://xandikos.example.com/"
1567 username = "..."
1568 password = "..."
1569
1571 For any unanswered questions or problems, see Support and Contact.
1572
1573 Requests-related ImportErrors
1574 ImportError: No module named packages.urllib3.poolmanager
1575
1576 ImportError: cannot import name iter_field_objects
1577
1578 Debian and nowadays even other distros make modifications to the re‐
1579 quests package that don't play well with packages assuming a normal re‐
1580 quests. This is due to stubbornness on both sides.
1581
1582 See issue #82 and issue #140 for past discussions. You have one option
1583 to work around this, that is, to install vdirsyncer in a virtualenv,
1584 see Manual installation.
1585
1587 NOTE:
1588
1589 • Please read Support and Contact for questions and support re‐
1590 quests.
1591
1592 • All participants must follow the pimutils Code of Conduct.
1593
1594 The issue tracker
1595 We use GitHub issues for organizing bug reports and feature requests.
1596
1597 The following labels are of interest:
1598
1599 • "Planning" is for issues that are still undecided, but where at least
1600 some discussion exists.
1601
1602 • "Blocked" is for issues that can't be worked on at the moment because
1603 some other unsolved problem exists. This problem may be a bug in some
1604 software dependency, for instance.
1605
1606 • "Ready" contains issues that are ready to work on.
1607
1608 If you just want to get started with contributing, the "ready" issues
1609 are an option. Issues that are still in "Planning" are also an option,
1610 but require more upfront thinking and may turn out to be impossible to
1611 solve, or at least harder than anticipated. On the flip side those tend
1612 to be the more interesting issues as well, depending on how one looks
1613 at it.
1614
1615 All of those labels are also available as a kanban board on waffle.io.
1616 It is really just an alternative overview over all issues, but might be
1617 easier to comprehend.
1618
1619 Feel free to contact me or comment on the relevant issues for further
1620 information.
1621
1622 Reporting bugs
1623 • Make sure your problem isn't already listed in Known Problems.
1624
1625 • Make sure you have the absolutely latest version of vdirsyncer. For
1626 users of some Linux distributions such as Debian or Fedora this may
1627 not be the version that your distro offers. In those cases please
1628 file a bug against the distro package, not against upstream
1629 vdirsyncer.
1630
1631 • Use --verbosity=DEBUG when including output from vdirsyncer.
1632
1633 Suggesting features
1634 If you're suggesting a feature, keep in mind that vdirsyncer tries not
1635 to be a full calendar or contacts client, but rather just the piece of
1636 software that synchronizes all the data. Take a look at the documenta‐
1637 tion for software working with vdirsyncer.
1638
1639 Submitting patches, pull requests
1640 • Discuss everything in the issue tracker first (or contact me somehow
1641 else) before implementing it.
1642
1643 • Make sure the tests pass. See below for running them.
1644
1645 • But not because you wrote too few tests.
1646
1647 • Add yourself to AUTHORS.rst, and add a note to CHANGELOG.rst too.
1648
1649 Running tests, how to set up your development environment
1650 For many patches, it might suffice to just let CI run the tests. How‐
1651 ever, CI is slow, so you might want to run them locally too. For this,
1652 set up a virtualenv and run this inside of it:
1653
1654 # install:
1655 # - vdirsyncer from the repo into the virtualenv
1656 # - stylecheckers (flake8) and code formatters (autopep8)
1657 make install-dev
1658
1659 # Install git commit hook for some extra linting and checking
1660 pre-commit install
1661
1662 # Install development dependencies
1663 make install-dev
1664
1665 Then you can run:
1666
1667 make test # The normal testsuite
1668 make style # Stylechecker
1669 make docs # Build the HTML docs, output is at docs/_build/html/
1670
1671 The Makefile has a lot of options that allow you to control which tests
1672 are run, and which servers are tested. Take a look at its code where
1673 they are all initialized and documented.
1674
1675 To tests against a specific DAV server, use DAV_SERVER:
1676
1677 make DAV_SERVER=xandikos test
1678
1679 The server will be initialised in a docker container and terminated at
1680 the end of the test suite.
1681
1682 If you have any questions, feel free to open issues about it.
1683
1684 Structure of the testsuite
1685 Within tests/, there are three main folders:
1686
1687 • system contains system- and also integration tests. A rough rule is:
1688 If the test is using temporary files, put it here.
1689
1690 • unit, where each testcase tests a single class or function.
1691
1692 • storage runs a generic storage testsuite against all storages.
1693
1694 The reason for this separation is: We are planning to generate separate
1695 coverage reports for each of those testsuites. Ideally unit would gen‐
1696 erate palatable coverage of the entire codebase on its own, and the
1697 combination of system and storage as well.
1698
1700 This document describes a standard for storing calendars and contacts
1701 on a filesystem, with the main goal of being easy to implement.
1702
1703 Vdirsyncer synchronizes to vdirs via filesystem. Each vdir (basically
1704 just a directory with some files in it) represents a calendar or ad‐
1705 dressbook.
1706
1707 Basic Structure
1708 The main folder (root) contains an arbitrary number of subfolders (col‐
1709 lections), which contain only files (items). Synonyms for "collection"
1710 may be "addressbook" or "calendar".
1711
1712 An item is:
1713
1714 • A vCard file, in which case the file extension must be .vcf, or
1715
1716 • An iCalendar file, in which case the file extension must be .ics.
1717
1718 An item should contain a UID property as described by the vCard and
1719 iCalendar standards. If it contains more than one UID property, the
1720 values of those must not differ.
1721
1722 The file must contain exactly one event, task or contact. In most cases
1723 this also implies only one VEVENT/VTODO/VCARD component per file, but
1724 e.g. recurrence exceptions would require multiple VEVENT components
1725 per event.
1726
1727 The filename should have similar properties as the UID of the file con‐
1728 tent. However, there is no requirement for these two to be the same.
1729 Programs may choose to store additional metadata in that filename, how‐
1730 ever, at the same time they must not assume that the metadata they in‐
1731 cluded will be preserved by other programs.
1732
1733 Metadata
1734 Any of the below metadata files may be absent. None of the files listed
1735 below have any file extensions.
1736
1737 • A file called color inside the vdir indicates the vdir's color, a
1738 property that is only relevant in UI design.
1739
1740 Its content is an ASCII-encoded hex-RGB value of the form #RRGGBB.
1741 For example, a file content of #FF0000 indicates that the vdir has a
1742 red (user-visible) color. No short forms or informal values such as
1743 red (as known from CSS, for example) are allowed. The prefixing #
1744 must be present.
1745
1746 • A file called displayname contains a UTF-8 encoded label that may be
1747 used to represent the vdir in UIs.
1748
1749 Writing to vdirs
1750 Creating and modifying items or metadata files should happen
1751 atomically.
1752
1753 Writing to a temporary file on the same physical device, and then mov‐
1754 ing it to the appropriate location is usually a very effective solu‐
1755 tion. For this purpose, files with the extension .tmp may be created
1756 inside collections.
1757
1758 When changing an item, the original filename must be used.
1759
1760 Reading from vdirs
1761 • Any file ending with the .tmp or no file extension must not be
1762 treated as an item.
1763
1764 • The ident part of the filename should not be parsed to improve the
1765 speed of item lookup.
1766
1767 Considerations
1768 The primary reason this format was chosen is due to its compatibility
1769 with the CardDAV and CalDAV standards.
1770
1771 Performance
1772 Currently, vdirs suffer from a rather major performance problem, one
1773 which current implementations try to mitigate by building up indices of
1774 the collections for faster search and lookup.
1775
1776 The reason items' filenames don't contain any extra information is sim‐
1777 ple: The solutions presented induced duplication of data, where one du‐
1778 plicate might become out of date because of bad implementations. As it
1779 stands right now, an index format could be formalized separately
1780 though.
1781
1782 vdirsyncer doesn't really have to bother about efficient item lookup,
1783 because its synchronization algorithm needs to fetch the whole list of
1784 items anyway. Detecting changes is easily implemented by checking the
1785 files' modification time.
1786
1788 Thank you very much for packaging vdirsyncer! The following guidelines
1789 should help you to avoid some common pitfalls.
1790
1791 If you find yourself needing to patch anything, or going in a different
1792 direction, please open an issue so we can also address in a way that
1793 works for everyone. Otherwise we get bug reports for code or scenarios
1794 that don't exist in upstream vdirsycner.
1795
1796 Obtaining the source code
1797 The main distribution channel is PyPI, and source tarballs can be ob‐
1798 tained there. We mirror the same package tarball and wheel as GitHub
1799 releases. Please do not confuse these with the auto-generated GitHub
1800 "Source Code" tarball. Those are missing some important metadata and
1801 your build will fail.
1802
1803 We give each release a tag in the git repo. If you want to get notified
1804 of new releases, GitHub's feed is a good way.
1805
1806 Tags will be signed by the maintainer who is doing the release (start‐
1807 ing with 0.16.8), and generation of the tarball and wheel is done by
1808 CI. Hence, only the tag itself is signed.
1809
1810 Dependency versions
1811 As with most Python packages, setup.py denotes the dependencies of
1812 vdirsyncer. It also contains lower-bound versions of each dependency.
1813 Older versions will be rejected by the testsuite.
1814
1815 Testing
1816 Everything testing-related goes through the Makefile in the root of the
1817 repository or PyPI package. Trying to e.g. run pytest directly will re‐
1818 quire a lot of environment variables to be set (for configuration) and
1819 you probably don't want to deal with that.
1820
1821 You can install the all development dependencies with:
1822
1823 make install-dev
1824
1825 You probably don't want this since it will use pip to download the de‐
1826 pendencies. Alternatively you can find the testing dependencies in
1827 test-requirements.txt, again with lower-bound version requirements.
1828
1829 You also have to have vdirsyncer fully installed at this point. Merely
1830 cd-ing into the tarball will not be sufficient.
1831
1832 Running the tests happens with:
1833
1834 make test
1835
1836 Hypothesis will randomly generate test input. If you care about deter‐
1837 ministic tests, set the DETERMINISTIC_TESTS variable to "true":
1838
1839 make DETERMINISTIC_TESTS=true test
1840
1841 There are a lot of additional variables that allow you to test
1842 vdirsyncer against a particular server. Those variables are not "sta‐
1843 ble" and may change drastically between minor versions. Just don't use
1844 them, you are unlikely to find bugs that vdirsyncer's CI hasn't found.
1845
1846 Documentation
1847 Using Sphinx you can generate the documentation you're reading right
1848 now in a variety of formats, such as HTML, PDF, or even as a manpage.
1849 That said, I only take care of the HTML docs' formatting.
1850
1851 You can find a list of dependencies in docs-requirements.txt. Again,
1852 you can install those using pip with:
1853
1854 make install-docs
1855
1856 Then change into the docs/ directory and build whatever format you want
1857 using the Makefile in there (run make for the formats you can build).
1858
1859 Contrib files
1860 Reference systemd.service and systemd.timer unit files are provided. It
1861 is recommended to install this if your distribution is systemd-based.
1862
1864 • The #pimutils IRC channel on Libera.Chat might be active, depending
1865 on your timezone. Use it for support and general (including
1866 off-topic) discussion.
1867
1868 • Open a GitHub issue for concrete bug reports and feature requests.
1869
1870 • Lastly, you can also contact the author directly. Do this for secu‐
1871 rity issues. If that doesn't work out (i.e. if I don't respond within
1872 one week), use contact@pimutils.org.
1873
1875 This changelog only contains information that might be useful to end
1876 users and package maintainers. For further info, see the git commit
1877 log.
1878
1879 Package maintainers and users who have to manually update their instal‐
1880 lation may want to subscribe to GitHub's tag feed.
1881
1882 Version 0.18.0
1883 Note: Version 0.17 has some alpha releases but ultimately was never fi‐
1884 nalised. 0.18 actually continues where 0.16 left off.
1885
1886 • Support for Python 3.5 and 3.6 has been dropped. This release mostly
1887 focuses on keeping vdirsyncer compatible with newer environments.
1888
1889 • click 8 and click-threading 0.5.0 are now required.
1890
1891 • For those using pipsi, we now recommend using pipx, it's successor.
1892
1893 • Python 3.9 is now supported.
1894
1895 • Our Debian/Ubuntu build scripts have been updated. New versions
1896 should be pushed to those repositories soon.
1897
1898 Version 0.16.8
1899 released 09 June 2020
1900
1901 • Support Python 3.7 and 3.8.
1902
1903 This release is functionally identical to 0.16.7. It's been tested
1904 with recent Python versions, and has been marked as supporting them. It
1905 will also be the final release supporting Python 3.5 and 3.6.
1906
1907 Version 0.16.7
1908 released on 19 July 2018
1909
1910 • Fixes for Python 3.7
1911
1912 Version 0.16.6
1913 released on 13 June 2018
1914
1915 • Packagers: Documentation building no longer needs a working installa‐
1916 tion of vdirsyncer.
1917
1918 Version 0.16.5
1919 released on 13 June 2018
1920
1921 • Packagers: click-log 0.3 is required.
1922
1923 • All output will now happen on stderr (because of the upgrade of
1924 click-log).
1925
1926 Version 0.16.4
1927 released on 05 February 2018
1928
1929 • Fix tests for new Hypothesis version. (Literally no other change in‐
1930 cluded)
1931
1932 Version 0.16.3
1933 released on 03 October 2017
1934
1935 • First version with custom Debian and Ubuntu packages. See issue #663.
1936
1937 • Remove invalid ASCII control characters from server responses. See
1938 issue #626.
1939
1940 • packagers: Python 3.3 is no longer supported. See pull request #674.
1941
1942 Version 0.16.2
1943 released on 24 August 2017
1944
1945 • Fix crash when using daterange or item_type filters in
1946 google_calendar, see issue #657.
1947
1948 • Packagers: Fixes for new version 0.2.0 of click-log. The version re‐
1949 quirements for the dependency click-log changed.
1950
1951 Version 0.16.1
1952 released on 8 August 2017
1953
1954 • Removed remoteStorage support, see issue #647.
1955
1956 • Fixed test failures caused by latest requests version, see issue
1957 #660.
1958
1959 Version 0.16.0
1960 released on 2 June 2017
1961
1962 • Strip METHOD:PUBLISH added by some calendar providers, see issue
1963 #502.
1964
1965 • Fix crash of Google storages when saving token file.
1966
1967 • Make DAV discovery more RFC-conformant, see pull request #585.
1968
1969 • Vdirsyncer is now tested against Xandikos, see pull request #601.
1970
1971 • Subfolders with a leading dot are now ignored during discover for
1972 filesystem storage. This makes it easier to combine it with version
1973 control.
1974
1975 • Statuses are now stored in a sqlite database. Old data is automati‐
1976 cally migrated. Users with really large datasets should encounter
1977 performance improvements. This means that sqlite3 is now a dependency
1978 of vdirsyncer.
1979
1980 • Vdirsyncer is now licensed under the 3-clause BSD license, see issue
1981 #610.
1982
1983 • Vdirsyncer now includes experimental support for EteSync, see pull
1984 request #614.
1985
1986 • Vdirsyncer now uses more filesystem metadata for determining whether
1987 an item changed. You will notice a possibly heavy CPU/IO spike on the
1988 first sync after upgrading.
1989
1990 • Packagers: Reference systemd.service and systemd.timer unit files are
1991 provided. It is recommended to install these as documentation if your
1992 distribution is systemd-based.
1993
1994 Version 0.15.0
1995 released on 28 February 2017
1996
1997 • Deprecated syntax for configuration values is now completely re‐
1998 jected. All values now have to be valid JSON.
1999
2000 • A few UX improvements for Google storages, see issue #549 and issue
2001 #552.
2002
2003 • Fix collection discovery for google_contacts, see issue #564.
2004
2005 • iCloud is now tested on Travis, see issue #567.
2006
2007 Version 0.14.1
2008 released on 05 January 2017
2009
2010 • vdirsyncer repair no longer changes "unsafe" UIDs by default, an ex‐
2011 tra option has to be specified. See issue #527.
2012
2013 • A lot of important documentation updates.
2014
2015 Version 0.14.0
2016 released on 26 October 2016
2017
2018 • vdirsyncer sync now continues other uploads if one upload failed.
2019 The exit code in such situations is still non-zero.
2020
2021 • Add partial_sync option to pair section. See the config docs.
2022
2023 • Vdirsyncer will now warn if there's a string without quotes in your
2024 config. Please file issues if you find documentation that uses un‐
2025 quoted strings.
2026
2027 • Fix an issue that would break khal's config setup wizard.
2028
2029 Version 0.13.1
2030 released on 30 September 2016
2031
2032 • Fix a bug that would completely break collection discovery.
2033
2034 Version 0.13.0
2035 released on 29 September 2016
2036
2037 • Python 2 is no longer supported at all. See issue #219.
2038
2039 • Config sections are now checked for duplicate names. This also means
2040 that you cannot have a storage section [storage foo] and a pair [pair
2041 foo] in your config, they have to have different names. This is done
2042 such that console output is always unambiguous. See issue #459.
2043
2044 • Custom commands can now be used for conflict resolution during sync.
2045 See issue #127.
2046
2047 • http now completely ignores UIDs. This avoids a lot of unnecessary
2048 down- and uploads.
2049
2050 Version 0.12.1
2051 released on 20 August 2016
2052
2053 • Fix a crash for Google and DAV storages. See pull request #492.
2054
2055 • Fix an URL-encoding problem with DavMail. See issue #491.
2056
2057 Version 0.12
2058 released on 19 August 2016
2059
2060 • singlefile now supports collections. See pull request #488.
2061
2062 Version 0.11.3
2063 released on 29 July 2016
2064
2065 • Default value of auth parameter was changed from guess to basic to
2066 resolve issues with the Apple Calendar Server (issue #457) and im‐
2067 prove performance. See issue #461.
2068
2069 • Packagers: The click-threading requirement is now >=0.2. It was in‐
2070 correct before. See issue #478.
2071
2072 • Fix a bug in the DAV XML parsing code that would make vdirsyncer
2073 crash on certain input. See issue #480.
2074
2075 • Redirect chains should now be properly handled when resolving
2076 well-known URLs. See pull request #481.
2077
2078 Version 0.11.2
2079 released on 15 June 2016
2080
2081 • Fix typo that would break tests.
2082
2083 Version 0.11.1
2084 released on 15 June 2016
2085
2086 • Fix a bug in collection validation.
2087
2088 • Fix a cosmetic bug in debug output.
2089
2090 • Various documentation improvements.
2091
2092 Version 0.11.0
2093 released on 19 May 2016
2094
2095 • Discovery is no longer automatically done when running vdirsyncer
2096 sync. vdirsyncer discover now has to be explicitly called.
2097
2098 • Add a .plist example for Mac OS X.
2099
2100 • Usage under Python 2 now requires a special config parameter to be
2101 set.
2102
2103 • Various deprecated configuration parameters do no longer have spe‐
2104 cialized errormessages. The generic error message for unknown parame‐
2105 ters is shown.
2106
2107 • Vdirsyncer no longer warns that the passwordeval parameter has been
2108 renamed to password_command.
2109
2110 • The keyring fetching strategy has been dropped some versions ago,
2111 but the specialized error message has been dropped.
2112
2113 • An old status format from version 0.4 is no longer supported. If
2114 you're experiencing problems, just delete your status folder.
2115
2116 Version 0.10.0
2117 released on 23 April 2016
2118
2119 • New storage types google_calendar and google_contacts have been
2120 added.
2121
2122 • New global command line option --config, to specify an alternative
2123 config file. See issue #409.
2124
2125 • The collections parameter can now be used to synchronize differ‐
2126 ently-named collections with each other.
2127
2128 • Packagers: The lxml dependency has been dropped.
2129
2130 • XML parsing is now a lot stricter. Malfunctioning servers that used
2131 to work with vdirsyncer may stop working.
2132
2133 Version 0.9.3
2134 released on 22 March 2016
2135
2136 • singlefile and http now handle recurring events properly.
2137
2138 • Fix a typo in the packaging guidelines.
2139
2140 • Moved to pimutils organization on GitHub. Old links should redirect,
2141 but be aware of client software that doesn't properly handle redi‐
2142 rects.
2143
2144 Version 0.9.2
2145 released on 13 March 2016
2146
2147 • Fixed testsuite for environments that don't have any web browser in‐
2148 stalled. See pull request #384.
2149
2150 Version 0.9.1
2151 released on 13 March 2016
2152
2153 • Removed leftover debug print statement in vdirsyncer discover, see
2154 commit 3d856749f37639821b148238ef35f1acba82db36.
2155
2156 • metasync will now strip whitespace from the start and the end of the
2157 values. See issue #358.
2158
2159 • New Packaging Guidelines have been added to the documentation.
2160
2161 Version 0.9.0
2162 released on 15 February 2016
2163
2164 • The collections parameter is now required in pair configurations.
2165 Vdirsyncer will tell you what to do in its error message. See issue
2166 #328.
2167
2168 Version 0.8.1
2169 released on 30 January 2016
2170
2171 • Fix error messages when invalid parameter fetching strategy is used.
2172 This is important because users would receive awkward errors for us‐
2173 ing deprecated keyring fetching.
2174
2175 Version 0.8.0
2176 released on 27 January 2016
2177
2178 • Keyring support has been removed, which means that password.fetch =
2179 ["keyring", "example.com", "myuser"] doesn't work anymore.
2180
2181 For existing setups: Use password.fetch = ["command", "keyring",
2182 "get", "example.com", "myuser"] instead, which is more generic. See
2183 the documentation for details.
2184
2185 • Now emitting a warning when running under Python 2. See issue #219.
2186
2187 Version 0.7.5
2188 released on 23 December 2015
2189
2190 • Fixed a bug in remotestorage that would try to open a CLI browser for
2191 OAuth.
2192
2193 • Fix a packaging bug that would prevent vdirsyncer from working with
2194 newer lxml versions.
2195
2196 Version 0.7.4
2197 released on 22 December 2015
2198
2199 • Improved error messages instead of faulty server behavior, see issue
2200 #290 and issue #300.
2201
2202 • Safer shutdown of threadpool, avoid exceptions, see issue #291.
2203
2204 • Fix a sync bug for read-only storages see commit
2205 ed22764921b2e5bf6a934cf14aa9c5fede804d8e.
2206
2207 • Etag changes are no longer sufficient to trigger sync operations. An
2208 actual content change is also necessary. See issue #257.
2209
2210 • remotestorage now automatically opens authentication dialogs in your
2211 configured GUI browser.
2212
2213 • Packagers: lxml>=3.1 is now required (newer lower-bound version).
2214
2215 Version 0.7.3
2216 released on 05 November 2015
2217
2218 • Make remotestorage-dependencies actually optional.
2219
2220 Version 0.7.2
2221 released on 05 November 2015
2222
2223 • Un-break testsuite.
2224
2225 Version 0.7.1
2226 released on 05 November 2015
2227
2228 • Packagers: The setuptools extras keyring and remotestorage have been
2229 added. They're basically optional dependencies. See setup.py for more
2230 details.
2231
2232 • Highly experimental remoteStorage support has been added. It may be
2233 completely overhauled or even removed in any version.
2234
2235 • Removed mentions of old password_command in documentation.
2236
2237 Version 0.7.0
2238 released on 27 October 2015
2239
2240 • Packagers: New dependencies are click_threading, click_log and
2241 click>=5.0.
2242
2243 • password_command is gone. Keyring support got completely overhauled.
2244 See Storing passwords.
2245
2246 Version 0.6.0
2247 released on 06 August 2015
2248
2249 • password_command invocations with non-zero exit code are now fatal
2250 (and will abort synchronization) instead of just producing a warning.
2251
2252 • Vdirsyncer is now able to synchronize metadata of collections. Set
2253 metadata = ["displayname"] and run vdirsyncer metasync.
2254
2255 • Packagers: Don't use the GitHub tarballs, but the PyPI ones.
2256
2257 • Packagers: build.sh is gone, and Makefile is included in tarballs.
2258 See the content of Makefile on how to run tests post-packaging.
2259
2260 • verify_fingerprint doesn't automatically disable verify anymore.
2261
2262 Version 0.5.2
2263 released on 15 June 2015
2264
2265 • Vdirsyncer now checks and corrects the permissions of status files.
2266
2267 • Vdirsyncer is now more robust towards changing UIDs inside items.
2268
2269 • Vdirsyncer is now handling unicode hrefs and UIDs correctly. Software
2270 that produces non-ASCII UIDs is broken, but apparently it exists.
2271
2272 Version 0.5.1
2273 released on 29 May 2015
2274
2275 • N.b.: The PyPI upload of 0.5.0 is completely broken.
2276
2277 • Raise version of required requests-toolbelt to 0.4.0.
2278
2279 • Command line should be a lot faster when no work is done, e.g. for
2280 help output.
2281
2282 • Fix compatibility with iCloud again.
2283
2284 • Use only one worker if debug mode is activated.
2285
2286 • verify=false is now disallowed in vdirsyncer, please use verify_fin‐
2287 gerprint instead.
2288
2289 • Fixed a bug where vdirsyncer's DAV storage was not using the config‐
2290 ured useragent for collection discovery.
2291
2292 Version 0.4.4
2293 released on 12 March 2015
2294
2295 • Support for client certificates via the new auth_cert parameter, see
2296 issue #182 and pull request #183.
2297
2298 • The icalendar package is no longer required.
2299
2300 • Several bugfixes related to collection creation.
2301
2302 Version 0.4.3
2303 released on 20 February 2015
2304
2305 • More performance improvements to singlefile-storage.
2306
2307 • Add post_hook param to filesystem-storage.
2308
2309 • Collection creation now also works with SabreDAV-based servers, such
2310 as Baikal or ownCloud.
2311
2312 • Removed some workarounds for Radicale. Upgrading to the latest Radi‐
2313 cale will fix the issues.
2314
2315 • Fixed issues with iCloud discovery.
2316
2317 • Vdirsyncer now includes a simple repair command that seeks to fix
2318 some broken items.
2319
2320 Version 0.4.2
2321 released on 30 January 2015
2322
2323 • Vdirsyncer now respects redirects when uploading and updating items.
2324 This might fix issues with Zimbra.
2325
2326 • Relative status_path values are now interpreted as relative to the
2327 configuration file's directory.
2328
2329 • Fixed compatibility with custom SabreDAV servers. See issue #166.
2330
2331 • Catch harmless threading exceptions that occur when shutting down
2332 vdirsyncer. See issue #167.
2333
2334 • Vdirsyncer now depends on atomicwrites.
2335
2336 • Massive performance improvements to singlefile-storage.
2337
2338 • Items with extremely long UIDs should now be saved properly in
2339 filesystem-storage. See issue #173.
2340
2341 Version 0.4.1
2342 released on 05 January 2015
2343
2344 • All create arguments from all storages are gone. Vdirsyncer now asks
2345 if it should try to create collections.
2346
2347 • The old config values True, False, on, off and None are now invalid.
2348
2349 • UID conflicts are now properly handled instead of ignoring one item.
2350 Card- and CalDAV servers are already supposed to take care of those
2351 though.
2352
2353 • Official Baikal support added.
2354
2355 Version 0.4.0
2356 released on 31 December 2014
2357
2358 • The passwordeval parameter has been renamed to password_command.
2359
2360 • The old way of writing certain config values such as lists is now
2361 gone.
2362
2363 • Collection discovery has been rewritten. Old configuration files
2364 should be compatible with it, but vdirsyncer now caches the results
2365 of the collection discovery. You have to run vdirsyncer discover if
2366 collections were added or removed on one side.
2367
2368 • Pair and storage names are now restricted to certain characters.
2369 Vdirsyncer will issue a clear error message if your configuration
2370 file is invalid in that regard.
2371
2372 • Vdirsyncer now supports the XDG-Basedir specification. If the
2373 VDIRSYNCER_CONFIG environment variable isn't set and the
2374 ~/.vdirsyncer/config file doesn't exist, it will look for the config‐
2375 uration file at $XDG_CONFIG_HOME/vdirsyncer/config.
2376
2377 • Some improvements to CardDAV and CalDAV discovery, based on problems
2378 found with FastMail. Support for .well-known-URIs has been added.
2379
2380 Version 0.3.4
2381 released on 8 December 2014
2382
2383 • Some more bugfixes to config handling.
2384
2385 Version 0.3.3
2386 released on 8 December 2014
2387
2388 • Vdirsyncer now also works with iCloud. Particularly collection dis‐
2389 covery and etag handling were fixed.
2390
2391 • Vdirsyncer now encodes Cal- and CardDAV requests differently. This
2392 hasn't been well-tested with servers like Zimbra or SoGo, but isn't
2393 expected to cause any problems.
2394
2395 • Vdirsyncer is now more robust regarding invalid responses from CalDAV
2396 servers. This should help with future compatibility with Davmail/Out‐
2397 look.
2398
2399 • Fix a bug when specifying item_types of caldav in the deprecated con‐
2400 fig format.
2401
2402 • Fix a bug where vdirsyncer would ignore all but one character speci‐
2403 fied in unsafe_href_chars of caldav and carddav.
2404
2405 Version 0.3.2
2406 released on 3 December 2014
2407
2408 • The current config format has been deprecated, and support for it
2409 will be removed in version 0.4.0. Vdirsyncer warns about this now.
2410
2411 Version 0.3.1
2412 released on 24 November 2014
2413
2414 • Fixed a bug where vdirsyncer would delete items if they're deleted on
2415 side A but modified on side B. Instead vdirsyncer will now upload the
2416 new items to side A. See issue #128.
2417
2418 • Synchronization continues with the remaining pairs if one pair
2419 crashes, see issue #121.
2420
2421 • The processes config key is gone. There is now a --max-workers option
2422 on the CLI which has a similar purpose. See pull request #126.
2423
2424 • The Read The Docs-theme is no longer required for building the docs.
2425 If it is not installed, the default theme will be used. See issue
2426 #134.
2427
2428 Version 0.3.0
2429 released on 20 September 2014
2430
2431 • Add verify_fingerprint parameter to http, caldav and carddav, see
2432 issue #99 and pull request #106.
2433
2434 • Add passwordeval parameter to General Section, see issue #108 and
2435 pull request #117.
2436
2437 • Emit warnings (instead of exceptions) about certain invalid responses
2438 from the server, see issue #113. This is apparently required for
2439 compatibility with Davmail.
2440
2441 Version 0.2.5
2442 released on 27 August 2014
2443
2444 • Don't ask for the password of one server more than once and fix mul‐
2445 tiple concurrency issues, see issue #101.
2446
2447 • Better validation of DAV endpoints.
2448
2449 Version 0.2.4
2450 released on 18 August 2014
2451
2452 • Include workaround for collection discovery with latest version of
2453 Radicale.
2454
2455 • Include metadata files such as the changelog or license in source
2456 distribution, see issue #97 and issue #98.
2457
2458 Version 0.2.3
2459 released on 11 August 2014
2460
2461 • Vdirsyncer now has a --version flag, see issue #92.
2462
2463 • Fix a lot of bugs related to special characters in URLs, see issue
2464 #49.
2465
2466 Version 0.2.2
2467 released on 04 August 2014
2468
2469 • Remove a security check that caused problems with special characters
2470 in DAV URLs and certain servers. On top of that, the security check
2471 was nonsensical. See issue #87 and issue #91.
2472
2473 • Change some errors to warnings, see issue #88.
2474
2475 • Improve collection autodiscovery for servers without full support.
2476
2477 Version 0.2.1
2478 released on 05 July 2014
2479
2480 • Fix bug where vdirsyncer shows empty addressbooks when using CardDAV
2481 with Zimbra.
2482
2483 • Fix infinite loop when password doesn't exist in system keyring.
2484
2485 • Colorized errors, warnings and debug messages.
2486
2487 • vdirsyncer now depends on the click package instead of argvard.
2488
2489 Version 0.2.0
2490 released on 12 June 2014
2491
2492 • vdirsyncer now depends on the icalendar package from PyPI, to get rid
2493 of its own broken parser.
2494
2495 • vdirsyncer now also depends on requests_toolbelt. This makes it pos‐
2496 sible to guess the authentication type instead of blankly assuming
2497 basic.
2498
2499 • Fix a semi-bug in caldav and carddav storages where a tuple (href,
2500 etag) instead of the proper etag would have been returned from the
2501 upload method. vdirsyncer might do unnecessary copying when upgrad‐
2502 ing to this version.
2503
2504 • Add the storage singlefile. See issue #48.
2505
2506 • The collections parameter for pair sections now accepts the special
2507 values from a and from b for automatically discovering collections.
2508 See Pair Section.
2509
2510 • The read_only parameter was added to storage sections. See Storage
2511 Section.
2512
2513 Version 0.1.5
2514 released on 14 May 2014
2515
2516 • Introduced changelogs
2517
2518 • Many bugfixes
2519
2520 • Many doc fixes
2521
2522 • vdirsyncer now doesn't necessarily need UIDs anymore for synchroniza‐
2523 tion.
2524
2525 • vdirsyncer now aborts if one collection got completely emptied be‐
2526 tween synchronizations. See issue #42.
2527
2529 Contributors
2530 In alphabetical order:
2531
2532 • Ben Boeckel
2533
2534 • Christian Geier
2535
2536 • Clément Mondon
2537
2538 • Hugo Osvaldo Barrera
2539
2540 • Julian Mehne
2541
2542 • Malte Kiefer
2543
2544 • Marek Marczykowski-Górecki
2545
2546 • Markus Unterwaditzer
2547
2548 • Michael Adler
2549
2550 • Thomas Weißschuh
2551
2552 Special thanks goes to:
2553
2554 • FastMail sponsors a paid account for testing their servers.
2555
2556 • Packagecloud provide repositories for vdirsyncer's Debian packages.
2557
2558 License
2559 Copyright (c) 2014-2020 by Markus Unterwaditzer & contributors. See AU‐
2560 THORS.rst for more details.
2561
2562 Some rights reserved.
2563
2564 Redistribution and use in source and binary forms of the software as
2565 well as documentation, with or without modification, are permitted pro‐
2566 vided that the following conditions are met:
2567
2568 • Redistributions of source code must retain the above copyright no‐
2569 tice, this list of conditions and the following disclaimer.
2570
2571 • Redistributions in binary form must reproduce the above copyright no‐
2572 tice, this list of conditions and the following disclaimer in the
2573 documentation and/or other materials provided with the distribution.
2574
2575 • The names of the contributors may not be used to endorse or promote
2576 products derived from this software without specific prior written
2577 permission.
2578
2579 THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS
2580 AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUD‐
2581 ING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
2582 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2583 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, IN‐
2584 CIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2585 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
2586 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2587 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2588 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2589 OF THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY
2590 OF SUCH DAMAGE.
2591
2593 If you found my work useful, please consider donating. Thank you!
2594
2595 • Bitcoin: 16sSHxZm263WHR9P9PJjCxp64jp9ooXKVt
2596
2597 • PayPal.me
2598
2599 • Bountysource is useful for funding work on a specific GitHub issue.
2600
2601 • There's also Bountysource Salt, for one-time and recurring dona‐
2602 tions.
2603
2604 • Donations via Bountysource are publicly listed. Use PayPal if you
2605 dislike that.
2606
2607 • Flattr or Gratipay can be used for recurring donations.
2608
2610 Markus Unterwaditzer
2611
2613 2014-2022, Markus Unterwaditzer & contributors
2614
2615
2616
2617
26180.18 Aug 17, 2022 VDIRSYNCER(1)