{"slug": "show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed", "title": "Show HN: Kuma Voice – OSS Apple Watch voice assistant, no iPhone needed", "summary": "Kuma Voice, a self-hosted open-source voice assistant for Apple Watch, lets users run a watch-only assistant without an iPhone, streaming audio to a FastAPI backend that holds provider credentials and returns spoken answers. The prototype supports optional tools for web search, Notion notes, and Google Calendar, and requires an OpenAI API key for the realtime voice flow. Developers can deploy the backend on Fly.io or locally, with security via a shared-secret API token for remote deployments.", "body_md": "Kuma Voice is a self-hosted, watch-only voice assistant prototype. The Watch streams microphone audio to a FastAPI backend, which keeps provider credentials off the device and streams a spoken answer back. Optional tools add web search, Notion notes, and Google Calendar access.\n\nThis repository does not include a public backend or any credentials. Run your own server and point the Watch app at it.\n\n`watchos/KumaVoice.xcodeproj`\n\n— watch-only SwiftUI app`backend/app`\n\n— FastAPI server and provider integrations`backend/tests`\n\n— tests that use fakes and do not consume API credits\n\n- Xcode 16 or later and an Apple Watch simulator or device\n- Python 3.12 or later\n[uv](https://docs.astral.sh/uv/)- An OpenAI API key for the realtime voice flow\n\nOpenRouter powers the older REST fallback. Exa, Notion, and Google Calendar are optional.\n\n```\ncd backend\ncp .env.example .env\nuv sync\n```\n\nAdd at least this value to `backend/.env`\n\n:\n\n```\nOPENAI_API_KEY=your-key-here\n```\n\nThen start the server:\n\n```\nuv run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload\n```\n\nThe liveness check is at\n[ http://127.0.0.1:8000/health](http://127.0.0.1:8000/health), and local API\ndocumentation is at\n\n[.](http://127.0.0.1:8000/docs)\n\n`http://127.0.0.1:8000/docs`\n\n- Open\n`watchos/KumaVoice.xcodeproj`\n\nin Xcode. - Select the\n`KumaVoice`\n\ntarget and choose your development team under Signing & Capabilities. - Start the backend, select an Apple Watch simulator, and press Run.\n- Tap the microphone button, or use Double Tap on supported hardware, to start and stop a turn.\n\nThe checked-in configuration uses `http://127.0.0.1:8000`\n\n. For a physical Watch\nor hosted server, create a private local configuration:\n\n```\ncp watchos/Local.xcconfig.example watchos/Local.xcconfig\n```\n\nEdit `watchos/Local.xcconfig`\n\nwith your own HTTPS backend URL. If the backend has\nan API token, put the same value in `KUMA_API_TOKEN`\n\n. This file is ignored by\nGit. Local HTTP is allowed for development; remote deployments must use HTTPS.\n\n`KUMA_API_TOKEN`\n\nis optional only for local development. If it is empty, the API\naccepts requests without authentication. Always set a long random value when the\nserver is reachable from the internet, then put the same value in the ignored\nWatch configuration described above.\n\nThe token protects every `/api/v1`\n\nHTTP and WebSocket endpoint. `/health`\n\nremains public but returns only `{\"status\":\"ok\"}`\n\n. This is lightweight shared-\nsecret protection for a personal prototype, not multi-user authentication.\n\nThe included `fly.toml`\n\ndeliberately contains no app name or personal region.\nChoose your own globally unique name:\n\n```\nKUMA_FLY_APP=your-unique-app-name\nfly auth login\nfly apps create \"$KUMA_FLY_APP\"\nfly secrets set -a \"$KUMA_FLY_APP\" OPENAI_API_KEY=... KUMA_API_TOKEN=...\nfly deploy -a \"$KUMA_FLY_APP\"\n```\n\nSet `KUMA_BACKEND_URL`\n\nin `watchos/Local.xcconfig`\n\nto your assigned HTTPS URL,\nthen rebuild the Watch app. Use `openssl rand -hex 32`\n\nto generate a suitable\ntoken and keep it in a password manager.\n\nProvider secrets belong only in `backend/.env`\n\nlocally or in your host's secret\nstore. The full list and safe placeholders are in `backend/.env.example`\n\n.\n\nSet `EXA_API_KEY`\n\nto let the realtime assistant search the web.\n\n- Create an internal integration at\n[notion.so/my-integrations](https://www.notion.so/my-integrations). - Share only the pages Kuma should access with that integration.\n- Set\n`NOTION_API_KEY`\n\nand, optionally,`NOTION_NOTES_PAGE_ID`\n\n.\n\n- Enable the Google Calendar API and create a Desktop OAuth client in the\n[Google Cloud Console](https://console.cloud.google.com/). - Set\n`GOOGLE_CALENDAR_CLIENT_ID`\n\nand`GOOGLE_CALENDAR_CLIENT_SECRET`\n\nlocally. - Run\n`uv run python -m scripts.google_calendar_auth`\n\nfrom`backend`\n\nand save the resulting`GOOGLE_CALENDAR_REFRESH_TOKEN`\n\n. - Set\n`GOOGLE_CALENDAR_TIMEZONE`\n\nto an IANA zone such as`UTC`\n\n.\n\nUse a dedicated test calendar and least-privilege Notion pages when evaluating the prototype.\n\nMicrophone audio and conversation content are sent to the providers configured on your backend. Web searches, notes, and calendar requests may also be sent to their respective services. Review those providers' retention settings before using personal or sensitive data.\n\nNever commit `backend/.env`\n\nor `watchos/Local.xcconfig`\n\n. If a credential is ever\nexposed, rotate it rather than merely deleting it from Git.\n\n`GET /health`\n\n— minimal liveness response`WS /api/v1/realtime`\n\n— realtime PCM voice conversation`POST /api/v1/transcriptions`\n\n— audio file to text`POST /api/v1/responses`\n\n— messages to assistant text`POST /api/v1/speech`\n\n— text to MP3 audio`POST /api/v1/conversations`\n\n— start an in-memory conversation`POST /api/v1/conversations/{id}/turns`\n\n— run a complete voice turn`DELETE /api/v1/conversations/{id}`\n\n— end a conversation\n\nConversations are kept only in memory and disappear when the backend restarts. Realtime audio is 24 kHz mono, 16-bit PCM.\n\n```\ncd backend\nuv run pytest\n```\n\n", "url": "https://wpnews.pro/news/show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed", "canonical_source": "https://github.com/itsperini/kuma-voice", "published_at": "2026-08-26 12:53:39+00:00", "updated_at": "2026-08-26 13:16:53.601994+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-products", "developer-tools"], "entities": ["Kuma Voice", "Apple Watch", "FastAPI", "OpenAI", "OpenRouter", "Exa", "Notion", "Google Calendar"], "alternates": {"html": "https://wpnews.pro/news/show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed", "markdown": "https://wpnews.pro/news/show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed.md", "text": "https://wpnews.pro/news/show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed.txt", "jsonld": "https://wpnews.pro/news/show-hn-kuma-voice-oss-apple-watch-voice-assistant-no-iphone-needed.jsonld"}}