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. DAVDroid 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.16.8. 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.5+ 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 debian-urllib3).
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 pipsi 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 pipsi install --python python3 vdirsyncer
169
170 and .local/bin/vdirsyncer will be your new vdirsyncer installation. To
171 update vdirsyncer to the latest version:
172
173 pipsi upgrade vdirsyncer
174
175 If you're done with vdirsyncer, you can do:
176
177 pipsi 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 problems page if anything doesn't work like
199 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 supported-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_config 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 collections_tutorial.
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_tutorial.
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 partial_sync_tutorial.
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 supported-servers, as some servers may not work
771 well.
772
773 caldav CalDAV.
774
775 [storage example_for_caldav]
776 type = "caldav"
777 #start_date = null
778 #end_date = null
779 #item_types = []
780 url = "..."
781 #username = ""
782 #password = ""
783 #verify = true
784 #auth = null
785 #useragent = "vdirsyncer/0.16.4"
786 #verify_fingerprint = null
787 #auth_cert = null
788
789 You can set a timerange to synchronize with the parameters
790 start_date and end_date. Inside those parameters, you can use
791 any Python expression to return a valid datetime.datetime ob‐
792 ject. For example, the following would synchronize the timerange
793 from one year in the past to one year in the future:
794
795 start_date = "datetime.now() - timedelta(days=365)"
796 end_date = "datetime.now() + timedelta(days=365)"
797
798 Either both or none have to be specified. The default is to syn‐
799 chronize everything.
800
801 You can set item_types to restrict the kind of items you want to
802 synchronize. For example, if you want to only synchronize events
803 (but don't download any tasks from the server), set item_types =
804 ["VEVENT"]. If you want to synchronize events and tasks, but
805 have some VJOURNAL items on the server you don't want to syn‐
806 chronize, use item_types = ["VEVENT", "VTODO"].
807
808 Parameters
809
810 • start_date -- Start date of timerange to show, default
811 -inf.
812
813 • end_date -- End date of timerange to show, default
814 +inf.
815
816 • item_types -- Kind of items to show. The default, the
817 empty list, is to show all. This depends on particular
818 features on the server, the results are not validated.
819
820 • url -- Base URL or an URL to a calendar.
821
822 • username -- Username for authentication.
823
824 • password -- Password for authentication.
825
826 • verify -- Verify SSL certificate, default True. This
827 can also be a local path to a self-signed SSL certifi‐
828 cate. See ssl-tutorial for more information.
829
830 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
831 of the expected server certificate. See ssl-tutorial
832 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-tutorial for more information.
871
872 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
873 of the expected server certificate. See ssl-tutorial
874 for more information.
875
876 • auth -- Optional. Either basic, digest or guess. The
877 default is preemptive Basic auth, sending credentials
878 even if server didn't request them. This saves from an
879 additional roundtrip per request. Consider setting
880 guess if this causes issues with your server.
881
882 • auth_cert -- Optional. Either a path to a certificate
883 with a client certificate and the key or a list of
884 paths to the files with them.
885
886 • useragent -- Default vdirsyncer.
887
888 Google
889 Vdirsyncer supports synchronization with Google calendars with the re‐
890 striction that VTODO files are rejected by the server.
891
892 Synchronization with Google contacts is less reliable due to negligence
893 of Google's CardDAV API. Google's CardDAV implementation is allegedly a
894 disaster in terms of data safety. See this blog post for the details.
895 Always back up your data.
896
897 At first run you will be asked to authorize application for google ac‐
898 count access.
899
900 To use this storage type, you need to install some additional dependen‐
901 cies:
902
903 pip install vdirsyncer[google]
904
905 Furthermore you need to register vdirsyncer as an application yourself
906 to obtain client_id and client_secret, as it is against Google's Terms
907 of Service to hardcode those into opensource software [googleterms]:
908
909 1. Go to the Google API Manager and create a new project under any
910 name.
911
912 2. Within that project, enable the "CalDAV" and "CardDAV" APIs (not the
913 Calendar and Contacts APIs, those are different and won't work).
914 There should be a searchbox where you can just enter those terms.
915
916 3. In the sidebar, select "Credentials" and create a new "OAuth Client
917 ID". The application type is "Other".
918
919 You'll be prompted to create a OAuth consent screen first. Fill out
920 that form however you like.
921
922 4. Finally you should have a Client ID and a Client secret. Provide
923 these in your storage config.
924
925 The token_file parameter should be a filepath where vdirsyncer can
926 later store authentication-related data. You do not need to create the
927 file itself or write anything to it.
928
929 [googleterms]
930 See ToS, section "Confidential Matters".
931
932 NOTE:
933 You need to configure which calendars Google should offer vdirsyncer
934 using a rather hidden settings page.
935
936 google_calendar
937 Google calendar.
938
939 [storage example_for_google_calendar]
940 type = "google_calendar"
941 token_file = "..."
942 client_id = "..."
943 client_secret = "..."
944 #start_date = null
945 #end_date = null
946 #item_types = []
947
948 Please refer to caldav regarding the item_types and timerange
949 parameters.
950
951 Parameters
952
953 • token_file -- A filepath where access tokens are
954 stored.
955
956 • client_id/client_secret -- OAuth credentials, obtained
957 from the Google API Manager.
958
959 google_contacts
960 Google contacts.
961
962 [storage example_for_google_contacts]
963 type = "google_contacts"
964 token_file = "..."
965 client_id = "..."
966 client_secret = "..."
967
968 Parameters
969
970 • token_file -- A filepath where access tokens are
971 stored.
972
973 • client_id/client_secret -- OAuth credentials, obtained
974 from the Google API Manager.
975
976 EteSync
977 EteSync is a new cloud provider for end to end encrypted contacts and
978 calendar storage. Vdirsyncer contains experimental support for it.
979
980 To use it, you need to install some optional dependencies:
981
982 pip install vdirsyncer[etesync]
983
984 On first usage you will be prompted for the service password and the
985 encryption password. Neither are stored.
986
987 etesync_contacts
988 Contacts for etesync.
989
990 [storage example_for_etesync_contacts]
991 email = ...
992 secrets_dir = ...
993 #server_path = ...
994 #db_path = ...
995
996 Parameters
997
998 • email -- The email address of your account.
999
1000 • secrets_dir -- A directory where vdirsyncer can store
1001 the encryption key and authentication token.
1002
1003 • server_url -- Optional. URL to the root of your custom
1004 server.
1005
1006 • db_path -- Optional. Use a different path for the data‐
1007 base.
1008
1009 etesync_calendars
1010 Calendars for etesync.
1011
1012 [storage example_for_etesync_calendars]
1013 email = ...
1014 secrets_dir = ...
1015 #server_path = ...
1016 #db_path = ...
1017
1018 Parameters
1019
1020 • email -- The email address of your account.
1021
1022 • secrets_dir -- A directory where vdirsyncer can store
1023 the encryption key and authentication token.
1024
1025 • server_url -- Optional. URL to the root of your custom
1026 server.
1027
1028 • db_path -- Optional. Use a different path for the data‐
1029 base.
1030
1031 Local
1032 filesystem
1033 Saves each item in its own file, given a directory.
1034
1035 [storage example_for_filesystem]
1036 type = "filesystem"
1037 path = "..."
1038 fileext = "..."
1039 #encoding = "utf-8"
1040 #post_hook = null
1041
1042 Can be used with khal. See vdir for a more formal description of
1043 the format.
1044
1045 Directories with a leading dot are ignored to make usage of e.g.
1046 version control easier.
1047
1048 Parameters
1049
1050 • path -- Absolute path to a vdir/collection. If this is
1051 used in combination with the collections parameter in a
1052 pair-section, this should point to a directory of vdirs
1053 instead.
1054
1055 • fileext -- The file extension to use (e.g. .txt). Con‐
1056 tained in the href, so if you change the file extension
1057 after a sync, this will trigger a re-download of every‐
1058 thing (but should not cause data-loss of any kind).
1059
1060 • encoding -- File encoding for items, both content and
1061 filename.
1062
1063 • post_hook -- A command to call for each item creation
1064 and modification. The command will be called with the
1065 path of the new/updated file.
1066
1067 singlefile
1068 Save data in single local .vcf or .ics file.
1069
1070 The storage basically guesses how items should be joined in the
1071 file.
1072
1073 New in version 0.1.6.
1074
1075
1076 NOTE:
1077 This storage is very slow, and that is unlikely to change.
1078 You should consider using filesystem if it fits your usecase.
1079
1080 Parameters
1081
1082 • path -- The filepath to the file to be written to. If
1083 collections are used, this should contain %s as a
1084 placeholder for the collection name.
1085
1086 • encoding -- Which encoding the file should use. De‐
1087 faults to UTF-8.
1088
1089 Example for syncing with caldav:
1090
1091 [pair my_calendar]
1092 a = my_calendar_local
1093 b = my_calendar_remote
1094 collections = ["from a", "from b"]
1095
1096 [storage my_calendar_local]
1097 type = "singlefile"
1098 path = ~/.calendars/%s.ics
1099
1100 [storage my_calendar_remote]
1101 type = "caldav"
1102 url = https://caldav.example.org/
1103 #username =
1104 #password =
1105
1106 Example for syncing with caldav using a null collection:
1107
1108 [pair my_calendar]
1109 a = my_calendar_local
1110 b = my_calendar_remote
1111
1112 [storage my_calendar_local]
1113 type = "singlefile"
1114 path = ~/my_calendar.ics
1115
1116 [storage my_calendar_remote]
1117 type = "caldav"
1118 url = https://caldav.example.org/username/my_calendar/
1119 #username =
1120 #password =
1121
1122 Read-only storages
1123 These storages don't support writing of their items, consequently
1124 read_only is set to true by default. Changing read_only to false on
1125 them leads to an error.
1126
1127 http Use a simple .ics file (or similar) from the web. web‐
1128 cal://-calendars are supposed to be used with this, but you have
1129 to replace webcal:// with http://, or better, https://.
1130
1131 [pair holidays]
1132 a = holidays_local
1133 b = holidays_remote
1134 collections = null
1135
1136 [storage holidays_local]
1137 type = "filesystem"
1138 path = ~/.config/vdir/calendars/holidays/
1139 fileext = .ics
1140
1141 [storage holidays_remote]
1142 type = "http"
1143 url = https://example.com/holidays_from_hicksville.ics
1144
1145 Too many WebCAL providers generate UIDs of all VEVENT-components
1146 on-the-fly, i.e. all UIDs change every time the calendar is
1147 downloaded. This leads many synchronization programs to believe
1148 that all events have been deleted and new ones created, and ac‐
1149 cordingly causes a lot of unnecessary uploads and deletions on
1150 the other side. Vdirsyncer completely ignores UIDs coming from
1151 http and will replace them with a hash of the normalized item
1152 content.
1153
1154 Parameters
1155
1156 • url -- URL to the .ics file.
1157
1158 • username -- Username for authentication.
1159
1160 • password -- Password for authentication.
1161
1162 • verify -- Verify SSL certificate, default True. This
1163 can also be a local path to a self-signed SSL certifi‐
1164 cate. See ssl-tutorial for more information.
1165
1166 • verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
1167 of the expected server certificate. See ssl-tutorial
1168 for more information.
1169
1170 • auth -- Optional. Either basic, digest or guess. The
1171 default is preemptive Basic auth, sending credentials
1172 even if server didn't request them. This saves from an
1173 additional roundtrip per request. Consider setting
1174 guess if this causes issues with your server.
1175
1176 • auth_cert -- Optional. Either a path to a certificate
1177 with a client certificate and the key or a list of
1178 paths to the files with them.
1179
1180 • useragent -- Default vdirsyncer.
1181
1183 The following section contains tutorials not explicitly about any par‐
1184 ticular core function of vdirsyncer. They usually show how to integrate
1185 vdirsyncer with third-party software. Because of that, it may be that
1186 the information regarding that other software only applies to specific
1187 versions of them.
1188
1189 NOTE:
1190 Please contribute your own tutorials too! Pages are often only
1191 stubs and are lacking full examples.
1192
1193 Client applications
1194 Vdirsyncer with Claws Mail
1195 First of all, Claws-Mail only supports read-only functions for vCards.
1196 It can only read contacts, but there's no editor.
1197
1198 Preparation
1199 We need to install vdirsyncer, for that look here. Then we need to
1200 create some folders:
1201
1202 mkdir ~/.vdirsyncer
1203 mkdir ~/.contacts
1204
1205 Configuration
1206 Now we create the configuration for vdirsyncer. Open ~/.vdirsyncer/con‐
1207 fig with a text editor. The config should look like this:
1208
1209 [general]
1210 status_path = "~/.vdirsyncer/status/"
1211
1212 [storage local]
1213 type = "singlefile"
1214 path = "~/.contacts/%s.vcf"
1215
1216 [storage online]
1217 type = "carddav"
1218 url = "CARDDAV_LINK"
1219 username = "USERNAME"
1220 password = "PASSWORD"
1221 read_only = true
1222
1223 [pair contacts]
1224 a = "local"
1225 b = "online"
1226 collections = ["from a", "from b"]
1227 conflict_resolution = "b wins"
1228
1229 • In the general section, we define the status folder path, for discov‐
1230 ered collections and generally stuff that needs to persist between
1231 syncs.
1232
1233 • In the local section we define that all contacts should be sync in a
1234 single file and the path for the contacts.
1235
1236 • In the online section you must change the url, username and password
1237 to your setup. We also set the storage to read-only such that no
1238 changes get synchronized back. Claws-Mail should not be able to do
1239 any changes anyway, but this is one extra safety step in case files
1240 get corrupted or vdirsyncer behaves erratically. You can leave that
1241 part out if you want to be able to edit those files locally.
1242
1243 • In the last section we configure that online contacts win in a con‐
1244 flict situation. Configure this part however you like. A correct
1245 value depends on which side is most likely to be up-to-date.
1246
1247 Sync
1248 Now we discover and sync our contacts:
1249
1250 vdirsyncer discover contacts
1251 vdirsyncer sync contacts
1252
1253 Claws Mail
1254 Open Claws-Mail. Go to Tools => Addressbook.
1255
1256 Click on Addressbook => New vCard. Choose a name for the book.
1257
1258 Then search for the for the vCard in the folder ~/.contacts/. Click ok,
1259 and you we will see your contacts.
1260
1261 NOTE:
1262 Claws-Mail shows only contacts that have a mail address.
1263
1264 Crontab
1265 On the end we create a crontab, so that vdirsyncer syncs automatically
1266 every 30 minutes our contacts:
1267
1268 crontab -e
1269
1270 On the end of that file enter this line:
1271
1272 */30 * * * * /usr/local/bin/vdirsyncer sync > /dev/null
1273
1274 And you're done!
1275
1276 Running as a systemd.timer
1277 vdirsyncer includes unit files to run at an interval (by default every
1278 15±5 minutes).
1279
1280 NOTE:
1281 These are not installed when installing via pip, only via distribu‐
1282 tion packages. If you installed via pip, or your distribution
1283 doesn't ship systemd unit files, you'll need to download
1284 vdirsyncer.service and vdirsyncer.timer into either /etc/sys‐
1285 temd/user/ or ~/.local/share/systemd/user.
1286
1287 Activation
1288 To activate the timer, just run systemctl --user enable
1289 vdirsyncer.timer. To see logs of previous runs, use journalctl --user
1290 -u vdirsyncer.
1291
1292 Configuration
1293 It's quite possible that the default "every fifteen minutes" interval
1294 isn't to your liking. No default will suit everybody, but this is con‐
1295 figurable by simply running:
1296
1297 systemctl --user edit vdirsyncer
1298
1299 This will open a blank editor, where you can override the timer by in‐
1300 cluding:
1301
1302 OnBootSec=5m # This is how long after boot the first run takes place.
1303 OnUnitActiveSec=15m # This is how often subsequent runs take place.
1304
1305 Todoman
1306 The iCalendar format also supports saving tasks in form of VTODO-en‐
1307 tries, with the same file extension as normal events: .ics. Many CalDAV
1308 servers support synchronizing tasks, vdirsyncer does too.
1309
1310 todoman is a CLI task manager supporting vdir. Its interface is similar
1311 to the ones of Taskwarrior or the todo.txt CLI app. You can use
1312 filesystem with it.
1313
1314 Setting up vdirsyncer
1315 For this tutorial we will use NextCloud.
1316
1317 Assuming a config like this:
1318
1319 [general]
1320 status_path = "~/.vdirsyncer/status/"
1321
1322 [pair calendars]
1323 conflict_resolution = "b wins"
1324 a = "calendars_local"
1325 b = "calendars_dav"
1326 collections = ["from b"]
1327 metadata = ["color", "displayname"]
1328
1329 [storage calendars_local]
1330 type = "filesystem"
1331 path = "~/.calendars/"
1332 fileext = ".ics"
1333
1334 [storage calendars_dav]
1335 type = "caldav"
1336 url = "https://nextcloud.example.net/"
1337 username = "..."
1338 password = "..."
1339
1340 vdirsyncer sync will then synchronize the calendars of your NextCloud
1341 instance to subfolders of ~/.calendar/.
1342
1343 Setting up todoman
1344 Write this to ~/.config/todoman/todoman.conf:
1345
1346 [main]
1347 path = ~/.calendars/*
1348
1349 The glob pattern in path will match all subfolders in ~/.calendars/,
1350 which is exactly the tasklists we want. Now you can use todoman as de‐
1351 scribed in its documentation and run vdirsyncer sync to synchronize the
1352 changes to NextCloud.
1353
1354 Other clients
1355 The following client applications also synchronize over CalDAV:
1356
1357 • The Tasks-app found on iOS
1358
1359 • OpenTasks for Android
1360
1361 • The Tasks-app for NextCloud's web UI
1362
1363 Further applications, with missing pages:
1364
1365 • khal, a CLI calendar application supporting vdir. You can use
1366 filesystem with it.
1367
1368 • Many graphical calendar apps such as dayplanner, Orage or rainlendar
1369 save a calendar in a single .ics file. You can use singlefile with
1370 those.
1371
1372 • khard, a commandline addressbook supporting vdir. You can use
1373 filesystem with it.
1374
1375 • contactquery.c, a small program explicitly written for querying vdirs
1376 from mutt.
1377
1378 • mates, a commandline addressbook supporting vdir.
1379
1380 • vdirel, access vdir contacts from Emacs.
1381
1382 Servers
1383 Baikal
1384 Vdirsyncer is continuously tested against the latest version of Baikal.
1385
1386 • Baikal up to 0.2.7 also uses an old version of SabreDAV, with the
1387 same issue as ownCloud, see issue #160. This issue is fixed in later
1388 versions.
1389
1390 DavMail (Exchange, Outlook)
1391 DavMail is a proxy program that allows you to use Card- and CalDAV
1392 clients with Outlook. That allows you to use vdirsyncer with Outlook.
1393
1394 In practice your success with DavMail may wildly vary. Depending on
1395 your Exchange server you might get confronted with weird errors of all
1396 sorts (including data-loss).
1397
1398 Make absolutely sure you use the latest DavMail:
1399
1400 [storage outlook]
1401 type = "caldav"
1402 url = "http://localhost:1080/users/user@example.com/calendar/"
1403 username = "user@example.com"
1404 password = "..."
1405
1406 • Older versions of DavMail handle URLs case-insensitively. See issue
1407 #144.
1408
1409 • DavMail is handling malformed data on the Exchange server very
1410 poorly. In such cases the Calendar Checking Tool for Outlook might
1411 help.
1412
1413 • In some cases, you may see errors about duplicate events. It may look
1414 something like this:
1415
1416 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:
1417 error:
1418 error: vdirsyncer repair my_calendar_remote/calendar
1419 error:
1420 error: But make sure to have a backup of your data in some form. The offending hrefs are:
1421 [...]
1422
1423 In order to fix this, you can try the
1424 Remove-DuplicateAppointments.ps1 PowerShell script that Microsoft has
1425 come up with in order to remove duplicates.
1426
1427 FastMail
1428 Vdirsyncer is continuously tested against FastMail, thanks to them for
1429 providing a free account for this purpose. There are no known issues
1430 with it. FastMail's support pages provide the settings to use:
1431
1432 [storage cal]
1433 type = "caldav"
1434 url = "https://caldav.fastmail.com/"
1435 username = "..."
1436 password = "..."
1437
1438 [storage card]
1439 type = "carddav"
1440 url = "https://carddav.fastmail.com/"
1441 username = "..."
1442 password = "..."
1443
1444 Google
1445 Using vdirsyncer with Google Calendar is possible as of 0.10, but it is
1446 not tested frequently. You can use google_contacts and google_calendar.
1447
1448 For more information see issue #202 and issue #8.
1449
1450 iCloud
1451 Vdirsyncer is regularly tested against iCloud.
1452
1453 [storage cal]
1454 type = "caldav"
1455 url = "https://caldav.icloud.com/"
1456 username = "..."
1457 password = "..."
1458
1459 [storage card]
1460 type = "carddav"
1461 url = "https://contacts.icloud.com/"
1462 username = "..."
1463 password = "..."
1464
1465 Problems:
1466
1467 • Vdirsyncer can't do two-factor auth with iCloud (there doesn't seem
1468 to be a way to do two-factor auth over the DAV APIs) You'll need to
1469 use app-specific passwords instead.
1470
1471 • iCloud has a few special requirements when creating collections. In
1472 principle vdirsyncer can do it, but it is recommended to create them
1473 from an Apple client (or the iCloud web interface).
1474
1475 • iCloud requires a minimum length of collection names.
1476
1477 • Calendars created by vdirsyncer cannot be used as tasklists.
1478
1479 nextCloud
1480 Vdirsyncer is continuously tested against the latest version of
1481 nextCloud:
1482
1483 [storage cal]
1484 type = "caldav"
1485 url = "https://nextcloud.example.com/"
1486 username = "..."
1487 password = "..."
1488
1489 [storage card]
1490 type = "carddav"
1491 url = "https://nextcloud.example.com/"
1492
1493 • WebCAL-subscriptions can't be discovered by vdirsyncer. See this rel‐
1494 evant issue.
1495
1496 ownCloud
1497 Vdirsyncer is continuously tested against the latest version of
1498 ownCloud:
1499
1500 [storage cal]
1501 type = "caldav"
1502 url = "https://example.com/remote.php/dav/"
1503 username = ...
1504 password = ...
1505
1506 [storage card]
1507 type = "carddav"
1508 url = "https://example.com/remote.php/dav/"
1509 username = ...
1510 password = ...
1511
1512 • Versions older than 7.0.0: ownCloud uses SabreDAV, which had problems
1513 detecting collisions and race-conditions. The problems were reported
1514 and are fixed in SabreDAV's repo, and the corresponding fix is also
1515 in ownCloud since 7.0.0. See issue #16 for more information.
1516
1517 Radicale
1518 Radicale is a very lightweight server, however, it intentionally
1519 doesn't implement the CalDAV and CardDAV standards completely, which
1520 might lead to issues even with very well-written clients. Apart from
1521 its non-conformity with standards, there are multiple other problems
1522 with its code quality and the way it is maintained. Consider using e.g.
1523 xandikos instead.
1524
1525 That said, vdirsyncer is continuously tested against the git version
1526 and the latest PyPI release of Radicale.
1527
1528 • Vdirsyncer can't create collections on Radicale.
1529
1530 • Radicale doesn't support time ranges in the calendar-query of CalDAV,
1531 so setting start_date and end_date for caldav will have no or unpre‐
1532 dicted consequences.
1533
1534 • Versions of Radicale older than 0.9b1 choke on RFC-conform queries
1535 for all items of a collection.
1536
1537 You have to set item_types = ["VTODO", "VEVENT"] in caldav for
1538 vdirsyncer to work with those versions.
1539
1540 Xandikos
1541 Xandikos is a lightweight, yet complete CalDAV and CardDAV server,
1542 backed by git. Vdirsyncer is continuously tested against its latest
1543 version.
1544
1545 After running ./bin/xandikos --defaults -d $HOME/dav, you should be
1546 able to point vdirsyncer against the root of Xandikos like this:
1547
1548 [storage cal]
1549 type = "caldav"
1550 url = "https://xandikos.example.com/"
1551 username = "..."
1552 password = "..."
1553
1554 [storage card]
1555 type = "carddav"
1556 url = "https://xandikos.example.com/"
1557 username = "..."
1558 password = "..."
1559
1561 For any unanswered questions or problems, see contact.
1562
1563 Requests-related ImportErrors
1564 ImportError: No module named packages.urllib3.poolmanager
1565
1566 ImportError: cannot import name iter_field_objects
1567
1568 Debian and nowadays even other distros make modifications to the re‐
1569 quests package that don't play well with packages assuming a normal re‐
1570 quests. This is due to stubbornness on both sides.
1571
1572 See issue #82 and issue #140 for past discussions. You have one option
1573 to work around this, that is, to install vdirsyncer in a virtualenv,
1574 see manual-installation.
1575
1577 NOTE:
1578
1579 • Please read contact for questions and support requests.
1580
1581 • All participants must follow the pimutils Code of Conduct.
1582
1583 The issue tracker
1584 We use GitHub issues for organizing bug reports and feature requests.
1585
1586 The following labels are of interest:
1587
1588 • "Planning" is for issues that are still undecided, but where at least
1589 some discussion exists.
1590
1591 • "Blocked" is for issues that can't be worked on at the moment because
1592 some other unsolved problem exists. This problem may be a bug in some
1593 software dependency, for instance.
1594
1595 • "Ready" contains issues that are ready to work on.
1596
1597 If you just want to get started with contributing, the "ready" issues
1598 are an option. Issues that are still in "Planning" are also an option,
1599 but require more upfront thinking and may turn out to be impossible to
1600 solve, or at least harder than anticipated. On the flip side those tend
1601 to be the more interesting issues as well, depending on how one looks
1602 at it.
1603
1604 All of those labels are also available as a kanban board on waffle.io.
1605 It is really just an alternative overview over all issues, but might be
1606 easier to comprehend.
1607
1608 Feel free to contact me or comment on the relevant issues for further
1609 information.
1610
1611 Reporting bugs
1612 • Make sure your problem isn't already listed in problems.
1613
1614 • Make sure you have the absolutely latest version of vdirsyncer. For
1615 users of some Linux distributions such as Debian or Fedora this may
1616 not be the version that your distro offers. In those cases please
1617 file a bug against the distro package, not against upstream
1618 vdirsyncer.
1619
1620 • Use --verbosity=DEBUG when including output from vdirsyncer.
1621
1622 Suggesting features
1623 If you're suggesting a feature, keep in mind that vdirsyncer tries not
1624 to be a full calendar or contacts client, but rather just the piece of
1625 software that synchronizes all the data. Take a look at the documenta‐
1626 tion for software working with vdirsyncer.
1627
1628 Submitting patches, pull requests
1629 • Discuss everything in the issue tracker first (or contact me somehow
1630 else) before implementing it.
1631
1632 • Make sure the tests pass. See below for running them.
1633
1634 • But not because you wrote too few tests.
1635
1636 • Add yourself to AUTHORS.rst, and add a note to CHANGELOG.rst too.
1637
1638 Running tests, how to set up your development environment
1639 For many patches, it might suffice to just let Travis run the tests.
1640 However, Travis is slow, so you might want to run them locally too. For
1641 this, set up a virtualenv and run this inside of it:
1642
1643 # install:
1644 # - vdirsyncer from the repo into the virtualenv
1645 # - stylecheckers (flake8) and code formatters (autopep8)
1646 make install-dev
1647
1648 # Install git commit hook for some extra linting and checking
1649 pre-commit install
1650
1651 # install test dependencies
1652 make install-test
1653
1654 Then you can run:
1655
1656 make test # The normal testsuite
1657 make style # Stylechecker
1658 make docs # Build the HTML docs, output is at docs/_build/html/
1659
1660 The Makefile has a lot of options that allow you to control which tests
1661 are run, and which servers are tested. Take a look at its code where
1662 they are all initialized and documented.
1663
1664 For example, to test xandikos, first run the server itself:
1665
1666 docker-compose build xandikos
1667 docker-compose up -d xandikos
1668
1669 Then run the tests specifying this DAV_SERVER, run:
1670
1671 make DAV_SERVER=xandikos test
1672
1673 If you have any questions, feel free to open issues about it.
1674
1675 Structure of the testsuite
1676 Within tests/, there are three main folders:
1677
1678 • system contains system- and also integration tests. A rough rule is:
1679 If the test is using temporary files, put it here.
1680
1681 • unit, where each testcase tests a single class or function.
1682
1683 • storage runs a generic storage testsuite against all storages.
1684
1685 The reason for this separation is: We are planning to generate separate
1686 coverage reports for each of those testsuites. Ideally unit would gen‐
1687 erate palatable coverage of the entire codebase on its own, and the
1688 combination of system and storage as well.
1689
1691 This document describes a standard for storing calendars and contacts
1692 on a filesystem, with the main goal of being easy to implement.
1693
1694 Vdirsyncer synchronizes to vdirs via filesystem. Each vdir (basically
1695 just a directory with some files in it) represents a calendar or ad‐
1696 dressbook.
1697
1698 Basic Structure
1699 The main folder (root) contains an arbitrary number of subfolders (col‐
1700 lections), which contain only files (items). Synonyms for "collection"
1701 may be "addressbook" or "calendar".
1702
1703 An item is:
1704
1705 • A vCard file, in which case the file extension must be .vcf, or
1706
1707 • An iCalendar file, in which case the file extension must be .ics.
1708
1709 An item should contain a UID property as described by the vCard and
1710 iCalendar standards. If it contains more than one UID property, the
1711 values of those must not differ.
1712
1713 The file must contain exactly one event, task or contact. In most cases
1714 this also implies only one VEVENT/VTODO/VCARD component per file, but
1715 e.g. recurrence exceptions would require multiple VEVENT components
1716 per event.
1717
1718 The filename should have similar properties as the UID of the file con‐
1719 tent. However, there is no requirement for these two to be the same.
1720 Programs may choose to store additional metadata in that filename, how‐
1721 ever, at the same time they must not assume that the metadata they in‐
1722 cluded will be preserved by other programs.
1723
1724 Metadata
1725 Any of the below metadata files may be absent. None of the files listed
1726 below have any file extensions.
1727
1728 • A file called color inside the vdir indicates the vdir's color, a
1729 property that is only relevant in UI design.
1730
1731 Its content is an ASCII-encoded hex-RGB value of the form #RRGGBB.
1732 For example, a file content of #FF0000 indicates that the vdir has a
1733 red (user-visible) color. No short forms or informal values such as
1734 red (as known from CSS, for example) are allowed. The prefixing #
1735 must be present.
1736
1737 • A file called displayname contains a UTF-8 encoded label that may be
1738 used to represent the vdir in UIs.
1739
1740 Writing to vdirs
1741 Creating and modifying items or metadata files should happen
1742 atomically.
1743
1744 Writing to a temporary file on the same physical device, and then mov‐
1745 ing it to the appropriate location is usually a very effective solu‐
1746 tion. For this purpose, files with the extension .tmp may be created
1747 inside collections.
1748
1749 When changing an item, the original filename must be used.
1750
1751 Reading from vdirs
1752 • Any file ending with the .tmp or no file extension must not be
1753 treated as an item.
1754
1755 • The ident part of the filename should not be parsed to improve the
1756 speed of item lookup.
1757
1758 Considerations
1759 The primary reason this format was chosen is due to its compatibility
1760 with the CardDAV and CalDAV standards.
1761
1762 Performance
1763 Currently, vdirs suffer from a rather major performance problem, one
1764 which current implementations try to mitigate by building up indices of
1765 the collections for faster search and lookup.
1766
1767 The reason items' filenames don't contain any extra information is sim‐
1768 ple: The solutions presented induced duplication of data, where one du‐
1769 plicate might become out of date because of bad implementations. As it
1770 stands right now, a index format could be formalized separately though.
1771
1772 vdirsyncer doesn't really have to bother about efficient item lookup,
1773 because its synchronization algorithm needs to fetch the whole list of
1774 items anyway. Detecting changes is easily implemented by checking the
1775 files' modification time.
1776
1778 Thank you very much for packaging vdirsyncer! The following guidelines
1779 should help you to avoid some common pitfalls.
1780
1781 While they are called guidelines and therefore theoretically not manda‐
1782 tory, if you consider going a different direction, please first open an
1783 issue or contact me otherwise instead of just going ahead. These guide‐
1784 lines exist for my own convenience too.
1785
1786 Obtaining the source code
1787 The main distribution channel is PyPI, and source tarballs can be ob‐
1788 tained there. Do not use the ones from GitHub: Their tarballs contain
1789 useless junk and are more of a distraction than anything else.
1790
1791 I give each release a tag in the git repo. If you want to get notified
1792 of new releases, GitHub's feed is a good way.
1793
1794 Dependency versions
1795 As with most Python packages, setup.py denotes the dependencies of
1796 vdirsyncer. It also contains lower-bound versions of each dependency.
1797 Older versions will be rejected by the testsuite.
1798
1799 Testing
1800 Everything testing-related goes through the Makefile in the root of the
1801 repository or PyPI package. Trying to e.g. run py.test directly will
1802 require a lot of environment variables to be set (for configuration)
1803 and you probably don't want to deal with that.
1804
1805 You can install the testing dependencies with:
1806
1807 make install-test
1808
1809 You probably don't want this since it will use pip to download the de‐
1810 pendencies. Alternatively you can find the testing dependencies in
1811 test-requirements.txt, again with lower-bound version requirements.
1812
1813 You also have to have vdirsyncer fully installed at this point. Merely
1814 cd-ing into the tarball will not be sufficient.
1815
1816 Running the tests happens with:
1817
1818 make test
1819
1820 Hypothesis will randomly generate test input. If you care about deter‐
1821 ministic tests, set the DETERMINISTIC_TESTS variable to "true":
1822
1823 make DETERMINISTIC_TESTS=true test
1824
1825 There are a lot of additional variables that allow you to test
1826 vdirsyncer against a particular server. Those variables are not "sta‐
1827 ble" and may change drastically between minor versions. Just don't use
1828 them, you are unlikely to find bugs that vdirsyncer's CI hasn't found.
1829
1830 Documentation
1831 Using Sphinx you can generate the documentation you're reading right
1832 now in a variety of formats, such as HTML, PDF, or even as a manpage.
1833 That said, I only take care of the HTML docs' formatting.
1834
1835 You can find a list of dependencies in docs-requirements.txt. Again,
1836 you can install those using pip with:
1837
1838 make install-docs
1839
1840 Then change into the docs/ directory and build whatever format you want
1841 using the Makefile in there (run make for the formats you can build).
1842
1843 Contrib files
1844 Reference systemd.service and systemd.timer unit files are provided. It
1845 is recommended to install this if your distribution is systemd-based.
1846
1848 • The #pimutils IRC channel on Freenode might be active, depending on
1849 your timezone. Use it for support and general (including off-topic)
1850 discussion.
1851
1852 • Open a GitHub issue for concrete bug reports and feature requests.
1853
1854 • Lastly, you can also contact the author directly. Do this for secu‐
1855 rity issues. If that doesn't work out (i.e. if I don't respond within
1856 one week), use contact@pimutils.org.
1857
1859 This changelog only contains information that might be useful to end
1860 users and package maintainers. For further info, see the git commit
1861 log.
1862
1863 Package maintainers and users who have to manually update their instal‐
1864 lation may want to subscribe to GitHub's tag feed.
1865
1866 Version 0.16.8
1867 released 09 June 2020
1868
1869 • Support Python 3.7 and 3.8.
1870
1871 This release is functionally identical to 0.16.7. It's been tested
1872 with recent Python versions, and has been marked as supporting them. It
1873 will also be the final release supporting Python 3.5 and 3.6.
1874
1875 Version 0.16.7
1876 released on 19 July 2018
1877
1878 • Fixes for Python 3.7
1879
1880 Version 0.16.6
1881 released on 13 June 2018
1882
1883 • Packagers: Documentation building no longer needs a working installa‐
1884 tion of vdirsyncer.
1885
1886 Version 0.16.5
1887 released on 13 June 2018
1888
1889 • Packagers: click-log 0.3 is required.
1890
1891 • All output will now happen on stderr (because of the upgrade of
1892 click-log).
1893
1894 Version 0.16.4
1895 released on 05 February 2018
1896
1897 • Fix tests for new Hypothesis version. (Literally no other change in‐
1898 cluded)
1899
1900 Version 0.16.3
1901 released on 03 October 2017
1902
1903 • First version with custom Debian and Ubuntu packages. See issue #663.
1904
1905 • Remove invalid ASCII control characters from server responses. See
1906 issue #626.
1907
1908 • packagers: Python 3.3 is no longer supported. See pull request #674.
1909
1910 Version 0.16.2
1911 released on 24 August 2017
1912
1913 • Fix crash when using daterange or item_type filters in google_calen‐
1914 dar, see issue #657.
1915
1916 • Packagers: Fixes for new version 0.2.0 of click-log. The version re‐
1917 quirements for the dependency click-log changed.
1918
1919 Version 0.16.1
1920 released on 8 August 2017
1921
1922 • Removed remoteStorage support, see issue #647.
1923
1924 • Fixed test failures caused by latest requests version, see issue
1925 #660.
1926
1927 Version 0.16.0
1928 released on 2 June 2017
1929
1930 • Strip METHOD:PUBLISH added by some calendar providers, see issue
1931 #502.
1932
1933 • Fix crash of Google storages when saving token file.
1934
1935 • Make DAV discovery more RFC-conformant, see pull request #585.
1936
1937 • Vdirsyncer is now tested against Xandikos, see pull request #601.
1938
1939 • Subfolders with a leading dot are now ignored during discover for
1940 filesystem storage. This makes it easier to combine it with version
1941 control.
1942
1943 • Statuses are now stored in a sqlite database. Old data is automati‐
1944 cally migrated. Users with really large datasets should encounter
1945 performance improvements. This means that sqlite3 is now a dependency
1946 of vdirsyncer.
1947
1948 • Vdirsyncer is now licensed under the 3-clause BSD license, see issue
1949 #610.
1950
1951 • Vdirsyncer now includes experimental support for EteSync, see pull
1952 request #614.
1953
1954 • Vdirsyncer now uses more filesystem metadata for determining whether
1955 an item changed. You will notice a possibly heavy CPU/IO spike on the
1956 first sync after upgrading.
1957
1958 • Packagers: Reference systemd.service and systemd.timer unit files are
1959 provided. It is recommended to install these as documentation if your
1960 distribution is systemd-based.
1961
1962 Version 0.15.0
1963 released on 28 February 2017
1964
1965 • Deprecated syntax for configuration values is now completely re‐
1966 jected. All values now have to be valid JSON.
1967
1968 • A few UX improvements for Google storages, see issue #549 and issue
1969 #552.
1970
1971 • Fix collection discovery for google_contacts, see issue #564.
1972
1973 • iCloud is now tested on Travis, see issue #567.
1974
1975 Version 0.14.1
1976 released on 05 January 2017
1977
1978 • vdirsyncer repair no longer changes "unsafe" UIDs by default, an ex‐
1979 tra option has to be specified. See issue #527.
1980
1981 • A lot of important documentation updates.
1982
1983 Version 0.14.0
1984 released on 26 October 2016
1985
1986 • vdirsyncer sync now continues other uploads if one upload failed.
1987 The exit code in such situations is still non-zero.
1988
1989 • Add partial_sync option to pair section. See the config docs.
1990
1991 • Vdirsyncer will now warn if there's a string without quotes in your
1992 config. Please file issues if you find documentation that uses un‐
1993 quoted strings.
1994
1995 • Fix an issue that would break khal's config setup wizard.
1996
1997 Version 0.13.1
1998 released on 30 September 2016
1999
2000 • Fix a bug that would completely break collection discovery.
2001
2002 Version 0.13.0
2003 released on 29 September 2016
2004
2005 • Python 2 is no longer supported at all. See issue #219.
2006
2007 • Config sections are now checked for duplicate names. This also means
2008 that you cannot have a storage section [storage foo] and a pair [pair
2009 foo] in your config, they have to have different names. This is done
2010 such that console output is always unambiguous. See issue #459.
2011
2012 • Custom commands can now be used for conflict resolution during sync.
2013 See issue #127.
2014
2015 • http now completely ignores UIDs. This avoids a lot of unnecessary
2016 down- and uploads.
2017
2018 Version 0.12.1
2019 released on 20 August 2016
2020
2021 • Fix a crash for Google and DAV storages. See pull request #492.
2022
2023 • Fix an URL-encoding problem with DavMail. See issue #491.
2024
2025 Version 0.12
2026 released on 19 August 2016
2027
2028 • singlefile now supports collections. See pull request #488.
2029
2030 Version 0.11.3
2031 released on 29 July 2016
2032
2033 • Default value of auth parameter was changed from guess to basic to
2034 resolve issues with the Apple Calendar Server (issue #457) and im‐
2035 prove performance. See issue #461.
2036
2037 • Packagers: The click-threading requirement is now >=0.2. It was in‐
2038 correct before. See issue #478.
2039
2040 • Fix a bug in the DAV XML parsing code that would make vdirsyncer
2041 crash on certain input. See issue #480.
2042
2043 • Redirect chains should now be properly handled when resolving
2044 well-known URLs. See pull request #481.
2045
2046 Version 0.11.2
2047 released on 15 June 2016
2048
2049 • Fix typo that would break tests.
2050
2051 Version 0.11.1
2052 released on 15 June 2016
2053
2054 • Fix a bug in collection validation.
2055
2056 • Fix a cosmetic bug in debug output.
2057
2058 • Various documentation improvements.
2059
2060 Version 0.11.0
2061 released on 19 May 2016
2062
2063 • Discovery is no longer automatically done when running vdirsyncer
2064 sync. vdirsyncer discover now has to be explicitly called.
2065
2066 • Add a .plist example for Mac OS X.
2067
2068 • Usage under Python 2 now requires a special config parameter to be
2069 set.
2070
2071 • Various deprecated configuration parameters do no longer have spe‐
2072 cialized errormessages. The generic error message for unknown parame‐
2073 ters is shown.
2074
2075 • Vdirsyncer no longer warns that the passwordeval parameter has been
2076 renamed to password_command.
2077
2078 • The keyring fetching strategy has been dropped some versions ago,
2079 but the specialized error message has been dropped.
2080
2081 • An old status format from version 0.4 is no longer supported. If
2082 you're experiencing problems, just delete your status folder.
2083
2084 Version 0.10.0
2085 released on 23 April 2016
2086
2087 • New storage types google_calendar and google_contacts have been
2088 added.
2089
2090 • New global command line option --config, to specify an alternative
2091 config file. See issue #409.
2092
2093 • The collections parameter can now be used to synchronize differ‐
2094 ently-named collections with each other.
2095
2096 • Packagers: The lxml dependency has been dropped.
2097
2098 • XML parsing is now a lot stricter. Malfunctioning servers that used
2099 to work with vdirsyncer may stop working.
2100
2101 Version 0.9.3
2102 released on 22 March 2016
2103
2104 • singlefile and http now handle recurring events properly.
2105
2106 • Fix a typo in the packaging guidelines.
2107
2108 • Moved to pimutils organization on GitHub. Old links should redirect,
2109 but be aware of client software that doesn't properly handle redi‐
2110 rects.
2111
2112 Version 0.9.2
2113 released on 13 March 2016
2114
2115 • Fixed testsuite for environments that don't have any web browser in‐
2116 stalled. See pull request #384.
2117
2118 Version 0.9.1
2119 released on 13 March 2016
2120
2121 • Removed leftover debug print statement in vdirsyncer discover, see
2122 commit 3d856749f37639821b148238ef35f1acba82db36.
2123
2124 • metasync will now strip whitespace from the start and the end of the
2125 values. See issue #358.
2126
2127 • New Packaging Guidelines have been added to the documentation.
2128
2129 Version 0.9.0
2130 released on 15 February 2016
2131
2132 • The collections parameter is now required in pair configurations.
2133 Vdirsyncer will tell you what to do in its error message. See issue
2134 #328.
2135
2136 Version 0.8.1
2137 released on 30 January 2016
2138
2139 • Fix error messages when invalid parameter fetching strategy is used.
2140 This is important because users would receive awkward errors for us‐
2141 ing deprecated keyring fetching.
2142
2143 Version 0.8.0
2144 released on 27 January 2016
2145
2146 • Keyring support has been removed, which means that password.fetch =
2147 ["keyring", "example.com", "myuser"] doesn't work anymore.
2148
2149 For existing setups: Use password.fetch = ["command", "keyring",
2150 "get", "example.com", "myuser"] instead, which is more generic. See
2151 the documentation for details.
2152
2153 • Now emitting a warning when running under Python 2. See issue #219.
2154
2155 Version 0.7.5
2156 released on 23 December 2015
2157
2158 • Fixed a bug in remotestorage that would try to open a CLI browser for
2159 OAuth.
2160
2161 • Fix a packaging bug that would prevent vdirsyncer from working with
2162 newer lxml versions.
2163
2164 Version 0.7.4
2165 released on 22 December 2015
2166
2167 • Improved error messages instead of faulty server behavior, see issue
2168 #290 and issue #300.
2169
2170 • Safer shutdown of threadpool, avoid exceptions, see issue #291.
2171
2172 • Fix a sync bug for read-only storages see commit
2173 ed22764921b2e5bf6a934cf14aa9c5fede804d8e.
2174
2175 • Etag changes are no longer sufficient to trigger sync operations. An
2176 actual content change is also necessary. See issue #257.
2177
2178 • remotestorage now automatically opens authentication dialogs in your
2179 configured GUI browser.
2180
2181 • Packagers: lxml>=3.1 is now required (newer lower-bound version).
2182
2183 Version 0.7.3
2184 released on 05 November 2015
2185
2186 • Make remotestorage-dependencies actually optional.
2187
2188 Version 0.7.2
2189 released on 05 November 2015
2190
2191 • Un-break testsuite.
2192
2193 Version 0.7.1
2194 released on 05 November 2015
2195
2196 • Packagers: The setuptools extras keyring and remotestorage have been
2197 added. They're basically optional dependencies. See setup.py for more
2198 details.
2199
2200 • Highly experimental remoteStorage support has been added. It may be
2201 completely overhauled or even removed in any version.
2202
2203 • Removed mentions of old password_command in documentation.
2204
2205 Version 0.7.0
2206 released on 27 October 2015
2207
2208 • Packagers: New dependencies are click_threading, click_log and
2209 click>=5.0.
2210
2211 • password_command is gone. Keyring support got completely overhauled.
2212 See keyring.
2213
2214 Version 0.6.0
2215 released on 06 August 2015
2216
2217 • password_command invocations with non-zero exit code are now fatal
2218 (and will abort synchronization) instead of just producing a warning.
2219
2220 • Vdirsyncer is now able to synchronize metadata of collections. Set
2221 metadata = ["displayname"] and run vdirsyncer metasync.
2222
2223 • Packagers: Don't use the GitHub tarballs, but the PyPI ones.
2224
2225 • Packagers: build.sh is gone, and Makefile is included in tarballs.
2226 See the content of Makefile on how to run tests post-packaging.
2227
2228 • verify_fingerprint doesn't automatically disable verify anymore.
2229
2230 Version 0.5.2
2231 released on 15 June 2015
2232
2233 • Vdirsyncer now checks and corrects the permissions of status files.
2234
2235 • Vdirsyncer is now more robust towards changing UIDs inside items.
2236
2237 • Vdirsyncer is now handling unicode hrefs and UIDs correctly. Software
2238 that produces non-ASCII UIDs is broken, but apparently it exists.
2239
2240 Version 0.5.1
2241 released on 29 May 2015
2242
2243 • N.b.: The PyPI upload of 0.5.0 is completely broken.
2244
2245 • Raise version of required requests-toolbelt to 0.4.0.
2246
2247 • Command line should be a lot faster when no work is done, e.g. for
2248 help output.
2249
2250 • Fix compatibility with iCloud again.
2251
2252 • Use only one worker if debug mode is activated.
2253
2254 • verify=false is now disallowed in vdirsyncer, please use verify_fin‐
2255 gerprint instead.
2256
2257 • Fixed a bug where vdirsyncer's DAV storage was not using the config‐
2258 ured useragent for collection discovery.
2259
2260 Version 0.4.4
2261 released on 12 March 2015
2262
2263 • Support for client certificates via the new auth_cert parameter, see
2264 issue #182 and pull request #183.
2265
2266 • The icalendar package is no longer required.
2267
2268 • Several bugfixes related to collection creation.
2269
2270 Version 0.4.3
2271 released on 20 February 2015
2272
2273 • More performance improvements to singlefile-storage.
2274
2275 • Add post_hook param to filesystem-storage.
2276
2277 • Collection creation now also works with SabreDAV-based servers, such
2278 as Baikal or ownCloud.
2279
2280 • Removed some workarounds for Radicale. Upgrading to the latest Radi‐
2281 cale will fix the issues.
2282
2283 • Fixed issues with iCloud discovery.
2284
2285 • Vdirsyncer now includes a simple repair command that seeks to fix
2286 some broken items.
2287
2288 Version 0.4.2
2289 released on 30 January 2015
2290
2291 • Vdirsyncer now respects redirects when uploading and updating items.
2292 This might fix issues with Zimbra.
2293
2294 • Relative status_path values are now interpreted as relative to the
2295 configuration file's directory.
2296
2297 • Fixed compatibility with custom SabreDAV servers. See issue #166.
2298
2299 • Catch harmless threading exceptions that occur when shutting down
2300 vdirsyncer. See issue #167.
2301
2302 • Vdirsyncer now depends on atomicwrites.
2303
2304 • Massive performance improvements to singlefile-storage.
2305
2306 • Items with extremely long UIDs should now be saved properly in
2307 filesystem-storage. See issue #173.
2308
2309 Version 0.4.1
2310 released on 05 January 2015
2311
2312 • All create arguments from all storages are gone. Vdirsyncer now asks
2313 if it should try to create collections.
2314
2315 • The old config values True, False, on, off and None are now invalid.
2316
2317 • UID conflicts are now properly handled instead of ignoring one item.
2318 Card- and CalDAV servers are already supposed to take care of those
2319 though.
2320
2321 • Official Baikal support added.
2322
2323 Version 0.4.0
2324 released on 31 December 2014
2325
2326 • The passwordeval parameter has been renamed to password_command.
2327
2328 • The old way of writing certain config values such as lists is now
2329 gone.
2330
2331 • Collection discovery has been rewritten. Old configuration files
2332 should be compatible with it, but vdirsyncer now caches the results
2333 of the collection discovery. You have to run vdirsyncer discover if
2334 collections were added or removed on one side.
2335
2336 • Pair and storage names are now restricted to certain characters.
2337 Vdirsyncer will issue a clear error message if your configuration
2338 file is invalid in that regard.
2339
2340 • Vdirsyncer now supports the XDG-Basedir specification. If the
2341 VDIRSYNCER_CONFIG environment variable isn't set and the
2342 ~/.vdirsyncer/config file doesn't exist, it will look for the config‐
2343 uration file at $XDG_CONFIG_HOME/vdirsyncer/config.
2344
2345 • Some improvements to CardDAV and CalDAV discovery, based on problems
2346 found with FastMail. Support for .well-known-URIs has been added.
2347
2348 Version 0.3.4
2349 released on 8 December 2014
2350
2351 • Some more bugfixes to config handling.
2352
2353 Version 0.3.3
2354 released on 8 December 2014
2355
2356 • Vdirsyncer now also works with iCloud. Particularly collection dis‐
2357 covery and etag handling were fixed.
2358
2359 • Vdirsyncer now encodes Cal- and CardDAV requests differently. This
2360 hasn't been well-tested with servers like Zimbra or SoGo, but isn't
2361 expected to cause any problems.
2362
2363 • Vdirsyncer is now more robust regarding invalid responses from CalDAV
2364 servers. This should help with future compatibility with Davmail/Out‐
2365 look.
2366
2367 • Fix a bug when specifying item_types of caldav in the deprecated con‐
2368 fig format.
2369
2370 • Fix a bug where vdirsyncer would ignore all but one character speci‐
2371 fied in unsafe_href_chars of caldav and carddav.
2372
2373 Version 0.3.2
2374 released on 3 December 2014
2375
2376 • The current config format has been deprecated, and support for it
2377 will be removed in version 0.4.0. Vdirsyncer warns about this now.
2378
2379 Version 0.3.1
2380 released on 24 November 2014
2381
2382 • Fixed a bug where vdirsyncer would delete items if they're deleted on
2383 side A but modified on side B. Instead vdirsyncer will now upload the
2384 new items to side A. See issue #128.
2385
2386 • Synchronization continues with the remaining pairs if one pair
2387 crashes, see issue #121.
2388
2389 • The processes config key is gone. There is now a --max-workers option
2390 on the CLI which has a similar purpose. See pull request #126.
2391
2392 • The Read The Docs-theme is no longer required for building the docs.
2393 If it is not installed, the default theme will be used. See issue
2394 #134.
2395
2396 Version 0.3.0
2397 released on 20 September 2014
2398
2399 • Add verify_fingerprint parameter to http, caldav and carddav, see
2400 issue #99 and pull request #106.
2401
2402 • Add passwordeval parameter to general_config, see issue #108 and pull
2403 request #117.
2404
2405 • Emit warnings (instead of exceptions) about certain invalid responses
2406 from the server, see issue #113. This is apparently required for
2407 compatibility with Davmail.
2408
2409 Version 0.2.5
2410 released on 27 August 2014
2411
2412 • Don't ask for the password of one server more than once and fix mul‐
2413 tiple concurrency issues, see issue #101.
2414
2415 • Better validation of DAV endpoints.
2416
2417 Version 0.2.4
2418 released on 18 August 2014
2419
2420 • Include workaround for collection discovery with latest version of
2421 Radicale.
2422
2423 • Include metadata files such as the changelog or license in source
2424 distribution, see issue #97 and issue #98.
2425
2426 Version 0.2.3
2427 released on 11 August 2014
2428
2429 • Vdirsyncer now has a --version flag, see issue #92.
2430
2431 • Fix a lot of bugs related to special characters in URLs, see issue
2432 #49.
2433
2434 Version 0.2.2
2435 released on 04 August 2014
2436
2437 • Remove a security check that caused problems with special characters
2438 in DAV URLs and certain servers. On top of that, the security check
2439 was nonsensical. See issue #87 and issue #91.
2440
2441 • Change some errors to warnings, see issue #88.
2442
2443 • Improve collection autodiscovery for servers without full support.
2444
2445 Version 0.2.1
2446 released on 05 July 2014
2447
2448 • Fix bug where vdirsyncer shows empty addressbooks when using CardDAV
2449 with Zimbra.
2450
2451 • Fix infinite loop when password doesn't exist in system keyring.
2452
2453 • Colorized errors, warnings and debug messages.
2454
2455 • vdirsyncer now depends on the click package instead of argvard.
2456
2457 Version 0.2.0
2458 released on 12 June 2014
2459
2460 • vdirsyncer now depends on the icalendar package from PyPI, to get rid
2461 of its own broken parser.
2462
2463 • vdirsyncer now also depends on requests_toolbelt. This makes it pos‐
2464 sible to guess the authentication type instead of blankly assuming
2465 basic.
2466
2467 • Fix a semi-bug in caldav and carddav storages where a tuple (href,
2468 etag) instead of the proper etag would have been returned from the
2469 upload method. vdirsyncer might do unnecessary copying when upgrad‐
2470 ing to this version.
2471
2472 • Add the storage singlefile. See issue #48.
2473
2474 • The collections parameter for pair sections now accepts the special
2475 values from a and from b for automatically discovering collections.
2476 See pair_config.
2477
2478 • The read_only parameter was added to storage sections. See stor‐
2479 age_config.
2480
2481 Version 0.1.5
2482 released on 14 May 2014
2483
2484 • Introduced changelogs
2485
2486 • Many bugfixes
2487
2488 • Many doc fixes
2489
2490 • vdirsyncer now doesn't necessarily need UIDs anymore for synchroniza‐
2491 tion.
2492
2493 • vdirsyncer now aborts if one collection got completely emptied be‐
2494 tween synchronizations. See issue #42.
2495
2497 Contributors
2498 In alphabetical order:
2499
2500 • Ben Boeckel
2501
2502 • Christian Geier
2503
2504 • Clément Mondon
2505
2506 • Hugo Osvaldo Barrera
2507
2508 • Julian Mehne
2509
2510 • Malte Kiefer
2511
2512 • Marek Marczykowski-Górecki
2513
2514 • Markus Unterwaditzer
2515
2516 • Michael Adler
2517
2518 • Thomas Weißschuh
2519
2520 Special thanks goes to:
2521
2522 • FastMail sponsors a paid account for testing their servers.
2523
2524 • Packagecloud provide repositories for vdirsyncer's Debian packages.
2525
2526 License
2527 Copyright (c) 2014-2020 by Markus Unterwaditzer & contributors. See AU‐
2528 THORS.rst for more details.
2529
2530 Some rights reserved.
2531
2532 Redistribution and use in source and binary forms of the software as
2533 well as documentation, with or without modification, are permitted pro‐
2534 vided that the following conditions are met:
2535
2536 • Redistributions of source code must retain the above copyright no‐
2537 tice, this list of conditions and the following disclaimer.
2538
2539 • Redistributions in binary form must reproduce the above copyright no‐
2540 tice, this list of conditions and the following disclaimer in the
2541 documentation and/or other materials provided with the distribution.
2542
2543 • The names of the contributors may not be used to endorse or promote
2544 products derived from this software without specific prior written
2545 permission.
2546
2547 THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS
2548 AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUD‐
2549 ING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
2550 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2551 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, IN‐
2552 CIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2553 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
2554 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2555 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2556 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2557 OF THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY
2558 OF SUCH DAMAGE.
2559
2561 If you found my work useful, please consider donating. Thank you!
2562
2563 • Bitcoin: 16sSHxZm263WHR9P9PJjCxp64jp9ooXKVt
2564
2565 • PayPal.me
2566
2567 • Bountysource is useful for funding work on a specific GitHub issue.
2568
2569 • There's also Bountysource Salt, for one-time and recurring dona‐
2570 tions.
2571
2572 • Donations via Bountysource are publicly listed. Use PayPal if you
2573 dislike that.
2574
2575 • Flattr or Gratipay can be used for recurring donations.
2576
2578 Markus Unterwaditzer
2579
2581 2014-2021, Markus Unterwaditzer & contributors
2582
2583
2584
2585
25860.16 Jan 27, 2021 VDIRSYNCER(1)