Joelclaw egghead-slack
Joel's private egghead.io Slack integration — channel taxonomy, token config, passive monitoring, and message intelligence pipeline.
git clone https://github.com/joelhooks/joelclaw
T=$(mktemp -d) && git clone --depth=1 https://github.com/joelhooks/joelclaw "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/egghead-slack" ~/.claude/skills/joelhooks-joelclaw-egghead-slack && rm -rf "$T"
skills/egghead-slack/SKILL.mdegghead Slack Intelligence
Joel's private intelligence layer over the egghead.io Slack workspace. Joel-only — never participates in channels, never replies to anyone but Joel, never surfaces private data publicly.
Tokens
Three tokens in agent-secrets (values unchanged across scope updates):
| Secret | Type | Purpose |
|---|---|---|
| | Bot: Socket Mode, send DMs to Joel, reactions |
| | Socket Mode WebSocket connection |
| | User: read all channels, DMs, files, search |
User Token Scopes (current)
admin, identify, channels:history, channels:read, groups:history, groups:read, im:history, im:read, mpim:history, users:read, users:read.email, chat:write, canvases:read, canvases:write, files:read, search:read, search:read.public, search:read.private, search:read.mpim, search:read.im, search:read.files, search:read.users
Bot Token Scopes
files:read, files:write, remote_files:read, remote_files:share, remote_files:write, search:read.files, users.profile:read, chat:write, channels:history, channels:read, groups:history, groups:read, im:history, im:read, mpim:history, reactions:write, app_mentions:read, connections:write
Workspace IDs
All Slack IDs stored here (private skill, NOT in any git repo):
- Workspace: egghead.io (
)T030CS0QL - Joel user:
U030BJ3CK - Bot user:
(joelclaw bot)U0AGRUMQXPF - Joel DM channel:
D0AHPM2NPJL
VIP DM Channels
| Person | User ID | DM Channel | Notes |
|---|---|---|---|
| Kent C. Dodds | | | MEGA instructor, EpicWeb |
| Grzegorz Róg | | | Slack Connect, MEGA producer |
| Matt Pocock | | (lookup needed) | Total TypeScript, AI Hero |
| John Lindquist | | (lookup needed) | egghead cofounder, Script Kit |
22 external Slack Connect DMs total. Notable external users discovered: Tony Holdstock-Brown, Antonio Erdeljac, Sean Grove, Dave Kiss, Charly Poly, Matthew Rathbone, Janelle Allen, Justin Gordon
Channel Taxonomy
729 channels total. Canonical ID→name mapping:
~/Vault/Resources/slack/channels.json (729 entries, pulled 2026-02-26).
Prefix-based auto-categorization:
| Prefix | Category | Count (approx) | Description |
|---|---|---|---|
| Launch Control | ~50 | Course launch channels |
| Creator Channel | ~200 | 1:1 with creators/instructors |
| Ding Ding | ~15 | Revenue reporting (mostly noise) |
| Brain | 3 | Team thinking/strategy spaces |
| Projects | ~15 | Active project channels |
| Legacy | many | Legacy individual chats |
| Sales/Partner | few | Sales partner channels |
| Product Mgmt | few | Product management |
| Skill | few | Skill Recordings ops |
| egghead Ops | several | Various egghead channels |
Priority Channels (ADR-0131)
High (cc-/lc- with Contact materialization):
(cc-matt-p
) — Matt PocockC0211NSK3TP
(cc-john
) — John LindquistG70JH2Y7P
— activecc-ashley-hindle
— activecc-alex-hillman
(epic-instructors
) — Private, 14 members. Kent, Artem, and other Epic Web instructors. Workshop app features, video pipeline, course-builder updates.C06P7TD6VMM
(cc-kcd
) — Private. Kent C. Dodds creator channel (NOT lc-just-javascript)G01NK427ZE2
(cc-artem-zakharchenko
) — Private, 11 members. Artem's creator channelC044J7QEDRA
(lc-total-typescript
) — Private, 10 members. Matt's courseC03JWTULTN0
(lc-ai-hero
) — Private, 9 members. Matt's AI platformC07CURG8YB1
(lc-course-builder
) — Private, 11 members. Course builder toolC06KP859BUM
(lc-badass
) — Private, 12 members. Badass CoursesC02PXV4BR61
(lc-epic-web
) — Private, 11 members. Epic Web launchC03QFFWHT7D
Medium (project-/brain-/skill-*):
(brain-john
) — Public, 6 members. Strategy with JohnC0A2ZA94M0V
(brain-joel
) — Public, 8 members. Joel's strategy spaceC09LKT871PE
(project-support-agent
) — Public, 8 members. Support agent projectC0ACP6SDN73
(project-gremlin
) — Public, 8 members. Gremlin projectC0AE33HH9C3
(skill-life
) — Private, 9 members. Skill Recordings opsC04JPQS5ZUZ
Low/noise (dd-/sp-/legacy):
— revenue signals, topic-only extractiondd-*
— legacy, rarely active*-chat
API Patterns
Search messages
SLACK_USER=$(secrets lease slack_user_token --ttl 1h) curl -s "https://slack.com/api/search.messages?query=QUERY&count=20&sort=timestamp&sort_dir=desc" \ -H "Authorization: Bearer $SLACK_USER"
List DM channels
curl -s "https://slack.com/api/conversations.list?types=im&limit=500" \ -H "Authorization: Bearer $SLACK_USER"
Read DM history
curl -s "https://slack.com/api/conversations.history?channel=DM_CHANNEL_ID&limit=30" \ -H "Authorization: Bearer $SLACK_USER"
Download files
curl -s -L -o output.file \ -H "Authorization: Bearer $SLACK_USER" \ "URL_PRIVATE_DOWNLOAD"
Requires
files:read scope on user token.
Send DM to Joel (bot token)
SLACK_BOT=$(secrets lease slack_bot_token --ttl 1h) curl -s -X POST https://slack.com/api/chat.postMessage \ -H "Authorization: Bearer $SLACK_BOT" \ -H 'Content-Type: application/json' \ -d '{"channel":"U030BJ3CK","text":"message"}'
Upload file (3-step)
files.getUploadURLExternal → POST multipart → files.completeUploadExternal
Resolve external user (Slack Connect)
curl -s "https://slack.com/api/users.info?user=EXTERNAL_USER_ID" \ -H "Authorization: Bearer $SLACK_USER"
Backfill Pipeline
Inngest functions (deployed, registered):
— per-channel paginated history → Typesenseslack-channel-backfillslack_messages
— fan-out orchestrator for multiple channelsslack-backfill-batch- Events:
,channel/slack.backfill.requestedchannel/slack.backfill.batch.requested - Flow control: concurrency 2, throttle 10/60s, 1.5s sleep between pages
- First backfill: 15 channels, 60-day window, 245+ messages indexed
Privacy Boundary
Absolute rules:
- JoelClaw NEVER posts in Slack channels (only Joel's DM)
- JoelClaw NEVER responds to other users
- JoelClaw NEVER surfaces channel content publicly
- All intelligence is private context for Joel only
- No Slack IDs, channel names, or workspace identifiers in public repos
- This skill file is PRIVATE — lives at
, NOT in joelclaw repo~/.pi/agent/skills/egghead-slack/
Content shared in Slack is privileged by default:
- Loom recordings, screenshots, files, and links shared in Slack channels or DMs are private unless Joel explicitly says otherwise
- Do NOT auto-publish Looms or Slack-sourced content as discoveries, blog posts, or any public-facing content
- Always ASK Joel before surfacing any Slack-originated content publicly
- This applies to all channels — cc-, lc-, DMs, Slack Connect, everything
Related ADRs
- ADR-0130: Slack Channel Integration (gateway handler)
- ADR-0131: Unified Channel Intelligence Pipeline
- ADR-0132: VIP DM Escalated Handling
- Gateway channel:
packages/gateway/src/channels/slack.ts