{"id":15819373,"url":"https://github.com/xunnamius/msft-todo-backup","last_synced_at":"2026-01-03T03:09:04.784Z","repository":{"id":149436192,"uuid":"617260237","full_name":"Xunnamius/msft-todo-backup","owner":"Xunnamius","description":"🤖✨ A CLI for exporting (backing up) and importing (restoring) your precious Microsoft Todo lists and tasks for ultimate peace of mind","archived":false,"fork":false,"pushed_at":"2024-09-04T23:57:27.000Z","size":1737,"stargazers_count":3,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-29T23:53:13.081Z","etag":null,"topics":["backup","export","import","list","microsoft","msft","restore","save","sync","synchronize","task","todo"],"latest_commit_sha":null,"homepage":"https://npm.im/msft-todo-backup","language":"TypeScript","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/Xunnamius.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-22T02:27:27.000Z","updated_at":"2025-04-23T01:19:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"944cd6b4-dbbd-499b-87ad-75f2c39b88d2","html_url":"https://github.com/Xunnamius/msft-todo-backup","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Xunnamius/msft-todo-backup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fmsft-todo-backup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fmsft-todo-backup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fmsft-todo-backup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fmsft-todo-backup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Xunnamius","download_url":"https://codeload.github.com/Xunnamius/msft-todo-backup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fmsft-todo-backup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273722702,"owners_count":25156300,"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","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["backup","export","import","list","microsoft","msft","restore","save","sync","synchronize","task","todo"],"created_at":"2024-10-05T06:40:34.157Z","updated_at":"2026-01-03T03:09:04.698Z","avatar_url":"https://github.com/Xunnamius.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- badges-start --\u003e\n\n[![Black Lives Matter!][x-badge-blm-image]][x-badge-blm-link]\n[![Last commit timestamp][x-badge-lastcommit-image]][x-badge-repo-link]\n[![Codecov][x-badge-codecov-image]][x-badge-codecov-link]\n[![Source license][x-badge-license-image]][x-badge-license-link]\n[![Monthly Downloads][x-badge-downloads-image]][x-badge-npm-link]\n[![NPM version][x-badge-npm-image]][x-badge-npm-link]\n[![Uses Semantic Release!][x-badge-semanticrelease-image]][x-badge-semanticrelease-link]\n\n\u003c!-- badges-end --\u003e\n\n# msft-todo-backup\n\n\u003e Still a work in progress that I hope to finish before my anxiety overwhelms\n\u003e as I compile thousands of treasured notes on Microsoft's systems...\n\nAn NPM package allowing the export (backup) and import (restoration) of your\nprecious Microsoft Todo tasks for the paranoid among us that aren't willing to\nrisk a decade of notes on the whims and stability of Microsoft's services.\n\nCurrently, one or more lists and all of their tasks can be exported. For lists,\ntheir display names and unique id are exported. For tasks, the following are\nexported: body, body last modified date and time, categories, completed date and\ntime, created date and time, due date and time, unique id, importance, last\nmodified date and time, recurrence pattern, reminder date and time, start date\nand time, status, title, attachments, and checklist items (so-called \"steps\").\n\nThis tool was built using streams to ensure proper function in low-memory\nenvironments. Additionally, unattended backups, throttling, and automatic\nretrying are supported out of the box.\n\nHowever, while attachment and checklist items are backed up and can be restored,\nlinked resources and extensions are ignored.\n\n---\n\n\u003c!-- remark-ignore-start --\u003e\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [Install](#install)\n- [Usage](#usage)\n  - [Backing up Lists](#backing-up-lists)\n  - [Restoring Lists](#restoring-lists)\n  - [Enumerating and Deleting Stored Backups](#enumerating-and-deleting-stored-backups)\n- [Appendix](#appendix)\n  - [Limitations and Considerations](#limitations-and-considerations)\n  - [Inspiration](#inspiration)\n  - [Published Package Details](#published-package-details)\n  - [License](#license)\n- [Contributing and Support](#contributing-and-support)\n  - [Contributors](#contributors)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- remark-ignore-end --\u003e\n\n## Install\n\nYou can install this package globally:\n\n```shell\nnpm install --global msft-todo-backup\n```\n\nAlternatively, you can use npx to call this package without pre-installation:\n\n```shell\nnpx msft-todo-backup ...\n```\n\n## Usage\n\n\u003e For a full list of available commands and flags, use\n\u003e `msft-todo-backup --help`.\n\nBefore using `msft-todo-backup`, you'll have to acquire a Microsoft Graph tenant\n(directory) and client (application) ID:\n\n1. [Create a free new app registration][1] by clicking \"New registration\".\n   Select \"Only associate the new app with your personal account\". Name the\n   application \"msft-todo-backup\". For _Supported account types_ you must select\n   \"Accounts in any organizational directory (Any Azure AD directory -\n   Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)\". No redirect\n   URI should be configured. Click \"Register\". Once you're taken to your app's\n   dashboard, copy the Application (client) ID and Directory (tenant) ID.\n\n   \u003e Microsoft has more detailed instructions on setting up a new app\n   \u003e registration [here][2].\n\n2. Once the new app registration is created, it must be configured. Using the\n   sidebar, click \"Authentication\" \u003e scroll down to _Advanced settings_ and set\n   _Allow public client flows_ to \"Yes\". Click \"Save\".\n\n3. Register your app IDs with the CLI tool by running\n   `msft-todo-backup authenticate`. You'll have to provide the Application ID\n   and Directory ID, after which you'll be presented with instructions on how to\n   link up with your Microsoft account using the device login flow. The IDs will\n   be saved to `~/msft-todo-backups/auth.json` while your sensitive account\n   access tokens will be encrypted and stored elsewhere.\n\nNote that, if you do not run msft-todo-backup anywhere from 30 to 90 days after\nauthenticating (or if you revoke access to the msft-todo-backup app from your\nMicrosoft account), your access/refresh tokens may expire. If this happens, just\nrerun `msft-todo-backup authenticate`.\n\nAlso note that, for some reason, you must complete authentication using your\nactual account. You cannot use the incredibly convenient \"Sign in with another\naccount\" as of this writing. For example, you cannot authenticate successfully\nusing your GitHub account to login to your Microsoft account. If you attempt to\nauthenticate by entering the device code in your browser but are not presented\nwith a permissions approval screen for the \"msft-todo-backup\" app, you must\nauthenticate using your real account credentials instead.\n\n\u003e Manually registering a new application is necessary because interacting with\n\u003e the Microsoft Graph API to backup your tasks can be an intensive and\n\u003e data-heavy process, especially if you have a lot of files attached to your\n\u003e tasks. Hence, creating a shared API service would quickly run into throttling\n\u003e and bandwidth limit issues.\n\n### Backing up Lists\n\nYou can backup all your lists:\n\n```shell\nmsft-todo-backup backup\n```\n\nOr you can backup specific lists by their display name:\n\n```shell\nmsft-todo-backup backup list-1 list-2 list-3\n```\n\nThe backup process is non-destructive (read-only). Backups are stored at\n`~/msft-todo-backups` on Linux and `%USERPROFILE%\\msft-todo-backups` on Windows.\n\nYou can specify how many backups to keep around with the `--keep-num-backups`\nflag:\n\n```shell\n# Will keep five backups in storage before overwriting the oldest backup\nmsft-todo-backup backup list-1 list-2 --keep-num-backups 5\n```\n\nIf the backup is interrupted or fails, a partial backup will be available at\n`~/msft-todo-backups/...-partial.json`. Reattempting the backup process will\nimmediately delete any partial backup files, so save it someplace else if you\nwant to keep it.\n\n#### Automatic Backups\n\nOnce `msft-todo-backup authenticate` has executed successfully at least once,\nand your access/refresh tokens have not expired, backups can be performed\nautomatically in the background without you having to do anything. For example,\nto backup your Microsoft Todo tasks once a day, you can run\n`msft-todo-backup backup --keep-num-backups 5` as a [daily cron][3] (Linux) or\nvia the [task scheduler][4] (Windows).\n\n### Restoring Lists\n\nYou can restore all your lists:\n\n```shell\nmsft-todo-backup restore\n```\n\nOr you can restore specific lists:\n\n```shell\nmsft-todo-backup restore list-1 list-2 list-3\n```\n\nOr you can restore from a specific backup if you have multiple backups saved\n(defaults to the most recent \"first\" backup):\n\n```shell\n# Restore from the second stored backup (one-indexed)\nmsft-todo-backup restore list-1 list-2 list-3 --from-backup-index 2\n# Restore from the first stored backup, making the following two lines equivalent\nmsft-todo-backup restore list-1 list-2 list-3 --from-backup-index 1\nmsft-todo-backup restore list-1 list-2 list-3\n```\n\nRestoration is non-destructive by default. Lists and tasks are never overwritten\nor deleted; all operations are append-only. Therefore, if the restoration is\ninterrupted or fails, it can be safely restarted without worrying about\nduplicates or missing/lost/partial data.\n\nFurther, restored items are deeply deduplicated by default: lists with the same\ndisplay name will not be recreated. Similarly, tasks with the same title will\nnot be recreated.\n\n#### Dangerous Restoration\n\nIn addition to the default [`--deep-deduplication` mode][5], there are three\nother non-default \"dangerous\" restoration modes:\n\n##### `--shallow-deduplication`\n\nUnlike `--deep-deduplication`, which deduplicates using list display names and\ntask titles, `--shallow-deduplication` deduplicates using the IDs of lists and\ntasks. For accounts with a lot of data-heavy tasks, this can potentially speed\nthings up somewhat.\n\nHowever, since the creation of new lists/tasks results in those lists/tasks\nhaving new IDs, restoration operations using `--shallow-deduplication` are\n**NOT** idempotent and **NOT** resumable if interrupted. That is: executing two\n`--shallow-deduplication` restoration operations to the same account\nback-to-back without creating a new backup before the second restoration\noperation will _always_ result in duplicates.\n\n```shell\nmsft-todo-backup restore \"My Special List\" --shallow-deduplication\n```\n\n##### `--no-deduplication`\n\nNo checks for duplicate lists or tasks are performed before restoration. When\nusing this mode, _all_ lists and tasks will always be restored separately from\nthe lists and tasks that already exist in the account. This will likely result\nin many duplicates and will require manual resolution and list merging by the\nuser.\n\nYou can use this mode to create an exact copy of an existing list. For example,\nto make an identical copy of \"My Special List\", you could issue the following\ncommand:\n\n```shell\nmsft-todo-backup restore \"My Special List\" --no-deduplication\n```\n\n##### `--clean-before-restore`\n\nAll existing lists and tasks will be deleted before the restoration process is\nperformed. When using this mode, **all existing lists and tasks in the entire\naccount will be irreversibly destroyed**. Afterwards, the restoration process\nwill proceed as usual. While useful for performing a sort of \"system restore\" to\nreturn your lists back to a previous state in time, since this mode involves\ndeletion of data, it is extremely dangerous and should be invoked only with the\nutmost caution.\n\n```shell\nmsft-todo-backup restore --clean-before-restore\n```\n\n### Enumerating and Deleting Stored Backups\n\nYou can also enumerate and delete backups:\n\n```shell\n# List all backups along with the lists they contain and some metadata\nmsft-todo-backup list\n# Delete all but the most recent two backup files\nmsft-todo-backup clean --keep-num-backups 2\n# Delete all backup files\nmsft-todo-backup clean --keep-num-backups 0\n# Will fail without the --keep-num-backups flag to prevent accidental usage\nmsft-todo-backup clean\n```\n\nEnumerating backups with `msft-todo-backup list` will also reveal the internal\nindex of each backed up list, which can be provided when executing commands in\nlieu of the list's display name. This is useful when two lists might have the\nsame name. When two or more lists have the same name, referring to that name\nwhen executing a restoration operation will result in an error. However,\nreferring to the list using its internal index will allow the operation to\nproceed normally.\n\nFor example, suppose your account has the following lists: \"list-A\" (index=1),\n\"list-B\" (index=2), and a second \"list-A\" (index=3). The following command,\nwhich attempts to restore _only the second list-A_, will fail:\n\n```shell\n# Fails due to ambiguity\nmsft-todo-backup restore list-A\n```\n\nHowever, the following command will succeed, restoring the second list-A and\nignoring the first:\n\n```shell\n# Succeeds\nmsft-todo-backup restore --list-index 3\n# You can also specify multiple IDs (one-indexed)\nmsft-todo-backup restore --list-index 2 --list-index=3\n```\n\nWhen two or more lists have the same name, referring to that name when executing\na _backup_ operation will _not_ error. Instead, all of the lists with a matching\ndisplay name will be backed up. For example, the following will backup all lists\nnamed \"list-A\":\n\n```shell\n# Succeeds\nmsft-todo-backup backup list-A\n```\n\n## Appendix\n\nFurther documentation can be found under [`docs/`][x-repo-docs].\n\n### Limitations and Considerations\n\nFirst and foremost, though I've tested this on my own account and use it daily\nto back up thousands of tasks, **make sure you test this package thoroughly to\nensure it meets your needs before you use it on precious or sensitive data**.\nYou alone are responsible for the integrity, safety, and existence of your data.\n\nSecond, this package shares ZERO data or account permissions with any service or\nexternal entity except for Microsoft itself. Your data is yours.\n\nThird, it seems the current Microsoft Graph API does not expose any method of\ncapturing or specifying task list groups. This means any restoration action that\nrequires new lists to be created will result in said lists not being added to\nany task list groups. Deduplicated restorations (the default kind of\nrestoration), when adding tasks to existing task lists, are unaffected by this\nlimitation. The old beta version of Microsoft's Graph API did have a\n[taskGroups][6] endpoint, but it looks like it was removed for some reason.\nPerhaps this can be revisited at a later point. PRs welcome!\n\nFourth, linked resources and extensions are _not_ backed up, though the API\nexposes methods of capturing and perhaps restoring them. I haven't played around\nwith it though since the functionality would be of limited use to me. PRs\nwelcome!\n\nFinally, note that moving a task from one list to another will change its ID.\nThis can result in unexpected duplicates during restorations when using\nnon-default restoration modes.\n\n### Inspiration\n\nThanks to [Dan O'Sullivan][7] for giving me an idea of how Microsoft's Graph API\nworks and the knowledge that backing up Microsoft Todo tasks was even possible.\n\n### Published Package Details\n\nThis is a [CJS2 package][x-pkg-cjs-mojito] with statically-analyzable exports\nbuilt by Babel for Node14 and above.\n\n\u003cdetails\u003e\u003csummary\u003eExpand details\u003c/summary\u003e\n\nThat means both CJS2 (via `require(...)`) and ESM (via `import { ... } from ...`\nor `await import(...)`) source will load this package from the same entry points\nwhen using Node. This has several benefits, the foremost being: less code\nshipped/smaller package size, avoiding [dual package\nhazard][x-pkg-dual-package-hazard] entirely, distributables are not\npacked/bundled/uglified, and a less complex build process.\n\nEach entry point (i.e. `ENTRY`) in [`package.json`'s\n`exports[ENTRY]`][x-repo-package-json] object includes one or more [export\nconditions][x-pkg-exports-conditions]. These entries may or may not include: an\n[`exports[ENTRY].types`][x-pkg-exports-types-key] condition pointing to a type\ndeclarations file for TypeScript and IDEs, an\n[`exports[ENTRY].module`][x-pkg-exports-module-key] condition pointing to\n(usually ESM) source for Webpack/Rollup, an `exports[ENTRY].node` condition\npointing to (usually CJS2) source for Node.js `require` _and `import`_, an\n`exports[ENTRY].default` condition pointing to source for browsers and other\nenvironments, and [other conditions][x-pkg-exports-conditions] not enumerated\nhere. Check the [package.json][x-repo-package-json] file to see which export\nconditions are supported.\n\nThough [`package.json`][x-repo-package-json] includes\n[`{ \"type\": \"commonjs\" }`][x-pkg-type], note that any ESM-only entry points will\nbe ES module (`.mjs`) files. Finally, [`package.json`][x-repo-package-json] also\nincludes the [`sideEffects`][x-pkg-side-effects-key] key, which is `false` for\noptimal [tree shaking][x-pkg-tree-shaking].\n\n\u003c/details\u003e\n\n### License\n\nSee [LICENSE][x-repo-license].\n\n## Contributing and Support\n\n**[New issues][x-repo-choose-new-issue] and [pull requests][x-repo-pr-compare]\nare always welcome and greatly appreciated! 🤩** Just as well, you can [star 🌟\nthis project][x-badge-repo-link] to let me know you found it useful! ✊🏿 Thank\nyou!\n\nSee [CONTRIBUTING.md][x-repo-contributing] and [SUPPORT.md][x-repo-support] for\nmore information.\n\n### Contributors\n\n\u003c!-- remark-ignore-start --\u003e\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-)\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\u003c!-- remark-ignore-end --\u003e\n\nThanks goes to these wonderful people ([emoji\nkey][x-repo-all-contributors-emojis]):\n\n\u003c!-- remark-ignore-start --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://xunn.io/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/656017?v=4?s=100\" width=\"100px;\" alt=\"Bernard\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBernard\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#infra-Xunnamius\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/Xunnamius/msft-todo-backup/commits?author=Xunnamius\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/Xunnamius/msft-todo-backup/commits?author=Xunnamius\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#maintenance-Xunnamius\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"https://github.com/Xunnamius/msft-todo-backup/commits?author=Xunnamius\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/Xunnamius/msft-todo-backup/pulls?q=is%3Apr+reviewed-by%3AXunnamius\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n  \u003ctfoot\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" size=\"13px\" colspan=\"7\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/all-contributors/all-contributors-cli/1b8533af435da9854653492b1327a23a4dbd0a10/assets/logo-small.svg\"\u003e\n          \u003ca href=\"https://all-contributors.js.org/docs/en/bot/usage\"\u003eAdd your contributions\u003c/a\u003e\n        \u003c/img\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tfoot\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\u003c!-- remark-ignore-end --\u003e\n\nThis project follows the [all-contributors][x-repo-all-contributors]\nspecification. Contributions of any kind welcome!\n\n[x-badge-blm-image]: https://xunn.at/badge-blm 'Join the movement!'\n[x-badge-blm-link]: https://xunn.at/donate-blm\n[x-badge-codecov-image]:\n  https://img.shields.io/codecov/c/github/Xunnamius/msft-todo-backup/main?style=flat-square\u0026token=HWRIOBAAPW\n  'Is this package well-tested?'\n[x-badge-codecov-link]: https://codecov.io/gh/Xunnamius/msft-todo-backup\n[x-badge-downloads-image]:\n  https://img.shields.io/npm/dm/msft-todo-backup?style=flat-square\n  'Number of times this package has been downloaded per month'\n[x-badge-lastcommit-image]:\n  https://img.shields.io/github/last-commit/xunnamius/msft-todo-backup?style=flat-square\n  'Latest commit timestamp'\n[x-badge-license-image]:\n  https://img.shields.io/npm/l/msft-todo-backup?style=flat-square\n  \"This package's source license\"\n[x-badge-license-link]:\n  https://github.com/Xunnamius/msft-todo-backup/blob/main/LICENSE\n[x-badge-npm-image]:\n  https://xunn.at/npm-pkg-version/msft-todo-backup\n  'Install this package using npm or yarn!'\n[x-badge-npm-link]: https://www.npmjs.com/package/msft-todo-backup\n[x-badge-repo-link]: https://github.com/xunnamius/msft-todo-backup\n[x-badge-semanticrelease-image]:\n  https://xunn.at/badge-semantic-release\n  'This repo practices continuous integration and deployment!'\n[x-badge-semanticrelease-link]:\n  https://github.com/semantic-release/semantic-release\n[x-pkg-cjs-mojito]:\n  https://dev.to/jakobjingleheimer/configuring-commonjs-es-modules-for-nodejs-12ed#publish-only-a-cjs-distribution-with-property-exports\n[x-pkg-dual-package-hazard]:\n  https://nodejs.org/api/packages.html#dual-package-hazard\n[x-pkg-exports-conditions]:\n  https://webpack.js.org/guides/package-exports#reference-syntax\n[x-pkg-exports-module-key]:\n  https://webpack.js.org/guides/package-exports#providing-commonjs-and-esm-version-stateless\n[x-pkg-exports-types-key]:\n  https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta#packagejson-exports-imports-and-self-referencing\n[x-pkg-side-effects-key]:\n  https://webpack.js.org/guides/tree-shaking#mark-the-file-as-side-effect-free\n[x-pkg-tree-shaking]: https://webpack.js.org/guides/tree-shaking\n[x-pkg-type]:\n  https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#type\n[x-repo-all-contributors]: https://github.com/all-contributors/all-contributors\n[x-repo-all-contributors-emojis]: https://allcontributors.org/docs/en/emoji-key\n[x-repo-choose-new-issue]:\n  https://github.com/xunnamius/msft-todo-backup/issues/new/choose\n[x-repo-contributing]: /CONTRIBUTING.md\n[x-repo-docs]: docs\n[x-repo-license]: ./LICENSE\n[x-repo-package-json]: package.json\n[x-repo-pr-compare]: https://github.com/xunnamius/msft-todo-backup/compare\n[x-repo-support]: /.github/SUPPORT.md\n[1]:\n  https://aad.portal.azure.com#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps\n[2]:\n  https://learn.microsoft.com/en-us/graph/auth-register-app-v2#register-an-application\n[3]: https://opensource.com/article/17/11/how-use-cron-linux\n[4]:\n  https://www.windowscentral.com/how-create-automated-task-using-task-scheduler-windows-10\n[5]: #restoring-lists\n[6]:\n  https://learn.microsoft.com/en-us/graph/api/outlookuser-list-taskgroups?view=graph-rest-beta\u0026tabs=http\n[7]:\n  https://blog.osull.com/2020/09/14/backup-migrate-microsoft-to-do-tasks-with-powershell-and-microsoft-graph\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxunnamius%2Fmsft-todo-backup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxunnamius%2Fmsft-todo-backup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxunnamius%2Fmsft-todo-backup/lists"}