Competitor Radar
Tracks a fixed roster of competitors weekly and renders one branded HTML dashboard: follower counts, posting cadence, median engagement, week-over-week subscriber growth, standout post of the week, and SEO, per platform. Two tabs: Demo (a sample niche) and Actual (real competitors, with a focus/blur toggle so only "you" shows on camera).
Files
config.json: the stable roster (who to track, handles per platform, platforms to include, Apify actor ids). Edit to add/remove competitors.
radar_data.js: the weekly artifact. WEEK_ENDING, AV (base64 avatars, stable), and DATA ({demo, actual}). The refresh step rewrites this.
assets/template.html: the fixed dashboard shell (CSS, render logic, tabs, focus mode). Never regenerate; carries a single /*__RADAR_DATA__*/ marker.
scripts/build_dashboard.py: deterministic build (template + radar_data.js to index.html). No network.
Weekly refresh workflow
- Read
config.json (roster) and the current radar_data.js (last week's numbers, needed for week-over-week deltas).
- Gather fresh data for each creator per
references/data-sources.md. Do NOT fabricate; mark missing as null.
- Compute deltas per
references/data-sources.md.
- Rewrite
radar_data.js with the new WEEK_ENDING and refreshed DATA. Handle avatars per references/data-sources.md.
- Build:
python3 scripts/build_dashboard.py <skill_dir> ../index.html.
- Deploy and Slack the live URL per
references/deploy.md.
Self-improvement
This skill is never finished. Improve it as you use it.
- When the user corrects how a step was done, update the relevant reference file (
references/data-sources.md, references/deploy.md) or this SKILL.md so the correction sticks. Do not just fix it for this run.
- When a correction is a hard rule ("always X", "never Y"), add it as a permanent rule here.
- When the user says an output was genuinely good, save it to
references/examples/ so it becomes a model for future runs.
- Keep the skill small: when you add something, run the deletion test and cut anything that no longer changes behavior.
Guardrails
- YouTube numbers are the reliable core; always real. Never invent socials/SEO: set
null and move on.
- Never edit the template shell, CSS, or render JS. Only
radar_data.js (and config.json when the roster changes).
- Ben AI voice, no em dashes.
1---2name: competitor-radar3description: Build and weekly-refresh a branded HTML "Competitor Radar" dashboard that tracks a roster of competitors across YouTube, Instagram, LinkedIn, TikTok, community, and SEO. Use when the user wants to track competitors, monitor competitor socials/engagement/subscribers, build a competitor dashboard, or refresh the weekly competitor report. Gathers real data via connectors (YouTube, Apify, Firecrawl), renders a two-tab (Demo/Actual) dashboard in Ben AI branding, deploys it to a stable Vercel URL via git push, and posts the link to Slack.4---56# Competitor Radar78Tracks a fixed roster of competitors weekly and renders one branded HTML dashboard: follower counts, posting cadence, median engagement, week-over-week subscriber growth, standout post of the week, and SEO, per platform. Two tabs: **Demo** (a sample niche) and **Actual** (real competitors, with a focus/blur toggle so only "you" shows on camera).910## Files1112- `config.json`: the stable roster (who to track, handles per platform, platforms to include, Apify actor ids). Edit to add/remove competitors.13- `radar_data.js`: the weekly artifact. `WEEK_ENDING`, `AV` (base64 avatars, stable), and `DATA` ({demo, actual}). The refresh step rewrites this.14- `assets/template.html`: the fixed dashboard shell (CSS, render logic, tabs, focus mode). Never regenerate; carries a single `/*__RADAR_DATA__*/` marker.15- `scripts/build_dashboard.py`: deterministic build (template + radar_data.js to `index.html`). No network.1617## Weekly refresh workflow18191. **Read** `config.json` (roster) and the current `radar_data.js` (last week's numbers, needed for week-over-week deltas).202. **Gather fresh data** for each creator per `references/data-sources.md`. Do NOT fabricate; mark missing as `null`.213. **Compute deltas** per `references/data-sources.md`.224. **Rewrite** `radar_data.js` with the new `WEEK_ENDING` and refreshed `DATA`. Handle avatars per `references/data-sources.md`.235. **Build**: `python3 scripts/build_dashboard.py <skill_dir> ../index.html`.246. **Deploy and Slack** the live URL per `references/deploy.md`.2526## Self-improvement2728This skill is never finished. Improve it as you use it.29- When the user corrects how a step was done, update the relevant reference file (`references/data-sources.md`, `references/deploy.md`) or this SKILL.md so the correction sticks. Do not just fix it for this run.30- When a correction is a hard rule ("always X", "never Y"), add it as a permanent rule here.31- When the user says an output was genuinely good, save it to `references/examples/` so it becomes a model for future runs.32- Keep the skill small: when you add something, run the deletion test and cut anything that no longer changes behavior.3334## Guardrails3536- YouTube numbers are the reliable core; always real. Never invent socials/SEO: set `null` and move on.37- Never edit the template shell, CSS, or render JS. Only `radar_data.js` (and `config.json` when the roster changes).38- Ben AI voice, no em dashes.