GuruWatcher Setup

Setup guide

The complete GuruWatcher reference — open the Control Panel, connect Discord, wire email, and keep checking. Alert-only — no orders. Just starting? Use the short Getting started checklist; this page has every detail, including advanced CLI, Docker, and MCP options.
Buyers only — this guide assumes you have downloaded the app after purchase (or have the private GitHub repo on request). Buy GuruWatcher — $99, then use the download button on the thank-you page. Questions? See the FAQ.

Buy GuruWatcher — $99 Short checklist

This is / isn’t

This isThis isn’t
Watches prices your newsletter prints and pings your DiscordA trading bot or broker — it never buys or sells
Your sources and your own Discord webhookA Macro Charts reseller or bundled newsletter feed
Reads email or files you drop in (RSS/Telegram: advanced CLI)Auto-alerting from charts that have no numbers
Runs on your computer — your data stays localA hosted cloud dashboard

Use only content you have the right to use. Do not redistribute paid newsletter text. GuruWatcher arms concrete prices printed in the issue’s text. If a letter names a 200-day MA without a number, it may resolve that MA from the market — it does not invent a random level. Alerts are not trade instructions.

First hour — Control Panel (no terminal needed)

The Control Panel is a small local page that runs on this computer only. Dry-run is safe — nothing is sent to Discord until you go live. The packaged Mac/Windows app needs no Python install — Python is only needed for the source-zip path (macOS has python3 built in; Windows: install Python 3.10+ from python.org).

In one sentence: your newsletter arrives in email → GuruWatcher reads the prices → Discord pings when a level is hit. It never places trades.

