{"id":51552940,"url":"https://github.com/dennis-menge/watchdoo","last_synced_at":"2026-07-10T01:30:25.558Z","repository":{"id":355294264,"uuid":"1227531229","full_name":"dennis-menge/watchdoo","owner":"dennis-menge","description":"Standalone Apple Watch app for the Cookidoo® shopping list, with self-hosted FastAPI backend.","archived":false,"fork":false,"pushed_at":"2026-07-01T07:16:44.000Z","size":4329,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T09:11:17.983Z","etag":null,"topics":["apple-watch","cookidoo","fastapi","ios","self-hosted","shopping-list","swiftui","thermomix","watchos"],"latest_commit_sha":null,"homepage":null,"language":"Swift","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/dennis-menge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"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}},"created_at":"2026-05-02T20:16:12.000Z","updated_at":"2026-07-01T07:16:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dennis-menge/watchdoo","commit_stats":null,"previous_names":["dennis-menge/watchdoo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dennis-menge/watchdoo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dennis-menge%2Fwatchdoo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dennis-menge%2Fwatchdoo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dennis-menge%2Fwatchdoo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dennis-menge%2Fwatchdoo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dennis-menge","download_url":"https://codeload.github.com/dennis-menge/watchdoo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dennis-menge%2Fwatchdoo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35317805,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"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":["apple-watch","cookidoo","fastapi","ios","self-hosted","shopping-list","swiftui","thermomix","watchos"],"created_at":"2026-07-10T01:30:24.942Z","updated_at":"2026-07-10T01:30:25.548Z","avatar_url":"https://github.com/dennis-menge.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/logo.png\" alt=\"Watchdoo logo\" width=\"160\" /\u003e\n  \u003ch1\u003eWatchdoo\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eYour Cookidoo shopping list on the Apple Watch.\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nA standalone watchOS app that accesses the shopping list from the Cookidoo app (Thermomix/Vorwerk) through a self-hosted backend. UI languages: 🇩🇪 German, 🇬🇧 English.\n\n## ⚠️ Disclaimer\n\nThis project uses an **unofficial API** (via [cookidoo-api](https://github.com/miaucl/cookidoo-api)). It is not affiliated with Vorwerk or Cookidoo. Use at your own risk — it may violate Cookidoo's Terms of Service.\n\n*Cookidoo® and Thermomix® are registered trademarks of Vorwerk International AG. This project is not affiliated with, endorsed by, or sponsored by Vorwerk.*\n\n## Architecture\n\n```\nApple Watch (SwiftUI) ←→ Your Backend (FastAPI) ←→ Cookidoo Server\n                          (Azure Container Apps)\n```\n\n- **Self-hosted**: each user runs their own backend\n- **Cookidoo credentials** never leave your own server\n- **Watch ↔ Backend**: secured via API key\n\n## Features\n\n- 🛒 View the shopping list (grouped by category or by recipe)\n- ✅ Check items off as bought\n- ➕ Add your own custom items\n- 🗑️ Delete custom items and recipe ingredients\n- ⌚ Standalone — no iPhone required at runtime\n- 📱 iPhone companion app for one-time setup (server URL + API key sent via WatchConnectivity)\n\n## Requirements\n\n- Cookidoo account (with active subscription)\n- Azure account (for Container Apps) or Docker for local hosting\n- Xcode 15+ (for the Watch app)\n- Apple Watch with watchOS 10+\n\n## 🚀 Quick Start\n\n### 1. Run the backend locally\n\n```bash\ncd backend\ncp .env.example .env\n# Edit .env: enter your email, password, and an API key\n\npip install -r requirements.txt\nuvicorn app.main:app --reload\n```\n\nTest it:\n```bash\ncurl http://localhost:8000/api/v1/health\ncurl -H \"X-API-Key: your-key\" http://localhost:8000/api/v1/shopping-list\n```\n\n### 2. Deploy the backend to Azure\n\n```bash\n# Set environment variables\nexport COOKIDOO_EMAIL=\"you@email.com\"\nexport COOKIDOO_PASSWORD=\"your-password\"\nexport API_KEY=$(openssl rand -hex 32)\n\ncd backend/deploy\n./deploy.sh\n```\n\nThe script prints the backend URL on completion.\n\n### 3. Install the Watch app\n\n1. Open `Watchdoo/Watchdoo/Watchdoo.xcodeproj` in Xcode\n2. **Change the bundle identifiers** (in `Signing \u0026 Capabilities` for each target):\n   - Replace `com.example.Watchdoo*` with your own reverse-DNS ID (e.g. `dev.yourname.Watchdoo*`)\n   - Select your Apple Developer Team\n3. Build \u0026 run the companion app on iPhone (scheme: `Watchdoo`)\n4. Build \u0026 run the Watch app (scheme: `Watchdoo Watch App`)\n5. On the iPhone: enter the server URL and API key → \"Send to Watch\"\n\n\u003e The `WKCompanionAppBundleIdentifier` link between the Watch and iPhone targets must stay consistent — otherwise the Watch will not find its iPhone counterpart.\n\n## API Endpoints\n\n| Method   | Endpoint                                            | Description                       |\n|----------|-----------------------------------------------------|-----------------------------------|\n| `GET`    | `/api/v1/health`                                    | Health check (no auth)            |\n| `GET`    | `/api/v1/shopping-list`                             | Full shopping list                |\n| `PATCH`  | `/api/v1/shopping-list/ingredients`                 | Toggle ingredients as bought      |\n| `PATCH`  | `/api/v1/shopping-list/additional-items/ownership`  | Toggle custom items as bought     |\n| `POST`   | `/api/v1/shopping-list/additional-items`            | Add custom items                  |\n| `PUT`    | `/api/v1/shopping-list/additional-items`            | Edit custom items                 |\n| `DELETE` | `/api/v1/shopping-list/additional-items/{id}`       | Delete a custom item              |\n| `DELETE` | `/api/v1/shopping-list/recipes/{recipe_id}`         | Remove a recipe's ingredients     |\n| `POST`   | `/api/v1/auth/refresh`                              | Refresh the Cookidoo token        |\n\nAll endpoints (except `/health`) require the `X-API-Key` header.\n\n## Project Layout\n\n```\nwatchdoo/\n├── backend/\n│   ├── app/\n│   │   ├── main.py              # FastAPI app\n│   │   ├── config.py            # Settings\n│   │   ├── models.py            # Pydantic models\n│   │   ├── middleware.py        # API-key auth\n│   │   ├── routers/\n│   │   │   ├── shopping_list.py # Shopping-list endpoints\n│   │   │   └── auth.py          # Auth endpoints\n│   │   └── services/\n│   │       └── cookidoo.py      # Cookidoo API wrapper\n│   ├── Dockerfile\n│   ├── requirements.txt\n│   └── deploy/\n│       └── deploy.sh            # Azure 1-click deploy\n└── Watchdoo/              # Xcode workspace\n    └── Watchdoo/\n        ├── Watchdoo Watch App/   # watchOS target\n        │   ├── WatchdooApp.swift\n        │   ├── Models/\n        │   ├── Views/\n        │   ├── Services/\n        │   └── Connectivity/\n        └── Watchdoo/             # iOS companion target\n            ├── WatchdooCompanionApp.swift\n            ├── Views/\n            └── Services/\n```\n\n## Costs\n\n- **Azure Container Apps**: ~€3–5 per month (scales to zero when idle)\n- **Cookidoo subscription**: existing subscription required\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Please report security issues per [SECURITY.md](SECURITY.md).\n\n---\n\n\u003e Cookidoo® and Thermomix® are registered trademarks of Vorwerk International AG.\n\u003e This project is an independent, community-built tool and is **not affiliated with, endorsed by, or sponsored by Vorwerk**. All trademarks remain the property of their respective owners.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdennis-menge%2Fwatchdoo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdennis-menge%2Fwatchdoo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdennis-menge%2Fwatchdoo/lists"}