canary-watch
affaan-m/ecc
Monitor deployed URLs for regressions—checks endpoints, assets, performance, and console errors after releases.
What is canary-watch?
Canary Watch verifies a deployed URL is healthy after releases, merges, or dependency upgrades by monitoring HTTP status, console errors, performance metrics, static assets, API endpoints, and SSE streams. Use it immediately after deploying to production or staging, or set it to run continuously during a launch window.
- Checks HTTP status and verifies endpoints return 200
- Detects new console errors and warnings in real time
- Monitors Core Web Vitals (LCP, CLS, INP) for regressions vs baseline
- Verifies static assets (JS, CSS, images, fonts) load with correct content types
- Tests API endpoint health and response times against SLA
- Validates SSE stream connections and heartbeat latency
How to install canary-watch
npx skills add null --skill canary-watchHow to use canary-watch
- 1.Run a quick single-pass check: `/canary-watch https://myapp.com`
- 2.For sustained monitoring: `/canary-watch https://myapp.com --interval 5m --duration 2h`
- 3.To compare two environments: `/canary-watch --compare https://staging.myapp.com https://myapp.com`
- 4.Review the markdown report for status, metrics, and any regressions
- 5.Check `~/.claude/canary-watch.log` for detailed logs and historical data
Use cases
- Verify a production deploy is healthy before notifying users
- Monitor a staging environment after merging a risky PR
- Continuously check during a launch window to catch regressions early
- Compare staging and production endpoints side-by-side after a fix
- Validate dependency upgrades didn't break critical user flows
- DevOps engineers and release managers
- Full-stack developers verifying their own deploys
- QA teams running smoke tests post-deployment
- Platform teams monitoring canary releases
canary-watch FAQ
HTTP status not 200, >5 new console errors, LCP >4s, API 5xx responses, static assets returning 4xx/5xx, or SSE endpoints failing to connect.
Yes, critical thresholds can trigger optional Slack/Discord webhooks in addition to desktop notifications.
The first run establishes baseline metrics (LCP, response times, asset counts); subsequent runs compare against that baseline to detect regressions.
Yes, run it in GitHub Actions after your deploy step or add it as a PostToolUse hook on `git push` for automatic post-deploy verification.
Quick Check runs once and reports results; Sustained Watch runs repeatedly at your specified interval for a set duration to catch intermittent issues.
Full instructions (SKILL.md)
Source of truth, from affaan-m/ecc.
name: canary-watch description: Use this skill to monitor and verify a deployed URL after releases — checks HTTP endpoints, SSE streams, static assets, console errors, and performance regressions after deploys, merges, or dependency upgrades. Smoke / canary / post-deploy verification. metadata: origin: ECC
Canary Watch — Post-Deploy Monitoring
When to Use
- After deploying to production or staging
- After merging a risky PR
- When you want to verify a fix actually fixed it
- Continuous monitoring during a launch window
- After dependency upgrades
How It Works
Monitors a deployed URL for regressions. Runs in a loop until stopped or until the watch window expires.
What It Watches
1. HTTP Status — is the page returning 200?
2. Console Errors — new errors that weren't there before?
3. Network Failures — failed API calls, 5xx responses?
4. Performance — LCP/CLS/INP regression vs baseline?
5. Content — did key elements disappear? (h1, nav, footer, CTA)
6. API Health — are critical endpoints responding within SLA?
7. Static Assets — are JS, CSS, image, and font requests returning 2xx/3xx with expected content types?
8. SSE Streams — do event-stream endpoints connect and receive an initial event or heartbeat?
Watch Modes
Quick check (default): single pass, report results
/canary-watch https://myapp.com
Sustained watch: check every N minutes for M hours
/canary-watch https://myapp.com --interval 5m --duration 2h
Diff mode: compare staging vs production
/canary-watch --compare https://staging.myapp.com https://myapp.com
Alert Thresholds
critical: # immediate alert
- HTTP status != 200
- Console error count > 5 (new errors only)
- LCP > 4s
- API endpoint returns 5xx
- Static asset returns 4xx/5xx
- SSE endpoint cannot connect or drops before first heartbeat
warning: # flag in report
- LCP increased > 500ms from baseline
- CLS > 0.1
- New console warnings
- Response time > 2x baseline
- Static asset content type changed unexpectedly
- SSE heartbeat latency > 2x baseline
info: # log only
- Minor performance variance
- New network requests (third-party scripts added?)
Notifications
When a critical threshold is crossed:
- Desktop notification (macOS/Linux)
- Optional: Slack/Discord webhook
- Log to
~/.claude/canary-watch.log
Output
## Canary Report — myapp.com — 2026-03-23 03:15 PST
### Status: HEALTHY ✓
| Check | Result | Baseline | Delta |
|-------|--------|----------|-------|
| HTTP | 200 ✓ | 200 | — |
| Console errors | 0 ✓ | 0 | — |
| LCP | 1.8s ✓ | 1.6s | +200ms |
| CLS | 0.01 ✓ | 0.01 | — |
| API /health | 145ms ✓ | 120ms | +25ms |
| Static assets | 42/42 ✓ | 42/42 | — |
| SSE /events | connected ✓ | connected | +80ms heartbeat |
### No regressions detected. Deploy is clean.
Integration
Pair with:
/browser-qafor pre-deploy verification- Hooks: add as a PostToolUse hook on
git pushto auto-check after deploys - CI: run in GitHub Actions after deploy step
Related skills
More from affaan-m/ecc and the wider catalog.
carrier-relationship-management
Manage carrier portfolios, negotiate rates, and track performance with transportation expertise frameworks.
cisco-ios-patterns
Cisco IOS/IOS-XE review patterns for config, ACLs, wildcard masks, and safe change verification.
ck
Persistent per-project memory for Claude Code with auto-loaded context and git-aware session tracking.
claude-api
Agent skill from affaan-m/ecc.
claude-devfleet
Orchestrate parallel Claude Code agents on coding tasks with dependency chains and isolated worktrees.
click-path-audit
Trace button handlers through state changes to find bugs where functions cancel each other out or leave UI inconsistent.