This is / isn’t
| This is | This isn’t |
|---|---|
| Watches prices your newsletter prints and pings your Discord | A trading bot or broker — it never buys or sells |
| Your sources and your own Discord webhook | A 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 local | A 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.
-
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) · Windowsscripts/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. -
Tell it which Discord channel to buzz (optional for practice)
In Discord: open your channel → gear (Edit channel) → Integrations → Webhooks → New webhook → Copy URL. In the panel: paste under Discord alert link (your Discord webhook URL) → Save → Send 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.
-
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 paste → Load sample → Run once (safe) just to see it work.
Step-by-step: Connect your newsletter email.
-
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
- Primary: Support page (
support@guruwatcher.com) - After you have the toolkit (repo invite available on request), you can also open a GitHub Issue.
- Community (optional): Discord.
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
- Never places trades
- Do not commit webhook URLs or API keys
- Not investment advice · not a broker · not redistributing paid newsletters