/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) - INLINECODE1 — Configure ingestion method, auth, output directory
- INLINECODE2 — Extract X cookies from Chrome (recommended, one-time)
- INLINECODE3 — Show stats and last run info
- INLINECODE4 — 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 <auth_token> <ct0>
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:
- - Read
~/.no-cap/config.json and extract the repoPath field - Use this path in all CLI commands below (shown as
{repoPath})
Step 1: Fetch new bookmarks
Run the CLI to get new bookmarks:
CODEBLOCK3
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:
- - Is this a marketing/promo account? (constant CTAs, course selling, affiliate patterns)
- Is the author repeating the same pitch across multiple bookmarks?
- Did the account recently pivot to whatever's trending? (carpet-bagging)
- Output: PASS or FILTERED with reason
Layer 2 — Post-level:
- - Contains affiliate/referral links? → NOISE
- "Link in bio" / "DM me for" patterns? → NOISE
- Engagement bait structure? (rage bait, false urgency, vague boasts) → NOISE
- Is this an ad or sponsored content? → NOISE
- Is this just a meme or joke with no insight? → NOISE (unless genuinely clever insight underneath)
- Bare link to an X article (
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. - Output: PASS or FILTERED with reason
Layer 3 — Content-level:
- - Is there an extractable idea, technique, pattern, or insight?
- Is it novel, or common knowledge repackaged?
- Is it specific (concrete details, examples, code) or vague platitudes?
- Would this change how someone builds, thinks, or decides?
- Strong opinions from indie creators with genuine experience ARE signal — don't filter opinions that come from real expertise
- Output: PASS (with signal preview) or FILTERED with reason
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:
CODEBLOCK4
For action items:
CODEBLOCK5
For learning resources:
CODEBLOCK6
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:
CODEBLOCK7
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:
CODEBLOCK8
Writing principles for MASTER.md:
- - Write for yourself (Claude). This is agent context, not human docs. Include the mechanism, not just the name.
- Map to projects first, topics second. The user configured their projects for a reason — route signals there.
- Include enough detail to act. "FlashCompact exists" is useless. "FlashCompact: purpose-built context compaction model, 33K tok/s, 200K→50K in 1.5s, not the usual LLM+vectorDB pattern — relevant to No Cap's context window problem" is actionable.
- Compound noise patterns. If @IndieGameJoe shows up as noise 3 sessions in a row, note the pattern so future runs auto-filter.
- Keep it under 200 lines. Compress old signals to historical when they're stale or acted on.
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
- Replace
{date}, {theme_count}, {action_count} in the header - Replace
{tldr} with 2-3 sentence TL;DR - For each action item: copy the action card block, fill in icon emoji, title, description, and source link
- For each signal theme: copy the signal card block, fill in icon emoji, heading, prose paragraph, and source handles
- For secondary/reference signals (lower priority): use the two-column card block
- For project signals (if configured): use the project card block
- For noise: fill in the noise entries
- Write the completed HTML to INLINECODE32
IMPORTANT: Use valign="top" on all icon <td> elements. Set icon <div> with text-align:center;line-height:36px (or 40px for signal icons). This keeps icons centered in their squares.
INLINECODE37
Rules for using the template:
- - Do NOT change any styles, padding, colors, or border-radius values
- Do NOT invent new card layouts or section types — use only the blocks above
- Omit sections that don't apply (e.g., skip To Do if no action items, skip Project Card if no projects)
- For the two-column layout: only use when you have exactly 2 secondary/reference signals. Otherwise use full-width signal cards.
- Pick a relevant emoji for each icon. Keep it simple — one emoji per icon square.
- Noise entries should say what the post was about AND why it was filtered.
- EVERY @handle in the ENTIRE email MUST be a clickable link to the original tweet. This applies to ALL sections: action cards, signal cards, two-column cards, project cards, noise entries — no exceptions. Use
<a href="{tweet_url}" style="color:#b0aea5;text-decoration:underline;">@handle</a> for signal/noise source lines and <a href="{tweet_url}" style="color:#87867f;text-decoration:underline;">@handle</a> 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 <a> tag is a bug.
Save the HTML to {signalDir}/{YYYY-MM-DD}/digest-{N}.html.
If email is configured, send it:
CODEBLOCK10
First run only (no {signalDir}/state.json existed before this run): After sending the email, print this warning:
CODEBLOCK11
Step 7: Update state
After successful processing, mark the newest bookmark as processed:
CODEBLOCK12
Step 8: Print summary
After processing, print:
CODEBLOCK13
Status (/no-cap status)
CODEBLOCK14
Show the output to the user.
Update Cookies (/no-cap update-cookies)
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 →
x.com → copy auth_token and INLINECODE50 - Run the update command:
cd {repoPath} && npx tsx src/cli.ts update-cookies <auth_token> <ct0>
- 3. The command updates the config and runs a test fetch to verify.
This preserves all other settings (output dir, interests, email config).
Troubleshooting
"Not logged into X" or "Missing auth_token"
- - Run: INLINECODE51
- macOS will prompt for Keychain access — click Allow
- If auto-login fails, manually copy cookies from Chrome DevTools and run INLINECODE52
"X API returned 400" or "X authentication failed"
- - The CLI auto-retries with fresh query IDs on 400/404 errors
- If it still fails, run: INLINECODE53
- If discover doesn't help, cookies may be expired — run INLINECODE54
"No new bookmarks" when you know you have new ones
- - The high-water mark may be set to a bookmark you deleted
- Fix: delete
{signalDir}/state.json to reset, then run /no-cap again
Principles
- - Assume noise until proven signal. Most bookmarked content is still mostly noise.
- Strong opinions from practitioners are signal. An indie dev with real experience sharing a genuine opinion — even a hot take — is not noise. Marketing is noise.
- Not everything is a signal — some things are action items. "Take this exam", "try this tool", "attend this event" are not signals to extract — they're things to DO. Classify them as action items with clear next steps.
- Extract the mechanism, not the story. Strip narrative, isolate what's actually useful.
- Use configured interests as lenses, not filters. The user's topics and projects guide categorization, but don't filter out things that don't match — unexpected signals are often the most valuable.
- Route, don't hoard. Every signal should end up somewhere useful — a project, an action item, or a learning resource.
/no-cap
从噪音中提取信号。拉取你最近的X/Twitter书签,过滤掉营销/垃圾/互动诱饵内容,并提取可操作的情报。双重输出:面向智能体的结构化Markdown,面向人类的HTML邮件摘要。
命令
- - /no-cap — 处理新书签(主循环)
- /no-cap setup — 配置获取方式、认证、输出目录
- /no-cap auto-login — 从Chrome提取X cookies(推荐,一次性操作)
- /no-cap status — 显示统计信息和上次运行详情
- /no-cap update-cookies — 在X会话cookies过期时更新(无需重新运行完整设置)
设置流程(/no-cap setup)
引导用户完成配置:
- 1. 登录X — 检测用户平台并相应引导:
macOS用户 — 运行自动登录命令:
bash
cd {repoPath} && npx tsx src/cli.ts auto-login
这会自动从Chrome提取X cookies。macOS会提示钥匙串访问权限——点击允许。
Windows / Linux用户 — 自动登录仅限macOS。引导他们通过手动方式操作:
1. 打开Chrome → 访问x.com
2. 按F12(开发者工具)→ Application标签 → Cookies → https://x.com
3. 复制auth_token和ct0的值
4. 运行:
bash
cd {repoPath} && npx tsx src/cli.ts update-cookies
注意:cookies大约每30天过期一次。当用户看到认证错误时,引导他们重复这些步骤。
- 2. 输出目录 — 询问保存信号的位置(默认:~/no-cap-signals/)
- 3. 兴趣与板块 — 询问:你在追踪哪些主题或项目?这些会成为你摘要中的板块。
- 让用户自由列出主题(例如:AI智能体、微调LLM、营销、Claude Code)
- 同时询问他们是否有希望信号被路由到的活跃项目(例如:我的应用 — AI仪表盘、交易机器人)
- 将这些保存为配置中的interests和projects数组
- 这些用于指导信号如何分类和路由——它们不是硬性过滤器,只是视角
- 4. 邮件摘要 — 询问是否希望每次运行后收到HTML邮件摘要。如果是:
- 询问他们的邮箱地址
- 询问他们的Resend API密钥(免费获取于https://resend.com — 免费版每天100封邮件)
- 无需MCP插件或繁重依赖
- 5. 使用Write工具将配置写入~/.no-cap/config.json。将文件权限设置为600(仅所有者读写),因为其中包含会话凭证。确保配置中设置了repoPath,指向no-cap的安装目录。
- 6. 测试运行 — 进行测试获取以验证凭证是否有效:
bash
cd {repoPath} && npx tsx src/cli.ts fetch
其中{repoPath}是~/.no-cap/config.json中的repoPath字段。
如果认证出错,引导用户重新检查他们的cookies。
主循环(/no-cap)
首先,读取no-cap配置以获取仓库路径:
- - 读取~/.no-cap/config.json并提取repoPath字段
- 在以下所有CLI命令中使用此路径(显示为{repoPath})
步骤1:获取新书签
运行CLI获取新书签:
bash
cd {repoPath} && npx tsx src/cli.ts fetch
这会返回包含新书签的JSON(已与状态进行差异对比)。如果显示没有新书签——告知用户并停止。
步骤2:噪音过滤(3层)
对每个书签,通过三层进行评估。要激进——大多数内容都是噪音。
第一层 — 账号级别:
- - 这是营销/推广账号吗?(持续的行动号召、课程销售、联盟营销模式)
- 作者是否在多个书签中重复相同的推销内容?
- 该账号是否最近转向了热门话题?(投机取巧)
- 输出:通过 或 已过滤(附原因)
第二层 — 帖子级别:
- - 包含联盟/推荐链接?→ 噪音
- 个人简介中的链接 / 私信我获取模式?→ 噪音
- 互动诱饵结构?(愤怒诱饵、虚假紧迫感、模糊吹嘘)→ 噪音
- 这是广告或赞助内容吗?→ 噪音
- 这只是没有洞见的梗或笑话吗?→ 噪音(除非底下有真正巧妙的洞见)
- X文章的裸链接(x.com/i/article/...)? 链接追踪器现在会自动通过X API获取文章标题+预览文本。如果书签文本以[Article: ...]开头,说明文章内容已成功丰富——使用该内容通过正常的噪音过滤器进行评估。如果丰富失败且文本仍然是裸URL,则将其作为learning信号传递,附带文章链接以便用户点击查看——不要自动将其过滤为噪音。
- 输出:通过 或 已过滤(附原因)
第三层 — 内容级别:
- - 是否有可提取的想法、技术、模式或洞见?
- 是新颖的,还是重新包装的常识?
- 是具体的(具体细节、示例、代码)还是模糊的陈词滥调?
- 这会改变某人构建、思考或决策的方式吗?
- 来自拥有真实经验的独立创作者的强烈观点是信号——不要过滤来自真正专业知识的观点
- 输出:通过(附信号预览)或 已过滤(附原因)
重要:噪音中的信号。 一个帖子可能大部分是噪音,但仍然包含一个埋藏在炒作中的真正想法。例如,一个Polymarket交易帖子可能80%是营销废话,但包含一个真正新颖的套利机制。一个课程销售者可能在他们的推销帖中透露一个真正的技术。当你将帖子过滤为噪音时,始终检查:是否有值得提取的内核? 如果是,将其分类为partial_signal——提取想法但指出周围哪些是噪音。这些进入单独的噪音中的信号板块,而不是主要信号。
步骤3:分类书签意图
在提取信号之前,分类用户为何收藏此书签。人们出于不同原因收藏:
| 意图 | 描述 | 示例 |
|---|
| 信号 | 包含可操作的洞见、技术或模式 | 用于智能体决策的MCTS替代了暴力循环 |
| 行动项 |
用户应该做的事情——课程、考试、活动、要尝试的工具、要跟随的教程 | Claude Code架构师认证考试现已开放 |
|
项目信号 | 与用户正在进行的特定项目相关(检查配置中的projects) | 关于WASM沙箱的帖子,而用户有一个智能体平台项目 |
|
学习 | 值得保存以供参考的教育内容——深度解析、论文、帖子串 | 关于Transformer架构内部的全面帖子串 |
|
工具 | 值得收藏的工具、库或资源 | 用于X/Twitter数据导出的新CLI工具 |
不要将行动项过滤为噪音。 关于如何通过Claude Code架构师考试的帖子不是营销——这是用户希望被提醒要做的事情。活动、课程、教程、截止日期也是如此。
步骤4:提取信号和行动项
对于每个通过噪音过滤的书签,根据其意图提取:
对于信号和项目信号:
标题:核心思想的一句话摘要
类型:技术洞见 | 市场信号 | 工作流 | 工具 | 趋势 | 观点
意图:信号 | 项目信号
项目:[哪个项目,如果是项目信号——与配置中的项目匹配]
可操作性:立即 | 近期 | 参考
标签:[自由格式主题标签——尝试匹配用户配置的兴趣]
来源:@handle, URL, 日期
背景:为什么这很重要——2-3句话。剥离叙事,隔离机制。
对于行动项:
标题:要做什么——祈使形式(参加Claude Code架构师考试、尝试使用Resend发送邮件)
意图:行动项
优先级:高 | 中 | 低
来源:@handle, URL, 日期
背景:为什么值得做——1-2句话
对于学习资源:
标题:这教什么
意图:学习
标签:[主题标签]
来源:@handle, URL, 日期
背景:你将学到什么——1-2句话
如果书签有引用推文或链接帖子(来自链接传播),在分析中包含该背景。
步骤5:编写智能体输出
会话文件 — 写入 {signalDir}/{YYYY-MM-DD}/session-{N}.md:
markdown
YYYY-MM-DD — 会话 N
信号
[主题名称]