PIMSYNC.CONF(5)

NAME
pimsync.conf - configuration file for pimsync(1)

DESCRIPTION
pimsync.conf is divided into three main types of sections:

GLOBAL CONFIGURATION
    Global settings for pimsync.

STORAGE SECTIONS
    Configuration for individual storages.

PAIR SECTIONS
    Rules for synchronising pairs of storages.

See pimsync(1) for details on the default path for the configuration file, and how to specify an alternative path.

GLOBAL CONFIGURATION
The following settings can be set globally:

status_path path
    Path to a directory which will contain the status database internally used by pimsync. Relative paths are unsupported, as running pimsync(1) in the wrong directory would yield unexpected results. The contents of this directory should not be externally modified between executions without clear understanding of the consequences. See pimsync-status(7).

    Supports DYNAMIC PARAMETERS (see below).

STORAGE SECTIONS
A storage describes a location where calendars or contacts are stored. Each storage is declared in its own section, and each storage section starts with a declaration of the storage name.

storage name {…}
    Declare a storage with name name.

Directives are declared inside the curly braces for each section, one per line. The following directives apply to all storage types:

type type
    This directive must be the first directive in the storage block. Where type can be one of the following:

    vdir/icalendar
        A directory where each subdirectory represents a calendar. Each of these subdirectories contains individual icalendar files, each representing one event (or one series of recurring events), todo or journal entry.

    vdir/vcard
        A directory where each subdirectory represents an address book. Each of these subdirectories contains individual vcard files, each representing one contact.

    caldav
        A CalDAV server, containing calendars with events, todos and/or journal entries.

    carddav
        A CardDAV server containing address books with contacts.

    webcal
        An HTTP or HTTPS resource exposing a single iCalendar file which may contain zero or more events, todos or journal entries. This storage type is read-only.

    jmap/icalendar
        A JMAP server with Calendar support. This storage is experimental.

    jmap/vcard
        A JMAP server with Calendar support. This storage is experimental.

interval seconds
    When monitoring a storage is not possible, check for changes every the specified amount of seconds. If set to zero, interval-based synchronisations are disabled. The default is 300 seconds.

auth basic | digest
    Authentication method to use. The default is basic and does not need to be specified.

read_only
    Do not perform any write operations on this storage. This directive takes no parameters.

Storages of type vdir take the following directives:

path path
    Path to a directory storing a vdir. A leading tilde will be expanded to match the current user's home directory. Relative paths are unsupported, as running pimsync(1) in the wrong directory would yield unexpected results.

    Supports DYNAMIC PARAMETERS (see below).

fileext extension
    Optional. File extension for items saved into this vdir. If not specified, ics is used for calendar storages and vcf is used for address book storages.

Storages of type caldav or carddav accept the following directives:

url url
    URL of the DAV server. The meaning of this URL varies when using a non-default discovery directive.

    URLs must specify scheme http, https. or unix. URLs starting in unix:// shall be treated as a path to a unix domain socket.

    Supports DYNAMIC PARAMETERS (see below).

discovery full | context | principal | home-set | collections
    Optional. Controls how much service discovery is performed for the configured url. The default is full.

    •   full: url points to a base domain. Perform full RFC 6764 discovery (DNS SRV/TXT records and well-known URIs), then discover the principal, the home set and the collections.

    •   context: url points to a base domain. Skip DNS discovery and determine the context path from the well-known URI, then discover the principal, the home set and the collections.

    •   principal: url points to the CalDAV/CardDAV context path. Discover the principal, then the home set and the collections.

    •   home-set: url points to the principal URL. Discover the home set, then the collections.

    •   collections: url points to a container such as a home set (or any other custom location). Only enumerate the collections inside it.

username username
    Optional. Username to use for HTTP Basic Auth.

    Supports DYNAMIC PARAMETERS (see below).

password password
    Optional. Password to use for HTTP Basic Auth.

    Supports DYNAMIC PARAMETERS (see below).

collection_id_segment last | second-last
    Optional. URL path segment to use as the collection id. Valid values are last (the default) or second-last. See the advanced usage documentation for details.

Storages of type webcal take the following directives:

url url
    URL of an icalendar file. This file may contain multiple calendar items. Scheme must be http or https.

    Supports DYNAMIC PARAMETERS (see below).

