discovery
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"}' --follow
The 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 private
But 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:
- Is this monitorable? — Does it have ongoing updates? (blog with feed, GitHub repo with releases, living document that changes)
- Is it relevant to Joel's interests? — Check the interest profile in the
monitorskill. 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 now
If 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)
- Investigate — clone repos, extract articles via defuddle, read content
- Analyze via pi — decides title, tags, relevance, writes summary in Joel's voice
- Embed media — if source is a video (YouTube, etc.), auto-embeds
<YouTubeEmbed url="..." />in the note - Write — vault note to
~/Vault/Resources/discoveries/{slug}.md - Sync — fires
discovery/capturedevent which syncs to joelclaw.com/cool/ - 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:
- Classify URL — tweet, repo, article, video
- Fetch content — X API for tweets, defuddle for articles, repo clone for repos
- Match tracked projects — opencode, opentui, course-builder, pi-tools
- Deep dig if matched — recent commits, PRs, issues from upstream
- Profile the poster — git authors, web search, contact lookup (fires
contact/enrichif new) - 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
More from joelhooks/joelclaw
cli-design
Design and build agent-first CLIs with HATEOAS JSON responses, context-protecting output, and self-documenting command trees. Use when creating new CLI tools, adding commands to existing CLIs (joelclaw, slog), or reviewing CLI design for agent-friendliness. Triggers on 'build a CLI', 'add a command', 'CLI design', 'agent-friendly output', or any task involving command-line tool creation.
129docker-sandbox
Create, manage, and execute agent tools (claude, codex) inside Docker sandboxes for isolated code execution. Use when running agent loops, spawning tool subprocesses, or any task requiring process isolation. Triggers on "sandbox", "isolated execution", "docker sandbox", "safe agent execution", or when working on agent loop infrastructure.
86skill-review
Audit and maintain the joelclaw skill inventory. Use when checking skill health, fixing broken symlinks, finding stale skills, or running the skill garden. Triggers: 'skill audit', 'check skills', 'stale skills', 'skill health', 'skill garden', 'broken skill', 'skill review', 'fix skills', 'garden skills', or any task involving skill inventory maintenance.
49contacts
Add, enrich, and manage contacts in Joel's Vault. Fire the Inngest enrichment pipeline for full multi-source dossiers, or create quick contacts manually. Use when: 'add a contact', 'enrich this person', 'who is X', 'VIP contact', 'update contact', or any task involving the Vault/Contacts directory.
43gateway
Operate the joelclaw gateway daemon — the always-on pi session that receives events, notifications, and messages. Use the joelclaw CLI for ALL gateway operations. Use when: 'restart gateway', 'gateway status', 'is gateway healthy', 'push to gateway', 'gateway not responding', 'telegram not working', 'messages not going through', 'gateway stuck', 'gateway debug', 'check gateway', 'drain queue', 'test gateway', 'stream events', or any task involving the gateway daemon.
40email-triage
Triage Joel's email inboxes via the joelclaw email CLI. Scan, categorize, archive noise, surface actionable items, and draft replies. Use when: 'check my email', 'scan inbox', 'triage email', 'what needs a reply', 'clean up inbox', 'archive junk', 'email summary', 'anything important in email', or any request involving email inbox review or cleanup.
38