{"id":17552612,"url":"https://github.com/iloveitaly/todoist-digest","last_synced_at":"2025-07-26T20:33:45.035Z","repository":{"id":206814003,"uuid":"717595041","full_name":"iloveitaly/todoist-digest","owner":"iloveitaly","description":"Generate a digest of comments that occured since the last checked in date. Useful for including in an email.","archived":false,"fork":false,"pushed_at":"2025-07-01T12:03:14.000Z","size":619,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-01T13:22:37.169Z","etag":null,"topics":["digest","management","task","todoist"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iloveitaly.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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,"zenodo":null},"funding":{"github":["iloveitaly"]}},"created_at":"2023-11-12T00:08:23.000Z","updated_at":"2025-07-01T12:03:26.000Z","dependencies_parsed_at":"2024-02-24T16:27:24.156Z","dependency_job_id":"a9cc19e0-d3a5-47e3-8f72-add83a9678d0","html_url":"https://github.com/iloveitaly/todoist-digest","commit_stats":null,"previous_names":["iloveitaly/todoist-digest"],"tags_count":29,"template":false,"template_full_name":null,"purl":"pkg:github/iloveitaly/todoist-digest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iloveitaly%2Ftodoist-digest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iloveitaly%2Ftodoist-digest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iloveitaly%2Ftodoist-digest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iloveitaly%2Ftodoist-digest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iloveitaly","download_url":"https://codeload.github.com/iloveitaly/todoist-digest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iloveitaly%2Ftodoist-digest/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267228193,"owners_count":24056368,"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-07-26T02:00:08.937Z","response_time":62,"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":["digest","management","task","todoist"],"created_at":"2024-10-21T05:43:20.557Z","updated_at":"2025-07-26T20:33:45.018Z","avatar_url":"https://github.com/iloveitaly.png","language":"Python","funding_links":["https://github.com/sponsors/iloveitaly"],"categories":[],"sub_categories":[],"readme":"[![Release Notes](https://img.shields.io/github/release/iloveitaly/todoist-digest)](https://github.com/iloveitaly/todoist-digest/releases) [![Downloads](https://static.pepy.tech/badge/todoist-digest/month)](https://pepy.tech/project/todoist-digest) [![Python Versions](https://img.shields.io/pypi/pyversions/todoist-digest)](https://pypi.org/project/todoist-digest) ![GitHub CI Status](https://github.com/iloveitaly/todoist-digest/actions/workflows/build_and_publish.yml/badge.svg) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# Todoist Project Digest\n\n[Todoist](https://mikebian.co/todoist) doesn't have a way to generate a digest of all recent comments in a project created by a specific user. This makes it challenging to see what changed and what requires your action if you are collaborating with someone on a project.\n\nThis is a simple project which generates a digest of all comments by a particular user on a particular project.\n\nThis project was also a good excuse to play around and test some functional programming/data manipulation tooling I've been messing with ([funcy](https://github.com/Suor/funcy), [funcy-pipe](https://github.com/iloveitaly/funcy-pipe), and [whatever](https://github.com/Suor/whatever)).\n\n## Features\n\n* Can send an email digest if auth is provided\n* Retrieves comments on completed tasks\n* Target projects by ID or name\n\n## Usage\n\n### Docker\n\n```shell\ndocker pull ghcr.io/iloveitaly/todoist-digest:latest\ndocker run --env-file .env ghcr.io/iloveitaly/todoist-digest:latest\n```\n\nWant to run a one off execution?\n\n```shell\ndocker run --env-file .env ghcr.io/iloveitaly/todoist-digest:latest todoist-digest --help\n```\n\nWant to inspect the docker container?\n\n```shell\ndocker run -it ghcr.io/iloveitaly/todoist-digest:latest bash\n```\n\nOr, just use the [docker compose file](docker-compose.yml).\n\n### Locally\n\n\nRun this locally using:\n\n```shell\nbin/local-digest-html\n```\n\nIf you need a tty, you can copy the `todoist-digest` execution line and run it manually in a shell.\n\nOr run directly:\n\n```shell\npoetry run todoist-digest \\\n  --last-synced \"2023-12-04T15:52:48Z\" \\\n  --target-user user@gmail.com \\\n  --target-project ProjectName\n```\n\nOr, email yourself the digest:\n\n```shell\npoetry run todoist-digest \\\n  --last-synced $LAST_SYNC \\\n  --target-user $TARGET_USER \\\n  --target-project $TARGET_PROJECT \\\n  --email-auth $EMAIL_AUTH \\\n  --email-to $EMAIL_TO\n```\n\n## Development\n\n### Manual API Calls\n\n```\nhttp --auth-type bearer --auth $TODOIST_API_KEY https://api.todoist.com/rest/v2/projects 'Content-Type: application/json'\n```\n\n### Docker Build\n\nThis repo uses [nixpacks](https://nixpacks.com/docs/getting-started) for building a Dockerfile. Why? Because I like trying new things.\n\n[Asdf support](https://github.com/railwayapp/nixpacks/pull/1026) is built into nixpacks, so it will automatically pick up python and poetry versions.\n\n### Playground\n\nipython shell with some helpful variables defined:\n\n```shell\n./playground.py\n```\n\n### Run with ipdb\n\nOpen up an exception when there's an exception:\n\n```shell\nipdb3 $(which todoist-digest) --last-synced 2023-12-14T13:38:25Z ...\n```\n\n## Related\n\n* https://www.smashlists.com ([discovered here](https://www.reddit.com/r/todoist/comments/l7mhfq/how_to_track_weekly_goals/))","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filoveitaly%2Ftodoist-digest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filoveitaly%2Ftodoist-digest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filoveitaly%2Ftodoist-digest/lists"}