https://github.com/dennis-menge/watchdoo
Standalone Apple Watch app for the Cookidooยฎ shopping list, with self-hosted FastAPI backend.
https://github.com/dennis-menge/watchdoo
apple-watch cookidoo fastapi ios self-hosted shopping-list swiftui thermomix watchos
Last synced: about 4 hours ago
JSON representation
Standalone Apple Watch app for the Cookidooยฎ shopping list, with self-hosted FastAPI backend.
- Host: GitHub
- URL: https://github.com/dennis-menge/watchdoo
- Owner: dennis-menge
- License: mit
- Created: 2026-05-02T20:16:12.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-07-01T07:16:44.000Z (9 days ago)
- Last Synced: 2026-07-01T09:11:17.983Z (9 days ago)
- Topics: apple-watch, cookidoo, fastapi, ios, self-hosted, shopping-list, swiftui, thermomix, watchos
- Language: Swift
- Size: 4.13 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
README
Watchdoo
Your Cookidoo shopping list on the Apple Watch.
A standalone watchOS app that accesses the shopping list from the Cookidoo app (Thermomix/Vorwerk) through a self-hosted backend. UI languages: ๐ฉ๐ช German, ๐ฌ๐ง English.
## โ ๏ธ Disclaimer
This 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.
*Cookidooยฎ and Thermomixยฎ are registered trademarks of Vorwerk International AG. This project is not affiliated with, endorsed by, or sponsored by Vorwerk.*
## Architecture
```
Apple Watch (SwiftUI) โโ Your Backend (FastAPI) โโ Cookidoo Server
(Azure Container Apps)
```
- **Self-hosted**: each user runs their own backend
- **Cookidoo credentials** never leave your own server
- **Watch โ Backend**: secured via API key
## Features
- ๐ View the shopping list (grouped by category or by recipe)
- โ
Check items off as bought
- โ Add your own custom items
- ๐๏ธ Delete custom items and recipe ingredients
- โ Standalone โ no iPhone required at runtime
- ๐ฑ iPhone companion app for one-time setup (server URL + API key sent via WatchConnectivity)
## Requirements
- Cookidoo account (with active subscription)
- Azure account (for Container Apps) or Docker for local hosting
- Xcode 15+ (for the Watch app)
- Apple Watch with watchOS 10+
## ๐ Quick Start
### 1. Run the backend locally
```bash
cd backend
cp .env.example .env
# Edit .env: enter your email, password, and an API key
pip install -r requirements.txt
uvicorn app.main:app --reload
```
Test it:
```bash
curl http://localhost:8000/api/v1/health
curl -H "X-API-Key: your-key" http://localhost:8000/api/v1/shopping-list
```
### 2. Deploy the backend to Azure
```bash
# Set environment variables
export COOKIDOO_EMAIL="you@email.com"
export COOKIDOO_PASSWORD="your-password"
export API_KEY=$(openssl rand -hex 32)
cd backend/deploy
./deploy.sh
```
The script prints the backend URL on completion.
### 3. Install the Watch app
1. Open `Watchdoo/Watchdoo/Watchdoo.xcodeproj` in Xcode
2. **Change the bundle identifiers** (in `Signing & Capabilities` for each target):
- Replace `com.example.Watchdoo*` with your own reverse-DNS ID (e.g. `dev.yourname.Watchdoo*`)
- Select your Apple Developer Team
3. Build & run the companion app on iPhone (scheme: `Watchdoo`)
4. Build & run the Watch app (scheme: `Watchdoo Watch App`)
5. On the iPhone: enter the server URL and API key โ "Send to Watch"
> The `WKCompanionAppBundleIdentifier` link between the Watch and iPhone targets must stay consistent โ otherwise the Watch will not find its iPhone counterpart.
## API Endpoints
| Method | Endpoint | Description |
|----------|-----------------------------------------------------|-----------------------------------|
| `GET` | `/api/v1/health` | Health check (no auth) |
| `GET` | `/api/v1/shopping-list` | Full shopping list |
| `PATCH` | `/api/v1/shopping-list/ingredients` | Toggle ingredients as bought |
| `PATCH` | `/api/v1/shopping-list/additional-items/ownership` | Toggle custom items as bought |
| `POST` | `/api/v1/shopping-list/additional-items` | Add custom items |
| `PUT` | `/api/v1/shopping-list/additional-items` | Edit custom items |
| `DELETE` | `/api/v1/shopping-list/additional-items/{id}` | Delete a custom item |
| `DELETE` | `/api/v1/shopping-list/recipes/{recipe_id}` | Remove a recipe's ingredients |
| `POST` | `/api/v1/auth/refresh` | Refresh the Cookidoo token |
All endpoints (except `/health`) require the `X-API-Key` header.
## Project Layout
```
watchdoo/
โโโ backend/
โ โโโ app/
โ โ โโโ main.py # FastAPI app
โ โ โโโ config.py # Settings
โ โ โโโ models.py # Pydantic models
โ โ โโโ middleware.py # API-key auth
โ โ โโโ routers/
โ โ โ โโโ shopping_list.py # Shopping-list endpoints
โ โ โ โโโ auth.py # Auth endpoints
โ โ โโโ services/
โ โ โโโ cookidoo.py # Cookidoo API wrapper
โ โโโ Dockerfile
โ โโโ requirements.txt
โ โโโ deploy/
โ โโโ deploy.sh # Azure 1-click deploy
โโโ Watchdoo/ # Xcode workspace
โโโ Watchdoo/
โโโ Watchdoo Watch App/ # watchOS target
โ โโโ WatchdooApp.swift
โ โโโ Models/
โ โโโ Views/
โ โโโ Services/
โ โโโ Connectivity/
โโโ Watchdoo/ # iOS companion target
โโโ WatchdooCompanionApp.swift
โโโ Views/
โโโ Services/
```
## Costs
- **Azure Container Apps**: ~โฌ3โ5 per month (scales to zero when idle)
- **Cookidoo subscription**: existing subscription required
## License
MIT โ see [LICENSE](LICENSE).
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md). Please report security issues per [SECURITY.md](SECURITY.md).
---
> Cookidooยฎ and Thermomixยฎ are registered trademarks of Vorwerk International AG.
> 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.