Skip to main content

WatcheRobot Python SDK

Build, run, and distribute applications for WatcheRobot.

This package has two complementary roles:

  • Application SDK — the public Python API for building robot experiences.
  • Runtime/Daemon — the single local runtime that pairs with the robot, owns its device connection, and manages Application processes.

Your Application focuses on product behavior; the Runtime handles pairing, connections, lifecycle, logs, and transport. Watcher Desktop uses this same Runtime/Daemon implementation—it does not embed another Daemon. In other words, desktop uses this same Runtime/Daemon implementation rather than a separate copy.

What can I build?

Use the SDK to create a managed Application that can:

  • control behaviors, animations, motion, lights, expressions, works, and audio;
  • capture camera images, inspect the active vision backend and model, record microphone PCM, and consume face-tracking previews;
  • receive touch and roller input events;
  • exchange optional business messages with Watcher Desktop;
  • be launched locally with the CLI or installed and launched by Watcher Desktop after Marketplace review.

The SDK also provides Bluetooth Wi-Fi provisioning, Application project scaffolding and validation, Marketplace publishing tools, and Runtime control APIs for products that integrate with WatcheRobot.

Architecture at a glance

Your Application
  └─ ApplicationContext / ApplicationChannels
       └─ WatcheRobot Runtime (Daemon)
            ├─ pairing, device connection, logs, process lifecycle
            ├─ Desktop channel ─────────────── Watcher Desktop
            └─ Device channel ──────────────── WatcheRobot device

An Application never opens its own discovery socket or device WebSocket, and never receives pairing credentials. When an Application is running, Desktop and device business frames pass through that Application. Without one, the Runtime transparently forwards frames between Desktop and device.

Running in the official Workspace

Use yarn desktop:dev at the WatcheRobot-Workspace root for full source integration. The root command installs the current SDK checkout into a workspace-managed virtual environment, treats it as the only Daemon source, and verifies runtime imports before Desktop starts. It does not consume a Conda interpreter, system SDK, or packaged Runtime inherited from the caller.

This repository owns the Application API, Daemon, Runtime control plane, and distribution tooling. It does not own Desktop UI or packaging orchestration, and it does not implement the official default Application's ASR/LLM/TTS business logic.

Modules

Area Main entry points What it is for
Application development watcherobot.application.ApplicationContext The normal starting point for a managed Application. Provides app.robot, app.desktop, and app.logger.
Robot capabilities app.robot High-level domains for behavior, animation, motion, audio, lights, expressions, works, microphone, camera, vision diagnostics, face tracking, and input.
Advanced integration ApplicationChannels Source-aware raw Desktop and Device channels for Applications that own a complete business protocol.
Runtime and Daemon watcherobot daemon ... Pairing, device and Desktop connections, generic frame routing, Application lifecycle, logs, and local control REST API.
Robot onboarding watcherobot robot ... Guided first-time Wi-Fi setup, six-digit-code pairing, and connection status.
Application distribution watcherobot app ... Create, check, publish, submit, browse, download, install, and run reviewed Application snapshots.
Advanced Bluetooth provisioning watcherobot bluetooth ... / BluetoothProvisioner Low-level scanning, Wi-Fi credential management, and diagnostics over the existing BLE GATT service.
Device maintenance Daemon maintenance REST API Desktop-facing firmware, SD-resource, and portable-work maintenance; see resources.

Quick start

1. Install the SDK

Use a dedicated Conda environment instead of base. The SDK supports Python 3.10–3.12; Python 3.11 is recommended:

conda create -n watcherobot python=3.11 -y
conda activate watcherobot
python -m pip install --upgrade pip
python -m pip install watcherobot

The current stable release is watcherobot 0.1.1. For a reproducible installation, pin it explicitly with python -m pip install "watcherobot==0.1.1". The unpinned command above is the normal path for receiving the latest stable release from PyPI.

To test an unpublished PR or commit, create a separate watcherobot-source environment and run python -m pip install -e . from the selected checkout. Install .[test] only when contributing to the SDK.

See the installation guide for both complete paths, TestPyPI dependency resolution, and command ownership checks. Do not use the PyPI command to validate unpublished source.

Maintainers should follow the SDK release process, including immutable artifacts, TestPyPI verification, PyPI Trusted Publishing, and the protected production approval.

Verify the installed command when needed:

watcherobot --version

2. Set up your first robot

Run the guided setup:

watcherobot robot setup

