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