Features¶
What Wristotle can do, and which half of the app each feature needs.
- Watch — the Pebble watch app (
.pbw) - Companion — the Android companion app (on F-Droid, or sideload the APK)
- Yes in a column = that piece is involved • blank = it isn't
Most voice-driven features need both halves: the watch handles the trigger, dictation pipe, and on-screen feedback; the companion runs the transcription, classifies the intent, and does the work on the phone. A handful run on the watch alone (time, battery, vibrate), and a handful live entirely in the companion (settings, backup, conversation history).
For exact phrasings see Voice commands. For setup see Install.
What runs where (and what doesn't need an LLM)¶
A common assumption is that Wristotle is "an AI voice assistant" — and that every command needs an LLM. It doesn't. Three layers route your speech, only the last one is an LLM:
- Canonical phrasings ("pause", "set a timer for 10 minutes", "call mom") match an on-watch prefix table. No model. Instant.
- Paraphrases of the same intents ("buzz me at 3" instead of "remind me at 3", "ring mom" instead of "call mom") use a small on-device intent classifier — a ~23 MB MiniLM embedding model that runs locally on your phone. No network, no provider key. The model download is optional; without it, the canonical-phrasing layer above still catches the common cases.
- The Ask Agent flow — and only this flow — uses an LLM. It fires when you say "ask agent <…>" (or a custom trigger like "Jarvis"), and — if you opt into a routing mode (Settings → ✨ Ask Agent → Routing) — on unrecognised speech, or on every command with no wake word at all. Strictly optional; you can install Wristotle, never configure an LLM provider, and everything else still works.
So timers, alarms, pause/play/next, calls, texts, reminders, weather, world clock, calculator, notes, tasks, and app launch all work without any cloud LLM. The deterministic + on-device path is the daily driver; the agent path is the extension.
Voice commands¶
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Call a contact | Yes | Yes | Contacts + Phone permissions |
| Send message (SMS / WhatsApp / Telegram / Signal) | Yes | Yes | Contacts + SMS permissions; third-party apps draft only — see Voice commands → Send message |
| Create reminder | Yes | Yes | Watch holds the timeline pin |
Persistent reminder (persistent reminder / nag me / keep reminding me) |
Yes | Yes | Watch pin fires as usual; phone re-fires a notification every N minutes (default 10) until you tap Stop or hit the max-nags limit. Settings → Reminders → Persistent reminders tunes interval (5/10/15/30 min) and max nags (3/5/7/10). See Voice commands → Persistent reminders. |
| List reminders | Yes | Yes | Persistent ones show (persistent) suffix |
| Cancel / reschedule reminder | Yes | Yes | Voice cancel kills the phone-side persistent chain too |
| Calendar read (next meeting, today's events) | Yes | Yes | Calendar permission; uses the intent model |
| Calendar create (schedule a meeting) | Yes | Yes | Same as above |
| Open any app | Yes | Yes | Run AppIndex scan once from Settings |
| Media play / pause / next / previous / seek | Yes | Yes | Notification Access required |
Targeted play <app> / pause <app> |
Yes | Yes | Reliability depends on the target app's media service |
| Notes — create by voice | Yes | Yes | Stored on the phone |
| Notes — append to last note | Yes | Yes | Two append modes: merge audio or keep separate |
| Tasks — add / list / complete / delete | Yes | Yes | Voice CRUD checklist; substring + last-task match for complete/delete |
| Set alarm / cancel alarm | Yes | Yes | "Set an alarm for 7am" creates a row at the default destination (Phone / Watch / Both — set in companion settings). "Cancel the alarm" / "cancel 7am alarm" cancels watch alarms. Phone alarms still have to be dismissed in the system clock. Watch leg via wakeup_service; phone leg via AlarmClock intent. See Alarms (one-shot) below for the full surface. |
| Set timer | Yes | Yes | Fires the phone clock app's AlarmClock.ACTION_SET_TIMER intent; cancel happens in the clock app (no DISMISS_TIMER API exists) |
World clock (what time is it in <place>) |
Yes | Yes | Resolved on the phone from Android's time-zone database; no network — see Voice commands → World clock |
Calculator (what's 15% of 80) |
Yes | Yes | On-device arithmetic (+ − × ÷, % of/off); no network — see Voice commands → Calculator |
Weather (what's the weather / weather in <city>) |
Yes | Yes | First voice command that uses the network. Default backend is open-meteo (free, no key); OpenWeather available with your own free-tier key. Optional Location permission for the bare form. See Voice commands → Weather and Privacy. |
Sports (when do the Warriors play next / did Arsenal win / NBA standings / next F1 race / BBL standings) |
Yes | Yes | Next game / last result / live score / standings across soccer, NBA/NFL/MLB/NHL, Formula 1 (per-session results — practice / qualifying / sprint / race — plus driver/constructor standings), and cricket (IPL, Big Bash League, World Cup). Network-using, like Weather. Save favorite teams, a sport-priority order, and switch off sports you don't follow under Settings → Sports (all ride along in Backup & Restore). Leagues/teams update automatically (and on demand via Settings → Sports → Update sports data) with no app update. See Voice commands → Sports and Privacy. |
Ask Agent (ask agent <question> / ask claude <question>) |
Yes | Yes | Voice-trigger any LLM. Bring-your-own-key: Anthropic (Claude) or OpenAI-compatible (covers OpenAI / OpenRouter / Ollama / llama.cpp / vLLM via one endpoint URL). Off by default — until you paste a key, the intent answers "No agent key set" and nothing leaves the phone. See Voice commands → Ask Agent and Privacy. |
Morning brief (morning brief / what's on my plate today) |
Yes | Yes | One-shot rollup of today's meetings, alarms, reminders, pending tasks, notes, and unread messages. Reads live from your existing repositories + the Notification Access permission. Default snapshot-only (currently-in-tray notifications); opt-in Settings → 🔔 Notifications → Include dismissed notifications also catches notifications you swiped earlier today (companion v1.6.0+). See Voice commands → Morning brief. |
| MCP tool calling (configured under Settings → 🔌 MCP servers) | Yes | Yes | Lets Ask Agent's LLM call tools on HTTP MCP servers you've added (e.g. GitHub). Multi-round agent loop (up to 5 rounds); per-tool status line shows on the watch's hint bar during the loop. Tools list aggregated across every enabled server. |
Home Assistant (hey home assistant <command> / home assistant <command>) |
Yes | Yes | Forwards a spoken command to your self-hosted Home Assistant — HA runs its own NLU (/api/conversation/process) and speaks back the reply. No LLM, no cloud — just your server + a long-lived token (LAN / Tailscale / self-signed http:// all work). Off until you set the URL + token under Settings → 🏠 Home Assistant. Custom wake words supported. See Voice commands → Home Assistant and Privacy. Companion v1.16.0 |
Show saved code (show my qr code / show my <name>) |
Yes | Yes | Renders one of your saved QR/barcodes full-screen on the watch. Matches by name/alias, or by kind (show my qr code / show my barcode); several matches read the names back to pick from. See Voice commands → Saved codes. Companion v1.15.0 + Watch v1.5.0 |
Local watch commands¶
These don't need the companion for the response itself — recognition is a prefix match on a small built-in keyword list.
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Time | Yes | ||
| Battery level | Yes | ||
| Step count | Yes | ||
| Test vibrate | Yes | ||
| Reminder pins firing | Yes | Created via the phone; firing + dismiss is watch-side | |
| Find phone | Yes | Yes | Watch triggers; companion (or PKJS fallback) rings the phone |
On-watch UI¶
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Conversation chat row history | Yes | Yes | Watch shows last few; companion stores full history |
| Notes list view + detail | Yes | Yes | Open via the Quick menu, or bind any chat-surface button to Notes. Watch fetches from companion-stored DB |
| Tasks list + filter chooser (Pending / Completed / All) | Yes | Yes | Default long-press DOWN on the chat screen, or via the Quick menu. SELECT a pending row to mark done |
| Configurable chat-surface shortcuts | Yes | Yes | Bind SELECT, long-press UP, long-press DOWN to Dictation / Quick menu / Notes / Tasks / Alarms. Edit in companion's Watch settings or Pebble gear-icon page |
| Alarms (one-shot) — create / list / cancel | Yes | Yes | Companion's Settings → ⏰ Alarms & Reminders has the editor (time + label + Phone / Watch / Both). Voice "set an alarm for 7am" + "cancel the alarm". Watch leg via wakeup_service; phone leg via AlarmClock intent. Phone alarms can't be cancelled programmatically — dismiss in the system clock |
| Confirm-before-dispatch prompt | Yes | Yes | Companion builds the summary; watch shows the prompt with SELECT / BACK |
| Quick Launch action (dictate / notes / chooser) | Yes | Yes | Watch-side setting; the action itself needs the companion |
| Color theme (icons + menu highlight + chat bubble fill) | Yes | Yes | Off by default. Flip in companion's Settings → 📱 Watch → "Color theme". When on, color-capable watches (Time / Time Steel / Time Round / Time 2 / Emery) get colored row icons, a LightGray menu highlight, yellow chat bubble fills, and an accent progress strip during dictation. Black-and-white watches (Pebble Classic, Pebble 2) stay monochrome regardless |
| Chat surface bubbles | Yes | Each query/response pair sits inside a rounded outline. Always-on; no setting needed | |
| Saved codes — list + full-screen render | Yes | Yes | Menu → Codes (or voice). Lists your saved codes; SELECT one to render it full-screen with its name on top and the backlight forced on, scannable offline. Synced from the companion. Companion v1.15.0 + Watch v1.5.0 |
| Full-screen reply cards | Yes | Yes | Sports, weather, and meeting replies render as a full-screen card — a coloured band for the action (green create, red delete, blue lookup…) and an icon for the feature. Weather shows a rich card (temperature, condition, humidity, wind). Pick which reply types become cards (reminders / tasks / notes / alarms / agent / morning brief / …) under companion's Settings → 📱 Watch → Watch cards; sports, weather, and meetings are on by default. Companion v1.12.0 + Watch v1.3.0 |
Companion-side features¶
These live entirely in the Android app.
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Conversation history view (chat timeline + retention) | Yes | 1 / 10 / 20 / 30 day retention | |
| Notes tab (typed-create + dictate + audio playback per note) | Yes | Same store as on-watch notes; append modes (merge / separate) | |
| Tasks tab (typed composer + completed section + swipe-to-delete) | Yes | Same store as on-watch tasks | |
| Dictation audio replay (last 5) | Yes | microPebble only; opt-in | |
| App aliases (override Whisper mishearings) | Yes | Phrase → package overrides | |
| Contact aliases (override Whisper mishearings) | Yes | Phrase → contact overrides; backup-portable via name+number snapshots | |
| AppIndex (installed-app launcher index) | Yes | One-time scan; re-scan on install / uninstall | |
| Implicit NLU learning (phrases used → seed examples) | Yes | Used by the intent classifier; opt-in | |
| Saved codes (scan / manual entry / edit) | Yes | Manage QR + barcode (Code 128 / EAN-13 / UPC-A) cards; scan with the camera or type one in; name + voice alias each; synced to the watch for offline display | |
| Backup & restore (ZIP, optional AES-256) | Yes | Notes, tasks, conversations, learned phrases, saved codes, app + contact aliases, reminders, settings | |
| Diagnostics export | Yes | One-tap bug report | |
| Watch settings panel | Yes | Toggles round-trip to the watch via settings mirror | |
| Permissions screen + first-run flow | Yes |
Settings sync¶
The watch is the source of truth for runtime settings (logging, dictation confirmation, vibrate, find-phone target, quick-launch action, confirm-before-dispatch + its timeout, …). The companion mirrors them as a remote control.
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Confirm-before-dispatch toggle + timeout + default action | Yes | Yes | Off by default; gates destructive intents |
| Find-phone target (companion / PKJS / auto) | Yes | Yes | |
| Reminders / cancel target (companion / PKJS / auto) | Yes | Yes | |
| Quick Launch (dictate / notes / chooser) + auto-exit | Yes | Yes | |
| Vibrate options (on launch / on quick-launch / respect quiet hours) | Yes | Yes | |
| Skip retry dialog | Yes | Yes |
Settings tab — what's in each category¶
The Settings tab is a drill-down list (since v0.8.0). The landing lists these categories in order; tap one to see its cards. Since v1.21.0 the landing shows only the core categories by default; the optional integrations and diagnostics (Weather, Sport, MCP, Ask Agent, Home Assistant, Speech, Stats, Diagnostics) sit behind a "Show advanced settings" toggle (your choice persists).
| Category | What's in it |
|---|---|
| 🌟 Setup | Guided first-run shortcuts — jumps straight to the actions that unlock the full app (Whisper model download, intent-classifier model, runtime permissions, installed-app scan), each with Open / Skip. A convenience hub, not a settings store. |
| ⌚ Watch | Mirror of the watch's persisted settings — logging, dictation confirmation, vibrate options, find-phone / reminders / cancel target, Quick Launch action + auto-exit, Code display time (how long a voice-recalled code stays on screen; 0 = until Back), chat-surface shortcuts (bind UP/DOWN long-press + SELECT to Menu / Notes / Tasks / Alarms / Codes / Dictation), Confirm before send (toggle + timeout + default action when no response), skip retry dialog. Also Watch cards — pick which reply types show as full-screen cards on the watch (sports / weather / meetings on by default), and Run timers on the watch — count a "set a timer" down natively on the Pebble (buzzes when it’s up even if the app is closed) instead of the phone clock; needs watch v1.8.0. |
| 💬 Conversation | History retention (1 / 10 / 20 / 30 days, default 10) + Clear all. Audio capture toggle + Delete saved audio (microPebble only). |
| 📝 Notes | Keep last N (All / 10 / 25 / 50 / 100). Append-audio mode (Merge / Separate WAV per append). |
| 📋 Tasks | Sync to folder — write your tasks to a folder you pick as a live Markdown checklist (GitHub-style - [ ] / - [x], updated in place), the same mechanism as Notes sync. Format (Markdown / plain / JSON) + one-file-per-task or single-doc + delete behaviour. Works with Obsidian, Dropbox/Drive, git, any plain-text app. |
| 🎟️ Saved codes | Your QR + barcode cards (Code 128 / EAN-13 / UPC-A). Scan with the camera or enter manually; name + optional voice alias each; edit name / alias / contents / format. Synced to the watch for offline display. |
| ⏰ Alarms & Reminders | Default reminder time when none is spoken (5 / 10 / 15 / 30 / 45 / 60 / 90 min, default 30), plus persistent-reminder ("nag me") re-fire interval + max attempts. |
| 📅 Calendar | Pick which calendar/account voice-created events are added to (Automatic uses your primary, or the first writable one). Lists the writable calendars on the device; needs calendar access. |
| 🔔 Notifications | Morning-brief notification sourcing — opt in to Include dismissed notifications so the brief also surfaces ones you swiped earlier today (persisted log, records app id + key + timestamp only, auto-pruned after 7 days) + Clear log. |
| ☁️ Weather | Backend (open-meteo, free/no key; or OpenWeather with your own key) + unit (°C / °F). Key rides in Backup only as an opt-in secret. |
| 🏆 Sports | Favorite teams, sport-priority order, and per-sport on/off toggles across soccer / NBA / NFL / MLB / NHL / F1 / cricket. Update sports data refreshes leagues + teams with no app update. |
| 🧠 Models | Speech provider — local Whisper, an OpenAI-compatible cloud / self-hosted endpoint, or a primary + fallback pair (Local only / Local primary / Cloud primary). Whisper model catalog (tiny / base / small .en and quantized variants) — download, activate, delete, or sideload your own .bin via the Imported models picker. Intent classifier (MiniLM, ~23 MB) — install / activate. |
| 🎓 Learning | Installed-app index (scan + view). App aliases + Contact aliases (override Whisper mishearings). Intent classifier learning toggle + view saved phrases (per-row delete) + Clear learned phrases. |
| 💾 Backup & Restore | Export to ZIP (notes / conversations / learned phrases / reminders / saved codes / app aliases / contact aliases / settings; optionally audio; optional AES-256 password). Restore from ZIP (preview-then-confirm; contact aliases relink to matching contacts on the new device). |
| 🔌 MCP servers | Add HTTP MCP servers (name + URL + optional auth header + transport) for Ask Agent to call as tools. Enable / disable per server; the tool list is aggregated across all enabled ones. |
| ✨ Ask Agent | LLM provider (Anthropic, or any OpenAI-compatible endpoint), API key, model id, system prompt (watch-friendly default, editable), custom trigger words, response timeout. Routing (off / send unrecognised speech to the agent / agent-only with no wake word). Conversation memory (turns to keep, idle-reset timeout, spoken reset words) so follow-ups work. Custom headers for OpenAI-compatible providers (e.g. server-side sessions). Keys + custom headers ride in Backup only as an opt-in secret. |
| 🏠 Home Assistant | Base URL + long-lived access token for your self-hosted HA, plus custom wake words + response timeout. Powers the "hey home assistant …" voice command. Token rides in Backup only as an opt-in secret. |
| 🔊 Speech (Experimental) | On-watch spoken replies. TTS provider (on-device TTS, an HTTP endpoint, or a composite), overall mode, and a per-intent picker for which replies speak (off by default except sports). |
| 📊 Stats | Usage dashboard — six panels summarizing what you've asked and how it was handled, read from the conversation history. |
| 🔧 Diagnostics | Copy diagnostics + open Codeberg issue (bundles device info, app version, permission state, active models, recent conversation rows, last ~200 log lines). |
| ❓ Help | Tips + a searchable feature history (newest first, with the release each shipped in) + links out to these docs. |
| ❤️ Support | Donation links (Buy Me a Coffee + Liberapay). Native buttons, no remote badges. |
The Settings tab badges with a red dot when any category needs attention; a matching dot appears next to the row in the landing so you can see which category to tap into. Currently only Models drives attention (no Whisper model downloaded/active), and only on microPebble — under Core Devices the dot stays clear because Whisper isn't in the path.
Models (optional)¶
Wristotle works on a fresh install without these. They unlock more phrasings and (where applicable) on-device transcription.
| Feature | Watch | Companion | Notes |
|---|---|---|---|
| Whisper transcription | Yes | microPebble only — Core Devices uses its own dictation pipeline | |
| Cloud / self-hosted speech-to-text | Yes | Any OpenAI-compatible /audio/transcriptions endpoint (OpenAI, Groq, Cloudflare Workers AI, self-hosted Speaches / whisper.cpp HTTP server, …). Picks primary + fallback against local Whisper. microPebble only. |
|
| MiniLM intent classifier (paraphrase support) | Yes | ~23 MB; without it, only canonical verb prefixes are recognised |
What "Watch only" means¶
You can install the Pebble watch app without the companion. The watch will:
- Show time, battery, and step count
- Test vibration
- Fire reminder timeline pins that were created earlier
Voice commands that need phone capabilities (call, SMS, app launch, media control, …) all report "No companion connected" or do nothing without the Android app.
What "Companion only" means¶
Settings UI, Backup & Restore, the Permissions screen, the Conversation history view, the Notes tab, the Tasks tab, the App aliases + Contact aliases editors, and the Diagnostics export live entirely in the Android app — they don't surface on the watch at all.
microPebble vs. Core Devices — what differs¶
Wristotle plugs into one of two BLE companion apps. Every command works the same on both — calls, SMS, reminders, calendar, notes, tasks, alarms/timers, app launch, media control. The only difference is the transcription step: who turns your speech into text.
| Capability | microPebble | Core Devices (formerly rePebble) |
|---|---|---|
| All voice commands (call / text / reminders / tasks / notes / alarms / open / play / …) | Yes | Yes |
| On-device Whisper transcription (fully offline, no account) | Yes | — (Core Devices transcribes with its own engine — local / cloud / hybrid, set in its settings) |
| Cloud / self-hosted speech-to-text (any OpenAI-compatible endpoint) | Yes | — (audio never reaches Wristotle on Core Devices — its own pipeline handles the cloud step) |
| Dictation audio replay (save + listen to the last 5 recordings) | Yes | — (audio never reaches Wristotle — only the finished text does) |
| Whisper model download / selection (Settings → Models) | Yes | — (card shows an explanatory banner instead; no model needed) |
| System-wide voice input (experimental) | Yes | — (depends on Whisper being in the path) |
Why: under microPebble, watch audio is piped into Wristotle's own Whisper recogniser on your phone. Under Core Devices, Core Devices runs its own VoiceSession and only hands Wristotle the recognised text over the watch link — the audio never arrives, so anything that depends on Wristotle's Whisper (offline transcription, audio replay, model selection) isn't available. This is a Core Devices design choice Wristotle can't override.
If you see Whisper / audio-capture features greyed out or missing, that's why — you're on Core Devices. Switch your BLE companion to microPebble if you want them. Nothing else changes: the phone-side command handling is identical either way.