| name | wachi |
| description | Install, configure, and use the wachi CLI to monitor any URL for new content and get notifications via 90+ services (Slack, Discord, Telegram, email, etc.). Use when the user wants to: (1) subscribe to web pages, blogs, YouTube channels, or RSS feeds for change notifications, (2) set up URL monitoring with wachi sub/check/ls commands, (3) configure notification channels via apprise URLs, (4) schedule periodic checks with cron, (5) troubleshoot wachi errors or configuration, or (6) understand how wachi detects changes (RSS auto-discovery, LLM-based CSS selectors). |
wachi
Subscribe any link and get notified on change. Monitors URLs for new content, pushes notifications to 90+ services via apprise.
Install
npx wachi --help
bunx wachi --help
npm i -g wachi
bun i -g wachi
curl -fsSL https://raw.githubusercontent.com/ysm-dev/wachi/main/install.sh | sh
brew tap ysm-dev/tap && brew install wachi
Quick Start
wachi sub "slack://xoxb-token/channel" "https://blog.example.com"
wachi check
Commands
wachi sub <apprise-url> <url> Subscribe URL to notification channel
-e, --send-existing Send all current items on next check (skip baseline)
wachi unsub <apprise-url> [url] Unsubscribe URL or remove entire channel
wachi ls List all channels and subscriptions
wachi check Check all subscriptions for changes
-c, --channel <apprise-url> Check specific channel only
-n, --concurrency <number> Max concurrent checks (default: 10)
-d, --dry-run Preview without sending or recording
wachi test <apprise-url> Send test notification
wachi upgrade Update wachi to latest version
Global flags: --json / -j for machine-readable output, --verbose / -V for detailed logs, --config / -C for custom config path.
How It Works
wachi sub checks if the URL has an RSS feed (auto-discovery via <link> tags and common paths)
- If RSS found: store and use RSS for ongoing checks
- If no RSS: use LLM + agent-browser to identify CSS selectors via accessibility tree analysis
wachi check fetches each subscription, compares against dedup table (SHA-256 hash), sends new items via apprise
Configuration
Config at ~/.config/wachi/config.yml (auto-created on first wachi sub).
llm:
api_key: "sk-..."
model: "gpt-4.1-mini"
summary:
enabled: true
language: "en"
min_reading_time: 3
channels:
- apprise_url: "slack://xoxb-token/channel"
subscriptions:
- url: "https://blog.example.com"
rss_url: "https://blog.example.com/feed.xml"
All fields optional with sensible defaults. Empty config is valid.
Environment Variables
| Variable | Purpose |
|---|
WACHI_LLM_API_KEY | LLM API key |
WACHI_LLM_MODEL | LLM model name |
WACHI_LLM_BASE_URL | LLM API base URL (default: OpenAI) |
WACHI_NO_AUTO_UPDATE | Set to 1 to disable auto-update |
Notification Channels
Uses apprise URL format. Examples:
wachi sub "slack://xoxb-token/channel" "https://example.com"
wachi sub "discord://webhook-id/token" "https://example.com"
wachi sub "tgram://bot-token/chat-id" "https://example.com"
wachi test "slack://xoxb-token/channel"
Full list: https://github.com/caronc/apprise/wiki
Scheduling
wachi check is stateless and one-shot. Use any scheduler:
crnd "*/5 * * * *" wachi check
crontab -e
Examples
wachi sub "slack://xoxb-token/channel" "https://blog.example.com"
wachi sub "discord://webhook-id/token" "https://news.ycombinator.com"
wachi sub "tgram://bot-token/chat-id" "https://youtube.com/@channel"
wachi sub "slack://token/channel" "blog.example.com"
wachi sub -e "discord://webhook-id/token" "https://news.ycombinator.com"
wachi check -d
wachi check -c "slack://xoxb-token/channel"
For detailed behavior (dedup model, error patterns, notification format, config schema), see references/spec.md.