Two safe modes, one difference: Run once (safe) = one price check right now, does not post to Discord. Quiet = Keep checking on a timer, still does not post until you choose Live with a saved webhook.

  1. Open the Control Panel (this is the app)

    Packaged app (no Python needed): macOS — open the DMG, drag GuruWatcher to Applications, and launch it (notarized Developer ID; if Mac still blocks it: right-click → Open) · Windows — unzip the download and run GuruWatcher.exe (Authenticode-signed via Azure Artifact Signing; SmartScreen may still warn once for a new publisher — if so: More info → Run anyway).

    First time on Windows? The Keep → Unblock → Run anyway prompts are normal: Windows first run, step by step.

    Source zip: unzip the download. Double-click: macOS scripts/Open-GuruWatcher.command (if Mac says it can’t open: right-click → Open → Open) · Windows scripts/Open-GuruWatcher.bat.

    First run may take a few minutes. Your browser opens a local page (usually http://127.0.0.1:8788/). Packaged app: a tray icon keeps it running — reopen the panel or quit from the tray. Source launcher: leave the black terminal window open — that is the engine. Closing it turns the panel off.

  2. Tell it which Discord channel to buzz (optional for practice)

    In Discord: open your channel → gear (Edit channel) → IntegrationsWebhooks → New webhook → Copy URL. In the panel: paste under Discord alert link (your Discord webhook URL) → SaveSend test ping. You should see a short test message. Skip this step if you only want to practice with no Discord yet.

    Step-by-step: Connect a Discord webhook.

  3. Connect your newsletter email (so you don’t paste every issue)

    What it does / doesn’t do: each check only pulls new or unread mail in one folder — not your whole inbox history. Use a dedicated mailbox or a Gmail filter into one label/folder — not your everyday personal inbox.

    In the panel → Newsletter email inbox: click Use Gmail, enter that mailbox’s address, paste an App password (Google Account → Security → App passwords), set the folder, and Save. Don’t want email yet? Open One-time pasteLoad sampleRun once (safe) just to see it work.

    Step-by-step: Connect your newsletter email.

  4. Turn on Keep checking

    Scroll to Keep checking. Defaults are fine: prices ~5 min, email ~15 min (separate timers). Start with Quiet if you want no Discord posts yet. Click Start checking. Your computer must stay awake.

    When you’re happy: choose Live (needs the webhook) → Start again. Discord only fires when a price level is actually hit — not for every email.

That’s the whole first hour. Power users can use the command line, Docker, YAML tuning, or MCP (below).

Advanced — CLI, Docker, scheduling, YAML

Power users: install the CLI, run the spine, Docker, scheduling

Install the CLI

After purchase, download the source zip (GuruWatcher-v0.1.8.zip — “Source (zip)” on the thank-you page; the DMG/Windows apps don’t need this) and unzip it. It contains release v0.1.8. No download yet? See how access works.

unzip GuruWatcher-v0.1.8.zip
cd GuruWatcher-v0.1.8

Have the private GitHub repo instead (requested via support@guruwatcher.com)? git clone --branch v0.1.8 --depth 1 https://github.com/cemini23/GuruWatcher then cd GuruWatcher works the same.

macOS / Linux

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Or: pip install -e .

Windows (PowerShell)

py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
# If Activate.ps1 is blocked:
#   Set-ExecutionPolicy -Scope Process Bypass

Init portable data dir

python3 -m guru_watcher init --wizard --data-dir ./gw-data   # interactive; --wizard --yes = headless
export GURU_WATCHER_DATA="$(pwd)/gw-data"
python3 -m guru_watcher status

Windows: python -m guru_watcher init --wizard --data-dir .\gw-data then $env:GURU_WATCHER_DATA = "$(Get-Location)\gw-data". Creates config.yaml, .env.example, sources/, inbox/, state/. status shows data dir + config, webhook yes/no only (never the URL), watch counts, ingest age, and dry-run-safe / live-ready mode.

Set webhook (or stay dry-run)

cp "$GURU_WATCHER_DATA/.env.example" "$GURU_WATCHER_DATA/.env"
# Edit .env — only when you want live Discord:
# GURU_WATCHER_DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...

CLI reads the webhook from $GURU_WATCHER_DATA/.env. Or: bash scripts/setup_discord_webhook.sh 'https://…'. Never commit .env.

Add / edit a source

Edit gw-data/config.yaml or gw-data/sources/example.yaml for symbols and bands you have rights to use.

Ingest + dry-run check

mkdir -p "$GURU_WATCHER_DATA/drop"
# Drop a .md/.txt issue you own rights to into drop/
python3 -m guru_watcher ingest-run --adapter file_drop --data-dir "$GURU_WATCHER_DATA" --path drop --once
python3 -m guru_watcher ingest-issue --inbox "$GURU_WATCHER_DATA/inbox" --guru example --dry-run
python3 -m guru_watcher check --dry-run

First-hour host smoke (no webhook / Docker / network): bash scripts/smoke_host_oneshot.sh (Windows: smoke_host_oneshot.ps1).
Cold-user demo pack (synthetic sample, proves ≥1 armed watch): bash demos/first-hour/run.sh (Windows: demos\first-hour\run.ps1).

Docker — one-command pipeline

export GURU_WATCHER_HOST_DATA="$(pwd)/gw-data"
export GURU_WATCHER_MODE=dry-run
docker compose up --build

Default loop-pipeline: ingest → reconcile → check. One-shot: docker compose run --rm guruwatcher pipeline. Live: GURU_WATCHER_MODE=live + webhook (fail closed). Prebuilt: ghcr.io/cemini23/guruwatcher:v0.1.8 (or :latest).

Non-Docker loop — serve

python3 -m guru_watcher serve --data-dir "$GURU_WATCHER_DATA" --interval 900
python3 -m guru_watcher serve --once --data-dir "$GURU_WATCHER_DATA"   # single pass

Runs ingest → reconcile → check on an interval. Dry-run default; --mode live requires a webhook and fails closed.

MCP — drive GuruWatcher from Claude / Cursor

Optional — skip unless you use Claude Desktop or Cursor. Packaged-app buyers do not need this. Guide: Optional: Claude / Cursor (MCP).

Stdio MCP server so Claude Desktop / Cursor can check status, list watches, manage the drop folder, run the spine once, start/stop continuous checking, and set/clear the webhook. It never echoes the full webhook URL. Install the optional extra:

pip install -e '.[mcp]'          # from a checkout
# or:  pip install 'guru-watcher[mcp]'

Point the client at it with stdio (e.g. Claude Desktop’s ~/.claude.json):

{
  "mcpServers": {
    "guru-watcher": {
      "command": "python3",
      "args": ["-m", "guru_watcher", "mcp"],
      "env": { "GURU_WATCHER_DATA": "/absolute/path/to/gw-data" }
    }
  }
}

Tools: status, watches_list, drop_list, drop_put, drop_delete, run_once, serve_status, serve_start, serve_stop, webhook_status, webhook_set, webhook_clear. Without the extra installed, python3 -m guru_watcher mcp prints a clear “pip install 'guru-watcher[mcp]'” message instead of crashing.

Scheduling

ingest-run is a single pass — schedule it yourself. Docker loop-pipeline covers the full spine on an interval, and serve does the same without Docker.

Non-Docker loop — serve

python3 -m guru_watcher serve --data-dir "$GURU_WATCHER_DATA" --interval 900
python3 -m guru_watcher serve --once --data-dir "$GURU_WATCHER_DATA"   # single pass

Runs ingest → reconcile → check on an interval. Dry-run default; --mode live requires a webhook and fails closed.

Linux / macOS cron

*/15 * * * * cd /path/to/GuruWatcher && GURU_WATCHER_DATA="$HOME/gw-data" .venv/bin/python -m guru_watcher ingest-run --adapter file_drop --data-dir "$HOME/gw-data" --path drop --once
*/5  * * * * cd /path/to/GuruWatcher && GURU_WATCHER_DATA="$HOME/gw-data" .venv/bin/python -m guru_watcher check --dry-run

Windows Task Scheduler

$py = "$env:USERPROFILE\GuruWatcher\.venv\Scripts\python.exe"
$data = "$env:USERPROFILE\gw-data"
$cmd = "& '$py' -m guru_watcher check --dry-run"
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -Command $cmd"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "GuruWatcherCheck" -Action $action -Trigger $trigger

No Docker? Linux templates in systemd/toolkit/ run the same pipeline via a venv.

Support

Platform matrix

docs/PLATFORM.md: pip/venv CLI on Linux/macOS/Windows; Docker pipeline on Linux + Docker Desktop; CI smoke on Linux (host+docker), macOS (pytest), Windows (host ps1). Packaged Control Panel app (PyInstaller — no Tauri) for macOS Apple Silicon (DMG) and Windows (portable zip); no native GUI redesign.

Safety

Alert-only BYO sources No orders