
Discovery
- 31 installs
- 61 repo stars
- Updated August 4, 2026
- joelhooks/joelclaw
Capture interesting URLs, repos, or ideas into a vault by firing a discovery/noted Inngest event that enriches and publishes the find automatically.
About
Detects when a user flags something interesting and fires it into a durable Inngest enrichment pipeline that classifies, fetches, and writes a vault note. A developer uses it to bookmark finds without manual research.
- Fires joelclaw send discovery/noted --follow and returns the final link
- Pipeline handles X/API enrichment, repo cloning, and monitoring recommendations
Discovery by the numbers
- 31 all-time installs (skills.sh)
- Ranked #1,216 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/joelhooks/joelclaw --skill discoveryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 31 |
|---|---|
| repo stars | ★ 61 |
| Last updated | August 4, 2026 |
| Repository | joelhooks/joelclaw ↗ |
What it does
Capture interesting URLs, repos, or ideas into a vault by firing a discovery/noted Inngest event that enriches and publishes the find automatically.
Files
Discovery — Capture What's Interesting
When Joel flags something as interesting, fire it into the pipeline and keep moving.
Trigger Detection
Signal words/patterns (case-insensitive):
- "interesting", "cool", "neat", "nice", "wild", "clever"
- "check this out", "look at this", "came across", "found this"
- "bookmarking", "save this", "remember this"
- Bare URL/repo link with minimal context (1-2 words + link)
- Sharing a link then immediately moving on
When NOT to trigger: If Joel is asking for help with the thing (debugging, implementing, reviewing), that's a task — not a discovery.
Workflow
1. Resolve site + visibility first
Preferred explicit fields:
site:joelclaw|wizardshit|sharedvisibility:public|private|archived|migration-only
Sensible default when not specified:
site = joelclawvisibility = public
2. Canonical operator path when you need the final link back
Use the event surface directly and follow the run to completion:
joelclaw send discovery/noted --data '{"url":"<url>","context":"<optional context>","site":"joelclaw","visibility":"public"}' --followThe terminal run result now includes the final link for the created piece:
- public joelclaw discoveries →
https://joelclaw.com/cool/<slug> - non-public or off-site captures →
vault:Resources/discoveries/<Title>.md
Always return that `finalLink` to Joel.
If Joel explicitly wants the piece published somewhere other than joelclaw and that venue has its own durable publish surface, route to that venue-specific workflow instead of pretending the joelclaw discovery pipeline published it there. The joelclaw discovery pipeline can carry site/visibility metadata, but it only gives you a public joelclaw URL when the capture is actually eligible for joelclaw publication.
3. Compatibility shortcut
joelclaw discover still works as the thin fire-and-forget shortcut and now accepts explicit site/visibility too:
joelclaw discover <url> --site joelclaw --visibility public
joelclaw discover <url> -c "what Joel said about it" --site wizardshit --visibility privateBut if Joel needs the final link in the same turn, prefer joelclaw send discovery/noted --follow.
2. Assess for Monitoring (before moving on)
After firing the discovery event, quickly assess:
1. Is this monitorable? — Does it have ongoing updates? (blog with feed, GitHub repo with releases, living document that changes) 2. Is it relevant to Joel's interests? — Check the interest profile in the monitor skill. If it maps to 2+ areas, it's a strong candidate.
If both yes → recommend monitoring via MCQ:
"This looks like an active [blog/repo/guide] covering [matched interests]. Want to add it to the monitoring list?"
1. Yes, monitor it (hourly/daily)
2. Not nowIf the agent recommends monitoring and Joel accepts, add the subscription per the monitor skill workflow.
If monitorable but low relevance → mention briefly: "This has a feed if you ever want to track it" — don't push.
If not monitorable (one-shot article, tweet, static page) → skip, don't mention monitoring at all.
3. Continue conversation
Don't wait. Joel flagged something and moved on — match that energy.
What the Pipeline Does (background, in system-bus worker)
1. Investigate — clone repos, extract articles via defuddle, read content 2. Analyze via pi — decides title, tags, relevance, writes summary in Joel's voice 3. Embed media — if source is a video (YouTube, etc.), auto-embeds <YouTubeEmbed url="..." /> in the note 4. Write — vault note to ~/Vault/Resources/discoveries/{Title}.md (normal path) or a unique {Title} {fingerprint}.md degraded fallback
- If pi note generation times out or errors, the function writes a source-grounded degraded fallback note (
captureStatus: degraded,needs-review) and still forwardsdiscovery/capturedwithcaptureStatus: degraded. This keeps/coolcapture durable instead of losing the find behind a model stall.
5. Sync — fires discovery/captured event which syncs to joelclaw.com/cool/ 6. Log — slog write --action noted --tool discovery
X/Twitter URL Enrichment
When the source URL is an X/Twitter post (x.com/*/status/* or twitter.com/*/status/*):
- X blocks web scraping — do NOT use url_to_markdown or web_search for tweet content
- Instead, use the x-api skill to fetch tweet text, author, and metrics via the Twitter API v2
- Extract the tweet ID from the URL and call
GET /2/tweets/:id?tweet.fields=text,author_id,created_at,public_metrics&expansions=author_id&user.fields=name,username - Include tweet text, author handle, and engagement metrics in the discovery note
- See
x-apiskill for OAuth 1.0a signing details
Deep Dig — Inngest Enrichment Pipeline (ADR-0150)
Enrichment is not manual agent work. The discovery/noted event triggers a durable Inngest function (discovery/enrich) that handles all enrichment automatically:
1. Classify URL — tweet, repo, article, video 2. Fetch content — X API for tweets, defuddle for articles, repo clone for repos 3. Match tracked projects — opencode, opentui, course-builder, pi-tools 4. Deep dig if matched — recent commits, PRs, issues from upstream 5. Profile the poster — git authors, web search, contact lookup (fires contact/enrich if new) 6. Write enriched vault note — full context, not a bare URL
The agent's job is just to fire discovery/noted with whatever context Joel provided. The pipeline does the rest.
Tracked projects (canonical list in packages/system-bus/src/config/tracked-projects.ts)
anomalyco/opencode(fork ofsst/opencode)anomalyco/opentui(fork ofsst/opentui)badass-courses/course-builderjoelhooks/pi-toolsjoelhooks/joelclaw
Video/Media Handling
When the source URL is a YouTube video (youtube.com or youtu.be):
- The discovery note gets a
<YouTubeEmbed url="..." />component right after the title - This renders an embedded video player on the cool page at joelclaw.com
- The note body still includes analysis/summary — the embed is supplemental, not a replacement for writing about it
interface:
icon_small: "./assets/small-logo.svg"
icon_large: "./assets/large-logo.png"
<svg width="16" height="16" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="JoelClaw icon">
<defs>
<clipPath id="circle-clip">
<circle cx="256" cy="256" r="248" />
</clipPath>
</defs>
<circle cx="256" cy="256" r="248" fill="#0a0a0a" />
<g clip-path="url(#circle-clip)">
<path fill="#ff1493" d="M175.656 22.375l-48.47 82.094c-23.017 4.384-43.547 11.782-60.124 22.374-24.436 15.613-40.572 37.414-45.5 67.875-4.79 29.62 1.568 68.087 24.125 116.093 93.162 22.88 184.08-10.908 257.25-18.813 37.138-4.012 71.196-.898 96.344 22.97 22.33 21.19 36.21 56.808 41.908 113.436 29.246-35.682 44.538-69.065 49.343-99.594 5.543-35.207-2.526-66.97-20.31-95.593-8.52-13.708-19.368-26.618-32-38.626l14.217-33-41.218 10.625c-8.637-6.278-17.765-12.217-27.314-17.782l-7.03-59.782-38.157 37.406c-12.418-5.186-25.184-9.804-38.158-13.812l-8.375-71.28-57.625 56.5c-9.344-1.316-18.625-2.333-27.812-2.97l-31.094-78.125zM222 325.345c-39.146 7.525-82.183 14.312-127.156 11.686 47.403 113.454 207.056 224.082 260.125 87-101.18 33.84-95.303-49.595-132.97-98.686z" />
</g>
</svg>