Skip to content

Install

Wristotle is two apps + one of two BLE companion apps. The Android companion is on F-Droid; the watch app installs from its Pebble appstore. No Google Play needed.

What you need

  • A Pebble watch with a microphone: basalt, chalk, diorite, emery, flint, or gabbro. (Not aplite — no mic.)
  • An Android phone running Android 7.0 (API 24) or newer.
  • One of these BLE companion apps. This choice changes one thing only: who turns your speech into text. Every Wristotle action — calls, texts, reminders, media control, app launch, find phone — works exactly the same with either one.
    • microPebble — your watch dictation is transcribed by Wristotle, on your phone. By default that means on-device Whisper (no account, no subscription, nothing sent to any server); optionally you can configure an OpenAI-compatible cloud or self-hosted endpoint under Settings → 🧠 Models → Speech provider. Pick this if you want speech-to-text under your control — locally by default, with an optional cloud / self-hosted opt-in.
    • Core Devices (formerly rePebble) — the official companion from the team that revived Pebble. It transcribes your watch dictation with its own engine, which you can set to local, cloud, or hybrid inside Core Devices' settings. A Whisper model you download inside Wristotle is not used for dictation here — Core Devices does that part. Everything Wristotle does after your words are recognised is identical.

What you gain / give up by picking one: the only thing on the table is the transcription step. With microPebble you get Wristotle's private, offline, account-free speech-to-text. With Core Devices you get whatever transcription you've configured in its settings instead. Either way, the recognised command is handed to Wristotle Companion on your phone, which does the actual calling, texting, reminding, media control, and app launching.

You don't have to abandon Core Devices to use Wristotle — keep it and you still get all of Wristotle's phone-side features. The only thing you'd be giving up by staying on Core Devices is Wristotle's own transcription path — Whisper and the optional OpenAI-compatible cloud / self-hosted endpoint setting both rely on the audio reaching Wristotle, which only happens on the microPebble route.


1 · Install the BLE companion

If you don't already have one, install microPebble or Core Devices and pair your watch through it.

Only one

Don't pair more than one companion to the same watch at the same time — they race on the BLE link and dictation gets stuck. Pick one.


2 · Install the watch app

Two ways:

Open the Wristotle listing in whichever appstore matches your BLE companion and install it onto your watch from there. This is the easiest path — your companion handles the install for you.

Same app, same listing ID on both stores — use whichever your companion opens.

Option B — manual .pbw

Grab the latest Wristotle.pbw from Releases and open it with your BLE companion app. The companion will side-install it onto the watch.

.pbw bundles cover every supported platform (basalt / chalk / diorite / emery / flint / gabbro) in one file — the companion picks the right one for your watch.


3 · Install Wristotle Companion (Android)

There's no Google Play listing — by choice, not because it's hard. See Why no Google Play? below for the reasoning and the trust chain on the APK. Three install paths:

Wristotle Companion is on F-Droid. Install it from your F-Droid client (search Wristotle Companion) or from the package page, and it updates alongside the rest of your F-Droid apps. F-Droid rebuilds the app from source on its own servers and the build is reproducible, so the APK is verified to match the published source. It ships with the developer signing key, so you can switch between the F-Droid and Codeberg builds without uninstalling.

Option B — Obtainium (tracks Codeberg releases directly)

Obtainium installs apps straight from their source and checks for new releases automatically. Use this if you want updates the moment they're tagged on Codeberg, ahead of F-Droid's build cycle.

  1. Install Obtainium itself (from its site or F-Droid).
  2. In Obtainium tap Add App and paste the repo URL: https://codeberg.org/wristotle/wristotle-companion (Obtainium recognises Codeberg/Forgejo and tracks its releases.)
  3. Tap Add, then Install the latest release. Obtainium will prompt you to allow installs the first time, and will notify you when a new release ships.

Option C — manual APK

Grab the latest Wristotle-Companion-debug.apk from Releases and sideload it directly.

Sideload how-to

