{"id":13624676,"url":"https://github.com/bergercookie/syncall","last_synced_at":"2025-05-14T23:04:31.733Z","repository":{"id":38385302,"uuid":"104407230","full_name":"bergercookie/syncall","owner":"bergercookie","description":"Bi-directional synchronization between services such as Taskwarrior, Google Calendar, Notion, Asana, and more","archived":false,"fork":false,"pushed_at":"2024-11-17T15:43:45.000Z","size":91841,"stargazers_count":512,"open_issues_count":9,"forks_count":50,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-26T12:48:32.766Z","etag":null,"topics":["asana","caldav","calendar","google","google-calendar","google-calender","google-keep","google-tasks","notion","python3","sync","synchronization-service","task-management","taskwarrior"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bergercookie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["bergercookie"]}},"created_at":"2017-09-21T23:06:32.000Z","updated_at":"2025-04-24T14:38:53.000Z","dependencies_parsed_at":"2023-02-13T03:16:04.251Z","dependency_job_id":"e63952ed-ec60-46cb-b09d-60b95ae2363f","html_url":"https://github.com/bergercookie/syncall","commit_stats":{"total_commits":154,"total_committers":9,"mean_commits":17.11111111111111,"dds":0.1558441558441559,"last_synced_commit":"520e24635d26a696f80a96d20535316250c13cda"},"previous_names":["bergercookie/taskwarrior_syncall","bergercookie/taskw_gcal_sync"],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bergercookie%2Fsyncall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bergercookie%2Fsyncall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bergercookie%2Fsyncall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bergercookie%2Fsyncall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bergercookie","download_url":"https://codeload.github.com/bergercookie/syncall/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254243358,"owners_count":22038046,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asana","caldav","calendar","google","google-calendar","google-calender","google-keep","google-tasks","notion","python3","sync","synchronization-service","task-management","taskwarrior"],"created_at":"2024-08-01T21:01:45.090Z","updated_at":"2025-05-14T23:04:26.685Z","avatar_url":"https://github.com/bergercookie.png","language":"Python","readme":"# syncall\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/bergercookie/syncall/master/misc/meme.png\"/\u003e\n\u003c/p\u003e\n\n\u003ca href=\"https://github.com/bergercookie/syncall/actions\" alt=\"master\"\u003e\n\u003cimg src=\"https://github.com/bergercookie/syncall/actions/workflows/tests.yml/badge.svg?branch=master\" /\u003e\u003c/a\u003e\n\u003cimg src=\"https://github.com/bergercookie/syncall/actions/workflows/linters.yml/badge.svg?branch=master\" /\u003e\u003c/a\u003e\n\u003ca href='https://coveralls.io/github/bergercookie/syncall?branch=master'\u003e\n\u003cimg src='https://coveralls.io/repos/github/bergercookie/syncall/badge.svg?branch=master' alt='Coverage Status' /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/pre-commit/pre-commit\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\u0026logoColor=white\" alt=\"pre-commit\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/LICENSE\" alt=\"LICENSE\"\u003e\n\u003cimg src=\"https://img.shields.io/github/license/bergercookie/syncall.svg\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/syncall\" alt=\"PyPI\"\u003e\n\u003cimg src=\"https://img.shields.io/pypi/pyversions/syncall.svg\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://badge.fury.io/py/syncall\"\u003e\n\u003cimg src=\"https://badge.fury.io/py/syncall.svg\" alt=\"PyPI version\" height=\"18\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pepy.tech/project/syncall\"\u003e\n\u003cimg alt=\"Downloads\" src=\"https://pepy.tech/badge/syncall\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/psf/black\"\u003e\n\u003cimg alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"\u003e\u003c/a\u003e\n\n## Description\n\n`syncall` is your one-stop software to bi-directionally synchronize and keep in\nsync the data from a variety of services. The framework is targeted towards, but\nnot limited to, the synchronization of note-taking and task management data.\nEach synchronization comes with its own executable which handles the\nsynchronization services/sides at hand.\n\nOne of the main goals of `syncall` is to be extendable. Thus it should be easy\nto introduce support for either a new service / synchronization side (e.g.,\n[`ClickUp`](https://clickup.com/)) or a new synchronization altogether (e.g.,\nClickUp \u003c-\u003e Google Keep) given that you [implement the corresponding\nsynchronization sides and conversion\nmethods](docs/implement-a-new-synchronization.md). See also the\n[CONTRIBUTING](CONTRIBUTING.md) guide to get started.\n\nAt the moment the list of supported synchronizations is the following:\n\n\u003ctable style=\"undefined;table-layout: fixed; width: 823px\"\u003e\n\u003cthead\u003e\n  \u003ctr\u003e\n    \u003cth\u003e\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n    \u003cth\u003eExecutable\u003c/th\u003e\n  \u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-gtasks.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ \u003ca href=\"https://support.google.com/tasks/answer/7675772\"\u003eGoogle Tasks\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-gtasks-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-gcal.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ \u003ca href=\"https://calendar.google.com/\"\u003eGoogle Calendar\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-gcal-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-notion.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ \u003ca href=\"https://notion.so\"\u003eNotion Checkboxes\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-notion-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-gkeep.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ \u003ca href=\"https://www.google.com/keep/\"\u003eGoogle Keep Checkboxes\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-gkeep-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-asana.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ \u003ca href=\"https://www.asana.com\"\u003eAsana Tasks\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-asana-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-tw-caldav.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e \u003ca href=\"https://taskwarrior.org/\"\u003eTaskwarrior\u003c/a\u003e ⬄ Generic \u003ca href=\"https://en.wikipedia.org/wiki/CalDAV\"\u003eCaldav \u003c/a\u003e server\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003etw-caldav-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/readme-fs-gkeep.md\"\u003eREADME\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e  Local Files ⬄  \u003ca href=\"https://www.google.com/keep/\"\u003eGoogle Keep Notes\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ctt\u003efs-gkeep-sync\u003c/tt\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\nEach of the above should support _bi-directional_ synchronization between the\nsaid services. This means that on an _addition_, _modification_, or _deletion_\nof an item on one side, a corresponding addition, modification or deletion of\nthe counterpart item will occur on the other side so that the two sides are\neventually in sync. All synchronizations also support conflict resolution\nmeaning that it can successfully deal with item edits on both sides.\n\nCurrently unless the executable at hand specifies otherwise, the following\nconflict resolution strategies are available:\n\n\u003c!-- START sniff-and-replace tw_gcal_sync --list-resolution-strategies START --\u003e\n\u003c!-- OVERRIDES --no-collapsible --no-markdown OVERRIDES --\u003e\n\n1. MostRecentRS\n2. LeastRecentRS\n3. AlwaysFirstRS\n4. AlwaysSecondRS\n\n\u003c!-- END sniff-and-replace --\u003e\n\nBy the end of the run, it should show you a summary of what's been done, like\nthe following.\n\n```\nGoogle Keep\n-----------\n        * Items created: 3\n        * Items updated: 2\n        * Items deleted: 1\n\nTaskwarrior\n-----------\n        * Items created: 1\n        * Items updated: 0\n        * Items deleted: 0\n```\n\nRefer to the corresponding README from the list above for instructions specific\nto the synchronization with that particular service. Before jumping to that\nthough, please complete the installation instructions below.\n\n## Installation instructions\n\n### Requirements\n\n- Python version \u003e= `3.8`\n- For the integrations that require Taskwarrior - ([Installation\n  instructions](https://taskwarrior.org/download/)) version `\u003e=2.6` is required.\n\n### Installation Options\n\nYou have to specify at least one extra. To do so use the `[]` syntax in pip:\n\n```sh\n# for installing integration with google (e.g. Google Keep / Calendar) and Notion\npip3 install syncall[notion,google]\n```\n\nHere's some of the available options for installing it:\n\n- From PyPI - e.g., Specify three extras for integrations - Google (Calendar/Tasks), Google Keep, Notion):\n\n  ```sh\n  pip3 install --user --upgrade syncall[notion,google,gkeep]\n  ```\n\n- From Github - e.g., Specify two extras:\n\n  ```sh\n  pip3 install --user \"syncall[gkeep,fs] @ git+https://github.com/bergercookie/syncall\"\n  ```\n\n- Download and install `devel` branch locally - bleeding edge\n\n  ```sh\n  git clone https://github.com/bergercookie/syncall\n  cd syncall\n  git checkout devel\n  pip3 install --user --upgrade .[gkeep,fs,google,tw,caldav,asana]\n  ```\n\n- Setup using [poetry](https://python-poetry.org/) - handy for local\n  development and for isolation of dependencies:\n\n  ```sh\n  git clone https://github.com/bergercookie/syncall\n  poetry install --all-extras\n  # get an interactive shell\n  poetry shell\n\n  # now the executables of all the services should be in your PATH for the\n  # current shell and you can also edit the source code without further\n  # re-installation ...\n  ```\n\n### Sample Usage Instructions\n\nHere's the CLI help page for the synchronizations available.\n\n\u003c!-- START sniff-and-replace tw_gtasks_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_gtasks_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_gtasks_sync [OPTIONS]\n\n  Synchronize lists from your Google Tasks with filters from Taskwarrior.\n\n  The list of TW tasks is determined by a combination of TW tags and a TW\n  project while the list in GTasks should be provided by their name. if it\n  doesn't exist it will be crated\n\nOptions:\n  -l, --gtasks-list TEXT          Name of the Google Tasks list to synchronize\n                                  (will be created if not there)\n  --google-secret FILE            Override the client secret used for the\n                                  communication with the Google APIs\n  --oauth-port INTEGER            Port to use for OAuth Authentication with\n                                  Google Applications\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  --list-combinations             List the available named TW\u003c-\u003eGoogle Tasks\n                                  combinations\n  --list-resolution-strategies    List all the available resolution strategies\n                                  and exit\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eGoogle Tasks\n                                  combination\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eGoogle Tasks filters\n                                  combination using a specified custom name.\n  --prefer-scheduled-date         Prefer using the \"scheduled\" date field\n                                  instead of the \"due\" date if the former is\n                                  available\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace tw_gcal_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_gcal_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_gcal_sync [OPTIONS]\n\n  Synchronize calendars from your Google Calendar with filters from\n  Taskwarrior.\n\n  The list of TW tasks is determined by a combination of TW tags and a TW\n  project while the calendar in GCal should be provided by their name. if it\n  doesn't exist it will be crated\n\nOptions:\n  -c, --gcal-calendar TEXT        Name of the Google Calendar to synchronize\n                                  (will be created if not there)\n  --google-secret FILE            Override the client secret used for the\n                                  communication with the Google APIs\n  --oauth-port INTEGER            Port to use for OAuth Authentication with\n                                  Google Applications\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  --list-combinations             List the available named TW\u003c-\u003eGoogle\n                                  Calendar combinations\n  --list-resolution-strategies    List all the available resolution strategies\n                                  and exit\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eGoogle\n                                  Calendar combination\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eGoogle Calendar filters\n                                  combination using a specified custom name.\n  --prefer-scheduled-date         Prefer using the \"scheduled\" date field\n                                  instead of the \"due\" date if the former is\n                                  available\n  --default-event-duration-mins INTEGER\n                                  The default duration of an event that is to\n                                  be created on Google Calendar [in minutes]\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace tw_notion_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_notion_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_notion_sync [OPTIONS]\n\n  Synchronise filters of TW tasks with the to_do items of Notion pages\n\n  The list of TW tasks is determined by a combination of TW tags and TW\n  project while the notion pages should be provided by their URLs.\n\nOptions:\n  -n, --notion-page TEXT          Page ID of the Notion page to synchronize\n  --token, --token-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eNotion\n                                  combination\n  --list-combinations             List the available named TW\u003c-\u003eNotion\n                                  combinations\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eNotion filters\n                                  combination using a specified custom name.\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace tw_gkeep_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_gkeep_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_gkeep_sync [OPTIONS]\n\n  Synchronize Notes from your Google Keep with filters from Taskwarrior.\n\n  The list of TW tasks is determined by a combination of TW tags and a TW\n  project while the note in GKeep should be specified using their full name.\n  if it doesn't exist it will be created.\n\n  This service will create TaskWarrior tasks with the specified filter for\n  each one of the checkboxed items in the specified Google Keep note and will\n  create Google Keep items for each one of the tasks in the Taskwarrior\n  filter. You have to first \"Show checkboxes\" in the Google Keep Note in order\n  to use it with this service.\n\nOptions:\n  -k, --gkeep-note TEXT           Full title of the Google Keep Note to\n                                  synchronize - Make sure you enable the\n                                  checkboxes\n  --user, --user-pass-path TEXT   Path in the UNIX password manager to fetch\n                                  the Google username from\n  --passwd, --passwd-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n                                  the Google password from\n  --token, --token-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n                                  the google keep token from\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  --list-combinations             List the available named TW\u003c-\u003eGoogle Keep\n                                  combinations\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eGoogle Keep\n                                  combination\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eGoogle Keep filters\n                                  combination using a specified custom name.\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace tw_asana_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_asana_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_asana_sync [OPTIONS]\n\nOptions:\n  --token, --token-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n  -w, --asana-workspace-gid TEXT  Asana workspace GID used to filter tasks\n  -W, --asana-workspace-name TEXT\n                                  Asana workspace name used to filter tasks\n  --list-asana-workspaces         List the available Asana workspaces\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eAsana\n                                  combination\n  --list-combinations             List the available named TW\u003c-\u003eAsana\n                                  combinations\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eAsana filters\n                                  combination using a specified custom name.\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace tw_caldav_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003etw_caldav_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: tw_caldav_sync [OPTIONS]\n\n  Synchronize lists of tasks from your caldav Calendar with filters from\n  Taskwarrior.\n\n  The list of TW tasks is determined by a combination of TW tags and a TW\n  project. Use `--all` to synchronize all tasks.\n\n  The calendar in Caldav should be provided by their name. If it doesn't exist\n  it will be created.\n\nOptions:\n  --caldav-calendar TEXT          Name of the caldav Calendar to sync (will be\n                                  created if not there)\n  --caldav-url TEXT               URL where the caldav calendar is hosted at\n                                  (including /dav if applicable)\n  --caldav-user TEXT              The caldav username for the given caldav\n                                  instance\n  --caldav-passwd, --caldav-passwd-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n                                  the caldav password from\n  --caldav-passwd-cmd CMD\n                                  A command (which is run in a shell) that\n                                  outputs the caldav password on stdout\n  --all, --taskwarrior-all-tasks  Sync all taskwarrior tasks [potentially very\n                                  slow]\n  -t, --taskwarrior-tags TEXT     Taskwarrior tags to synchronize\n  -p, --tw-project TEXT           Taskwarrior project to synchronize\n  --30-days, --only-modified-last-30-days\n                                  Only synchronize Taskwarrior tasks that have\n                                  been modified in the last 30 days\n  --list-combinations             List the available named TW\u003c-\u003eCaldav\n                                  combinations\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved TW\u003c-\u003eCaldav\n                                  combination\n  -s, --save-as TEXT              Save the given TW\u003c-\u003eCaldav filters\n                                  combination using a specified custom name.\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\u003c!-- START sniff-and-replace fs_gkeep_sync --help START --\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e\u003ctt\u003efs_gkeep_sync --help\u003c/tt\u003e\u003c/summary\u003e\n\n```\nUsage: fs_gkeep_sync [OPTIONS]\n\n  Synchronize Notes from your Google Keep with text files in a directory on\n  your filesystem.\n\n  You can only synchronize a subset of your Google Keep notes based on a set\n  of provided labels and you can specify where to create the files by\n  specifying the path to a local directory. If you don't specify Google Keep\n  Labels it will synchronize all your Google Keep notes.\n\n  For each Google Keep Note, fs_gkeep_sync will create a corresponding file\n  under the specified root directory with a matching name. Any addition,\n  deletion and modification of the files on the filesystem will result in the\n  corresponding addition, deletion and modification of the corresponding\n  Google Keep item. The same holds the other way around.\n\nOptions:\n  -k, --gkeep-labels TEXT         Google Keep labels whose notes to\n                                  synchronize\n  -i, --gkeep-ignore-labels TEXT  Google Keep labels whose notes will be\n                                  explicitly ignored\n  --user, --user-pass-path TEXT   Path in the UNIX password manager to fetch\n                                  the Google username from\n  --passwd, --passwd-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n                                  the Google password from\n  --token, --token-pass-path TEXT\n                                  Path in the UNIX password manager to fetch\n                                  the google keep token from\n  --ext, --filename-extension TEXT\n                                  Use this extension for locally created files\n  --fs, --fs-root TEXT            Directory to consider as root for\n                                  synchronization operations\n  --list-combinations             List the available named Filesystem\u003c-\u003eGoogle\n                                  Keep combinations\n  -r, --resolution-strategy [MostRecentRS|LeastRecentRS|AlwaysFirstRS|AlwaysSecondRS]\n                                  Resolution strategy to use during conflicts\n  -b, --combination TEXT          Name of an already saved Filesystem\u003c-\u003eGoogle\n                                  Keep combination\n  -s, --save-as TEXT              Save the given Filesystem\u003c-\u003eGoogle Keep\n                                  filters combination using a specified custom\n                                  name.\n  -v, --verbose\n  --version                       Show the version and exit.\n  --help                          Show this message and exit.\n\n```\n\n\u003c/details\u003e\n\n\u003c!-- END sniff-and-replace --\u003e\n\n## Mechanics / Automatic synchronization\n\nTo achieve synchronization between two arbitrary services, we use a push-pull\nmechanism which is far easier and less troublesome than an automatic\nsynchronization solution. This means that you have to explicitly call the\nexecutable for the synchronization you want to achieve. If you want to automate\nthis, consider adding a `cron` job or a `systemd` timer.\n\n```sh\ncrontab -e\n...\n\n# Add the following to sync every 10' - modify the arguments according to your\n# preferences and according to the instructions of the corresponding executable\n# for example for `tw_gcal_sync`:\n#\n# See output and potential errors in your system logs (e.g., `/var/log/syslog`)\n*/10 * * * * tw_gcal_sync -c \"TW Reminders\" -t \"remindme\"\n```\n\n## FAQ\n\n\u003cdetails\u003e\n  \u003csummary\u003eHow do I reset the synchronization and start it from scratch?\u003c/summary\u003e\n\n1. Remove the combination file that corresponds to your synchronization. For\n   example, if you're executing synchronization of `Google Keep` with\n   `Taskwarrior`, like the following, your combination name is\n   `testnote__None__test_tag`.\n\n   ```sh\n   tw_gkeep_sync -t test_tag -k \"testnote\"\n   ```\n\n   The executable also mentions the combination name at the end of the run.\n\n   ```\n   ...\n   14:00:03.41 | INFO      | Flushing data to remote Google Keep...\n   14:00:04.32 | SUCCESS   | Sync completed successfully. You can now use the -b/--combination option to refer to this particular combination\n\n     tw_gkeep_sync --combination testnote__None__test_tag\n   ```\n\n   For this combination, on Linux, remove\n   `~/.config/syncall/testnote__None__test_tag.yaml`.\n\n1. Remove the section for your combination in the `\u003csideA_sideB_configs.yaml\u003e`\n   configuration file under the `~/.config/syncall/` directory.\n\n   This section will have the same name as the combination file deleted in the\n   earlier step and will look like this:\n\n   ```yaml\n   ---\n   testnote__None__test_tag:\n     gkeep_note: testnote\n     tw_project: null\n     tw_tags: !!python/tuple\n       - test_tag\n   ```\n\n1. Remove the items of one of the sides. Keep e.g. the items from the Google Keep\n   note and delete the tasks of the tag/project you are using for\n   synchronization.\n1. Rerun synchronization from scratch to populate the one side with the items of\n   the other side.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eI want to synchronize more than a single (Notion page / TW filter),  (Google Calendar / TW filter) etc. combination.\u003c/summary\u003e\n\nSee \u003ca\nhref=\"https://github.com/bergercookie/syncall/blob/master/docs/combinations.md\"\u003ecombinations.md\u003c/a\u003e.\n\n\u003c/details\u003e\n\n## Tab Completion\n\nAll synchronization executables support tab auto-completion for their options\nfor `bash`, `zsh` and `fish`. You can find them under `completions/`\n\n## Miscellaneous\n\n- \u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/implement-a-new-synchronization.md\"\u003eImplement a New Synchronization Service\u003c/a\u003e.\n- \u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/combinations.md\"\u003eUsing Multiple Combinations\u003c/a\u003e.\n- \u003ca href=\"https://github.com/bergercookie/syncall/blob/master/CONTRIBUTING.md\"\u003eCONTRIBUTING.md\u003c/a\u003e.\n- \u003ca href=\"https://github.com/bergercookie/syncall/blob/master/docs/taskwarrior-filtering.md\"\u003eTaskwarrior Filtering\u003c/a\u003e.\n\n## Self Promotion\n\nIf you find this tool useful, please [star it on\nGithub](https://github.com/bergercookie/syncall)\n\n## TODO List\n\nSee [ISSUES list](https://github.com/bergercookie/syncall/issues) for\nthe things that I'm currently either working on or interested in implementing in\nthe near future. In case there's something you are interesting in working on,\ndon't hesitate to either ask for clarifications or just do it and directly make\na PR.\n","funding_links":["https://github.com/sponsors/bergercookie"],"categories":["Python","HarmonyOS"],"sub_categories":["Windows Manager"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbergercookie%2Fsyncall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbergercookie%2Fsyncall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbergercookie%2Fsyncall/lists"}