The command first asks you to turn on computer Bluetooth and open Settings > Wi-Fi on the robot. Scanning starts only after you confirm that the page is open. Results are identified by the stable Device ID shown on the robot; when several robots are nearby, use Up/Down and Enter to select the intended Device ID. Older firmware that does not advertise a Device ID is explicitly marked as unavailable and shows its Bluetooth ID only as a compatibility fallback. The command then reads the Wi-Fi password privately and provisions the network.

To finish setup, return to the robot launcher, open the "Python SDK" app, read the six-digit pairing code at the top of the screen, and enter it in the same robot setup flow. Pairing belongs to one-time setup, while app run only starts an Application. Confirm the connection at any time with:

watcherobot robot status

If the robot is already on the same Wi-Fi, do not reset its network. Open the "Python SDK" app and pair it directly:

watcherobot robot pair 123456

Replace 123456 with the current code shown by the robot.

3. Create and run your first Application

watcherobot app init hello_robot
cd hello_robot
watcherobot app run

The generated Hello World Application always logs a successful greeting. If a compatible robot is connected, it also plays the happy behavior once. If no robot is connected, app run explains how to start watcherobot robot setup and continues in offline mode. The Runtime remains the only owner of pairing and the device connection.

The local control API also exposes GET /daemon/logs; see the Runtime contract for product integration and diagnostics.

4. Write an Application

import asyncio

from watcherobot.application import ApplicationContext


async def main() -> None:
    async with ApplicationContext.from_environment() as app:
        job = await asyncio.to_thread(app.robot.behavior.play, "happy")
        await asyncio.to_thread(job.wait, 20.0)


asyncio.run(main())

The initializer generated this same pattern in hello_robot/app.py. Metadata flags remain available when you are preparing a project for publication:

watcherobot app init my_app --id com.example.my_app --author "Example Team"

Common workflows

Goal Start here
Learn from working code Application examples
Build and test an Application end to end SDK Application guide
Look up every SDK command Complete CLI reference
Publish a reviewed Marketplace Application Marketplace documentation and Application distribution reference
Provision Wi-Fi over Bluetooth Bluetooth provisioning
Use camera, vision models, microphone, or face tracking Device vision diagnostics, face-tracking preview, and microphone audio
Select a device behavior state ESP32-S3 v0.3.4 state catalog
Work with official resources or Creator works Resource and work guide
Diagnose pairing, connection, or runtime problems Troubleshooting and Runtime contract

Useful commands

# Runtime lifecycle
watcherobot daemon start
watcherobot daemon status
watcherobot daemon stop

# First-time robot setup and connection
watcherobot robot setup
watcherobot robot status
watcherobot robot pair 123456

# Application development and distribution
watcherobot app init my_app
cd my_app
watcherobot app run
watcherobot app check .
watcherobot app login
watcherobot app publish .
watcherobot app submit .
watcherobot app marketplace
watcherobot app install <app-id>
watcherobot app list
watcherobot app uninstall <app-id>

# Advanced Bluetooth Wi-Fi diagnostics
watcherobot bluetooth scan
watcherobot bluetooth provision --device <id> --ssid MyWiFi
watcherobot bluetooth status --device <id>

See the complete CLI reference for every watcherobot command, its parameters, side effects, and Runtime boundary.

Requirements and support

  • Python 3.10–3.12
  • Windows or macOS for Bluetooth Wi-Fi provisioning
  • A WatcheRobot device for pairing and hardware features

The package is licensed under Apache-2.0.

Metadata

Release files for watcherobot 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for watcherobot 0.1.4
File Size Uploaded
watcherobot-0.1.4.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for watcherobot 0.1.4
File Interpreter ABI Platform
watcherobot-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 1.5 MB

Release files / watcherobot-0.1.4.tar.gz

Download URL watcherobot-0.1.4.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
828966a06df1ae72006a55e096f9507f104e9ffe53b58a37af9b95b5c2ffb3c6
BLAKE2b-256 checksum
How to use checksums
d120fe7d8f228fa947897d3d567efb2356ed306e77dab43974e5038f6cb75989
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / watcherobot-0.1.4-py3-none-any.whl

Download URL watcherobot-0.1.4-py3-none-any.whl
Size 223.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7f521266ad70c0516a6afe0a1a28e73b8ba18924dac41d233806d96b68b91e42
BLAKE2b-256 checksum
How to use checksums
e2c73e10c5e0705718e906bc3c86dde64f69bd08ce1ef0cfb0e6399ceebbc9c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.6

2 release files

0.1.5

2 release files

This release

0.1.4 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page