1VDIRSYNCER(1)                     vdirsyncer                     VDIRSYNCER(1)
2
3
4

NAME

6       vdirsyncer - vdirsyncer Documentation
7
8Documentation
9
10Source 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

WHEN DO I NEED VDIRSYNCER?

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
49Syncthing
50
51Dropbox or one of the gajillion services like it
52
53unison
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

INSTALLATION

77   OS/distro packages
78       The following packages are user-contributed and were up-to-date at  the
79       time of writing:
80
81ArchLinux
82
83Ubuntu  and  Debian, x86_64-only (packages also exist in the official
84         repositories but may be out of date)
85
86GNU Guix
87
88OS X (homebrew)
89
90BSD (pkgsrc)
91
92OpenBSD
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
113libxml and libxslt
114
115zlib
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

TUTORIAL

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
358null:  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

SSL AND CERTIFICATE VALIDATION

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

STORING PASSWORDS

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

SYNCING WITH READ-ONLY STORAGES

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

FULL CONFIGURATION MANUAL

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
660status_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
679a and b reference the storages to sync by their names.
680
681collections:  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
695collections = ["from b", "foo", "bar"] makes vdirsyncer synchronize
696           the collections from side B, and also the collections  named  "foo"
697           and "bar".
698
699collections = ["from b", "from a"] makes vdirsyncer synchronize all
700           existing collections on either side.
701
702collections = [["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
706conflict_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
712null, 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
721vimdiff  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
730partial_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
733error: An error is shown.
734
735ignore:  The  change is ignored. However: Events deleted in B still
736           reappear if they're updated in A.
737
738revert (default): The change is reverted on next sync.
739
740         See also partial_sync_tutorial.
741
742metadata: 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
757type  defines  which  kind of storage is defined. See Supported Stor‐
758         ages.
759
760read_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
810start_date -- Start date of timerange to show,  default
811                       -inf.
812
813end_date  --  End  date  of  timerange to show, default
814                       +inf.
815
816item_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
820url -- Base URL or an URL to a calendar.
821
822username -- Username for authentication.
823
824password -- Password for authentication.
825
826verify -- 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
830verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
831                       of  the  expected  server certificate. See ssl-tutorial
832                       for more information.
833
834auth -- 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
840auth_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
844useragent -- 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
862url -- Base URL or an URL to an addressbook.
863
864username -- Username for authentication.
865
866password -- Password for authentication.
867
868verify -- 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
872verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
873                       of  the  expected  server certificate. See ssl-tutorial
874                       for more information.
875
876auth -- 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
882auth_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
886useragent -- 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
953token_file  --  A  filepath  where  access  tokens  are
954                       stored.
955
956client_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
970token_file  --  A  filepath  where  access  tokens  are
971                       stored.
972
973client_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
998email -- The email address of your account.
999
1000secrets_dir -- A directory where vdirsyncer  can  store
1001                       the encryption key and authentication token.
1002
1003server_url  -- Optional. URL to the root of your custom
1004                       server.
1005
1006db_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
1020email -- The email address of your account.
1021
1022secrets_dir  --  A directory where vdirsyncer can store
1023                       the encryption key and authentication token.
1024
1025server_url -- Optional. URL to the root of your  custom
1026                       server.
1027
1028db_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
1050path -- 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
1055fileext  -- 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
1060encoding -- File encoding for items, both  content  and
1061                       filename.
1062
1063post_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
1082path  --  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
1086encoding  --  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
1156url -- URL to the .ics file.
1157
1158username -- Username for authentication.
1159
1160password -- Password for authentication.
1161
1162verify  --  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
1166verify_fingerprint -- Optional. SHA1 or MD5 fingerprint
1167                       of the expected server  certificate.  See  ssl-tutorial
1168                       for more information.
1169
1170auth  --  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
1176auth_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
1180useragent -- Default vdirsyncer.
1181

OTHER TUTORIALS

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
1359OpenTasks for Android
1360
1361       • The Tasks-app for NextCloud's web UI
1362
1363       Further applications, with missing pages:
1364
1365khal,  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
1372khard, a  commandline  addressbook  supporting  vdir.   You  can  use
1373         filesystem with it.
1374
1375contactquery.c, a small program explicitly written for querying vdirs
1376         from mutt.
1377
1378mates, a commandline addressbook supporting vdir.
1379
1380vdirel, 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
1512Versions 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
1534Versions 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

KNOWN PROBLEMS

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

CONTRIBUTING TO THIS PROJECT

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
1629Discuss  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
1678system contains system- and also integration tests. A rough rule  is:
1679         If the test is using temporary files, put it here.
1680
1681unit, where each testcase tests a single class or function.
1682
1683storage 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

THE VDIR STORAGE FORMAT

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

PACKAGING GUIDELINES

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

SUPPORT AND CONTACT

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

CHANGELOG

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
1883Packagers: 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
1889Packagers: 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
1908packagers: 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
1916Packagers: 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
1948Vdirsyncer 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
1958Packagers: 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
1978vdirsyncer 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
1986vdirsyncer  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
2015http 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
2028singlefile 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
2037Packagers:  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
2096Packagers: 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
2104singlefile 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
2124metasync  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
2178remotestorage now automatically opens authentication dialogs in  your
2179         configured GUI browser.
2180
2181Packagers: 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
2196Packagers:  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
2208Packagers:  New  dependencies  are  click_threading,  click_log   and
2209         click>=5.0.
2210
2211password_command  is gone. Keyring support got completely overhauled.
2212         See keyring.
2213
2214   Version 0.6.0
2215       released on 06 August 2015
2216
2217password_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
2223Packagers: Don't use the GitHub tarballs, but the PyPI ones.
2224
2225Packagers: build.sh is gone, and Makefile is  included  in  tarballs.
2226         See the content of Makefile on how to run tests post-packaging.
2227
2228verify_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
2243N.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
2254verify=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

CREDITS AND LICENSE

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
2522FastMail sponsors a paid account for testing their servers.
2523
2524Packagecloud 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

DONATIONS

2561       If you found my work useful, please consider donating. Thank you!
2562
2563       • Bitcoin: 16sSHxZm263WHR9P9PJjCxp64jp9ooXKVt
2564
2565PayPal.me
2566
2567Bountysource 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
2575Flattr or Gratipay can be used for recurring donations.
2576

AUTHOR

2578       Markus Unterwaditzer
2579
2581       2014-2021, Markus Unterwaditzer & contributors
2582
2583
2584
2585
25860.16                             Jan 27, 2021                    VDIRSYNCER(1)
Impressum