Monitor A-shares, Hong Kong, and U.S. stocks, manage your portfolios, and research ideas with TradingAgents. Self-host PanWatch with your preferred OpenAI-compatible provider or local models through Ollama.
Feature overview · Core features · Quick start · Reference · Support · Contributing
🧠 Start from a portfolio holding → let a nine-agent TradingAgents research team analyze it → follow the bull/bear debate and risk review → receive a PM decision memo and the complete reasoning trail in your messaging app within 3–5 minutes.
The screenshots below use the English interface; Simplified Chinese is available throughout the same product surfaces.
Mobile screenshots
📱 PanWatch is an installable PWA and can be added to your mobile home screen like a native app.
💡 If PanWatch is useful to you, please consider giving the project a ⭐ Star. It is the best way to support the project and help more people discover it.
| Capability | What you can do |
|---|---|
| Portfolio | Manage multiple brokerage accounts, track holdings and P&L, and set trading styles. |
| AI research | Follow technical, sentiment, news, and fundamentals analysis through debate, risk review, and a portfolio-manager decision. |
| Scheduled agents | Run pre-market, intraday, and closing workflows on eligible exchange trading days using your configured schedules. |
| Price alerts | Combine conditions with AND/OR logic and configure cooldowns, daily limits, expiration, and notification channels. |
| Opportunities | Review ranked candidates with entry levels, targets, and risk context. |
| Paper trading | Simulate signal-based entries and exits, then track equity and performance. |
| Notifications | Deliver reports and alerts through Telegram, WeCom, DingTalk, Feishu, Bark, or webhooks. |
| Mobile | Install the PWA on your home screen and use the same workspace on your phone. |
docker run -d \
--name panwatch \
--restart unless-stopped \
-p 8000:8000 \
-v panwatch_data:/app/data \
sunxiao0721/panwatch:latestOpen http://localhost:8000 and create your login credentials.
Initial setup
- Open the web interface and create your login credentials.
- Go to Settings → AI Services and configure an OpenAI-compatible API, such as OpenAI, Zhipu AI, DeepSeek, or Ollama.
- Go to Settings → Notification Channels and add Telegram or another delivery channel.
- Go to Portfolio → Add Stock, add a symbol to your watchlist, and enable the relevant agents.
Docker Compose
services:
panwatch:
image: sunxiao0721/panwatch:latest
container_name: panwatch
ports:
- "8000:8000"
volumes:
- panwatch_data:/app/data
restart: unless-stopped
volumes:
panwatch_data:docker compose up -dFirst startup and browser installation
The image includes Playwright's system dependencies. Chromium's headless shell for screenshots is downloaded on first startup into the mounted volume (default /app/data/playwright), which requires network access and can take a few minutes.
If you do not need browser features such as screenshots, set PLAYWRIGHT_SKIP_BROWSER_INSTALL=1 to skip this installation.
Scheduled agents and deep analysis
| Agent | Purpose |
|---|---|
| Pre-market outlook | Combine overnight moves, news, and technical structure into a plan. |
| Intraday monitor | Watch unusual moves and technical signals during open sessions. |
| Daily report | Review the session and prepare the next trading day's plan. |
Schedules are configurable. Automatic runs filter exchange holidays before collection and analysis; intraday workflows also require an open trading session.
Select the brain icon beside a holding to start TradingAgents deep analysis. Four analyst roles feed a bull/bear debate, risk review, and portfolio-manager decision, with the reasoning trail available in the app and through configured notification channels. Runtime and cost depend on the selected models and configuration.
Market calendars and scheduling
- Select the market status strip to compare all three exchanges across the next 14 dates. Opening/session times use your browser timezone; trade dates and status use each exchange's local date.
- A non-trading day shows closed; a completed trading day shows market closed. Beijing Saturday morning may still be New York Friday after close.
- Published 2026 closures and half-days are bundled locally. Startup warms only the previous 30 and next 90 days, without downloading full history. Unpublished weekdays show a pending calendar and block automatic execution; the bundled annual data must be updated for the next year.
- Agent Cron/interval settings remain unchanged; execution and schedule previews share calendar filters. Price alerts in “all day” mode still require a trading day.
- Paper fills require an open session for that stock's market. Paper notifications follow each exchange's local clock, including half-days and U.S. daylight-saving changes.
Professional technical analysis
- Trend indicators: moving-average alignment, MACD crosses, and Bollinger Band breakouts.
- Momentum indicators: RSI overbought/oversold conditions and KDJ saturation or divergence.
- Price and volume: volume-ratio anomalies, low-volume pullbacks, and high-volume breakouts.
- Pattern recognition: hammer, engulfing, doji, and other candlestick patterns.
- Support and resistance: automatic calculation of multiple support and resistance levels.
Price alerts
- Combine price, percentage change, turnover, volume ratio, and other conditions with AND/OR logic.
- Limit rules to market hours or keep them active all day on trading days; configure cooldowns, daily trigger limits, and repeat behavior.
- Set an expiration date and
HH:mmtime in the rule dialog, or leave it empty so the rule never expires. - Choose notification channels per rule, or use the system default when none is selected.
Environment variables
| Variable | Description | Default |
|---|---|---|
AUTH_USERNAME |
Preconfigured login username | Set on first visit |
AUTH_PASSWORD |
Preconfigured login password | Set on first visit |
JWT_SECRET |
Secret used to sign JWTs | Generated automatically |
DATA_DIR |
Data storage directory | ./data |
TZ |
Application timezone for Agent schedules; market-calendar times follow the browser timezone | Asia/Shanghai |
PLAYWRIGHT_SKIP_BROWSER_INSTALL |
Skip the initial Chromium installation when browser features are not required | Not set |
LOG_LEVEL |
Console log level. INFO prints business events and errors; use DEBUG for scheduler heartbeats, collection steps, and other diagnostics. The UI log panel always retains the complete log. |
INFO |
HTTP_PROXY / HTTPS_PROXY / http_proxy |
Outbound HTTP proxy. Configure it through an external environment variable, http_proxy=http://host:port in .env, or Settings → Global HTTP Proxy. Priority: external environment variables > UI > .env. NO_PROXY includes localhost,127.0.0.1 by default. |
Not set |
OTEL_EXPORTER_OTLP_ENDPOINT |
OpenTelemetry OTLP endpoint, such as http://jaeger:4318. Export remains completely disabled when this is empty. The optional dependencies in requirements-otel.txt are also required. |
Not set (disabled) |
Local development
Requirements: Python 3.10+ / Node.js 24.14.0 / pnpm 9.15.9
# One-command development setup (recommended)
make dev-api # Backend with automatic venv/dependencies on :8000
make dev-web # Frontend with automatic pnpm install on :5183
# Or start each service manually
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python server.py # Backend on :8000
cd frontend && pnpm install && pnpm dev # Frontend on :5183The frontend development server runs at http://localhost:5183 and proxies /api to 127.0.0.1:8000.
Technology stack
Backend: FastAPI / SQLAlchemy / APScheduler / OpenAI SDK
Frontend: React 18 / TypeScript / Tailwind CSS / shadcn/ui
OpenTelemetry export (optional and disabled by default)
PanWatch includes a built-in observability stack with structured logs, end-to-end trace_id correlation, the agent_runs table, and node-level TradingAgents progress and cost reporting. It works without any external service.
You can optionally add standard OpenTelemetry export and send traces to Jaeger, Tempo, Langfuse, or another compatible APM. PanWatch maps three types of spans:
- One agent run → a root span correlated with the
trace_idfromagent_runs. - One LLM call → a
gen_aichild span following the OpenTelemetry GenAI semantic conventions, includinggen_ai.system,gen_ai.request.model, input/output token usage, andgen_ai.operation.name. - One TradingAgents node → a child span that reuses the node-level progress callback.
Export is a complete no-op when the optional dependencies are not installed and no endpoint is configured.
Enable it in three steps:
# 1. Install the optional dependencies
pip install -r requirements-otel.txt
# 2. Configure your collector or APM endpoint
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
export OTEL_SERVICE_NAME=panwatch # Optional; defaults to panwatch
# 3. Start PanWatch normally. The startup log will confirm that OTel export is enabled.
python server.pyRun a local Jaeger instance to verify the integration:
docker run -d --name jaeger -p 16686:16686 -p 4318:4318 \
jaegertracing/all-in-one:latest
# Trigger an agent, open http://localhost:16686, and select service=panwatch.Langfuse and Tempo work the same way: point OTEL_EXPORTER_OTLP_ENDPOINT to their OTLP endpoint.
Publishing Docker images
The repository includes a GitHub Actions release workflow:
- Pushing a tag such as
0.2.3automatically builds and publishes:sunxiao0721/panwatch:0.2.3sunxiao0721/panwatch:latest
- The workflow can also be started manually with
workflow_dispatchand an explicit version.
Configure these repository secrets before publishing:
DOCKERHUB_USERNAMEDOCKERHUB_TOKEN
For sponsorship or partnership inquiries, contact sunxiaoyes@outlook.com.
PanWatch is free and open source. If it saves you time or improves your workflow, you can support continued development:
Issues and pull requests are welcome. See the contribution guide for setup, validation, internationalization, custom agents, and market-data sources.
Community chat (Telegram): t.me/panwatch











