Choose a service
On Mac, open Settings → undefined for your own provider, or Local AI for downloaded models. On iPhone/iPad, use Settings → undefined, Local AI Beta or Local AI on Mac.
Set up chat on Mac, iPhone, iPad and Apple Watch, connect to Mac local AI, or use a compatible custom server.
Understand the measurement, your personal baseline and the rules behind the stress estimate. Try the calculation with fictional values.
Cloud AI needs internet; some providers require your API key. A downloaded, supported local model can run on its host device without cloud AI. Mac local AI still needs a working connection to your Mac. Model downloads need internet.
Core chat on Mac, iPhone and iPad does not require an Apple Watch. Mac does not include Mood or weather.
On Mac, open Settings → undefined for your own provider, or Local AI for downloaded models. On iPhone/iPad, use Settings → undefined, Local AI Beta or Local AI on Mac.
Enter only what the chosen service requires. Mac Custom Server uses a compatible HTTPS address without a key or model field. Built-in Qwen is a separate online service with usage limits.
Choose the service in chat and send a brief text message first. Images require a compatible provider and model; the Mac device connection currently accepts text only.
Mac feature preview · checked against current source on October 4, 2026. This is not confirmation that a Mac build is available in TestFlight.
The model is downloaded to and runs on your Mac. Your iPhone or iPad sends the current request and the context included by your chat settings. Mac returns the answer; it does not transfer model files to your other devices.
Use the same local network, or a private VPN you have already configured to reach the Mac. WatchMuse does not set up a public relay. The device connection uses authenticated TCP/TLS, not HTTP.
The pairing code includes the address, port and authentication secret. Treat it like a password and share it only with your own devices. Normal pairing does not require entering a port manually.
To change the port, turn device access off on Mac, save a port from 1024 to 65535, then turn access on again. Copy the new code and pair each device again.
Do not forward the port to the public internet. Keep authentication and encryption enabled. If a .local name is not reachable over your private VPN, Mac Connection offers an advanced address setting for a reachable private Mac address.
Using the same Apple ID does not establish this connection. iCloud chat sync and Mac AI pairing are separate.
Mac must be powered on, awake and running WatchMuse. Closing its window keeps device access running in the menu bar. Quitting the App stops the service.
WatchMuse remembers the access switch and tries to restore the service when you reopen the App. There is no independent service running after you quit. Check the ready status after every restart or failure.
This connection currently handles text only, including any text context prepared by your chat settings. Local image support on Mac does not mean images can be sent through this connection. There is no automatic cloud AI fallback.
Only one local generation runs at a time. A download, verification or another local answer can make the Mac busy; requests may be rejected rather than queued. Long requests can time out.
Speed depends on hardware, model size, available memory and other work on the Mac. Memory guidance is not a performance guarantee. Start with a smaller supported model if resources are limited.
Mac Settings → General → Sync conversations with iCloud is optional. It uses the shared chat archive; enable chat backups on the other devices too. A signed build with the iCloud capability and a working iCloud account is required.
The chat archive includes saved messages and attachments, quotes or extracted document text stored with them. It does not sync model files, API keys or Mac pairing secrets. Configure these on each device.
Turning sync off stops future sync; it does not automatically erase existing cloud data. Chat sync is not guaranteed to be immediate, and does not replace a working network connection to Mac.
Accept the App’s terms, enable device access, and read the service status. The code appears only when the listener is ready. If startup fails, check local-network permission, port conflicts and Keychain access. A signing or application-identity change can affect access to saved credentials; use the intended signed build.
Pairing saves the connection details; it is not a connectivity test. Confirm Mac is awake, WatchMuse is running, the service is ready, and both devices can reach each other on the LAN or private VPN. Check App-specific local-network and firewall permissions, without disabling the firewall. Recheck the address and port; use a new code if they changed.
Wake the Mac and reopen WatchMuse. Wait for the device service to be ready, then retry. Closing the window is different from quitting the App.
Stop device access, save the new port, restart access, then pair each client with the new code. The old code still contains the old port.
Wait for downloads, verification and generation to finish. Confirm all required files are present in the current LocalAI folder and any model terms have been accepted, then choose Use This Model. Check the displayed error; downloading does not automatically make a model active.
Check that you opened the intended signed App and application identity. A different identifier can use a different container, preferences and Keychain access. In Mac Settings → General, the current build offers “Recover Previous Data”, “Import Downloaded Models…” and “Import Previous Settings…”. These labels may still be in English. Choose the old LocalAI folder or preferences file; model files are verified and copied, not moved. Passwords and permissions are not imported. Restart after importing settings. Do not delete the old data first.
Wait for the current local answer, download or verification to finish. Avoid repeated retries from multiple devices. If the request times out, try a shorter question or smaller model.
First test a text question from the paired iPhone. Check its Mac pairing and Apple Watch access switch. On Watch, refresh model information and choose Mac, or follow iPhone’s Mac route. Keep iPhone nearby and reopen WatchMuse on it if background forwarding was interrupted. No model download to Watch is needed.
Configure a cloud provider below, or use the local AI guide above. Keys apply only to providers that require them. Model availability differs by platform and version; check the list in your App.
| Provider | Setup | App default / model choice |
|---|---|---|
| Qwen AI 千问 AI | An online service operated for WatchMuse, with its own access and usage limits. Separate from downloadable Qwen models. | Determined by the WatchMuse server. |
| OpenAI | Create an API key following OpenAI’s official guide, then enter it in the app.OpenAI key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| Gemini | Create an API key in Google AI Studio, then enter it in the app.Gemini key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| DeepSeek | Apply for an API key on the DeepSeek platform, then enter it in the app.DeepSeek key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| Claude | Create an API key in Claude Console, then enter it in the app.Claude key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| Perplexity Sonar | Create an API key in Perplexity API Console, then enter it in the app.Sonar key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| OpenRouter | Create one OpenRouter API key, then choose a model from the app’s model list. You do not need a separate key for every other platform.OpenRouter key guide | See the model choices in your App; defaults may differ between Mac and mobile. |
| Custom Server | Enter your complete HTTPS endpoint URL. It must accept the app’s request and return the expected response—not just display a web page.View the endpoint format | Determined by your own server. |
Model availability, image support, limits, and charges depend on the selected service, model, and account. Check the app’s model list and the provider’s current documentation. Enter keys only in the app—this website never asks you to submit an API key.
APPLE WATCH
TroubleshootingChoose a question to see what to check.
Keep Reply Notifications enabled in Settings → AI & Chat. watchOS decides how long networking and background work can continue, so a suspended or terminated app cannot guarantee every long request will finish. Reopen the conversation to check its saved state.
Enable Location Services for WatchMuse and try Update Current Location again. If Apple Weather is temporarily unavailable, WatchMuse can use Open-Meteo when that fallback is enabled. You can also enter a city manually.
Allow Health read access and confirm Apple Watch has a recent HRV sample. WatchMuse reads the latest measurement already saved by Apple Watch; it cannot force a new HRV measurement. The wellness stage is informational and is not a medical diagnosis.
Open WatchMuse once after installing or updating it, confirm the relevant Mood, Stress, or Weather feature is enabled, and wait for watchOS to refresh the timeline. If needed, remove the complication from the watch face and add it again.
Check notification permission in watchOS Settings and confirm the corresponding alert is enabled inside WatchMuse. Sleep protection may intentionally pause mood alerts, and watchOS may delay background schedules to preserve battery.
WatchMuse can use Ollama, a self-hosted model, or any cloud model through one compatible HTTPS endpoint. Your server translates WatchMuse's simple request into the format expected by your model.
Use a compatible HTTPS endpoint. On Mac, no API key or model selection is required in this option; your server chooses the model. This is separate from Mac device access.
Enter the endpoint URL itself, not an Ollama dashboard or model page. WatchMuse sends an HTTP POST request with UTF-8 JSON and the question in message. Without an attachment, your server should accept image fields that are either null or omitted.
Your endpoint must return a successful 2xx response, Content-Type: application/json, and a non-empty reply string before the request times out.
{
"message": "Hello",
"imageBase64": null,
"mimeType": null
}
{
"reply": "Hello from your model."
}
In a chat interface that supports attachments, choose an image and enter your question; the app handles the encoding. Do not paste a Base64 string into the regular chat field. The instructions below are for building or testing a custom-server endpoint.
Base64 turns the bytes of an image file into text that can be included in JSON. It is not an image URL or a file path.
{
"message": "What is in this image?",
"imageBase64": "REPLACE_WITH_FULL_BASE64",
"mimeType": "image/jpeg"
}REPLACE_WITH_FULL_BASE64 is a placeholder. Replace it with the image’s complete Base64 data before sending; do not send the placeholder itself.
These commands read a local image and print its encoding; they do not upload the file. Replace the path with your image’s path, then put the output in imageBase64.
base64 -i "/path/to/photo.jpg" | tr -d '\r\n'[Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\photo.jpg"))The Ollama gateway below uses qwen2.5 as a text-model example. To test images, select an installed model that supports image input. Ollama image input documentation ↗
Base64 is not encryption. Use HTTPS, and encode private images locally instead of uploading them to an untrusted conversion website.
curl -X POST "https://your-domain.example/watch-ai" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"message": "Reply with the word ready.",
"imageBase64": null,
"mimeType": null
}'
{ "reply": "ready" }
import express from "express";
const app = express();
app.use(express.json({ limit: "20mb" }));
app.post("/watch-ai", async (request, response) => {
const { message, imageBase64, mimeType } = request.body ?? {};
if (typeof message !== "string" || !message.trim()) {
return response.status(400).json({ error: "message is required" });
}
const userMessage = { role: "user", content: message };
if (imageBase64 && mimeType?.startsWith("image/")) {
userMessage.images = [imageBase64];
}
try {
const ollamaResponse = await fetch("http://127.0.0.1:11434/api/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "qwen2.5",
messages: [userMessage],
stream: false
})
});
if (!ollamaResponse.ok) {
return response.status(502).json({ error: "Model request failed" });
}
const result = await ollamaResponse.json();
const reply = result?.message?.content?.trim();
if (!reply) {
return response.status(502).json({ error: "Model returned no answer" });
}
return response.json({ reply });
} catch {
return response.status(503).json({ error: "Model is unavailable" });
}
});
app.listen(3000, "127.0.0.1");
Include the App version, device, operating system, selected AI route and exact error message. For Mac connections, include whether the service says it is ready. Do not send pairing codes, credentials or private chat content.
[email protected]