Files
Dani bf22ede1b2 chore: finish Vercel -> Cloudflare Pages migration docs and cleanup
The dashboard already deploys to Cloudflare Pages (deploy.yml, wrangler.toml)
but CLAUDE.md, the deployer/build-checker agents, and the dashboard/cloudflare
rules still described the old Vercel setup. The pulse worker still called the
Vercel API for deploy metrics even though the project moved off Vercel.

- Update CLAUDE.md, deployer.md, build-checker.md, dashboard.md, cloudflare.md
  to reflect Cloudflare Pages (wrangler deploy/rollback, CLOUDFLARE_API_TOKEN/
  CLOUDFLARE_ACCOUNT_ID secrets) instead of Vercel
- Apply an unmerged fix (55741ad4) that replaces pulse's Vercel deploy-metrics
  collector with a Cloudflare Pages collector
- Remove dead dashboard/vercel.json; port its security/CORS headers to
  dashboard/public/_headers (Cloudflare Pages' native headers file) since
  Cloudflare Pages was silently ignoring vercel.json
- Rewrite scripts/deploy.sh to call wrangler instead of vercel --prod
2026-06-30 21:03:54 -04:00
..

Pulse — Weekly KPI Report (Cloudflare Worker)

Collects metrics from GitHub, Discord, Supabase, Vercel, and Google Analytics every Sunday at 14:00 UTC and sends a consolidated report via Telegram.

Setup

1. Install dependencies

cd cloudflare-workers/pulse
npm install

2. Configure secrets

Set each secret using wrangler secret put:

# Telegram (same bot/chat as docs-monitor)
wrangler secret put TELEGRAM_BOT_TOKEN
wrangler secret put TELEGRAM_CHAT_ID

# GitHub
wrangler secret put GITHUB_TOKEN          # PAT with public_repo scope

# Supabase
wrangler secret put SUPABASE_URL          # https://xxx.supabase.co
wrangler secret put SUPABASE_SERVICE_ROLE_KEY

# Discord
wrangler secret put DISCORD_BOT_TOKEN
wrangler secret put DISCORD_GUILD_ID

# Cloudflare Pages (dashboard deploy metrics)
wrangler secret put CLOUDFLARE_API_TOKEN      # API token with Account > Pages > Read
wrangler secret put CLOUDFLARE_ACCOUNT_ID     # Cloudflare account ID
wrangler secret put CLOUDFLARE_PAGES_PROJECT  # Pages project name (aitmpl-dashboard)

# Manual trigger auth
wrangler secret put TRIGGER_SECRET

# Optional — Google Analytics (add later)
wrangler secret put GA_PROPERTY_ID
wrangler secret put GA_SERVICE_ACCOUNT_JSON  # Base64-encoded service account JSON

3. Deploy

wrangler deploy

Usage

Automatic (Cron)

Runs every Sunday at 14:00 UTC (11:00 AM Chile). No action needed after deploy.

Manual trigger

# Full report
curl -X POST https://pulse-weekly-report.YOUR_SUBDOMAIN.workers.dev/trigger \
  -H "Authorization: Bearer YOUR_TRIGGER_SECRET"

# Single source only
curl -X POST "https://pulse-weekly-report.YOUR_SUBDOMAIN.workers.dev/trigger?source=github" \
  -H "Authorization: Bearer YOUR_TRIGGER_SECRET"

# Dry run (don't send to Telegram)
curl -X POST "https://pulse-weekly-report.YOUR_SUBDOMAIN.workers.dev/trigger?send=false" \
  -H "Authorization: Bearer YOUR_TRIGGER_SECRET"

Status

curl https://pulse-weekly-report.YOUR_SUBDOMAIN.workers.dev/status

Local development

npm run dev              # Start local dev server
npm run test             # Test cron trigger locally

Report format

📊 PULSE — Weekly Report
📅 Jan 25, 2026 - Jan 31, 2026

⭐ GITHUB
├ Stars: 1,234 (+45)
├ Forks: 156 (+8)
├ Issues: 12 open (3 new, 2 closed)
└ PRs: 5 opened, 4 merged

💬 DISCORD
├ Members: 890 (+23)
├ Active: ~145
└ Messages: 312

📦 DOWNLOADS
├ Total: 45,678 (+1,234)
├ Top: frontend-developer (89)
├ By type: agents 65% | commands 20% | settings 15%
└ Countries: US 40% | DE 15% | BR 10% | UK 8% | CL 5%

🚀 CLOUDFLARE (Pages)
├ Deploys: 12 (11 ok, 1 failed)
└ Latest: 2h ago [OK]

📈 ANALYTICS
├ Visitors: 3,456
├ Pageviews: 12,345
├ Top: / (4,567) | /agents (2,345) | /commands (1,234)
└ Referrers: google (45%) | github (30%) | direct (15%)

Sources that fail gracefully show ⚠️ Unavailable instead.