collection_id name
    Name to be used when mapping this collection to another on the other storage.

Storages of type jmap take the following directives:

url url
    Base URL of the JMAP server.

    Supports DYNAMIC PARAMETERS (see below).

username username
    Optional. Username to use for HTTP Basic Auth.

    Supports DYNAMIC PARAMETERS (see below).

password password
    Optional. Password to use for HTTP Basic Auth.

    Supports DYNAMIC PARAMETERS (see below).

Storages of type caldav, carddav, webcal and jmap also accept the following directives:

user_agent user_agent
    Optional. Set the User-Agent header to user_agent for outgoing HTTP requests. The default uses “pimsync/” followed by the current version number. E.g.: pimsync/1.0.0.

tls_root path
    Optional. Use the certificate root store at path when checking the server's TLS certificate. Disables checking the certificate against the system certificate authorities. See tls_fingerprint below.

tls_fingerprint fingerprint
    Optional. Accept the certificate if its fingerprint matches fingerprint. If specified together with the tls_root directive, the certificate is verified with the specified root. If tls_root is not specified, the server's certificate is not validated against any root and only a fingerprint verification is performed.

auth_cert certificate key
    Optional. Use the provided certificate and key for TLS client authentication.

auth_cert pem_bundle
    Optional. Use the certificate and key from the specified bundle for TLS client authentication.

DYNAMIC PARAMETERS
The url, username, password, and path fields may be defined in the configuration file, or may specify a block with a command to retrieve this value from an external system. When specifying an external command, instead of defining a value for the directive, specify a new block with a single cmd directive.

For example, to read a password via the external command secret-store --get-caldav-password, use the following syntax:

    password {
    	cmd secret-store --get-caldav-password
    }

It is also possible to specify a shell script, which is executed via ‘sh -c’. For example:

    password {
    	shell pass show communication/migadu.com | head -1
    }

It is recommended to store credentials and other sensitive values in a secret storage service.

PAIR SECTIONS
A pair declares how two storages shall be synchronised to each other. Each pair section starts with a declaration of the pair name:

pair name {…}
    Declare a pair with name name.

Each pair is defined by a block of directives, one per line, enclosed in curly braces:

storage_a name
    The name of the first storage to be synchronised with another.

storage_b name
    The name of the second storage to be synchronised with the other.

collections all
    Synchronise all collections found in both storages. Collections will be synchronised to others with a matching id on the other side. The is the recommended value if you simply want to synchronise all collections from both storages.

collections from a
    Synchronise all collections found in storage_a. Each collection shall be synchronised with the collection which has the same collection id on storage_b.

collections from b
    Synchronise all collections found in storage_b. Each collection shall be synchronised with the collection which has the same collection id on storage_a.

collection id
    Synchronise collection with id id. May be specified more than once.

collection file ... {…}
    Synchronise collection defined by the given rules. See COLLECTION SECTIONS below. May be specified more than once.

on_empty skip
    When a collection is completely emptied on one side, skip it. This is the default.

on_empty sync
    When a collection is completely emptied on one side, empty its counterpart on the other side. Take care when using this option. If you completely delete a collection on one side, pimsync.conf won't restore it. Instead, it will delete the same collection (and all of its items) on the other side.

on_delete sync
    When a collection itself is deleted on one side, delete it on the other side. This only applies if the collection is already empty. This is the default. This is generally safe, especially when combined with on_empty skip.

on_delete skip
    When a collection itself is deleted on one side, skip it.

one_way
    Synchronise items from storage_a to storage_b only. Changes in storage_b are overwritten with the data from storage_a. Items created in storage_b that do not exist in storage_a are deleted. This mode never produces conflicts. This directive takes no parameters.

The conflict_resolution directive specifies which action should be taken if an item was modified on both sides. This directive has no effect when using synchronising one-way.

conflict_resolution cmd command [args]
    Execute command to resolve conflicts between both sides. args will be passed as arguments, followed by the path to two files; one containing the data on storage a, and the other containing the data on storage b. The conflict will be considered resolved if and only if both files are the same when the command exits and the command exits with exit code zero.

conflict_resolution keep a
    In case of conflict, keep the version for storage a.

conflict_resolution keep b
    In case of conflict, keep the version for storage b.

