launch-radar
$
npx mdskill add aaronjmars/aeon/launch-radar> **${var}** — Optional idea category filter (e.g. "crypto", "AI", "DeFi"). If empty, scans top-priority unexecuted ideas across all categories.
SKILL.md
.github/skills/launch-radarView on GitHub ↗
---
name: launch-radar
description: Weekly competitive scan — searches ProductHunt, HN Show HN, and GitHub Trending for product launches matching the operator's startup idea backlog. Flags when someone ships an idea from the list.
var: ""
tags: [meta, creative, ideas]
---
> **${var}** — Optional idea category filter (e.g. "crypto", "AI", "DeFi"). If empty, scans top-priority unexecuted ideas across all categories.
Today is ${today}. Read `memory/MEMORY.md` before starting. If `soul/SOUL.md` + `soul/STYLE.md` exist and are populated, read them to match the operator's voice; otherwise use a clear, direct, neutral tone.
## Why this skill exists
Idea backlogs sit in `memory/topics/startup-ideas.md`. `idea-validator` screens them statically. `idea-pipeline` checks what the operator has shipped. Nothing checks what the *market* shipped this week. When someone launches in your idea territory, you want to know — so you can sharpen the angle, accelerate, or step aside. This closes that gap.
## Steps
### 1. Load the idea backlog
Read `memory/topics/startup-ideas.md`. If it doesn't exist, log `LAUNCH_RADAR_SKIP: no backlog at memory/topics/startup-ideas.md` and stop.
Read `memory/topics/startup-ideas-screened.md` if it exists — extract ideas with `viability >= 8` or date within last 60 days.
Build the **priority list**: up to 15 ideas ordered by (viability desc, recency desc). If `${var}` is set, filter by category/domain match first.
For each idea, extract 2–3 search keywords (core noun + differentiator, e.g. "AI agent payments micropayments" or "coordination market reflexive prediction").
### 2. Scan for recent launches
For each idea in the priority list:
**ProductHunt search:**
```
WebSearch: "[keyword1] [keyword2] site:producthunt.com"
```
**HN Show HN search:**
```
WebSearch: "Show HN [keyword1] [keyword2] site:news.ycombinator.com"
```
You don't need to fetch every URL. Read the search snippet — title, visible traction (upvotes/points), and date from the result. That's enough to classify.
### 3. Score competitive signals
For each idea, classify based on what you found:
- **active competition** — launched in the last 60 days AND has 100+ upvotes/points → someone shipped this and it's getting traction
- **prior art** — launched > 60 days ago OR fewer than 50 upvotes/points → exists, no breakout signal
- **open** — no relevant match found on either platform
### 4. Update competitive intel file
Read `memory/topics/startup-ideas-market.md` (create if missing — empty file is fine).
This file persists scan results across runs. **Upsert** entries for ideas scanned this run — update existing entries, add new ones. Do not overwrite unrelated entries.
Format per entry:
```
## [Idea Name]
- **Last scanned:** ${today}
- **ProductHunt:** [product title / upvote count / launch date — or "none found"]
- **HN Show HN:** [title / points / date — or "none found"]
- **Signal:** active / prior art / open
- **Note:** [1 sentence on competitive posture]
```
### 5. Write the report
Write to `articles/launch-radar-${today}.md`:
```markdown
# Launch Radar — ${today}
**Ideas scanned:** N | **Active competition:** N | **Prior art:** N | **Open:** N
## Active Competition (Watch / Differentiate)
### [Idea Name]
**What shipped:** [product name] on [platform], [upvotes/points], [date]
**Posture:** [1–2 sentences — why this matters or doesn't]
**Call:** watch / differentiate (sharpen the angle, find a wedge they missed, or step aside)
### ...
## Prior Art (Exists, No Traction)
### [Idea Name]
**What exists:** [product name] on [platform], [upvotes/points], [date]
**Posture:** [why this is weak signal]
**Call:** still worth building / needs sharper angle
### ...
## Open (No Launches Found)
- [Idea Name] — [one-liner]
- ...
---
*Source: ProductHunt + HN Show HN search | Ideas from memory/topics/startup-ideas.md | Generated by launch-radar*
```
### 6. Send notification
Write to `.pending-notify-temp/launch-radar-${today}.md` (create dir if needed), then:
```bash
mkdir -p .pending-notify-temp
./notify -f .pending-notify-temp/launch-radar-${today}.md
```
**Notification format** — match the operator's voice if soul files are populated, otherwise direct and neutral:
```
launch radar — ${today}
N ideas scanned. N with active competition. N still open.
active competition (watch / differentiate):
[for each: "• [idea name] — [product] launched [date], [N] upvotes"]
prior art (weak signal):
[for each: "• [idea name] — [product] exists, [N] upvotes [date]"]
still wide open:
[comma-separated or bullet list of idea names]
```
Keep under 2500 chars. If nothing in "active competition", skip that section. If zero active competitions, the "still open" list is still worth sending — it's positive signal.
### 7. Log to memory/logs/${today}.md
Append:
```markdown
## Launch Radar
- **Ideas scanned:** N
- **Active competition:** N (names if any)
- **Prior art:** N (names if any)
- **Open:** N
- **Market intel updated:** memory/topics/startup-ideas-market.md
- **Notification:** sent
- LAUNCH_RADAR_OK
```
If fewer than 2 ideas were found in the backlog: log `LAUNCH_RADAR_SKIP: backlog empty or filtered to <2 ideas` and stop without notifying.
## Required Env Vars
None. All search via built-in **WebSearch** tool. Local file reads via Read tool. No curl, no prefetch script, no external auth.
## Sandbox Note
All external search done via **WebSearch** (built-in Claude tool — bypasses GitHub Actions sandbox network restrictions). No curl or prefetch needed. `gh` CLI not required.