{"id":48147704,"url":"https://github.com/graysoncadams/todoist-bridge","last_synced_at":"2026-04-04T17:01:53.202Z","repository":{"id":327139734,"uuid":"1108041697","full_name":"GraysonCAdams/todoist-bridge","owner":"GraysonCAdams","description":"Unified task synchronization from Google Tasks and Alexa to Todoist","archived":false,"fork":false,"pushed_at":"2026-01-05T01:08:12.000Z","size":641,"stargazers_count":1,"open_issues_count":16,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-09T08:37:59.828Z","etag":null,"topics":["alexa","alexa-shopping-list","google-tasks","reminders","sync","tasks","todoist"],"latest_commit_sha":null,"homepage":"","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/GraysonCAdams.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":null},"created_at":"2025-12-02T00:15:59.000Z","updated_at":"2026-01-04T18:01:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/GraysonCAdams/todoist-bridge","commit_stats":null,"previous_names":["graysoncadams/todoist-bridge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/GraysonCAdams/todoist-bridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraysonCAdams%2Ftodoist-bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraysonCAdams%2Ftodoist-bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraysonCAdams%2Ftodoist-bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraysonCAdams%2Ftodoist-bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GraysonCAdams","download_url":"https://codeload.github.com/GraysonCAdams/todoist-bridge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GraysonCAdams%2Ftodoist-bridge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["alexa","alexa-shopping-list","google-tasks","reminders","sync","tasks","todoist"],"created_at":"2026-04-04T17:01:52.872Z","updated_at":"2026-04-04T17:01:53.136Z","avatar_url":"https://github.com/GraysonCAdams.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eTodoist Bridge\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    Unified task synchronization from Google Tasks, Alexa, and Microsoft To-Do to Todoist\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/GraysonCAdams/todoist-bridge/actions/workflows/docker-publish.yml\"\u003e\n    \u003cimg src=\"https://github.com/GraysonCAdams/todoist-bridge/actions/workflows/docker-publish.yml/badge.svg\" alt=\"Build Status\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/GraysonCAdams/todoist-bridge/pkgs/container/todoist-bridge\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/ghcr.io-available-blue\" alt=\"Container Registry\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen\" alt=\"Node Version\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/typescript-5.6-blue\" alt=\"TypeScript\"\u003e\n\u003c/p\u003e\n\n---\n\n## Table of Contents\n\n- [About](#about)\n- [Features](#features)\n- [Quick Start](#quick-start)\n- [Installation](#installation)\n  - [Docker (Recommended)](#docker-recommended)\n  - [Docker Compose](#docker-compose)\n  - [Manual Installation](#manual-installation)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [Architecture](#architecture)\n- [Wiki](#wiki)\n- [Contributing](#contributing)\n- [Credits](#credits)\n- [License](#license)\n\n---\n\n## About\n\nTodoist Bridge is a Node.js daemon that synchronizes tasks between multiple platforms and Todoist. It runs as a background service, polling your task sources at configurable intervals and automatically creating, updating, and completing tasks.\n\n### Supported Sources\n\nYou can use **any combination** of the following sources:\n\n| Source | Sync Direction | Description |\n|--------|----------------|-------------|\n| Google Tasks | One-way → Todoist | Sync task lists from Google Tasks |\n| Alexa Reminders | One-way → Todoist | Sync reminders from Alexa devices |\n| Alexa Shopping List | One-way → Todoist | Sync your Alexa shopping list |\n| Microsoft To-Do | **Bi-directional** ↔ Todoist | Two-way sync with Microsoft To-Do lists |\n\nEnable only what you need - each source is independently configurable.\n\n**Why Todoist Bridge?**\n\n- **Centralize your tasks**: Consolidate tasks from multiple sources into Todoist\n- **Modular sources**: Use Google Tasks, Alexa, or both - your choice\n- **Hands-free operation**: Set it up once and forget about it\n- **Flexible mapping**: Map specific lists to specific projects with custom tags\n- **Self-hosted**: Your data stays on your infrastructure\n\n---\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Google Tasks Sync** | Full sync of tasks including subtasks, due dates, and descriptions |\n| **Alexa Reminders** | Sync reminders from all Alexa devices to Todoist |\n| **Alexa Shopping List** | Keep your shopping list in sync |\n| **Microsoft To-Do Sync** | Bi-directional sync with Microsoft To-Do (great for shared lists) |\n| **Completion Sync** | Complete tasks on either platform, syncs to the other |\n| **Shared List Support** | Filter shared Microsoft lists to only sync your items |\n| **Custom Tags** | Apply labels to synced tasks for easy filtering |\n| **Flexible Mapping** | Map any source list to any Todoist project or Inbox |\n| **Subtask Support** | Single-level subtask hierarchy preserved |\n| **Completed Tasks** | Optional retroactive import of completed tasks |\n| **Delete After Sync** | Optionally remove tasks from source after syncing |\n| **Conflict Resolution** | Last-write-wins for bi-directional sync conflicts |\n| **SQLite State** | Reliable change detection with local database |\n| **Graceful Shutdown** | Clean handling of SIGTERM/SIGINT signals |\n\n---\n\n## Quick Start\n\n### Using Docker\n\n```bash\n# Pull the image\ndocker pull ghcr.io/graysoncadams/todoist-bridge:latest\n\n# Create directories\nmkdir -p ./data ./credentials\n\n# Create config file (see Configuration section)\ncp config.example.yaml config.yaml\n# Edit config.yaml with your settings\n\n# Run the container\ndocker run -d \\\n  --name todoist-bridge \\\n  -v $(pwd)/config.yaml:/app/config.yaml:ro \\\n  -v $(pwd)/credentials:/app/credentials \\\n  -v $(pwd)/data:/app/data \\\n  ghcr.io/graysoncadams/todoist-bridge:latest\n```\n\n---\n\n## Installation\n\n### Docker (Recommended)\n\nDocker provides the simplest deployment path with automatic updates and isolation.\n\n```bash\ndocker pull ghcr.io/graysoncadams/todoist-bridge:latest\n```\n\nSee [Docker Compose](#docker-compose) for a complete example.\n\n### Docker Compose\n\nCreate a `docker-compose.yml`:\n\n```yaml\nservices:\n  todoist-bridge:\n    image: ghcr.io/graysoncadams/todoist-bridge:latest\n    container_name: todoist-bridge\n    restart: unless-stopped\n    volumes:\n      - ./config.yaml:/app/config.yaml:ro\n      - ./credentials:/app/credentials\n      - ./data:/app/data\n    ports:\n      - \"3000:3000\"  # Google OAuth web form (first run only)\n      - \"3001:3001\"  # Alexa auth proxy (first run only, if using Alexa)\n    environment:\n      - LOG_LEVEL=info\n      - TZ=America/New_York\n```\n\n\u003e **Note:** Ports are only needed for initial authorization. After tokens/cookies are saved, you can remove the port mappings. For Alexa, also set `proxy_host` in config.yaml to your Docker host's IP.\n\nRun with:\n\n```bash\ndocker compose up -d\ndocker compose logs -f\n```\n\n### Manual Installation\n\n**Requirements:**\n- Node.js 20.0.0 or higher\n- npm\n\n```bash\n# Clone the repository\ngit clone https://github.com/GraysonCAdams/todoist-bridge.git\ncd todoist-bridge\n\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Configure\ncp config.example.yaml config.yaml\n# Edit config.yaml\n\n# Run\nnpm start\n```\n\nFor development:\n\n```bash\nnpm run dev\n```\n\n---\n\n## Configuration\n\nTodoist Bridge uses a YAML configuration file with environment variable overrides.\n\n### Minimal Configuration\n\nChoose one or more sources to sync. Each source can be enabled or disabled independently.\n\n**Google Tasks only:**\n\n```yaml\ntodoist:\n  api_token: \"your-todoist-api-token\"\n\nsources:\n  google:\n    enabled: true\n    lists:\n      - source_list_id: \"YOUR_GOOGLE_LIST_ID\"\n        todoist_project_id: \"YOUR_TODOIST_PROJECT_ID\"\n  alexa:\n    enabled: false\n```\n\n**Alexa only:**\n\n```yaml\ntodoist:\n  api_token: \"your-todoist-api-token\"\n\nsources:\n  google:\n    enabled: false\n  alexa:\n    enabled: true\n    amazon_page: \"amazon.com\"\n    lists:\n      - source_list_id: \"all\"\n        todoist_project_id: \"YOUR_TODOIST_PROJECT_ID\"\n```\n\n**Both sources:**\n\n```yaml\ntodoist:\n  api_token: \"your-todoist-api-token\"\n\nsources:\n  google:\n    enabled: true\n    lists:\n      - source_list_id: \"YOUR_GOOGLE_LIST_ID\"\n        todoist_project_id: \"YOUR_TODOIST_PROJECT_ID\"\n  alexa:\n    enabled: true\n    lists:\n      - source_list_id: \"all\"\n        todoist_project_id: \"YOUR_ALEXA_PROJECT_ID\"\n```\n\n**Microsoft To-Do (bi-directional):**\n\n```yaml\ntodoist:\n  api_token: \"your-todoist-api-token\"\n\nsources:\n  google:\n    enabled: false\n  alexa:\n    enabled: false\n  microsoft:\n    enabled: true\n    client_id: \"your-azure-app-client-id\"\n    tenant_id: \"consumers\"  # Use \"consumers\" for personal Microsoft accounts\n    lists:\n      - list_name: \"Groceries\"\n        todoist_project_id: \"inbox\"\n        tags: [\"grocery\"]\n    assign_to_self: true               # Set reminders on tasks with due times\n    exclude_others_assignments: true   # Ignore items from other users\n```\n\n### Full Configuration\n\n```yaml\n# Todoist configuration\ntodoist:\n  api_token: \"your-todoist-api-token\"\n\n# Sources to sync from\nsources:\n  # Google Tasks (one-way sync to Todoist)\n  google:\n    enabled: true\n    poll_interval_minutes: 5\n    credentials_path: \"./credentials/google-credentials.json\"\n    token_path: \"./credentials/google-token.json\"\n    lists:\n      - source_list_id: \"abc123\"\n        todoist_project_id: \"456789\"  # or \"inbox\"\n        include_completed: false\n        delete_after_sync: false\n        tags:\n          - \"google-tasks\"\n\n  # Alexa Reminders (one-way sync to Todoist)\n  alexa:\n    enabled: false\n    poll_interval_minutes: 5\n    cookie_path: \"./credentials/alexa-cookie.json\"\n    amazon_page: \"amazon.com\"\n    proxy_port: 3001\n    proxy_host: \"192.168.1.140\"  # Your Docker host IP (for external access)\n    fail_silently: true\n    max_retries: 3\n    lists:\n      - source_list_id: \"all\"\n        todoist_project_id: \"789012\"\n        tags:\n          - \"alexa\"\n    # Shopping list sync\n    sync_shopping_list:\n      enabled: false\n      todoist_project_id: \"123456\"\n      tags:\n        - \"shopping\"\n\n  # Microsoft To-Do (bi-directional sync with Todoist)\n  microsoft:\n    enabled: false\n    client_id: \"your-azure-app-client-id\"\n    tenant_id: \"consumers\"  # Use \"consumers\" for personal accounts\n    token_path: \"./credentials/microsoft-token.json\"\n    poll_interval_minutes: 3\n    lists:\n      - list_name: \"Groceries\"\n        todoist_project_id: \"inbox\"\n        tags: [\"grocery\"]\n    assign_to_self: false              # Set reminders on tasks with due times\n    exclude_others_assignments: true   # Ignore items from other users\n\n# Global sync settings\nsync:\n  sync_completed_once: true\n\n# Storage\nstorage:\n  database_path: \"./data/sync.db\"\n\n# Logging\nlogging:\n  level: \"info\"  # trace, debug, info, warn, error\n```\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `TODOIST_API_TOKEN` | Todoist API token | - |\n| `DATABASE_PATH` | SQLite database path | `./data/sync.db` |\n| `POLL_INTERVAL_MINUTES` | Sync interval | `5` |\n| `LOG_LEVEL` | Log verbosity | `info` |\n\n---\n\n## Usage\n\n### First Run Authentication\n\n#### Google Tasks\n\n**Google Cloud Console Setup:**\n\n1. Go to [Google Cloud Console](https://console.cloud.google.com/)\n2. Create a new project or select an existing one\n3. Enable the **Google Tasks API**\n4. Go to **APIs \u0026 Services** \u003e **Credentials**\n5. Create OAuth credentials \u003e **Desktop app** (not \"Web application\")\n6. Download the credentials JSON\n7. Save as `./credentials/google-credentials.json`\n\n**Authorization Flow:**\n\nOn first run, you'll be prompted to authorize with Google:\n\n**Interactive mode (CLI/Terminal):**\n1. A URL will be printed to the console\n2. Open the URL in your browser\n3. Sign in with your Google account\n4. Grant access to Google Tasks\n5. Google displays an authorization code - copy it\n6. Paste the code in the terminal when prompted\n7. The token is saved for future runs\n\n**Docker mode (Non-interactive):**\n1. Check the container logs for the Google authorization URL\n2. Open the URL in your browser and authorize\n3. Google displays an authorization code - copy it\n4. Visit `http://localhost:3000/auth` (or your Docker host)\n5. Paste the authorization code in the web form\n6. The token is saved for future runs\n\n\u003e **Note:** For Docker, ensure port 3000 is exposed for the initial authorization:\n\u003e ```yaml\n\u003e ports:\n\u003e   - \"3000:3000\"\n\u003e ```\n\n#### Alexa (if enabled)\n\n1. A proxy server starts on the configured port (default: 3001)\n2. Open `http://localhost:3001` in your browser (or your Docker host IP)\n3. Sign in with your Amazon account\n4. Cookies are saved for future runs\n\n\u003e **Note for Docker:** When running in Docker, set `proxy_host` in your config to your Docker host's IP address (e.g., `192.168.1.140`) so the authentication redirects work correctly. Also expose the proxy port:\n\u003e ```yaml\n\u003e # config.yaml\n\u003e sources:\n\u003e   alexa:\n\u003e     proxy_port: 3001\n\u003e     proxy_host: \"192.168.1.140\"  # Your Docker host IP\n\u003e ```\n\u003e ```yaml\n\u003e # docker-compose.yml\n\u003e ports:\n\u003e   - \"3001:3001\"\n\u003e ```\n\n#### Microsoft To-Do (if enabled)\n\n**Azure App Registration Setup:**\n\n1. Go to [Azure Portal](https://portal.azure.com/) \u003e **App registrations**\n2. Click **New registration**\n3. Configure the app:\n   - **Name:** `Todoist Bridge` (or any name you prefer)\n   - **Supported account types:** Select **\"Personal Microsoft accounts only\"** (recommended for personal To-Do)\n4. Click **Register** (leave Redirect URI blank)\n5. Copy the **Application (client) ID** - you'll need this for config\n6. Go to **API permissions** \u003e **Add a permission**:\n   - Select **Microsoft Graph**\n   - Choose **Delegated permissions**\n   - Add: `Tasks.ReadWrite`, `User.Read`\n   - Click **Add permissions**\n7. Go to **Authentication**:\n   - Under **Advanced settings**, set **Allow public client flows** to **Yes**\n   - Click **Save**\n\n\u003e **Important:** Use `tenant_id: \"consumers\"` in your config for personal Microsoft accounts (@outlook.com, @hotmail.com, etc.)\n\n**Device Code Authentication Flow:**\n\nMicrosoft To-Do uses Device Code Flow, which works in any environment (CLI, Docker, headless servers):\n\n1. On first run, the app displays a message like:\n   ```\n   To sign in, use a web browser to open https://microsoft.com/devicelogin\n   and enter the code: ABCD1234\n   ```\n2. Open that URL in **any browser** (can be on your phone or another computer)\n3. Enter the code shown in your terminal\n4. Sign in with the **Microsoft account that has the To-Do lists you want to sync**\n5. Grant the requested permissions (Tasks.ReadWrite, User.Read)\n6. Return to your terminal - authentication completes automatically\n7. Token is saved to `./credentials/microsoft-token.json` for future runs\n\n\u003e **Which account gets linked?** Whatever Microsoft account you sign into during step 4 is the one that gets linked. This is how you choose which To-Do lists to sync - by signing into the correct account.\n\n\u003e **Shared Lists:** If you're syncing a shared Microsoft To-Do list, sign in with your own account. Enable `exclude_others_assignments: true` to ignore items added by other users.\n\n### Finding IDs\n\nSee the [Wiki: Finding IDs](../../wiki/Finding-IDs) for detailed instructions on obtaining:\n- Google Task List IDs\n- Todoist Project IDs\n\n### Field Mapping\n\n**Google Tasks / Alexa → Todoist:**\n\n| Source | Todoist | Notes |\n|--------|---------|-------|\n| Title | Content | Direct mapping |\n| Notes/Description | Description | Direct mapping |\n| Status | is_completed | Mapped appropriately |\n| Due Date | due_date | Date only |\n| Parent | parent_id | Single level subtasks |\n\n**Microsoft To-Do ↔ Todoist (bi-directional):**\n\n| Microsoft To-Do | Todoist | Notes |\n|-----------------|---------|-------|\n| title | content | Syncs both directions |\n| body.content | description | Syncs both directions |\n| status | is_completed | Completion syncs both ways |\n| dueDateTime | due_date | Date and time preserved |\n| importance | priority | high→P1, normal→P4, low→P4 |\n| reminderDateTime | (via due) | Mapped to Todoist due time |\n\n---\n\n## Architecture\n\n```\n┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐\n│  Google Tasks   │     │  Alexa Skills   │     │ Microsoft To-Do │\n│      API        │     │      API        │     │   Graph API     │\n└────────┬────────┘     └────────┬────────┘     └────────┬────────┘\n         │                       │                       │\n         │ (one-way)             │ (one-way)             │ (bi-directional)\n         │                       │                       ↕\n         └───────────────────────┼───────────────────────┘\n                                 │\n                          ┌──────▼──────┐\n                          │   Todoist   │\n                          │   Bridge    │\n                          └──────┬──────┘\n                                 │\n                          ┌──────▼──────┐\n                          │   SQLite    │\n                          │  State DB   │\n                          └──────┬──────┘\n                                 │\n                          ┌──────▼──────┐\n                          │   Todoist   │\n                          │     API     │\n                          └─────────────┘\n```\n\n### Components\n\n| Component | Description |\n|-----------|-------------|\n| `src/index.ts` | Main entry point and daemon loop |\n| `src/config.ts` | Configuration loading and validation |\n| `src/storage.ts` | SQLite state management |\n| `src/auth/` | Authentication for Google, Todoist, Alexa |\n| `src/clients/` | API client wrappers |\n| `src/sources/google/` | Google Tasks source (one-way) |\n| `src/sources/alexa/` | Alexa source (one-way) |\n| `src/sources/microsoft/` | Microsoft To-Do source (bi-directional) |\n| `src/utils/` | Logger and retry utilities |\n\n---\n\n## Wiki\n\nDetailed documentation is available in the [Wiki](../../wiki):\n\n- [Home](../../wiki/Home) - Overview and quick start\n- [Installation](../../wiki/Installation) - Detailed installation guide\n- [Google Setup](../../wiki/Google-Setup) - Google Cloud and OAuth configuration\n- [Alexa Setup](../../wiki/Alexa-Setup) - Amazon Alexa integration\n- [Microsoft To-Do Setup](../../wiki/Microsoft-Setup) - Azure AD app registration and bi-directional sync\n- [Finding IDs](../../wiki/Finding-IDs) - How to find list and project IDs\n- [Docker Deployment](../../wiki/Docker-Deployment) - Container deployment guide\n- [Troubleshooting](../../wiki/Troubleshooting) - Common issues and solutions\n\n---\n\n## Contributing\n\nContributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/improvement`)\n3. Commit your changes (`git commit -am 'Add improvement'`)\n4. Push to the branch (`git push origin feature/improvement`)\n5. Open a Pull Request\n\n---\n\n## Credits\n\nTodoist Bridge is built on the work of these projects:\n\n| Project | Description | License |\n|---------|-------------|---------|\n| [googleapis](https://github.com/googleapis/google-api-nodejs-client) | Google APIs Node.js Client | Apache-2.0 |\n| [todoist-api-typescript](https://github.com/Doist/todoist-api-typescript) | Official Todoist TypeScript SDK | MIT |\n| [alexa-remote2](https://github.com/Apollon77/alexa-remote) | Alexa Remote Control | MIT |\n| [@azure/msal-node](https://github.com/AzureAD/microsoft-authentication-library-for-js) | Microsoft Authentication Library | MIT |\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See [LICENSE](LICENSE) for details.\n\n```\nMIT License\n\nCopyright (c) 2024\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraysoncadams%2Ftodoist-bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraysoncadams%2Ftodoist-bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraysoncadams%2Ftodoist-bridge/lists"}