COLLECTION SECTIONS
A collections block defines a mapping between two collections that are to be synchronised; one of them in storage_a and the other in storage_b.

These sections are only used in advanced configurations which need to map existing collections to each other without changing their location on either side.

Each block must include an alias:

alias name
    An alias for this pair of collections that will be used for any output.

Exactly one reference to a collection in storage_a must be included:

id_a id
    Use collection with the id id.

href_a href
    Use collection with the path href.

Exactly one reference to a collection in storage_b must be included:

id_b id
    Use collection with the id id.

href_b href
    Use collection with the path href.

For example, to synchronise a collection with id work with another at path /calendars/mine/work/, use:

    collection {
    	alias work
    	id_a work
    	href_b /calendars/mine/work/
    }

Specifying an id and an href for the same storage is not allowed.

COLLECTION ID
The id of a collection is a concept specific to pimsync(1) and vdirsyncer(1).

For vdir storages, the id of a collection is the name of the directory that corresponds to it.

For caldav or carddav storages, the id of a collection is the last component of its URL by default. This can be changed to use the second-to-last component via the collection_id_segment configuration directive.

For webcal storages, the id must be specified explicitly via the collection_id configuration directive.

Unless configured otherwise, collections with the same id on both storages are synchronised with each other.

EXAMPLES
This example synchronises two storages with address books. The first is a local set of directories which contain vCard files, the second is a remote CardDAV servers. Credentials are supplied via the hiq(1) command line tool.

    status_path "~/.local/share/pimsync/status/"
    pair contacts {
    	storage_a contacts_local
    	storage_b contacts_remote
    	collections all
    	conflict_resolution cmd nvim -d
    }
    storage contacts_local {
    	type vdir/vcard
    	path ~/.local/share/contacts/cards/
    	fileext vcf
    	interval 30
    }
    storage contacts_remote {
    	type carddav
    	url https://carddav.example.com/
    	username hugo@example.com
    	password {
    		cmd hiq -dFpassword proto=carddavs username=hugo@example.com
    	}
    	interval 30
    }

The following example synchronises two storages with calendar data. The first is local directories with iCalendar files, the second is a remote CalDAV servers.

    status_path "~/.local/share/pimsync/status/"
    pair calendars {
    	storage_a calendars_local
    	storage_b calendars_remote
    	collections from b
    	conflict_resolution cmd nvim -d
    }
    storage calendars_local {
    	type vdir/icalendar
    	path ~/.local/share/calendars/
    	fileext ics
    	interval 30
    }
    storage calendars_remote {
    	type caldav
    	url https://caldav.example.com/
    	username hugo@example.com
    	password {
    	 cmd hiq -dFpassword proto=caldavs username=hugo@example.com
    	}
    	interval 30
    }

The following example synchronises two storages with calendar data. The first is a local directory named "italki" with iCalendar files, the second is an http server publishing an iCalendar file.

Note that the first storage is the same as the one above, and should be specified only once if both configurations were specified in the same file.

The exact URL to the iCalendar file exposed via http is fetched via the hiq(1) tool, used to query the himitsu(7) secret store.

    status_path "~/.local/share/pimsync/status/"
    pair study_calendars {
    	storage_a calendars_local
    	storage_b calendars_italki
    	collection italki
    }
    storage calendars_local {
    	type vdir/icalendar
    	path ~/.local/share/calendars/
    	fileext ics
    	interval 30
    }
    storage calendars_italki {
    	type webcal
    	collection_id italki
    	url {
    		cmd hiq -dFurl proto=webcal alias=italki-mine
    	}
    }

This example synchronises two storages with calendar data. The first is a CardDAV server, reached via a Unix domain socket. The second is storage uses a local filesystem with vCard files.

    status_path "~/.local/share/pimsync/status/"
    pair unixtest {
    	storage_a unix_a
    	storage_b unix_b
    	collections all
    }
    storage unix_a {
    	type carddav
    	url unix:///tmp/xandikos.sock
    }
    storage unix_b {
    	type vdir/vcard
    	path /tmp/test_storage/
    	fileext vcf
    }

SEE ALSO
pimsync(1), pimsync-migration(7), pimsync-status(7)

The configuration file follows the scfg syntax. See: https://git.sr.ht/~emersion/scfg