Skip to main content
ClaudeWave
Skill510 repo starsupdated today

competitor-launch-radar

Competitor-Launch-Radar scans Product Hunt and Hacker News weekly for newly launched AI agent frameworks outside the nine tracked by ai-framework-watch, deduplicating against local state to surface market entrants before they gain momentum. Use this skill to close the blind spot between curated framework monitoring and real-time public launches, ensuring early awareness of competitive frameworks that might otherwise go unnoticed until weeks after their initial launch.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/competitor-launch-radar && cp -r /tmp/competitor-launch-radar/skills/competitor-launch-radar ~/.claude/skills/competitor-launch-radar
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

> **${var}** — Optional. `dry-run` skips notify (state still updates and article still writes). Empty = normal run.

Today is ${today}. `ai-framework-watch` tracks momentum across a known 9-framework cohort (aeon anchor + langgraph/crewai/autogen/llamaindex/mastra/smolagents/dspy/pydantic-ai). That cohort is intentionally curated — but in 2026 a brand-new agent framework can post to Product Hunt, get 400 upvotes, hit the HN front page, and accumulate users before earning a single GitHub star. This skill is the radar for that blind spot: weekly Monday scan of Product Hunt RSS + HN Algolia for **new entrants** matching agent-framework keywords, filtered against the existing cohort and an LRU dedup state so each launch fires exactly once.

Read `memory/MEMORY.md` for context.
Read the last 8 days of `memory/logs/` to dedupe entrants already featured this week.
Read `soul/SOUL.md` + `soul/STYLE.md` if populated to match voice.

## Why this exists

`ai-framework-watch` answers "what did the known cohort ship this week?" — momentum, releases, breaking changes. It cannot answer "did a new framework just launch?" because the watchlist is hardcoded by design (drift erodes week-over-week comparability). Without a second skill watching the public-launch surfaces, the operator only learns about a new entrant when it crosses into their Twitter feed weeks later. By that point the framework already has stars, integrations, and momentum the operator could have engaged earlier.

This skill closes the gap with a single weekly anchor — Monday 10:00 UTC, one digest, gated on signal — so new entrants surface the week they launch.

## Inputs

| Source | Purpose | Auth |
|--------|---------|------|
| `https://www.producthunt.com/feed` | Product Hunt RSS — all-categories feed, top daily launches | None (public RSS) |
| `https://hn.algolia.com/api/v1/search?tags=show_hn&query={kw}&hitsPerPage=50` | Hacker News Algolia API — Show HN and story search | None (keyless) |
| `memory/topics/competitor-launch-radar-state.json` | LRU dedup state — already-announced entrants | Local file |

No new secrets. Both data sources are public, keyless HTTP. Sandbox fallback: WebFetch (see Sandbox note).

Writes:
- `memory/topics/competitor-launch-radar-state.json` — LRU 200-entry `announced` array
- `articles/competitor-launch-radar-${today}.md` — digest article on non-QUIET runs
- `memory/logs/${today}.md` — one log block per run, even on QUIET
- Notification via `./notify` — only when a gate fires

## Watchlist suppression (already-known cohort)

Skip any candidate whose URL or text contains one of these slugs (case-insensitive substring match). These are tracked by `ai-framework-watch` already and are not "new entrants" by definition:

```
langgraph
crewai
autogen
llamaindex
mastra
smolagents
dspy
pydantic-ai
aeon
```

The suppression is structural: a Product Hunt post titled "LangGraph Studio v2" is not a new entrant, it's a known peer's product launch — `ai-framework-watch` will surface it via the release scan. Likewise an HN Show HN that mentions `crewai` in the title or URL is filtered out here.

## Keyword match list

Case-insensitive substring on title + tagline + description. Any one match qualifies a candidate (subject to suppression + noise floor + dedup):

```
agent framework
autonomous agent
agentic
multi-agent
mcp server
mcp client
ai agent
claude agent
llm agent
```

These are intentionally broad: the goal is high recall on the inbound side; classification (step 5) and dedup (step 6) do the precision work.

## Classification taxonomy

Each surviving match gets exactly one classification:

| Class | Heuristic | Meaning |
|-------|-----------|---------|
| `framework` | Description/tagline contains "framework", "library", "SDK", or the name matches the `agent-{x}`/`{x}-agent` pattern indicating a framework offering | Direct competitor to the cohort — the highest-signal class |
| `mcp` | Title/description mentions "MCP" or "model context protocol" | MCP server or tool — adjacent ecosystem, often a building block rather than competitor |
| `product` | None of the above, but a keyword matched | Agent-powered downstream product (e.g. an "AI agent for sales") |

Apply classes in order: `framework` wins over `mcp` wins over `product`. A candidate matching both "framework" and "MCP" is classed `framework` because the framework framing is the higher-signal one for the operator.

## State schema

`memory/topics/competitor-launch-radar-state.json`:

```json
{
  "last_run": "2026-05-18",
  "last_status": "COMPETITOR_LAUNCH_RADAR_OK",
  "announced": [
    {
      "id": "ph:some-product-slug",
      "name": "Some Product",
      "url": "https://www.producthunt.com/posts/some-product-slug",
      "class": "framework",
      "score": 412,
      "source": "producthunt",
      "announced_at": "2026-05-18"
    },
    {
      "id": "hn:39812345",
      "name": "Show HN: foo-agent — a minimal agent framework",
      "url": "https://news.ycombinator.com/item?id=39812345",
      "class": "framework",
      "score": 87,
      "source": "hackernews",
      "announced_at": "2026-05-18"
    }
  ]
}
```

Key invariants:
- `id` is the canonical dedup key: `ph:{slug}` (extracted from `/posts/{slug}` URL) or `hn:{objectID}` (Algolia `objectID`).
- LRU cap: 200 entries. When the cap is hit, drop the oldest by `announced_at`. 200 entries × ~1 framework launch/week real-world rate ≈ 4 years of headroom; the cap is a guard, not an active rotation knob.
- Once an `id` is in `announced`, the entrant is suppressed forever (until manually evicted from state).

## Steps

### 0. Bootstrap

```bash
mkdir -p memory/topics articles
[ -f memory/topics/competitor-launch-radar-state.json ] || cat > memory/topics/competitor-launch-radar-state.json <<'EOF'
{"last_run":null,"last_status":null,"announced":[]}
EOF
```

If `jq empty memory/topics/competitor-launch-radar-state.json` fails (corrupt JSON from a prior aborted write), back the file up to `.bak`, reset to