GuruWatcher · Setup

Setup guide (first hour)

Self-hosted claim ledger + Discord buzzer. You bring the feeds and the webhook. Alert-only — no orders.

Clone the toolkit Short checklist

This is / isn’t

This isThis isn’t
Claim ledger + Discord buzzerA trading bot / broker
BYO Discord + BYO sources you subscribe toA Macro Charts reseller
Multi-ingest into one inbox → guards → armsAuto-arming from charts without numbers
Most-recent-wins mindA generic TradingView ping clone

Use only content you have the right to use. Do not redistribute paid newsletter text. Levels arm only when a number appears in that issue’s text. Alerts are not trade instructions.

Install

Clone from GitHub, pinning release v0.1.1.

git clone --branch v0.1.1 --depth 1 https://github.com/cemini23/GuruWatcher
cd GuruWatcher

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

Optional: Docker Desktop (macOS/Windows) or native Docker (Linux) — see step 7 for the full pipeline.

First-hour checklist

  1. 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.

  2. 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.

  3. Add / edit a source — edit gw-data/config.yaml or gw-data/sources/example.yaml for symbols and bands you have rights to use.
  4. Ingest once
    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
  5. Extract + dry-run check
    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).

  6. Optional 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.1 (or :latest).

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). No native GUI.

Safety

Alert-only BYO sources No orders