Features

Every capability, in one place.

Eight platform features that together make WatchDog Bot the trading bot runtime built for Python developers. Each one is in service of a simple goal: keep your bots alive without you babysitting them.

01

Auto-installing dependencies

02

AI Fix

03

Real-time cloud logs

04

Built-in Python SDK

05

Multi-exchange connections

06

Per-bot isolated venvs

07

Demo mode

08

Friendly errors

01 · Reliability

Auto-installing dependencies

The single most common reason trading bots fail in production is a missing Python package — usually one you forgot to declare in requirements.txt before deploying. The runtime catches every ModuleNotFoundError, parses the missing module name, runs uv pip install into the bot's isolated venv, and retries automatically. Up to three retries. Persistent across launches.

Result: most users go weeks without ever seeing a dependency error. Read the deep-dive →

[runtime] Starting bot... ModuleNotFoundError: No module named 'ccxt' [runtime] Parsing missing module: ccxt [runtime] $ uv pip install ccxt + ccxt-4.2.5 installed [runtime] Retrying bot... [INFO] Connected to Binance [INFO] Bot started.
02 · Debugging

AI Fix — debugging by clicking a button

When your bot crashes with an unhandled exception, the dashboard shows a Fix with AI button. Clicking it sends your code + the traceback + recent logs to Claude, which proposes a code diff with explanation. Apply the fix with one click.

Approximately 70% success rate on common error classes. Never sees your API keys. Read what gets sent and when to trust the fix →

TypeError: 'NoneType' object is not subscriptable at line 28: ask = market["yes_ask"] [Fix with AI] → + if not market or "yes_ask" not in market: + wd.log.warning("no market data") + time.sleep(30); continue + ask = market["yes_ask"] [Claude] The market response can be None if Kalshi returns an empty payload. Add a guard before accessing the dict.
03 · Visibility

Real-time cloud logs

Every log line your bot prints — whether you used wd.log.info(), print(), or a third-party logger — streams to a cloud dashboard at watchdogbot.cloud/dashboard in real time. Filter by level, search by text, see what your bot is doing from any device.

No more SSH-ing into a VPS at 3 AM to tail a log file.

14:32:01 [INFO] YES ask = 47 14:32:31 [INFO] YES ask = 45 14:33:01 [INFO] YES ask = 42 14:33:31 [INFO] YES ask = 38 14:33:31 [INFO] → BUY signal 14:33:32 [INFO] Bought 1 YES @ 38 14:34:01 [INFO] YES ask = 41 14:34:31 [WARNING] rate limit at 87%
04 · Developer experience

Built-in Python SDK

Every bot can import wd with zero setup — pure stdlib, no pip install, auto-injected into sys.path at runtime. The SDK gives you structured logging, encrypted credential access by name, persistent state directories, and runtime introspection.

Full SDK reference →

import wd conn = wd.connection("Binance") wd.log.info("Bot %s starting", wd.bot_name()) # persistent per-bot state directory state = wd.bot_dir() / "state.json" # gate destructive actions in test mode if wd.is_demo(): wd.log.info("DEMO — no real orders")
05 · Coverage

Multi-exchange connections

First-class support for Kalshi, Binance, Coinbase, Kraken, and Bybit. Crypto exchanges use CCXT (40+ venues total). Plus custom HTTP connections for anything else — sportsbook APIs, alternative data, in-house systems.

Every connection is encrypted, named, and accessed the same way: wd.connection("ExchangeName"). Setup guide →

# Crypto via CCXT binance = wd.connection("Binance") coinbase = wd.connection("Coinbase") kraken = wd.connection("Kraken") # Prediction markets — built in kalshi = wd.connection("Kalshi") # Anything else — custom HTTP news = wd.connection("NewsAPI") poly = wd.connection("Polymarket")
06 · Architecture

Per-bot isolated venvs

Each bot gets its own Python virtual environment, managed by uv. Different bots can use different versions of ccxt, pandas, or anything else without conflict. A malicious or buggy package in one bot can't corrupt the others or escape into the host shell.

Bot venvs are created lazily on first run, persist across restarts, and reset cleanly if you delete the bot.

# Each bot gets its own venv: ~/.wdb/bots/ ├── 7f3a-c8b1/ # Kalshi MM │ └── .venv/ │ └── ccxt-4.0.0/ ├── 2c91-a4d2/ # Binance momentum │ └── .venv/ │ └── ccxt-4.2.5/ └── f6e0-1b7c/ # News classifier └── .venv/ └── anthropic-0.31.0/
07 · Safety

Demo mode

Every bot runs in demo mode by default until you flip the switch. Demo mode fetches live market data and runs your strategy logic normally — but skips actual order placement, letting you verify behavior end-to-end without risking capital.

Use wd.is_demo() to gate destructive actions in code. Flip a single toggle in Settings to go live.

while True: market = client.get_market(ticker) if should_buy(market): if wd.is_demo(): wd.log.info("[DEMO] would buy at %d", ask) else: client.place_order(...) wd.log.info("BOUGHT 1 @ %d", ask) time.sleep(30)
08 · Developer experience

Friendly errors

Raw Python tracebacks are 200 lines of internal frames you don't care about. WatchDog Bot's runtime extracts the user-frame line + column, shows the actual error, and attaches a hint when the error is a known pattern (pandas SettingWithCopyWarning, ccxt InvalidNonce, requests Timeout, and ~40 others).

Most errors point you straight to the bad line of your code, with a one-sentence explanation of what to fix.

[ERROR] line 14, col 22 ask = market["yes_ask"] ^^^^^^^^^ KeyError: 'yes_ask' → Hint: Kalshi markets sometimes return a payload without yes_ask when the market is halted. Use market.get("yes_ask") or check market["status"] first.

Pick a feature. Try it free.

14-day free trial, no credit card. Your first bot up and running in 5 minutes.

Start Free Trial →