{"id":26964640,"url":"https://github.com/disrupted/things-cloud-api","last_synced_at":"2025-04-03T06:34:24.742Z","repository":{"id":38235761,"uuid":"376940660","full_name":"disrupted/things-cloud-api","owner":"disrupted","description":"(WIP) Unofficial Python client for Things Cloud","archived":false,"fork":false,"pushed_at":"2025-03-11T15:44:50.000Z","size":413,"stargazers_count":32,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-01T19:03:24.231Z","etag":null,"topics":["api","python","reverse-engineering","things3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/disrupted.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-06-14T19:56:16.000Z","updated_at":"2025-03-19T00:45:18.000Z","dependencies_parsed_at":"2023-09-24T02:06:16.931Z","dependency_job_id":"3f198020-7f31-463b-84b9-9b80fe68c7f4","html_url":"https://github.com/disrupted/things-cloud-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/disrupted%2Fthings-cloud-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/disrupted%2Fthings-cloud-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/disrupted%2Fthings-cloud-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/disrupted%2Fthings-cloud-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/disrupted","download_url":"https://codeload.github.com/disrupted/things-cloud-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246949613,"owners_count":20859696,"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":["api","python","reverse-engineering","things3"],"created_at":"2025-04-03T06:34:24.110Z","updated_at":"2025-04-03T06:34:24.717Z","avatar_url":"https://github.com/disrupted.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Things Cloud Python client\n\n\u003e work in progress, expect breaking changes\n\nThings is an excellent to-do manager for Apple devices, specifically the Mac, iPad, iPhone and Watch. Unfortunately there is no support outside these devices. Like many other users, I encountered this limitation after spending years using Things daily to plan nearly every aspect of my life and work.\n\n\u003e \"A life without Things is possible, but pointless.\" — Loriot (German humorist)\n\nThis is an attempt of recreating some basic functionality Things Cloud has to offer, to help automate some recurring tasks (e.g. inside of Home Assistant).\n\nSince there's no documentation, I've been analyzing the requests made by the Mac app. The exchanged data is often difficult to understand, because none of the fields use clear names. So far, figuring out the meaning of the to-do item fields, has been a mixed success. I was able to document some fields, while others remain a mystery.\n\nContributions are welcome to translate the rest of the fields.\n\n## Usage\n\n```python\nfrom things_cloud import ThingsClient\nfrom things_cloud.api.account import Account, Credentials\nfrom things_cloud.models import TodoItem\n\nEMAIL = os.environ[\"THINGS_EMAIL\"]\nPASSWORD = os.environ[\"THINGS_PASSWORD\"]\n\ncredentials = Credentials(email=EMAIL, password=PASSWORD)\naccount = Account.login(credentials)\nthings = ThingsClient(account)\n# create a new project\nproject = TodoItem(title=\"Things Cloud Project\").as_project()\n# push to Things Cloud\nthings.commit(project)\n\n# create a todo inside project\ntodo = TodoItem(title=\"Try out Things Cloud\")\ntodo.project = project\nthings.commit(todo)\n\n# schedule for today\ntodo.today()\nthings.commit(todo)\n```\n\n## Example\n\nSee [main.py](./main.py).\n\nPass your Things Cloud credentials as environment examples to run the example\n\n```sh\nTHINGS_EMAIL=your-email@example.com THINGS_PASSWORD=your-password uv run main.py\n```\n\n### Progress\n\n- [x] Todos\n  - [x] create\n  - [x] edit\n  - [ ] list\n  - [ ] note\n- [x] Projects\n  - [x] create\n  - [x] edit\n- [ ] Areas\n  - [ ] Today\n  - [ ] Inbox\n\n### Similar projects\n\n- @nicolai86's Go [`things-cloud-sdk`](https://github.com/nicolai86/things-cloud-sdk); it's also a work-in-progress, relying on reverse engineering the requests on the wire\n\n### Disclaimer\n\nThis project is not affiliated with Cultured Code. They make a fantastic product, and I hope they will provide an official way of interacting with the API one day. If you want to learn more about it, visit [culturedcode.com](https://culturedcode.com/things/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdisrupted%2Fthings-cloud-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdisrupted%2Fthings-cloud-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdisrupted%2Fthings-cloud-api/lists"}