No Cap
by @zephyr2800
Automatically ingest X/Twitter bookmarks, filter noise, and extract actionable signals. Run to process new bookmarks into structured intelligence.
clawhub install no-capπ About This Skill
name: no-cap description: Automatically ingest X/Twitter bookmarks, filter noise, and extract actionable signals. Run to process new bookmarks into structured intelligence. user_invocable: true
/no-cap
Extract signal from noise. Pulls your recent X/Twitter bookmarks, filters out marketing/spam/engagement bait, and extracts actionable intelligence. Dual output: structured markdown for agents, HTML email digest for humans.
Commands
/no-cap β Process new bookmarks (main loop)/no-cap setup β Configure ingestion method, auth, output directory/no-cap auto-login β Extract X cookies from Chrome (recommended, one-time)/no-cap status β Show stats and last run info/no-cap update-cookies β Update X session cookies when they expire (without re-running full setup)Setup Flow (/no-cap setup)
Guide the user through configuration:
1. Sign into X β Detect the user's platform and guide accordingly:
macOS users β Run the auto-login command:
cd {repoPath} && npx tsx src/cli.ts auto-login
This extracts X cookies from Chrome automatically. macOS will prompt for Keychain access β click Allow. Windows / Linux users β Auto-login is macOS only. Guide them through the manual method:
1. Open Chrome β go to x.com
2. Press F12 (DevTools) β Application tab β Cookies β https://x.com
3. Copy the values for auth_token and ct0
4. Run:
cd {repoPath} && npx tsx src/cli.ts update-cookies
Note: cookies expire roughly every 30 days. When the user sees an auth error, guide them to repeat these steps.2. Output directory β Ask where to save signals (default: ~/no-cap-signals/)
3. Interests & sections β Ask: "What topics or projects are you tracking? These become sections in your digest."
- Let the user list topics freeform (e.g., "AI agents", "fine-tuning LLMs", "marketing", "Claude Code")
- Also ask if they have active projects they want signals routed to (e.g., "my-app β AI dashboard", "trading bot")
- Save these as interests and projects arrays in config
- These guide how signals get categorized and routed β they're not hard filters, just lenses
4. Email digest β Ask if they want an HTML email digest after each run. If yes: - Ask for their email address - Ask for their Resend API key (free at https://resend.com β 100 emails/day on free tier) - No MCP plugins or heavy dependencies needed
5. Write config to ~/.no-cap/config.json using the Write tool. Set file permissions to 600 (owner-only read/write) since it contains session credentials. Make sure repoPath is set in the config to the directory where no-cap is installed.
6. Test run β Do a test fetch to verify credentials work:
cd {repoPath} && npx tsx src/cli.ts fetch
Where {repoPath} is the repoPath field from ~/.no-cap/config.json.
If it errors on auth, guide the user to re-check their cookies.Main Loop (/no-cap)
First, read the no-cap config to get the repo path:
~/.no-cap/config.json and extract the repoPath field{repoPath})Step 1: Fetch new bookmarks
Run the CLI to get new bookmarks:
cd {repoPath} && npx tsx src/cli.ts fetch
This returns JSON with new bookmarks (already diffed against state). If "No new bookmarks" β tell the user and stop.
Step 2: Noise Filter (3 layers)
For each bookmark, evaluate through three layers. Be aggressive β most content is noise.
Layer 1 β Account-level:
Layer 2 β Post-level:
x.com/i/article/...)? The link-follower now automatically fetches article title + preview text via the X API. If the bookmark text starts with [Article: ...], the article content was successfully enriched β evaluate it through the normal noise filter using that content. If enrichment failed and the text is still just a bare URL, pass it through as a learning signal with the article link so the user can click through β do NOT auto-filter it as noise.Layer 3 β Content-level:
Important: Signal-in-the-noise. A post can be mostly noise but still contain a real idea buried inside the hype. For example, a Polymarket trading post might be 80% marketing fluff but contain a genuinely novel arbitrage mechanism. A course seller might drop a real technique in their pitch thread. When you filter a post as noise, always check: is there a kernel worth extracting? If yes, classify it as partial_signal β extract the idea but note what's noise around it. These go in a separate "Signal in the Noise" section, not the main signals.
Step 3: Classify bookmark intent
Before extracting signals, classify WHY the user bookmarked this. People bookmark for different reasons:
| Intent | Description | Example |
|--------|-------------|---------|
| signal | Contains an actionable insight, technique, or pattern | "MCTS for agent decision-making replaces brute-force loops" |
| action_item | Something the user should DO β a course, exam, event, tool to try, tutorial to follow | "Claude Code architect certification exam is now open" |
| project_signal | Relevant to a specific project the user is working on (check config projects) | A post about WASM sandboxing when user has an agent platform project |
| learning | Educational content worth saving for reference β deep dives, papers, threads | "Comprehensive thread on transformer architecture internals" |
| tool | A tool, library, or resource worth bookmarking | "New CLI tool for X/Twitter data export" |
Do NOT filter out action items as noise. A post about "how to pass the Claude Code architect exam" is not marketing β it's something the user wants to be reminded to do. Same for events, courses, tutorials, deadlines.
Step 4: Extract signals and action items
For each bookmark that passed noise filtering, extract based on its intent:
For signals and project_signals:
Title: One-sentence summary of the core idea
Type: technical_insight | market_signal | workflow | tool | trend | opinion
Intent: signal | project_signal
Project: [which project, if project_signal β match against config projects]
Actionability: immediate | near_term | reference
Tags: [freeform topic tags β try to match user's configured interests]
Source: @handle, URL, date
Context: Why this matters β 2-3 sentences. Strip narrative, isolate the mechanism.
For action items:
Title: What to do β imperative form ("Take Claude Code architect exam", "Try Resend for email")
Intent: action_item
Priority: high | medium | low
Source: @handle, URL, date
Context: Why this is worth doing β 1-2 sentences
For learning resources:
Title: What this teaches
Intent: learning
Tags: [topic tags]
Source: @handle, URL, date
Context: What you'll learn β 1-2 sentences
If the bookmark has a quoted tweet or linked post (from link propagation), include that context in the analysis.
Step 5: Write agent output
Session file β Write to {signalDir}/{YYYY-MM-DD}/session-{N}.md:
# YYYY-MM-DD β Session NSignals
[Theme Name]
[Signal 1] β [2-3 sentence context with the mechanism, why it matters, and source] (@handle)
[Signal 2] β [context] (@handle, @handle2) [Theme Name 2]
[Signal] β [context] (@handle) Project Signals
[Only if user has projects configured][Project Name]:
[Signal] β [why it matters for this project] (@handle) Action Items
[ ] [What to do] β [brief context] (@handle) β Priority: high/medium/low Signal in the Noise
[Extracted idea] β [context]. Source is noisy because [reason]. (@handle) Noise
[What the post was about] β Filtered because: [specific reason] (@handle) Stats
Processed: X | Signals: Y | Actions: Z | Noise: N
Determine session number by counting existing session files in today's directory.
Master file β Read {signalDir}/MASTER.md, then rewrite to reflect cumulative state. This file is YOUR primary reference β write it so you (Claude) can load it next session and immediately understand what's happening, what matters, and what to do.
Structure:
# No Cap β Signal Master_Last updated: YYYY-MM-DD_
_Sessions: N total | Latest: YYYY-MM-DD_
New Since Last Session
[Quick diff β what changed this run. 2-3 sentences max. Remove this section when the next session runs.]Project Signals
[Grouped by the user's configured projects. Each signal has enough context to act on without reading the source.][Project Name]
[Signal title]
[2-3 sentences: what it is, why it matters for this project, what the mechanism/technique is. Include enough detail that you could reason about it or suggest actions without going back to the tweet.]
Source: @handle Β· YYYY-MM-DD Β· actionability
Connects to: [what existing project work this relates to]
Unrouted
[Signals that don't map to any configured project but are still actionable]Action Items
[ ] [Action] β [context] (source, date) β Priority: high/medium/low Noise Patterns
[Recurring noise patterns across sessions β accounts/topics to auto-filter. This section compounds over time.]
@handle β [pattern] (seen N times) Historical
[Signals that have been acted on or are >30 days stale. Compressed to one-liners.]
Writing principles for MASTER.md:
Step 6: Generate and send email digest (if configured)
Generate the email digest HTML using the EXACT template structure below. Do NOT improvise the layout β use this template and fill in the content. The template has been tested across email clients and renders correctly.
How to use the template:
1. Copy the template below
2. Replace {date}, {theme_count}, {action_count} in the header
3. Replace {tldr} with 2-3 sentence TL;DR
4. For each action item: copy the action card block, fill in icon emoji, title, description, and source link
5. For each signal theme: copy the signal card block, fill in icon emoji, heading, prose paragraph, and source handles
6. For secondary/reference signals (lower priority): use the two-column card block
7. For project signals (if configured): use the project card block
8. For noise: fill in the noise entries
9. Write the completed HTML to {signalDir}/{YYYY-MM-DD}/digest-{N}.html
IMPORTANT: Use
no cap Signal from noise · {date} {theme_count} themes · {action_count} actions
{tldr}
To Do
{action_title} {action_description} β {action_source}
Signals
{signal_heading} {signal_prose} {signal_sources}
{col1_heading} {col1_prose} {col1_note} {col2_heading} {col2_prose} {col2_note}
{project_name} {project_signals_prose}
Filtered · {noise_count} {noise_entry}
no cap Signal from noise · Built with Claude Code Powered by No Cap skill Rules for using the template:
Save the HTML to If email is configured, send it:
First run only (no After successful processing, mark the newest bookmark as processed:
After processing, print:
Show the output to the user. When the user's X cookies expire (usually every ~30 days), they'll see an auth error. Instead of re-running full setup: 1. Guide them to get fresh cookies: open X in browser β Dev Tools (F12) β Application β Cookies β This preserves all other settings (output dir, interests, email config). "Not logged into X" or "Missing auth_token"
"X API returned 400" or "X authentication failed"
"No new bookmarks" when you know you have new ones
"Not logged into X" or "Missing auth_token"
"X API returned 400" or "X authentication failed"
"No new bookmarks" when you know you have new ones
valign="top" on all icon elements. Set icon text-align:center;line-height:36px (or 40px for signal icons). This keeps icons centered in their squares.
@handle for signal/noise source lines and @handle for action card sources. For quoted tweet authors, link to the quoted tweet URL. The tweet URL comes from the bookmark data (url field, or quotedTweet.url for QT authors) β never link to just the profile page. Plain text @handle with no tag is a bug.{signalDir}/{YYYY-MM-DD}/digest-{N}.html.cd {repoPath} && npx tsx src/cli.ts send-email "No Cap β {N} signals from {date}" "{signalDir}/{YYYY-MM-DD}/digest-{N}.html"
{signalDir}/state.json existed before this run): After sending the email, print this warning:β οΈ FIRST-RUN NOTICE: CHECK YOUR SPAM FOLDER
Emails from No Cap are sent via Resend (from onboarding@resend.dev).
Your email provider may flag the first one as spam.
If you don't see it in your inbox, check spam/junk and mark it as "Not Spam"
so future digests land in your inbox.
Step 7: Update state
cd {repoPath} && npx tsx src/cli.ts mark-done {newestBookmarkId}
Step 8: Print summary
No Cap β {date}
Processed: {X} bookmarks
Signals: {Y} | Action items: {Z} | Learning: {W}
Noise filtered: {N}
Saved to: {signalDir}/{date}/session-{N}.md
Master updated: {signalDir}/MASTER.md
{Email sent to: address | Email digest saved to: path}
Status (
/no-cap status)cd {repoPath} && npx tsx src/cli.ts status
Update Cookies (
/no-cap update-cookies)x.com β copy auth_token and ct0
2. Run the update command:
3. The command updates the config and runs a test fetch to verify.cd {repoPath} && npx tsx src/cli.ts update-cookies Troubleshooting
cd {repoPath} && npx tsx src/cli.ts auto-loginupdate-cookiescd {repoPath} && npx tsx src/cli.ts discover/no-cap update-cookies{signalDir}/state.json to reset, then run /no-cap againPrinciples
π Tips & Best Practices
cd {repoPath} && npx tsx src/cli.ts auto-loginupdate-cookiescd {repoPath} && npx tsx src/cli.ts discover/no-cap update-cookies{signalDir}/state.json to reset, then run /no-cap again