For Obtainium or the manual APK, if your phone hasn't installed apps from outside a store before, you'll need to allow "Install unknown apps" for Obtainium (or the browser/file manager you're opening the APK from). Android prompts you the first time. F-Droid handles this within its own client.


4 · First-run setup

Open Wristotle Companion on your phone.

a. Grant permissions

Tap Grant Permissions on the Permissions tab. You'll walk through three system prompts in order:

  1. Runtime permissions — Contacts, Phone, SMS, Notifications
  2. Battery optimisation exemption — keeps the watch bridge running in the background
  3. Notification Access — required for cross-app media control (play <app>, pause, etc.)

b. Download a Whisper speech model

Open Settings → Models → Speech and tap Download on a model.

Model Size Speed Accuracy When to pick
tiny.en (quantized) ~32 MB Fastest OK for short commands Default — recommended
base.en (quantized) ~57 MB Medium Better for long dictation If you dictate full SMS bodies
small.en ~244 MB Slower Higher Power users

The first model you download is auto-activated. Tap any downloaded model to switch.

c. (Optional) Download the Intent model

Strictly optional — Wristotle is fully functional without the intent model, as long as you start each command with one of the canonical verbs: call, text, remind, cancel, play, pause, next, previous, open, launch. The watch routes these via a built-in prefix table that's always available.

The intent model is a polish layer that adds tolerance for natural paraphrases of the same intents — "ring Mom" instead of "call Mom", "tell Dad I'll be late" instead of "text Dad I'll be late", "buzz me at 3" instead of "remind me at 3". The actions and contacts/slots resolved are identical to the prefix path; only the way you can phrase them changes.

To add it: open Settings → Models → Intent and download MiniLM-L6-v2 (~23 MB).

d. (Optional) Scan installed apps

If you want open <app> and play <app> voice commands to work, open Settings → Learning → Installed apps and tap Scan installed apps. Re-scan whenever you install or uninstall an app.

This makes Wristotle the recognizer that the BLE companion routes dictation to. Without it, your companion app uses its default cloud recognizer.

Run this once from a computer connected to your phone via ADB:

adb shell settings put secure voice_recognition_service \
    com.lazydevs.wristotle/com.lazydevs.wristotle.speech.service.WhisperRecognitionService

The exact command is one tap to copy from Permissions tab → Voice Input → Copy ADB activation command. See the Voice Input section below for the full ADB walkthrough.

f. Try it

Open Wristotle on the watch, press select, dictate "call mom" (or whoever is in your contacts).


Using Wristotle as system-wide voice input (optional, experimental)

Wristotle ships an android.speech.RecognitionService implementation backed by whichever Speech provider mode you've chosen (on-device Whisper by default, or an OpenAI-compatible cloud / self-hosted endpoint if you've configured one). The setup below registers it as Android's default speech recognition service — in principle any app that calls android.speech.SpeechRecognizer would then transcribe through Wristotle. In practice we haven't verified which third-party apps actually use that API (many keyboards and assistants bundle their own engine), so treat this section as experimental.

The activation requires WRITE_SECURE_SETTINGS, a signature-level permission only granted to the shell user — so the command must run from a computer with ADB.

brew install --cask android-platform-tools
# Debian/Ubuntu
sudo apt install android-tools-adb

Download Android SDK Platform Tools, unzip, add the folder to PATH.

Verify with adb version — should print a version string.

Enable USB debugging on the phone

  1. Settings → About phone → Build number — tap 7 times to unlock Developer Options.
  2. Settings → System → Developer options → USB debugging — toggle on.
  3. Connect via USB and tap Allow on the phone when prompted.
  4. Confirm with adb devices — should list your device as device (not unauthorized).

Run the activation command

Tap Copy ADB activation command in Wristotle's Voice Input card, then paste in a terminal:

adb shell settings put secure voice_recognition_service \
    com.lazydevs.wristotle/com.lazydevs.wristotle.speech.service.WhisperRecognitionService

No output on success. Reopen Wristotle — the Voice Input card should now read "Active — Wristotle is the system voice input provider".

Verify:

adb shell settings get secure voice_recognition_service

Should print the long form: com.lazydevs.wristotle/com.lazydevs.wristotle.speech.service.WhisperRecognitionService.

One-time

The setting persists across reboots and Wristotle updates. You only need to repeat this if you intentionally change the voice provider, uninstall Wristotle, or factory reset.

Wireless ADB (Android 11+)

If you'd rather not keep a USB cable around:

  1. Settings → System → Developer options → Wireless debugging → Pair device with pairing code. Note the IP:port + 6-digit code.
  2. adb pair <ip>:<port> — enter the code when prompted.
  3. adb connect <ip>:<port> (use the port shown on the Wireless debugging screen, not the pairing port).
  4. Run the activation command as above.

Reverting

Switch back to Google's recognizer:

adb shell settings put secure voice_recognition_service \
    com.google.android.tts/com.google.android.apps.speech.tts.googletts.service.GoogleTTSRecognitionService

Or clear it entirely:

adb shell settings delete secure voice_recognition_service

Why no Google Play?

It's possible — Wristotle could ship on Play Store. It deliberately doesn't, and here's the reasoning.

The principled bit

As an open-source project, Wristotle is supporting Keep Android Open — a community effort to keep Android welcoming to apps from many sources, not just the Play Store. Hosting Wristotle on Codeberg is a small way to back that, and a chance to show open-source apps can be safe and straightforward to install outside of it.

A practical note that's worth being explicit about: the "advanced flow" that keeps sideloading possible under the verification rollout isn't part of the Android Open Source Project — it lives in Google's proprietary Play Protect / services layer, which Google controls unilaterally. Today's policy ("ADB exempt, advanced flow stays open, anonymous verification") is a policy choice, not a structural guarantee. Same code path Play Store policies have ratcheted along for the last decade.

If the argument resonates, signing the open letter and pushing back on the developer-verification rollout helps every open-source Android app in this space, not just this one.

The practical bit — "I don't trust random APKs"

Fair concern. Here's the trust chain on the Codeberg release:

  • Source is AGPLv3-licensed and public on Codeberg for both the companion and the watch app. Anyone can read or build it.
  • The .apk is CI-built by Codeberg Actions from that public source — not built on a developer laptop. The build pipeline is auditable end-to-end.
  • All releases are signed with the same key. Android refuses to install an update signed with a different key, so a hijacked release would visibly fail to upgrade rather than silently take over.

For auto-updates without the Play Store dependency, Obtainium subscribes directly to the Codeberg releases feed and handles updates from there — see Install Wristotle Companion → Option A above.