agentsclimarketplace

X bookmark triage

Skill jeremyknows/x-bookmark-triage

Turns X/Twitter bookmarks into structured knowledge cards posted to Discord. Claude Haiku triage with tier, freshness, topic tags, and auto-unbookmark.

Install
npx -y skills add jeremyknows/x-bookmark-triage

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Automatically triages X/Twitter bookmarks into structured knowledge cards and posts them to a Discord channel (#knowledge-intake or similar). Captures tweet content via fxtwitter, scores relevance using Claude Haiku, assigns tier (1–10), freshness (evergreen/dated/expired), and topic tags, then optionally unbookmarks after capture. Includes a scheduled poll for new bookmarks, a one-time backlog sweep, and a manual drop handler. Use when: (1) setting up automated bookmark → knowledge card pipeline, (2) draining an existing bookmark backlog, (3) dropping a URL manually for immediate triage, (4) packaging this as a publishable skill for other OpenClaw users. Requires X OAuth 2.0 User Context with bookmark.read scope (+ bookmark.write to unbookmark). Triggers on: "triage my bookmarks", "set up bookmark pipeline", "drain bookmark backlog", "x-bookmark-triage", "knowledge intake".

SKILL.md

8.8 KB, as published. Nobody here has run it

x-bookmark-triage

Turns X/Twitter bookmarks into searchable, tiered knowledge cards posted to a Discord channel. Captures, scores, and optionally unbookmarks — so your bookmark list stays clean and your knowledge base grows automatically.

Works standalone — no OpenClaw required for core triage. OpenClaw integration is optional (adds scheduled polling via cron and bus events). See references/adapting.md for standalone setup.

Architecture

X Bookmarks
    │
    ├── Scheduled poll (2×/day)  → bookmark-poll.js
    ├── Backlog sweep (one-time) → backlog-sweep.js
    └── Manual drop (on mention) → poll-channel.js (launchd poller)
                │
                ▼
        triage-url.js  (fetch → Claude Haiku → card)
                │
                ▼
    Discord #knowledge-intake  (structured card)
                │
                ▼
    X API DELETE /bookmarks/:id  (unbookmark)

Prerequisites

RequirementNotes
X OAuth 2.0 appdeveloper.x.com — Free tier works
Scopesbookmark.read (required) + bookmark.write (for unbookmark)
Discord bot tokenNeeds Send Messages permission in target channel
Anthropic API keyANTHROPIC_DEFAULT_KEY env var
Node.js 18+Scripts use spawnSync, no npm deps

Quick Start (8-step MVP)

  1. Get credentials:

  2. Run auth flow: node scripts/x-oauth2-authorize.js → saves refresh token to data/x-oauth2-token-cache.json

  3. Set env vars: Export X_OAUTH2_CLIENT_ID, X_OAUTH2_CLIENT_SECRET, X_OAUTH2_REFRESH_TOKEN, DISCORD_BOT_TOKEN, ANTHROPIC_DEFAULT_KEY

  4. Set your Discord channel: Set env var KNOWLEDGE_INTAKE_CHANNEL_ID=<your-channel-id> (preferred), OR edit scripts/triage-url.js line 19 to hardcode it.

  5. Test triage: node scripts/triage-url.js https://x.com/@username/status/1234567890 --source "manual drop"

  6. Check Discord: You should see a formatted card in your channel

  7. Verify dedup: Run the command again — should skip (already seen)

  8. Done: Your first card is live. Next: set up scheduling (see Steps 3–4 below)


Setup

1. OAuth 2.0 Authorization

# Run the interactive auth flow
node scripts/x-oauth2-authorize.js
# → Opens browser, captures callback, saves to data/x-oauth2-token-cache.json

Store credentials in your gateway plist (or env):

X_OAUTH2_CLIENT_ID     — app OAuth 2.0 client ID
X_OAUTH2_CLIENT_SECRET — app OAuth 2.0 client secret
X_OAUTH2_REFRESH_TOKEN — from auth flow (auto-rotated by scripts)

The scripts also fall back to reading refresh_token from a secrets JSON file at runtime. See references/oauth-setup.md for full details.

2. Configure Target Channel

Set CHANNEL_ID at the top of scripts/triage-url.js to your Discord channel ID.

3. Register the Scheduled Poll (Optional — for automated polling)

# Register a cron job (9 AM + 5 PM daily)
# In OpenClaw: cron add — see references/cron-setup.md
# You can also run manually: node scripts/bookmark-poll.js

Alternatively, drain all bookmarks one-time:

node scripts/backlog-sweep.js --delay 3

4. Register the launchd Poller (Optional — for automated polling)

Note: scripts/ai.watson.knowledge-intake-poll.plist is a template. Customize it first:

  1. Edit the file to replace /PATH/TO/skills/x-bookmark-triage/scripts/poll-channel.js with the actual path
  2. Replace YOUR_BOT_TOKEN, YOUR_ANTHROPIC_KEY, YOUR_CHANNEL_ID, /PATH/TO/workspace with real values
  3. Copy to LaunchAgents and load:
# After customizing the plist:
cp scripts/ai.watson.knowledge-intake-poll.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/ai.watson.knowledge-intake-poll.plist

Or use OpenClaw to manage it — see references/cron-setup.md.

Scripts

triage-url.js — Core triage engine

node scripts/triage-url.js <url> [--source "bookmark poll"|"manual drop"|"backlog sweep"]
  • Fetches content (fxtwitter for tweets, markdown.new for web pages)
  • Triages with Claude Haiku → produces tier, freshness, topic, tags, proposed action
  • Posts formatted card to Discord
  • Marks URL as seen in data/knowledge-intake-seen.json
  • Exits 0 on success or "already seen"; exits 1 on hard failure

bookmark-poll.js — Scheduled sweep (latest 20)

node scripts/bookmark-poll.js
  • Refreshes OAuth token, fetches 20 most recent bookmarks
  • Calls triage-url.js for each unseen URL
  • Unbookmarks after successful triage (+ already-seen items)
  • Emits bookmark_sweep_complete to bus

backlog-sweep.js — One-time full drain

node scripts/backlog-sweep.js [--dry-run] [--limit 50] [--delay 3] [--no-unbookmark]
  • Pages through ALL bookmarks (up to API limit)
  • --dry-run: list URLs without triaging or unbookmarking
  • --limit N: stop after N bookmarks
  • --delay N: seconds between triage calls (default: 3)
  • Emits backlog_sweep_complete to bus

poll-channel.js — Discord drop handler

node scripts/poll-channel.js
# Or via wrapper: bash scripts/run-poll.sh
  • Polls a Discord channel every 2 min for new messages
  • Extracts URLs from message content
  • Calls triage-url.js for each unseen URL
  • Intended to run as a persistent launchd service

Card Format

Tier 3–10 (work-relevant):

🗂️ **Title** @handle

• The Miracle: what's new/impressive
• Why it matters: connection to your work
• Key Features: [list]
• Proposed Action: specific next step
• Tier: 🥈 Tier 2 — Worth tracking (7/10) — relevance summary
• Freshness: 🌿 evergreen | Topic: #ai
• Tags: #tool #infra
• Link: <url>

Tier 1–2 (off-topic/personal):

📌 **Title** @handle — one-liner summary #personal <url>

Tier Guide

TierLabelMeaning
9–10🥇 Act nowImplement this week
7–8🥈 Worth trackingThread + investigate soon
5–6🥉 Knowledge docRevisit in a sprint
3–4📌 Low priorityInteresting, not actionable
1–2📌 Off-topicPersonal/entertainment — one-liner only

Freshness Values

  • evergreen 🌿 — timeless, still valid in 2 years
  • dated 📅 — relevant but will age (benchmarks, roadmaps)
  • expired ⏰ — time-sensitive, likely already stale

Topic Values (one per card)

#ai · #veefriends · #product · #revenue · #openclaw · #personal · #x-strategy

Token / Cost Estimate

Each triage call: ~3.5K avg input + 300 output tokens (claude-haiku-4-5)

  • Per URL: ~$0.003
  • 20 new bookmarks/run: ~$0.06
  • 2 runs/day at typical throughput: ~$3.60/month
  • Full 1000-bookmark backlog: ~$3.50

Seen-URL Deduplication

URLs are tracked in data/knowledge-intake-seen.json. Cap: 2,000 entries (FIFO). Bookmarks already in the seen cache are still unbookmarked — they were captured in a prior run.

Refresh Token Rotation

X rotates refresh tokens on each use. The scripts:

  1. Detect rotation (new token in response)
  2. Save new token to data/x-oauth2-new-refresh-token.txt
  3. Log a warning to update the plist env var

Watson auto-detects and updates the secrets file. For non-Watson deployments, monitor for this warning and update X_OAUTH2_REFRESH_TOKEN in your env.

References

  • references/oauth-setup.md — Full OAuth 2.0 setup walkthrough
  • references/cron-setup.md — OpenClaw cron registration for scheduled polls
  • references/adapting.md — How to adapt channel IDs, topics, triage prompt for your workspace

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.