Resource Monitor — Track What Matters
Manage the feed subscription system (ADR-0127). Inngest cron checks subscriptions hourly, detects changes, summarizes via LLM, and notifies Joel via gateway with approve/dismiss for /cool publishing.
Joel's Interest Profile
Use this to assess whether a discovered resource is worth monitoring. If a resource clearly maps to 2+ of these, recommend monitoring with a brief explanation.
- Agentic AI — agent patterns, agent infrastructure, tool use, MCP, multi-agent systems
- Developer education — course platforms, learning design, course-builder ecosystem
- TypeScript tooling — Effect ecosystem, Bun, type-level programming, compiler work
- Inngest / durable workflows — event-driven systems, step functions, background jobs
- Personal AI systems — local-first AI, semantic memory, knowledge management, RAG
- BEAM / Elixir / OTP — Erlang ecosystem, actor model, fault tolerance
- Video infrastructure — Mux, transcription, media pipelines
- Next.js / React — RSC, App Router, cache components, Vercel platform
- CLI design — agent-first interfaces, HATEOAS, terminal UIs
- Knowledge management — Obsidian, digital gardens, PKM, zettelkasten
- Self-hosted infra — homelab, k8s, Tailscale, NAS, local services
- AT Protocol / Bluesky — decentralized web, PDS, lexicons
- Convex — real-time database, reactive backends
CLI Commands
# List all monitored subscriptions
joelclaw subscribe list
# Add a subscription (auto-detects type from URL)
joelclaw subscribe add <url> --name "Simon Willison" --interval hourly
joelclaw subscribe add <url> --name "json-render" --type github --interval daily
# Remove a subscription
joelclaw subscribe remove <id>
# Force-check a specific subscription now
joelclaw subscribe check --id <id>
# Force-check all subscriptions
joelclaw subscribe check
# Show recent updates across all subscriptions
joelclaw subscribe summary
Direct Inngest Fallback (alternative)
# Add subscription via event
joelclaw send subscription/add -d '{
"id": "simon-willison-blog",
"name": "Simon Willison",
"feedUrl": "https://simonwillison.net/atom/everything/",
"type": "atom",
"checkInterval": "hourly",
"notify": true,
"summarize": true,
"publishToCool": false,
"active": true
}'
# Force check all
joelclaw send subscription/check-feeds
# Check single
joelclaw send subscription/check-single -d '{"subscriptionId": "simon-willison-blog"}'
Subscription Types
| Type |
Detection |
Method |
Best For |
atom / rss |
URL ends in /atom/, /feed/, /rss or has XML content-type |
Standard feed parse |
Blogs, newsletters |
github |
github.com/<owner>/<repo> |
GitHub API (releases, commits) |
Open source projects |
page |
Any other URL |
Content hash diff via defuddle |
Living documents, guides |
bluesky |
bsky.app or AT Protocol handle |
AT Protocol feed |
Social/microblog |
Auto-Detection Heuristics
When adding a subscription, detect the type:
- GitHub URL →
github type, check releases + significant commits
- URL with
/atom/ or /feed/ → atom type
- URL with
/rss → rss type
- Blog root URL → try
{url}/atom/, {url}/feed/, {url}/rss.xml before falling back to page
- Everything else →
page type (content hash diff)
How Updates Flow
Inngest cron (hourly) → subscription/check-feeds
→ fans out: subscription/check-single per subscription
→ fetch feed / API / page hash
→ new entries detected?
→ YES: subscription/summarize → LLM summary
→ gateway notification with [Publish to /cool] [Dismiss]
→ Joel approves → discovery/noted → vault note → /cool
→ NO: log quiet check, move on
Notification Format
Gateway notifications for feed updates include:
- Source name and subscription type
- Brief LLM summary of what changed
- Entry count and links to significant items
- Relevance tag (which interest areas it maps to)
- Action buttons: [Publish to /cool] [Dismiss]
Adding from Discovery
When the discovery skill fires and the agent assesses the resource is monitorable, use MCQ to recommend:
After firing joelclaw discover:
1. Assess: Is this a blog, repo, or living page with ongoing updates?
2. Assess: Does it map to 2+ items in Joel's Interest Profile above?
3. If both yes → recommend monitoring via MCQ with brief reasoning
4. If monitorable but low relevance → mention it's monitorable but don't push
5. If not monitorable (one-shot article, tweet, etc.) → don't mention monitoring
Backend
- Redis storage:
joelclaw:subscriptions hash (lib at packages/system-bus/src/lib/subscriptions.ts)
- Inngest functions:
packages/system-bus/src/inngest/functions/subscriptions.ts
- Feed checker:
packages/system-bus/src/lib/feed-checker.ts
- ADR:
~/Vault/docs/decisions/0127-feed-subscriptions-and-resource-monitoring.md
1---
2name: monitor
3displayName: Resource Monitor
4description: "Manage feed subscriptions that track blogs, repos, and living pages for changes. Use when adding, listing, removing, or checking monitored resources. Also use when the discovery skill flags a resource as monitorable. Triggers on: 'monitor this', 'subscribe to', 'track this repo', 'watch this blog', 'what are we monitoring', 'check feeds', 'unsubscribe', 'stop monitoring', or any task involving feed subscriptions."
5version: 1.0.0
6author: Joel Hooks
7tags: [joelclaw, monitor, feeds, subscriptions, rss, github, discovery]
8disable-model-invocation: true
9---
10
11# Resource Monitor — Track What Matters
12
13Manage the feed subscription system (ADR-0127). Inngest cron checks subscriptions hourly, detects changes, summarizes via LLM, and notifies Joel via gateway with approve/dismiss for `/cool` publishing.
14
15## Joel's Interest Profile
16
17Use this to assess whether a discovered resource is worth monitoring. If a resource clearly maps to 2+ of these, **recommend monitoring** with a brief explanation.
18
19- **Agentic AI** — agent patterns, agent infrastructure, tool use, MCP, multi-agent systems
20- **Developer education** — course platforms, learning design, course-builder ecosystem
21- **TypeScript tooling** — Effect ecosystem, Bun, type-level programming, compiler work
22- **Inngest / durable workflows** — event-driven systems, step functions, background jobs
23- **Personal AI systems** — local-first AI, semantic memory, knowledge management, RAG
24- **BEAM / Elixir / OTP** — Erlang ecosystem, actor model, fault tolerance
25- **Video infrastructure** — Mux, transcription, media pipelines
26- **Next.js / React** — RSC, App Router, cache components, Vercel platform
27- **CLI design** — agent-first interfaces, HATEOAS, terminal UIs
28- **Knowledge management** — Obsidian, digital gardens, PKM, zettelkasten
29- **Self-hosted infra** — homelab, k8s, Tailscale, NAS, local services
30- **AT Protocol / Bluesky** — decentralized web, PDS, lexicons
31- **Convex** — real-time database, reactive backends
32
33## CLI Commands
34
35```bash
36# List all monitored subscriptions
37joelclaw subscribe list
38
39# Add a subscription (auto-detects type from URL)
40joelclaw subscribe add <url> --name "Simon Willison" --interval hourly
41joelclaw subscribe add <url> --name "json-render" --type github --interval daily
42
43# Remove a subscription
44joelclaw subscribe remove <id>
45
46# Force-check a specific subscription now
47joelclaw subscribe check --id <id>
48
49# Force-check all subscriptions
50joelclaw subscribe check
51
52# Show recent updates across all subscriptions
53joelclaw subscribe summary
54```
55
56### Direct Inngest Fallback (alternative)
57
58```bash
59# Add subscription via event
60joelclaw send subscription/add -d '{
61 "id": "simon-willison-blog",
62 "name": "Simon Willison",
63 "feedUrl": "https://simonwillison.net/atom/everything/",
64 "type": "atom",
65 "checkInterval": "hourly",
66 "notify": true,
67 "summarize": true,
68 "publishToCool": false,
69 "active": true
70}'
71
72# Force check all
73joelclaw send subscription/check-feeds
74
75# Check single
76joelclaw send subscription/check-single -d '{"subscriptionId": "simon-willison-blog"}'
77```
78
79## Subscription Types
80
81| Type | Detection | Method | Best For |
82|------|-----------|--------|----------|
83| `atom` / `rss` | URL ends in `/atom/`, `/feed/`, `/rss` or has XML content-type | Standard feed parse | Blogs, newsletters |
84| `github` | `github.com/<owner>/<repo>` | GitHub API (releases, commits) | Open source projects |
85| `page` | Any other URL | Content hash diff via defuddle | Living documents, guides |
86| `bluesky` | `bsky.app` or AT Protocol handle | AT Protocol feed | Social/microblog |
87
88## Auto-Detection Heuristics
89
90When adding a subscription, detect the type:
91
921. **GitHub URL** → `github` type, check releases + significant commits
932. **URL with `/atom/` or `/feed/`** → `atom` type
943. **URL with `/rss`** → `rss` type
954. **Blog root URL** → try `{url}/atom/`, `{url}/feed/`, `{url}/rss.xml` before falling back to `page`
965. **Everything else** → `page` type (content hash diff)
97
98## How Updates Flow
99
100```
101Inngest cron (hourly) → subscription/check-feeds
102 → fans out: subscription/check-single per subscription
103 → fetch feed / API / page hash
104 → new entries detected?
105 → YES: subscription/summarize → LLM summary
106 → gateway notification with [Publish to /cool] [Dismiss]
107 → Joel approves → discovery/noted → vault note → /cool
108 → NO: log quiet check, move on
109```
110
111## Notification Format
112
113Gateway notifications for feed updates include:
114- **Source name** and subscription type
115- **Brief LLM summary** of what changed
116- **Entry count** and links to significant items
117- **Relevance tag** (which interest areas it maps to)
118- **Action buttons**: [Publish to /cool] [Dismiss]
119
120## Adding from Discovery
121
122When the discovery skill fires and the agent assesses the resource is monitorable, use MCQ to recommend:
123
124```
125After firing joelclaw discover:
126
1271. Assess: Is this a blog, repo, or living page with ongoing updates?
1282. Assess: Does it map to 2+ items in Joel's Interest Profile above?
1293. If both yes → recommend monitoring via MCQ with brief reasoning
1304. If monitorable but low relevance → mention it's monitorable but don't push
1315. If not monitorable (one-shot article, tweet, etc.) → don't mention monitoring
132```
133
134## Backend
135
136- **Redis storage**: `joelclaw:subscriptions` hash (lib at `packages/system-bus/src/lib/subscriptions.ts`)
137- **Inngest functions**: `packages/system-bus/src/inngest/functions/subscriptions.ts`
138- **Feed checker**: `packages/system-bus/src/lib/feed-checker.ts`
139- **ADR**: `~/Vault/docs/decisions/0127-feed-subscriptions-and-resource-monitoring.md`