{"id":"577c6bfb-77a4-4f26-91e3-df63afdaae22","entityType":"agent","slug":"clawhub-mvanhorn-last30days-official","name":"last30days","canonicalUrl":"https://www.xpersona.co/agent/clawhub-mvanhorn-last30days-official","canonicalPath":"/agent/clawhub-mvanhorn-last30days-official","generatedAt":"2026-10-10T03:26:39.990Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":null},"description":"Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'. Skill: last30days Owner: mvanhorn Summary: Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'. Tags: latest:3.0.0-open Version history: v3.0.0-open | 2026-04-08T17:57:27.835Z | auto last30days v3.0.0-open: Major update with multi-mode research, persistent knowledge, and wa","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 9.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17ea85t738dtyvg6gkwt7zt5h84596q:last30days-official","sourceUrl":"https://clawhub.ai/mvanhorn/last30days-official","homepage":"https://clawhub.ai/mvanhorn/skills/last30days-official","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/mvanhorn/last30days-official","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/mvanhorn/skills/last30days-official","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":72,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and r"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":null},"stars":null,"forks":null,"downloads":9156,"packageName":null,"latestVersion":"3.0.0-open","tractionLabel":"9.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T02:31:30.020Z","lastCrawledAt":"2026-10-09T02:31:30.020Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T02:31:30.020Z","lastVerifiedAt":null,"highlights":[{"version":"3.0.0-open","createdAt":"2026-04-08T17:57:27.835Z","changelog":"last30days v3.0.0-open: Major update with multi-mode research, persistent knowledge, and watchlist features. - Added support for multiple modes: one-shot research, watchlist management, daily briefing, and query of accumulated knowledge. - Introduced persistent storage: SQLite research database and saved briefings. - Expanded sources: now includes Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. - Modular command routing via first argument (e.g. `watch`, `briefing`, `history`, or direct research topic). - Improved API key handling and source availability checks. - Reference-driven flow: each mode uses dedicated instructions, improving reliability and flexibility.","fileCount":67,"zipByteSize":216154},{"version":"2.9.3","createdAt":"2026-03-07T02:35:58.867Z","changelog":"Security scan improvements: declared AUTH_TOKEN/CT0 in optionalEnv, clarified X token access language (no browser session access), added permissions overview block, removed prompt-injection false positive","fileCount":47,"zipByteSize":188453},{"version":"2.9.1","createdAt":"2026-03-07T02:07:45.759Z","changelog":"Initial ClawHub release. v2.9.1: auto-save to ~/Documents/Last30Days/, ScrapeCreators Reddit backend, smart subreddit discovery, top comment elevation, Instagram Reels (8th source), TikTok, Polymarket, HN, X, YouTube.","fileCount":47,"zipByteSize":187933}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ea85t738dtyvg6gkwt7zt5h84596q:last30days-official","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T03:26:39.986Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mvanhorn-last30days-official/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":null},"readme":"Skill: last30days\n\nOwner: mvanhorn\n\nSummary: Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'.\n\nTags: latest:3.0.0-open\n\nVersion history:\n\nv3.0.0-open | 2026-04-08T17:57:27.835Z | auto\n\nlast30days v3.0.0-open: Major update with multi-mode research, persistent knowledge, and watchlist features.\n\n- Added support for multiple modes: one-shot research, watchlist management, daily briefing, and query of accumulated knowledge.\n- Introduced persistent storage: SQLite research database and saved briefings.\n- Expanded sources: now includes Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more.\n- Modular command routing via first argument (e.g. `watch`, `briefing`, `history`, or direct research topic).\n- Improved API key handling and source availability checks.\n- Reference-driven flow: each mode uses dedicated instructions, improving reliability and flexibility.\n\nv2.9.3 | 2026-03-07T02:35:58.867Z | user\n\nSecurity scan improvements: declared AUTH_TOKEN/CT0 in optionalEnv, clarified X token access language (no browser session access), added permissions overview block, removed prompt-injection false positive\n\nv2.9.1 | 2026-03-07T02:07:45.759Z | user\n\nInitial ClawHub release. v2.9.1: auto-save to ~/Documents/Last30Days/, ScrapeCreators Reddit backend, smart subreddit discovery, top comment elevation, Instagram Reels (8th source), TikTok, Polymarket, HN, X, YouTube.\n\nArchive index:\n\nArchive v3.0.0-open: 67 files, 216154 bytes\n\nFiles: CHANGELOG.md (11485b), context.md (634b), references/briefing.md (1854b), references/history.md (2096b), references/research.md (23389b), references/watchlist.md (2897b), scripts/briefing.py (8306b), scripts/last30days.py (15315b), scripts/lib/__init__.py (29b), scripts/lib/bird_x.py (15630b), scripts/lib/bluesky.py (7514b), scripts/lib/cluster.py (10269b), scripts/lib/dates.py (3201b), scripts/lib/dedupe.py (2428b), scripts/lib/entity_extract.py (4205b), scripts/lib/env.py (17874b), scripts/lib/fusion.py (8287b), scripts/lib/github.py (34695b), scripts/lib/grounding.py (9030b), scripts/lib/hackernews.py (9784b), scripts/lib/http.py (6567b), scripts/lib/instagram.py (17152b), scripts/lib/log.py (831b), scripts/lib/normalize.py (15718b), scripts/lib/perplexity.py (4789b), scripts/lib/pinterest.py (6308b), scripts/lib/pipeline.py (38709b), scripts/lib/planner.py (22673b), scripts/lib/polymarket.py (26452b), scripts/lib/providers.py (15865b), scripts/lib/quality_nudge.py (6439b), scripts/lib/query.py (4018b), scripts/lib/reddit_enrich.py (9535b), scripts/lib/reddit_public.py (12662b), scripts/lib/reddit.py (27329b), scripts/lib/relevance.py (5191b), scripts/lib/render.py (25522b), scripts/lib/rerank.py (10982b), scripts/lib/resolve.py (7350b), scripts/lib/schema.py (11271b), scripts/lib/setup_wizard.py (18089b), scripts/lib/signals.py (8274b), scripts/lib/snippet.py (1398b), scripts/lib/threads.py (8048b), scripts/lib/tiktok.py (18851b), scripts/lib/truthsocial.py (5196b), scripts/lib/ui.py (25673b), scripts/lib/vendor/bird-search/bird-search.mjs (3887b), scripts/lib/vendor/bird-search/lib/features.json (523b), scripts/lib/vendor/bird-search/lib/paginate-cursor.js (1225b), scripts/lib/vendor/bird-search/lib/query-ids.json (815b), scripts/lib/vendor/bird-search/lib/runtime-features.js (5036b), scripts/lib/vendor/bird-search/lib/runtime-query-ids.js (9424b), scripts/lib/vendor/bird-search/lib/twitter-client-base.js (4853b), scripts/lib/vendor/bird-search/lib/twitter-client-constants.js (2535b), scripts/lib/vendor/bird-search/lib/twitter-client-features.js (18400b), scripts/lib/vendor/bird-search/lib/twitter-client-search.js (7310b), scripts/lib/vendor/bird-search/lib/twitter-client-types.js (59b), scripts/lib/vendor/bird-search/lib/twitter-client-utils.js (19169b), scripts/lib/vendor/bird-search/package.json (331b), scripts/lib/xai_x.py (7110b), scripts/lib/xiaohongshu_api.py (5321b), scripts/lib/youtube_yt.py (33912b), scripts/store.py (23302b), scripts/watchlist.py (9398b), SKILL.md (2911b), _meta.json (143b)\n\nFile v3.0.0-open:SKILL.md\n\n---\nname: last30days\nversion: \"3.0.0-open\"\ndescription: \"Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'.\"\nargument-hint: 'last30 AI video tools, last30 watch my competitor every week, last30 give me my briefing'\nallowed-tools: Bash, Read, Write, AskUserQuestion, WebSearch\ndisable-model-invocation: true\n---\n\n# last30days (open variant): Research + Watchlist + Briefings\n\nMulti-mode research skill with persistent knowledge accumulation.\n\n## Command Routing\n\nParse the user's first argument to determine the mode:\n\n| First word | Mode | Reference |\n|---|---|---|\n| `watch` | Watchlist management | `references/watchlist.md` |\n| `briefing` | Morning briefing | `references/briefing.md` |\n| `history` | Query accumulated knowledge | `references/history.md` |\n| *(anything else)* | One-shot research | `references/research.md` |\n\n## Setup: Find Skill Root\n\n```bash\nfor dir in \\\n  \".\" \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\" \\\n  \"${GEMINI_EXTENSION_DIR:-}\" \\\n  \"$HOME/.gemini/extensions/last30days-skill\" \\\n  \"$HOME/.gemini/extensions/last30days\" \\\n  \"$HOME/.claude/skills/last30days\" \\\n  \"$HOME/.agents/skills/last30days\" \\\n  \"$HOME/.codex/skills/last30days\"; do\n  [ -n \"$dir\" ] && [ -f \"$dir/scripts/last30days.py\" ] && SKILL_ROOT=\"$dir\" && break\ndone\n\nif [ -z \"${SKILL_ROOT:-}\" ]; then\n  echo \"ERROR: Could not find scripts/last30days.py\" >&2\n  exit 1\nfi\n```\n\nUse `$SKILL_ROOT` for all script and reference file paths.\n\n## Load Context\n\nAt session start, read `${SKILL_ROOT}/variants/open/context.md` for user preferences and source quality notes. Update it after interactions.\n\n## Shared Configuration\n\n- **Database**: `~/.local/share/last30days/research.db` (SQLite, WAL mode)\n- **Briefings**: `~/.local/share/last30days/briefs/`\n- **API keys**: `~/.config/last30days/.env` or environment variables\n- **Key priority**: env vars > config file\n\n### API Keys\n\n| Key | Required | Purpose |\n|---|---|---|\n| `OPENAI_API_KEY` | For Reddit | Reddit search via OpenAI responses API |\n| `XAI_API_KEY` | For X (fallback) | X search via xAI Grok API |\n| `OPENROUTER_API_KEY` | Optional | Perplexity Sonar Pro search + AI reasoning (planning/reranking). Add `INCLUDE_SOURCES=perplexity` to enable. Use `--deep-research` for exhaustive reports. |\n| `PARALLEL_API_KEY` | Optional | Web search via Parallel AI |\n| `BRAVE_API_KEY` | Optional | Web search via Brave Search |\n\nBird CLI provides free X search if installed. YouTube search uses yt-dlp (free).\n\nRun `python3 \"${SKILL_ROOT}/scripts/last30days.py\" --diagnose` to check source availability.\n\n## Routing Logic\n\nAfter determining the mode, **read the corresponding reference file** using the Read tool:\n\n```\nRead: ${SKILL_ROOT}/variants/open/references/{mode}.md\n```\n\nThen follow the instructions in that reference file exactly.\n\nFile v3.0.0-open:_meta.json\n\n{\n  \"ownerId\": \"kn7d7xy7794nh6aaabfga5wwzh7zptdm\",\n  \"slug\": \"last30days-official\",\n  \"version\": \"3.0.0-open\",\n  \"publishedAt\": 1775671047835\n}\n\nFile v3.0.0-open:references/briefing.md\n\n# Morning Briefing\n\nSynthesize accumulated findings into a formatted briefing.\n\n## Commands\n\n| Command | Action |\n|---|---|\n| `briefing` | Generate today's briefing |\n| `briefing --weekly` | Weekly digest with trends |\n| `briefing --since YYYY-MM-DD` | Briefing since specific date |\n\n## Generate Briefing\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/briefing.py\" generate [--weekly] [--since DATE]\n```\n\nThe script returns JSON with per-topic findings, staleness info, and cost data.\n\n## Staleness Check\n\nBefore synthesizing, check each topic's freshness:\n- **Fresh** (< 12h): show normally\n- **Aging** (12-36h): note when last run was\n- **Stale** (> 36h): warn user, suggest running `watch run-one \"topic\"`\n\n## Daily Briefing Format\n\n```\nGood morning! Here's your research briefing for [DATE].\n\nTL;DR: [One sentence about the top finding across all topics]\n\n---\n\n**[Topic 1]** (N new findings)\nTop signal: [Highest engagement finding with source]\nAlso trending: [2nd finding], [3rd finding]\n\n**[Topic 2]** (N new findings)\nTop signal: [Highest engagement finding]\nAlso trending: [2nd finding]\n\n---\nCost: $X.XX / $Y.YY budget | N topics active | N findings today\n```\n\n## Weekly Digest Format\n\n```\nWeekly digest for week of [DATE]:\n\n**[Topic 1]**\nThis week: N findings (up/down X% from last week)\nTrending up: [engagement increasing]\nKey voices: @handle1, r/sub1\n\n**[Topic 2]**\nThis week: N findings\nTrending down: [engagement decreasing]\n```\n\n## Synthesis Rules\n\n- Lead with people, not publications\n- 3-5 topics max per briefing\n- 2-3 findings per topic\n- Include cost/budget footer\n- Note any failed or stale topics\n\n## No Data Handling\n\nIf no topics or no findings:\n```\nNo briefing data available.\n\nTo get started:\n1. Add a topic: /last30days watch add \"your topic\"\n2. Run research: /last30days watch run-all\n3. Generate briefing: /last30days briefing\n```\n\nFile v3.0.0-open:references/history.md\n\n# History & Knowledge Query\n\nQuery the accumulated findings database.\n\n## Commands\n\n| Command | Action |\n|---|---|\n| `history \"topic\"` | Show findings for a topic |\n| `history \"topic\" --since=7d` | Findings from last N days |\n| `history --search \"query\"` | Full-text search across all findings |\n| `history --trending` | Topics with most recent activity |\n| `history --stats` | Watchlist health dashboard |\n\n## Topic History\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" query \"TOPIC\" [--since DAYS]\n```\n\nDisplay findings grouped by date (newest first):\n```\n**[Topic Name]** — N findings since [date]\n\n[DATE]\n- [Reddit] Title (score pts, N comments) — r/subreddit\n- [X] Tweet text... (N likes) — @handle\n- [YouTube] Video title (N views) — channel\n\n[EARLIER DATE]\n- ...\n```\n\nMark updated findings (engagement changed since first seen).\n\n## Full-Text Search\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" search \"QUERY\"\n```\n\nUses FTS5 with BM25 ranking. Show results across all topics:\n```\nSearch: \"QUERY\" — N results\n\n1. [Reddit] Title — r/subreddit (topic: AI video)\n   ...snippet with **highlighted** matches...\n\n2. [X] Tweet text — @handle (topic: NVIDIA)\n   ...snippet...\n```\n\n## Trending Topics\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" trending\n```\n\nShow topics ranked by recent activity:\n```\nTrending topics (last 7 days):\n\n1. AI video tools — 12 new findings, engagement up 45%\n2. NVIDIA news — 8 new findings, engagement steady\n3. Claude Code — 3 new findings, engagement down 20%\n```\n\n## Stats Dashboard\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" stats\n```\n\nDisplay as a health dashboard:\n```\nWatchlist Health\n- Active topics: N\n- Total findings: N\n- Database size: N KB\n\nResearch Runs (7 days)\n- Successful: N\n- Failed: N\n- Cost: $X.XX\n\nSource Breakdown\n- Reddit: N findings\n- X: N findings\n- YouTube: N findings\n- Web: N findings\n```\n\n## No Data Handling\n\nIf no findings exist:\n```\nNo research history yet.\n\nTo start building knowledge:\n1. Run research: /last30days \"your topic\"\n2. Or add a watchlist topic: /last30days watch add \"topic\"\n```\n\nFile v3.0.0-open:references/research.md\n\n# One-Shot Research Mode (v3)\n\nResearch ANY topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web. Surface what people are actually discussing, recommending, betting on, and debating right now.\n\n---\n\n## 1. Parse User Intent\n\nBefore doing anything, parse the user's input for:\n\n1. **TOPIC**: What they want to learn about\n2. **TARGET TOOL** (if specified): Where they'll use the prompts\n3. **QUERY TYPE**:\n   - **PROMPTING** - \"X prompts\", \"prompting for X\" -> copy-paste prompts\n   - **RECOMMENDATIONS** - \"best X\", \"top X\" -> list of specific things\n   - **NEWS** - \"what's happening with X\" -> current events\n   - **COMPARISON** - \"X vs Y\", \"X versus Y\", \"compare X and Y\" -> side-by-side comparison\n   - **GENERAL** - anything else -> broad understanding\n\nCommon patterns:\n- `[topic] for [tool]` -> TOOL IS SPECIFIED\n- `[topic] prompts for [tool]` -> TOOL IS SPECIFIED\n- Just `[topic]` -> TOOL NOT SPECIFIED, that's OK\n- \"best [topic]\" or \"top [topic]\" -> QUERY_TYPE = RECOMMENDATIONS\n- \"X vs Y\" or \"X versus Y\" -> QUERY_TYPE = COMPARISON, TOPIC_A = X, TOPIC_B = Y\n\n**Do NOT ask about target tool before research.** Run research first, ask after.\n\n**Store these variables:**\n- `TOPIC = [extracted topic]`\n- `TARGET_TOOL = [extracted tool, or \"unknown\" if not specified]`\n- `QUERY_TYPE = [PROMPTING | RECOMMENDATIONS | NEWS | COMPARISON | GENERAL]`\n- `TOPIC_A = [first item]` (only if COMPARISON)\n- `TOPIC_B = [second item]` (only if COMPARISON)\n\n---\n\n## 2. Confirm Topic\n\nDisplay a branded one-liner before starting research. Build ACTIVE_SOURCES_LIST by checking what's configured in .env (Reddit, HN, Polymarket are always active; add X, YouTube, TikTok, Instagram, GitHub, Perplexity based on configured keys/tools).\n\nFor GENERAL / NEWS / RECOMMENDATIONS / PROMPTING queries:\n```\n/last30days - searching {ACTIVE_SOURCES_LIST} for what people are saying about {TOPIC}.\n```\n\nFor COMPARISON queries:\n```\n/last30days - comparing {TOPIC_A} vs {TOPIC_B} across {ACTIVE_SOURCES_LIST}.\n```\n\nDo NOT show a multi-line \"Parsed intent\" block with TOPIC=, TARGET_TOOL=, QUERY_TYPE= variables. Do NOT promise a specific time. Do NOT list sources that aren't configured.\n\nThen proceed immediately to research execution.\n\n---\n\n## 3. Handle / GitHub Resolution\n\n**OpenClaw does not have WebSearch.** Skip manual handle resolution (Steps 0.5, 0.55, 0.75 from the main skill). Instead, add `--auto-resolve` to the research command. The engine will use configured web search backends (Brave, Exa, Serper) to discover subreddits, X handles, and context before planning.\n\nIf the user manually provides handles or community names, pass them through as CLI flags (see the flags list in Research Execution below). But do NOT attempt WebSearch-based resolution yourself.\n\n---\n\n## 4. Agent Mode (--agent flag)\n\nIf `--agent` appears in ARGUMENTS (e.g., `/last30days plaud granola --agent`):\n\n1. **Skip** the intro display block\n2. **Skip** any `AskUserQuestion` calls - use `TARGET_TOOL = \"unknown\"` if not specified\n3. **Run** the research script exactly as normal\n4. **Skip** the follow-up invitation\n5. **Output** the complete research report and stop - do not wait for further input\n\nAgent mode saves raw research data to `~/Documents/Last30Days/` automatically via `--save-dir`.\n\nAgent mode report format:\n\n```\n## Research Report: {TOPIC}\nGenerated: {date} | Sources: Reddit, X, YouTube, TikTok, Instagram, HN, Polymarket, Web\n\n### Key Findings\n[3-5 bullet points, highest-signal insights with citations]\n\n### What I learned\n{The full \"What I learned\" synthesis from normal output}\n\n### Stats\n{The standard stats block}\n```\n\n---\n\n## 5. Comparison Mode (QUERY_TYPE = COMPARISON)\n\nWhen the user asks \"X vs Y\", run ONE research pass with a comparison-optimized query that covers both entities AND their rivalry.\n\n**Single pass with entity-aware subqueries:**\n```bash\npython3 \"${SKILL_ROOT}/scripts/last30days.py\" \"{TOPIC_A} vs {TOPIC_B}\" --auto-resolve --emit=compact --save-dir=~/Documents/Last30Days --save-suffix=v3 --store 2>&1\n```\n\nIf the user provided manual handles or subreddits, include those flags too.\n\nThen skip the normal Research Execution below - go directly to the comparison synthesis format (see Synthesis section).\n\n**Comparison output format:**\n\n```\n# {TOPIC_A} vs {TOPIC_B}: What the Community Says (Last 30 Days)\n\n## Quick Verdict\n[1-2 sentence data-driven summary: which one the community prefers and why, with source counts]\n\n## {TOPIC_A}\nCommunity Sentiment: [Positive/Mixed/Negative] ({N} mentions across {sources})\n\nStrengths (what people love)\n- [Point 1 with source attribution]\n- [Point 2]\n\nWeaknesses (common complaints)\n- [Point 1 with source attribution]\n- [Point 2]\n\n## {TOPIC_B}\nCommunity Sentiment: [Positive/Mixed/Negative] ({N} mentions across {sources})\n\nStrengths (what people love)\n- [Point 1 with source attribution]\n- [Point 2]\n\nWeaknesses (common complaints)\n- [Point 1 with source attribution]\n- [Point 2]\n\n## Head-to-Head\n[Synthesis from the combined search - what people say when directly comparing]\n\n| Dimension | {TOPIC_A} | {TOPIC_B} |\n|-----------|-----------|-----------|\n| [Key dimension 1] | [A's position] | [B's position] |\n| [Key dimension 2] | [A's position] | [B's position] |\n| [Key dimension 3] | [A's position] | [B's position] |\n\n## The Bottom Line\nChoose {TOPIC_A} if... Choose {TOPIC_B} if... (based on actual community data, not assumptions)\n```\n\nThen show combined stats and the standard invitation section.\n\n---\n\n## 6. Research Execution\n\n**Run the research script in the FOREGROUND with a 5-minute timeout.**\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/last30days.py\" $ARGUMENTS --auto-resolve --emit=compact --save-dir=~/Documents/Last30Days --save-suffix=v3 --store 2>&1\n```\n\nUse a **timeout of 300000** (5 minutes). The `--store` flag persists findings for watchlist/briefing integration.\n\n**Always include `--auto-resolve`** since OpenClaw has no WebSearch. The engine will use configured web search backends (Brave, Exa, Serper) to discover subreddits, X handles, and current events context before planning.\n\n**Available flags** (pass through if the user provides them manually):\n- `--x-handle={handle}` - primary X/Twitter handle (without @)\n- `--x-related={handle1},{handle2}` - related X handles (comma-separated, without @)\n- `--subreddits={sub1},{sub2}` - target subreddits (comma-separated, no r/ prefix)\n- `--tiktok-hashtags={tag1},{tag2}` - TikTok hashtags to search\n- `--tiktok-creators={creator1},{creator2}` - TikTok creator handles\n- `--ig-creators={creator1},{creator2}` - Instagram creator handles\n- `--github-user={username}` - GitHub username for person-mode search\n- `--github-repo={owner/repo}` - GitHub repo for project-mode search (comma-separated for multiple)\n- `--deep-research` - Perplexity Deep Research mode (exhaustive 50+ citation reports, ~$0.90/query, requires OPENROUTER_API_KEY + `INCLUDE_SOURCES=perplexity`)\n- `--days=N` - look back N days instead of 30\n- `--quick` - faster, fewer sources (8-12 each)\n- `--deep` - comprehensive (50-70 Reddit, 40-60 X)\n\n**Read the ENTIRE output.** It contains data sections for: Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and Web. If you miss sections, you will produce incomplete stats.\n\n---\n\n## 7. WebSearch Supplemental\n\n**If your platform supports WebSearch**, use it after the script finishes to supplement with blogs, tutorials, and news.\n\nChoose search queries based on QUERY_TYPE:\n\n- **RECOMMENDATIONS**: `best {TOPIC} recommendations`, `{TOPIC} list examples`\n- **NEWS**: `{TOPIC} news 2026`, `{TOPIC} announcement update`\n- **PROMPTING**: `{TOPIC} prompts examples 2026`, `{TOPIC} techniques tips`\n- **GENERAL**: `{TOPIC} 2026`, `{TOPIC} discussion`\n\nRules:\n- **USE THE USER'S EXACT TERMINOLOGY**\n- EXCLUDE reddit.com, x.com, twitter.com (covered by script)\n- Do NOT output a separate \"Sources:\" block\n\n**If your platform does NOT support WebSearch**, the `--auto-resolve` flag already provides web context via the engine's configured backends. Skip this step.\n\n---\n\n## 8. Synthesis / Judge Agent\n\n### v3 Cluster-First Output\n\nv3 returns results grouped by STORY/THEME (clusters), not by source. Each cluster represents one narrative thread found across multiple platforms.\n\n**How to read v3 output:**\n- `### 1. Cluster Title (score N, M items, sources: X, Reddit, TikTok)` - a story found across multiple platforms\n- `Uncertainty: single-source` - only one platform found this story (lower confidence)\n- `Uncertainty: thin-evidence` - all items scored below 55 (unconfirmed)\n- Items within a cluster show: source label, title, date, score, URL, and evidence snippet\n\n**Synthesis strategy for cluster-first output:**\n1. **Synthesize per-cluster first.** Each cluster = one story. Summarize what each story is about.\n2. **Multi-source clusters are highest confidence.** A cluster with items from Reddit + X + YouTube is much stronger than single-source.\n3. **Check uncertainty tags.** \"single-source\" means treat with caution. \"thin-evidence\" means mention but caveat.\n4. **Cross-cluster synthesis second.** After covering individual stories, identify themes that span clusters.\n5. **Engagement signals still matter.** Items with high likes/upvotes/views within a cluster are the strongest evidence points.\n6. **Quote directly from evidence snippets.** The snippets are pre-extracted best passages - use them.\n7. Extract the top 3-5 actionable insights across all clusters.\n8. **Disambiguation: trust your resolved entity.** When auto-resolve identified a specific entity, prioritize content about THAT entity. If results contain a different entity with the same name, lead with the one auto-resolve identified.\n\n### Source-Specific Guidance (applies within clusters)\n\nThe Judge Agent must:\n1. Weight Reddit/X sources HIGHER (they have engagement signals: upvotes, likes)\n2. Weight YouTube sources HIGH (they have views, likes, and transcript content)\n3. Weight TikTok sources HIGH (they have views, likes, and caption content - viral signal)\n4. Weight Instagram sources HIGH (influencer/creator perspective)\n5. Weight WebSearch sources LOWER (no engagement data)\n6. **For Reddit: Pay special attention to top comments** - they often contain the wittiest, most insightful, or funniest take. Quote them directly.\n7. **For X: Reply clusters are gold.** When you see a cluster of replies to a recommendation-request tweet (someone asking \"what's the best X?\" and getting multiple independent responses), call this out prominently. This is the strongest form of community endorsement.\n8. **For YouTube: Quote transcript highlights directly.** Attribute to the channel name.\n9. **For TikTok: Note view counts and caption content.** Viral TikToks are strong cultural signal.\n10. **For Instagram: Weight alongside TikTok.** Instagram provides unique creator/influencer perspective.\n11. **For HN: Developer community signal.** Cite as \"per HN\" or \"per hn/username.\"\n12. **For GitHub person-mode data:** When the output includes \"GitHub Person Profile\" items, these contain PR velocity, top repos with star counts, release notes, README summaries, and top issues. Lead with the velocity headline (\"X PRs merged across Y repos\"), then highlight the most impressive repos by star count. Weave release notes into the narrative to show what actually shipped.\n13. Identify patterns that appear across ALL sources (strongest signals)\n14. Note any contradictions between sources\n15. **Multi-source clusters (items from 3+ platforms) are the strongest signals.** Lead with these.\n\n### Prediction Markets (Polymarket)\n\nWhen Polymarket returns relevant markets, prediction market odds are among the highest-signal data points. Real money on outcomes cuts through opinion.\n\n**6-point synthesis strategy:**\n\n1. **Prefer structural/long-term markets over near-term deadlines.** Championship odds > regular season. Regime change > near-term strike deadline. IPO/major milestone > incremental update. When multiple markets exist, the bigger question is more interesting.\n\n2. **When the topic is an outcome in a multi-outcome market, call out that specific outcome's odds and movement.** Don't just say \"Polymarket has a market\" - say \"Arizona has a 28% chance, up 10% this month.\"\n\n3. **Weave odds into the narrative as supporting evidence.** Don't isolate Polymarket data in its own paragraph. Instead: \"Final Four buzz is building - Polymarket gives Arizona a 12% chance to win the championship (up 3% this week).\"\n\n4. **Citation format: show ONLY % odds. NEVER mention dollar volumes, liquidity, or betting amounts.** The % odds are the magic - the dollar figures are internal metrics that add zero value.\n\n5. **When multiple relevant markets exist, highlight 3-5 of the most interesting ones** in your synthesis, ordered by importance (structural > near-term).\n\n6. **Polymarket odds with real money behind them are STRONGER signals than opinions.** Always include specific percentages when markets are confirmed relevant.\n\n### X Reply Cluster Weighting\n\nWhen you see a cluster of replies to a recommendation-request tweet (someone asking \"what's the best X?\" and getting multiple independent responses), call this out prominently. This is the strongest form of community endorsement - real people independently making the same recommendation without coordination. Example: \"In a thread where @ecom_cork asked for Loom alternatives, every reply said Tella.\"\n\n### Fun Content\n\n**If the research output includes a \"## Best Takes\" section or items tagged with `fun:` scores, weave at least 2-3 of the funniest/cleverest quotes into your synthesis.** Reddit comments and X posts with high fun scores are the voice of the people. A 1,338-upvote comment that says \"Where's the limewire link\" tells you more about the cultural moment than a news article. Quote the actual text. Don't put fun content in a separate section - mix it into the narrative where it fits naturally.\n\n### ELI5 Mode\n\n**If ELI5_MODE is true for this run, apply these writing guidelines to your ENTIRE synthesis. If false, skip this block and write normally.**\n\n- Assume I know nothing about this topic. Zero context.\n- No jargon without a quick explanation in parentheses\n- Short sentences. One idea per sentence.\n- Start with the single most important thing that happened, in one line\n- Use analogies when they help (\"think of it like...\")\n- Keep the same structure: narrative, key patterns, stats, invitation\n- Still quote real people and cite sources - don't lose the grounding\n- Don't be condescending. Simple is not stupid. ELI5 means accessible, not childish.\n\n### Citation Priority Hierarchy\n\nMost to least preferred:\n\n1. @handles from X - \"per @handle\" (these prove the tool's unique value)\n2. r/subreddits from Reddit - \"per r/subreddit\" (prefer quoting top comments over thread titles)\n3. YouTube channels - \"per [channel name] on YouTube\" (transcript-backed insights)\n4. TikTok creators - \"per @creator on TikTok\" (viral/trending signal)\n5. Instagram creators - \"per @creator on Instagram\" (influencer/creator signal)\n6. HN discussions - \"per HN\" or \"per hn/username\" (developer community signal)\n7. Polymarket - \"Polymarket has X at Y% (up/down Z%)\" with specific odds and movement\n8. Web sources - ONLY when other sources don't cover that specific fact\n\nThe tool's value is surfacing what PEOPLE are saying, not what journalists wrote. When both a web article and an X post cover the same fact, cite the X post.\n\n### URL Formatting\n\nNEVER paste raw URLs anywhere in the output - not in synthesis, not in stats, not in sources.\n- **BAD:** \"per https://www.rollingstone.com/music/...\"\n- **GOOD:** \"per Rolling Stone\"\n- **BAD stats line:** `Web: 10 pages - https://later.com/blog/...`\n- **GOOD stats line:** `Web: 10 pages - Later, Buffer, CNN, SocialBee`\n\nUse the publication/site name, not the URL.\n\n### Disambiguation\n\nWhen auto-resolve or the research identified a specific entity (handles, subreddits, location context), prioritize content about THAT entity. If search results contain a different entity with the same name, lead with the entity your resolution identified. Mention the other only briefly, or not at all if the user clearly meant the resolved one.\n\n### Anti-Pattern Warning\n\n**Ground your synthesis in the ACTUAL research content, not your pre-existing knowledge.**\n\nRead the research output carefully. Pay attention to:\n- **Exact product/tool names** mentioned - don't conflate similar-sounding products\n- **Specific quotes and insights** from the sources - use THESE, not generic knowledge\n- **What the sources actually say**, not what you assume the topic is about\n\n**SELF-CHECK before displaying**: Re-read your \"What I learned\" section. Does it match what the research ACTUALLY says? If you catch yourself projecting your own knowledge instead of the research, rewrite it.\n\n---\n\n## 9. Display Results\n\n### \"What I learned\" (format depends on QUERY_TYPE)\n\n**If RECOMMENDATIONS** - show specific items with sources:\n```\nMost mentioned:\n\n[Name] - {n}x mentions\nUse Case: [what it does]\nSources: @handle1, r/sub, blog.com\n```\n\n**If PROMPTING/NEWS/GENERAL** - show synthesis:\n\nCite sparingly: 1-2 sources per topic in the intro, 1 source per pattern. Do NOT chain multiple citations.\n\n```\nWhat I learned:\n\n{Topic 1} - [1-2 sentences about what people are saying, per @handle or r/sub]\n\n{Topic 2} - [1-2 sentences, per @handle or r/sub]\n\nKEY PATTERNS from the research:\n1. [Pattern] - per @handle\n2. [Pattern] - per r/sub\n3. [Pattern] - per @handle\n```\n\n**If COMPARISON** - use the comparison output format from section 5 above.\n\n### Stats Block\n\n**Calculate actual totals from the research output.** Count posts/threads from each section. Sum engagement: parse likes, upvotes, views from each item. Identify top voices.\n\n**Copy this EXACTLY, replacing only the {placeholders}:**\n\n```\n---\n✅ All agents reported back!\n├─ 🟠 Reddit: {N} threads │ {N} upvotes │ {N} comments\n├─ 🔵 X: {N} posts │ {N} likes │ {N} reposts\n├─ 🔴 YouTube: {N} videos │ {N} views │ {N} with transcripts\n├─ 🎵 TikTok: {N} videos │ {N} views │ {N} likes │ {N} with captions\n├─ 📸 Instagram: {N} reels │ {N} views │ {N} likes │ {N} with captions\n├─ 🧵 Threads: {N} posts │ {N} likes │ {N} replies\n├─ 📌 Pinterest: {N} pins │ {N} saves │ {N} comments\n├─ 🟡 HN: {N} stories │ {N} points │ {N} comments\n├─ 🦋 Bluesky: {N} posts │ {N} likes │ {N} reposts\n├─ 🇺🇸 Truth Social: {N} posts │ {N} likes │ {N} reposts\n├─ 🐙 GitHub: {N} items │ {N} reactions │ {N} comments\n├─ 📊 Polymarket: {N} markets │ {exact % odds}\n├─ 🔮 Perplexity: {N} insights │ {N} citations\n├─ 🌐 Web: {N} pages — Source Name, Source Name\n├─ 🗣️ Top voices: @{handle1} ({N} likes), @{handle2} │ r/{sub1}, r/{sub2}\n└─ 📎 Raw results saved to ~/Documents/Last30Days/{slug}-raw.md\n---\n```\n\n**CRITICAL: Omit any line with 0 results.** Do NOT show \"0 threads\", \"0 stories\", \"0 markets\", or \"(no results this cycle)\". If a source found nothing, DELETE that line entirely.\n\n**Web line - how to extract site names from URLs:** Strip the protocol, path, and `www.` - use the recognizable publication name. List as comma-separated plain names.\n\n---\n\n## 10. Invitation\n\nAdapt to QUERY_TYPE. Every invitation MUST include 2-3 specific example suggestions based on what you ACTUALLY learned from the research.\n\n**If QUERY_TYPE = PROMPTING:**\n```\n---\nI'm now an expert on {TOPIC} for {TARGET_TOOL}. What do you want to make? For example:\n- [specific idea based on popular technique from research]\n- [specific idea based on trending style/approach from research]\n- [specific idea riffing on what people are actually creating]\n\nJust describe your vision and I'll write a prompt you can paste straight into {TARGET_TOOL}.\n```\n\n**If QUERY_TYPE = RECOMMENDATIONS:**\n```\n---\nI'm now an expert on {TOPIC}. Want me to go deeper? For example:\n- [Compare specific item A vs item B from the results]\n- [Explain why item C is trending right now]\n- [Help you get started with item D]\n```\n\n**If QUERY_TYPE = NEWS:**\n```\n---\nI'm now an expert on {TOPIC}. Some things you could ask:\n- [Specific follow-up question about the biggest story]\n- [Question about implications of a key development]\n- [Question about what might happen next based on current trajectory]\n```\n\n**If QUERY_TYPE = COMPARISON:**\n```\n---\nI've compared {TOPIC_A} vs {TOPIC_B} using the latest community data. Some things you could ask:\n- [Deep dive into {TOPIC_A} alone with /last30days {TOPIC_A}]\n- [Deep dive into {TOPIC_B} alone with /last30days {TOPIC_B}]\n- [Focus on a specific dimension from the comparison table]\n- [Look at a different time period with --days=7 or --days=90]\n```\n\n**If QUERY_TYPE = GENERAL:**\n```\n---\nI'm now an expert on {TOPIC}. Some things I can help with:\n- [Specific question based on the most discussed aspect]\n- [Specific creative/practical application of what you learned]\n- [Deeper dive into a pattern or debate from the research]\n```\n\nContext-aware: Only list sources that returned results in the closing line. Build the source list from your stats.\n\n---\n\n## 11. Follow-Up\n\nAfter research, you are an **EXPERT** on this topic.\n\nWhen the user responds, match their intent:\n\n- **QUESTION** about the topic -> Answer from research (no new searches)\n- **GO DEEPER** on a subtopic -> Elaborate from findings\n- **CREATE/PROMPT** -> Write ONE prompt using research insights\n- **Different topic** -> Run new research\n\n### Mode Toggles\n\n- **\"eli5 on\"** / **\"eli5 mode\"** / **\"explain simpler\"** -> Write `ELI5_MODE=true` to `~/.config/last30days/.env`. Confirm: \"ELI5 mode on. All future runs will explain things like you're 5.\"\n- **\"eli5 off\"** / **\"normal mode\"** / **\"full detail\"** -> Write `ELI5_MODE=false` to `~/.config/last30days/.env`. Confirm: \"ELI5 mode off. Back to full detail.\"\n- **\"more fun\"** / **\"too serious\"** -> Write `FUN_LEVEL=high` to `~/.config/last30days/.env`. Confirm: \"Fun level set to high. Next run will surface more witty and viral content.\"\n- **\"less fun\"** / **\"too many jokes\"** -> Write `FUN_LEVEL=low` to `~/.config/last30days/.env`. Confirm: \"Fun level set to low. Next run will focus on the news.\"\n\n### Writing Prompts\n\nWhen the user wants a prompt, write a single, highly-tailored prompt using your research expertise.\n\n**CRITICAL: Match the FORMAT the research recommends.** If research says to use JSON prompts with device specs, your prompt MUST be JSON. If research says structured params, use structured params.\n\nQuality Checklist (run before delivering):\n- FORMAT MATCHES RESEARCH - if research said JSON/structured/etc, prompt IS that format\n- Directly addresses what the user said they want to create\n- Uses specific patterns/keywords discovered in research\n- Ready to paste with zero edits (or minimal [PLACEHOLDERS] clearly marked)\n- Appropriate length and style for TARGET_TOOL\n\n### Output Summary Footer (After Each Prompt)\n\n```\n---\nExpert in: {TOPIC} for {TARGET_TOOL}\nBased on: {n} Reddit threads ({sum} upvotes) + {n} X posts ({sum} likes) + {n} YouTube videos ({sum} views) + {n} TikTok videos ({sum} views) + {n} Instagram reels ({sum} views) + {n} HN stories ({sum} points) + {n} web pages\n\nWant another prompt? Just tell me what you're creating next.\n```\n\nOnly include sources with non-zero results in the footer.\n\nFile v3.0.0-open:references/watchlist.md\n\n# Watchlist Management\n\nManage topics you want to track continuously. Findings accumulate in the SQLite database for briefings and history queries.\n\n## Commands\n\n| Command | Action |\n|---|---|\n| `watch add \"topic\"` | Add a topic (daily schedule) |\n| `watch add \"topic\" --weekly` | Add with weekly schedule |\n| `watch \"topic\"` | Shorthand for `watch add` |\n| `watch remove \"topic\"` | Remove a topic |\n| `watch list` | Show all topics with status |\n| `watch config delivery [channel]` | Set delivery channel |\n| `watch config budget AMOUNT` | Set daily cost budget |\n| `watch run-all` | Run research for all topics now |\n| `watch run-one \"topic\"` | Run research for one topic now |\n\n## Adding a Topic\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" add \"TOPIC_NAME\" [--weekly] [--queries \"q1,q2\"]\n```\n\nThe script auto-bootstraps the SQLite database on first add.\n\n**Default schedule**: Daily at 8am (`0 8 * * *`).\n**Weekly**: Mondays at 8am (`0 8 * * 1`).\n\n**After adding**, confirm to the user:\n```\nAdded \"TOPIC_NAME\" to watchlist.\nSchedule: daily at 8am (or weekly on Mondays)\n\nTo run research now: /last30days watch run-one \"TOPIC_NAME\"\nTo set up automated runs: add a cron/launchd job for `python3 ${SKILL_ROOT}/scripts/watchlist.py run-all`\n```\n\n## Removing a Topic\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" remove \"TOPIC_NAME\"\n```\n\nShow confirmation or \"not found\" message.\n\n## Listing Topics\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" list\n```\n\nDisplay as a formatted table:\n```\nTopic         | Schedule     | Last Run     | Findings | Status\n--------------+--------------+--------------+----------+--------\nAI video      | daily 8am    | 2h ago       | 47       | ok\nNVIDIA news   | weekly Mon   | 3d ago       | 23       | ok\n\nBudget: $0.42 / $5.00 today\n```\n\n## Running Research\n\n```bash\n# All enabled topics (with budget guard)\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" run-all\n\n# Single topic\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" run-one \"TOPIC_NAME\"\n```\n\nShow results: new findings count, updated findings, duration, and any errors.\n\n## Configuration\n\n```bash\n# Set delivery channel (for future notification support)\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" config delivery telegram\n\n# Set daily budget limit\npython3 \"${SKILL_ROOT}/scripts/watchlist.py\" config budget 10.00\n```\n\n## Scheduling\n\nThe watchlist doesn't auto-schedule. To automate, set up a system job:\n\n**macOS (launchd)**:\n```bash\n# Run daily at 8am\ncrontab -e\n# Add: 0 8 * * * python3 /path/to/scripts/watchlist.py run-all\n```\n\n**Linux (cron)**:\n```bash\ncrontab -e\n# Add: 0 8 * * * python3 /path/to/scripts/watchlist.py run-all\n```\n\n## Error Handling\n\n- Duplicate topic: update the existing schedule\n- Topic not found on remove: show \"not found\" message\n- Budget exceeded: skip remaining topics, show which were skipped\n- Research failure: record error, continue to next topic\n\nFile v3.0.0-open:scripts/lib/vendor/bird-search/lib/features.json\n\n{\n  \"global\": {\n    \"responsive_web_grok_annotations_enabled\": false,\n    \"post_ctas_fetch_enabled\": true,\n    \"responsive_web_graphql_exclude_directive_enabled\": true\n  },\n  \"sets\": {\n    \"lists\": {\n      \"blue_business_profile_image_shape_enabled\": true,\n      \"tweetypie_unmention_optimization_enabled\": true,\n      \"responsive_web_text_conversations_enabled\": false,\n      \"interactive_text_enabled\": true,\n      \"vibe_api_enabled\": true,\n      \"responsive_web_twitter_blue_verified_badge_is_enabled\": true\n    }\n  }\n}\n\nFile v3.0.0-open:scripts/lib/vendor/bird-search/lib/query-ids.json\n\n{\n  \"CreateTweet\": \"nmdAQXJDxw6-0KKF2on7eA\",\n  \"CreateRetweet\": \"LFho5rIi4xcKO90p9jwG7A\",\n  \"CreateFriendship\": \"8h9JVdV8dlSyqyRDJEPCsA\",\n  \"DestroyFriendship\": \"ppXWuagMNXgvzx6WoXBW0Q\",\n  \"FavoriteTweet\": \"lI07N6Otwv1PhnEgXILM7A\",\n  \"DeleteBookmark\": \"Wlmlj2-xzyS1GN3a6cj-mQ\",\n  \"TweetDetail\": \"_NvJCnIjOW__EP5-RF197A\",\n  \"SearchTimeline\": \"6AAys3t42mosm_yTI_QENg\",\n  \"Bookmarks\": \"RV1g3b8n_SGOHwkqKYSCFw\",\n  \"BookmarkFolderTimeline\": \"KJIQpsvxrTfRIlbaRIySHQ\",\n  \"Following\": \"mWYeougg_ocJS2Vr1Vt28w\",\n  \"Followers\": \"SFYY3WsgwjlXSLlfnEUE4A\",\n  \"Likes\": \"ETJflBunfqNa1uE1mBPCaw\",\n  \"ExploreSidebar\": \"lpSN4M6qpimkF4nRFPE3nQ\",\n  \"ExplorePage\": \"kheAINB_4pzRDqkzG3K-ng\",\n  \"GenericTimelineById\": \"uGSr7alSjR9v6QJAIaqSKQ\",\n  \"TrendHistory\": \"Sj4T-jSB9pr0Mxtsc1UKZQ\",\n  \"AboutAccountQuery\": \"zs_jFPFT78rBpXv9Z3U2YQ\"\n}\n\nFile v3.0.0-open:scripts/lib/vendor/bird-search/package.json\n\n{\n  \"name\": \"bird-search\",\n  \"version\": \"0.8.0\",\n  \"description\": \"Vendored Bird CLI search subset for /last30days\",\n  \"type\": \"module\",\n  \"main\": \"bird-search.mjs\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=22\"\n  },\n  \"license\": \"MIT\",\n  \"attribution\": \"Based on @steipete/bird v0.8.0 by Peter Steinberger (MIT License)\"\n}\n\nFile v3.0.0-open:CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [3.0.0] - 2026-04\n\n### Highlights\n\nIntelligent search, fun judge, cross-source cluster merging, single-pass comparisons, and OpenClaw as a first-class citizen. The v3 engine doesn't just search for your topic -- it figures out *where* to search before the search begins. Engine architecture by @j-sperling.\n\n### Added\n\n- **Intelligent pre-research** -- Resolves X handles, subreddits, TikTok hashtags, and YouTube channels via a new Python brain before any API calls fire. Bidirectional: person to company, product to founder.\n- **Fun judge / Best Takes** -- Second parallel LLM judge scores humor, cleverness, and virality. Surfaces the best reactions in a dedicated output section.\n- **Cross-source cluster merging** -- Entity-based overlap detection merges the same story across Reddit, X, YouTube into one cluster instead of three separate items.\n- **Single-pass comparisons** -- \"X vs Y\" runs one pass with entity-aware subqueries instead of three serial passes. 3 minutes instead of 12+.\n- **GitHub as a source** -- Stars, reactions, and comments from repos and issues.\n- **OpenClaw first-class citizen** -- Auto-resolve for engine-side pre-research. Device auth for frictionless ScrapeCreators signup.\n- **Per-author cap** -- Max 3 items per author prevents single-voice dominance.\n- **Entity disambiguation** -- Synthesis trusts resolved handles over keyword matches.\n- **Perplexity Sonar Pro as additive source** -- AI-synthesized research with citations via OpenRouter. Opt-in via `INCLUDE_SOURCES=perplexity`. Returns structured narratives that complement social data.\n- **Perplexity Deep Research** -- `--deep-research` flag for exhaustive 50+ citation reports (~$0.90/query). Premium opt-in for serious investigation.\n- **OpenRouter as reasoning provider** -- One OPENROUTER_API_KEY powers planning, reranking, and Perplexity search. Auto-detected after Gemini/OpenAI/xAI.\n- **Parallel AI grounding backend** -- `--web-backend parallel` or auto-detected via PARALLEL_API_KEY.\n- **Grounding in planner** -- Grounding source properly registered in SOURCE_CAPABILITIES instead of force-injected.\n\n### Changed\n\n- YouTube transcript candidate pool widened 3x past music videos to reach talk/review content with captions\n- Reddit comment enrichment sorted by total engagement (upvotes + comments), not just upvotes\n- Polymarket display shows % odds only; dollar volumes removed\n- 852 tests passing\n\n### Contributors\n\n- @j-sperling -- v3 engine architecture, Python pre-research brain\n- @hnshah -- Watchlist features\n\n## [2.9.4] - 2026-03-06\n\n### Changed\n\n- Move save into Python script via `--save-dir` flag - raw research data saved during the existing script Bash call, zero extra tool calls after invitation\n- Remove entire \"Save Research to Documents\" section from SKILL.md (~45 lines removed)\n- No more `📎` footer, no Bash heredoc, no `(No output)`, no multi-minute cogitation after research\n\n## [2.9.3] - 2026-03-06\n\n### Fixed\n\n- **Critical:** Switch save from `run_in_background` to foreground Bash - background callbacks caused model to re-engage, hallucinate fake user messages, and generate unsolicited multi-paragraph responses\n- Save uses foreground `cat >` heredoc (executes sub-second, no callback, no delayed notification)\n\n## [2.9.2] - 2026-03-06\n\n### Fixed\n\n- Save research silently using background Bash heredoc instead of Write tool (eliminates \"Wrote N lines...\" clutter)\n- Suppress follow-up text after background save completes (no more \"Research briefing saved...\" noise)\n- Add `📎` footer line for save path instead of verbose confirmation\n\n## [2.9.1] - 2026-03-05\n\n### Highlights\n\nAuto-save research briefings to `~/Documents/Last30Days/` as topic-named .md files. Every run now builds a personal research library automatically - no more manual copy-paste.\n\n### Added\n\n- Auto-save complete research briefings (synthesis, stats, follow-up suggestions) to `~/Documents/Last30Days/{topic-slug}.md` after every run\n- Kebab-case filename generation from topic (e.g., \"Claude Code skills\" -> `claude-code-skills.md`)\n- Duplicate topic handling: appends date suffix instead of overwriting (e.g., `claude-code-skills-2026-03-05.md`)\n- Agent mode (`--agent`) also saves research files\n- Brief confirmation after save: \"Saved to ~/Documents/Last30Days/{slug}.md\"\n\n### Credits\n\n- [@devin_explores](https://x.com/devin_explores) -- Inspired this feature by sharing their workflow of saving every last30days run into organized .md files ([PR #51](https://github.com/mvanhorn/last30days-skill/pull/51))\n\n## [2.9.0] - 2026-03-05\n\n### Highlights\n\nScrapeCreators Reddit as the default backend (one `SCRAPECREATORS_API_KEY` covers Reddit + TikTok + Instagram), smart subreddit discovery with relevance-weighted scoring, and top comments elevated with 10% scoring weight and prominent display.\n\n### Added\n\n- ScrapeCreators Reddit backend (`scripts/lib/reddit.py`) — keyword search, subreddit discovery, comment enrichment, all via `api.scrapecreators.com`\n- Smart subreddit discovery with relevance-weighted scoring: frequency × recency × topic-word match, replacing pure frequency count\n- `UTILITY_SUBS` blocklist to filter noise subreddits (r/tipofmytongue, r/whatisthisthing, etc.) from discovery results\n- Top comment scoring: 10% weight in engagement formula via `log1p(top_comment_score)`\n- Top comment rendering: `💬 Top comment` lines with upvote counts in compact and full report output\n- Comment excerpt length increased from 300 → 400 chars; `comment_insights` limit raised from 7 → 10\n\n### Changed\n\n- `primaryEnv` switched from `OPENAI_API_KEY` to `SCRAPECREATORS_API_KEY` — one key now powers Reddit, TikTok, and Instagram\n- Reddit engagement scoring formula: `0.55/0.40/0.05` (score/comments/ratio) → `0.50/0.35/0.05/0.10` (score/comments/ratio/top-comment)\n- SKILL.md synthesis instructions updated to emphasize quoting top comments\n\n### Fixed\n\n- Utility subreddit noise in discovery (e.g., r/tipofmytongue appearing for unrelated topics)\n- Reddit search no longer requires `OPENAI_API_KEY` — ScrapeCreators API handles search directly\n\n## [2.8.0] - 2026-03-04\n\n### Highlights\n\nInstagram Reels as the 8th signal source, TikTok migrated from Apify to ScrapeCreators API, and SKILL.md quality improvements. One API key (`SCRAPECREATORS_API_KEY`) now covers both TikTok and Instagram.\n\n### Added\n\n- Instagram Reels as 8th research source via ScrapeCreators API — keyword search, engagement metrics (views, likes, comments), spoken-word transcript extraction (`scripts/lib/instagram.py`)\n- `InstagramItem` dataclass, normalization, scoring (45% relevance / 25% recency / 30% engagement), deduplication, cross-source linking, and rendering\n- Instagram in SKILL.md: stats template (`📸 Instagram:`), citation priority, item format description, output footer\n- URL-to-name extraction examples in SKILL.md for cleaner web source display\n- `--search=instagram` flag support\n\n### Changed\n\n- TikTok backend migrated from Apify to ScrapeCreators API (`api.scrapecreators.com`)\n- `APIFY_API_TOKEN` replaced by `SCRAPECREATORS_API_KEY` in config\n- SKILL.md version bumped to v2.8\n- WebSearch citation instruction strengthened to prevent trailing Sources: blocks\n- Security section updated: Apify → ScrapeCreators references\n\n### Fixed\n\n- Web stats line showing full URLs instead of plain domain names\n- Trailing \"Sources:\" block appearing after skill invitation (WebSearch tool mandate conflict)\n- Instagram/TikTok not running in web-only mode when `--search=instagram` used without Reddit/X\n- `$ARGUMENTS` quoting in SKILL.md for correct flag forwarding\n\n## [2.1.0] - 2026-02-15\n\n### Highlights\n\nThree headline features: watchlists for always-on bots, YouTube transcripts as a 4th source, and Codex CLI compatibility. Plus bundled X search with no external CLI needed.\n\n### Added\n\n- Open-class skill with watchlists, briefings, and history modes (SQLite-backed, FTS5 full-text search, WAL mode) (`feat(open)`)\n- YouTube as a 4th research source via yt-dlp -- search, view counts, and auto-generated transcript extraction (`feat: Add YouTube`)\n- OpenAI Codex CLI compatibility -- install to `~/.agents/skills/last30days`, invoke with `$last30days` (`feat: Add Codex CLI`)\n- Bundled X search -- vendored subset of Bird's Twitter GraphQL client (MIT, originally by @steipete), no external CLI needed (`v2.1: Bundle Bird X search`)\n- Native web search backends: Parallel AI, Brave Search, OpenRouter/Perplexity Sonar Pro (`feat(engine)`)\n- `--diagnose` flag for checking available sources and authentication status\n- `--store` flag for SQLite accumulation (open variant)\n- Conversational first-run experience (NUX) with dynamic source status (`feat(nux)`)\n\n### Changed\n\n- Smarter query construction -- strips noise words, auto-retries with shorter queries when X returns 0 results\n- Two-phase search architecture -- Phase 1 discovers entities (@handles, r/subreddits), Phase 2 drills into them\n- Reddit JSON enrichment -- real upvotes, comments, and upvote ratio from reddit.com/.json endpoint\n- Engagement-weighted scoring: relevance 45%, recency 25%, engagement 30% (log1p dampening)\n- Model auto-selection with 7-day cache and fallback chain (gpt-4.1 -> gpt-4o -> gpt-4o-mini)\n- `--days=N` configurable lookback flag (thanks @jonthebeef, [#18](https://github.com/mvanhorn/last30days-skill/pull/18))\n- Model fallback for unverified orgs (thanks @levineam, [#16](https://github.com/mvanhorn/last30days-skill/pull/16))\n- Marketplace plugin support via `.claude-plugin/plugin.json` (inspired by @galligan, [#1](https://github.com/mvanhorn/last30days-skill/pull/1))\n\n### Fixed\n\n- YouTube timeout increased to 90s, Reddit 429 rate limit fail-fast\n- YouTube soft date filter -- keeps evergreen content instead of filtering to 0 results\n- Eager import crash in `__init__.py` that broke Codex environments\n- Reddit future timeout (same pattern as YouTube timeout bug)\n- Process cleanup on timeout/kill -- tracks child PIDs for clean shutdown\n- Windows Unicode fix for cp1252 emoji crash (thanks @JosephOIbrahim, [#17](https://github.com/mvanhorn/last30days-skill/pull/17))\n- X search returning 0 results on popular topics due to over-specific queries\n\n### New Contributors\n\n- @JosephOIbrahim -- Windows Unicode fix ([#17](https://github.com/mvanhorn/last30days-skill/pull/17))\n- @levineam -- Model fallback for unverified orgs ([#16](https://github.com/mvanhorn/last30days-skill/pull/16))\n- @jonthebeef -- `--days=N` configurable lookback ([#18](https://github.com/mvanhorn/last30days-skill/pull/18))\n\n### Credits\n\n- @steipete -- Bird CLI (vendored X search) and yt-dlp/summarize inspiration for YouTube transcripts\n- @galligan -- Marketplace plugin inspiration\n- @hutchins -- Pushed for YouTube feature\n\n## [1.0.0] - 2026-01-15\n\nInitial public release. Reddit + X search via OpenAI Responses API and xAI API.\n\n[2.9.1]: https://github.com/mvanhorn/last30days-skill/compare/v2.9.0...v2.9.1\n[2.9.0]: https://github.com/mvanhorn/last30days-skill/compare/v2.8.0...v2.9.0\n[2.8.0]: https://github.com/mvanhorn/last30days-skill/compare/v2.6.0...v2.8.0\n[2.1.0]: https://github.com/mvanhorn/last30days-skill/compare/v1.0.0...v2.1.0\n[1.0.0]: https://github.com/mvanhorn/last30days-skill/releases/tag/v1.0.0\n\nFile v3.0.0-open:context.md\n\n# last30days Context\n\nAgent memory for improving research quality over time.\n\n## User Preferences\n<!-- Record preferences discovered during interactions -->\n<!-- e.g., \"Prefers detailed technical analysis over general summaries\" -->\n\n## Source Quality Notes\n<!-- Record which sources work best for which topics -->\n<!-- e.g., \"r/LocalLLaMA is highest signal for AI hardware topics\" -->\n<!-- e.g., \"@kaboratech provides reliable AI tool reviews\" -->\n\n## Interaction History\n<!-- Record topics researched and useful follow-up patterns -->\n<!-- e.g., \"2026-02-14: Researched 'AI video tools', user wanted Runway vs Kling comparison\" -->\n\nArchive v2.9.3: 47 files, 188453 bytes\n\nFiles: CHANGELOG.md (8958b), README.md (69588b), scripts/briefing.py (8178b), scripts/last30days.py (66702b), scripts/lib/__init__.py (29b), scripts/lib/bird_x.py (16235b), scripts/lib/brave_search.py (6019b), scripts/lib/cache.py (4762b), scripts/lib/dates.py (3253b), scripts/lib/dedupe.py (8631b), scripts/lib/entity_extract.py (4205b), scripts/lib/env.py (15490b), scripts/lib/hackernews.py (7592b), scripts/lib/http.py (6067b), scripts/lib/instagram.py (14076b), scripts/lib/models.py (5218b), scripts/lib/normalize.py (12037b), scripts/lib/openai_reddit.py (17956b), scripts/lib/openrouter_search.py (6632b), scripts/lib/parallel_search.py (4016b), scripts/lib/polymarket.py (20350b), scripts/lib/reddit_enrich.py (9592b), scripts/lib/reddit.py (19015b), scripts/lib/render.py (32901b), scripts/lib/schema.py (26339b), scripts/lib/score.py (18968b), scripts/lib/tiktok.py (13515b), scripts/lib/ui.py (23070b), scripts/lib/vendor/bird-search/bird-search.mjs (3750b), scripts/lib/vendor/bird-search/lib/cookies.js (6266b), scripts/lib/vendor/bird-search/lib/paginate-cursor.js (1225b), scripts/lib/vendor/bird-search/lib/runtime-features.js (5036b), scripts/lib/vendor/bird-search/lib/runtime-query-ids.js (9424b), scripts/lib/vendor/bird-search/lib/twitter-client-base.js (4853b), scripts/lib/vendor/bird-search/lib/twitter-client-constants.js (2535b), scripts/lib/vendor/bird-search/lib/twitter-client-features.js (18400b), scripts/lib/vendor/bird-search/lib/twitter-client-search.js (7310b), scripts/lib/vendor/bird-search/lib/twitter-client-types.js (59b), scripts/lib/vendor/bird-search/lib/twitter-client-utils.js (19169b), scripts/lib/websearch.py (11688b), scripts/lib/xai_x.py (6646b), scripts/lib/youtube_yt.py (13599b), scripts/store.py (20353b), scripts/sync.sh (2056b), scripts/watchlist.py (11071b), SKILL.md (30541b), _meta.json (138b)\n\nFile v2.9.3:SKILL.md\n\n---\nname: last30days\nversion: \"2.9.2\"\ndescription: \"Research a topic from the last 30 days. Also triggered by 'last30'. Sources: Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, web. Become an expert and write copy-paste-ready prompts.\"\nargument-hint: 'last30 AI video tools, last30 best project management tools'\nallowed-tools: Bash, Read, Write, AskUserQuestion, WebSearch\nhomepage: https://github.com/mvanhorn/last30days-skill\nrepository: https://github.com/mvanhorn/last30days-skill\nauthor: mvanhorn\nlicense: MIT\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: \"📰\"\n    requires:\n      env:\n        - SCRAPECREATORS_API_KEY\n      optionalEnv:\n        - OPENAI_API_KEY\n        - XAI_API_KEY\n        - OPENROUTER_API_KEY\n        - PARALLEL_API_KEY\n        - BRAVE_API_KEY\n        - APIFY_API_TOKEN\n        - AUTH_TOKEN\n        - CT0\n      bins:\n        - node\n        - python3\n    primaryEnv: SCRAPECREATORS_API_KEY\n    files:\n      - \"scripts/*\"\n    homepage: https://github.com/mvanhorn/last30days-skill\n    tags:\n      - research\n      - reddit\n      - x\n      - youtube\n      - tiktok\n      - instagram\n      - hackernews\n      - polymarket\n      - trends\n      - prompts\n---\n\n# last30days v2.9.4: Research Any Topic from the Last 30 Days\n\n> **Permissions overview:** Reads public web/platform data and optionally saves research briefings to `~/Documents/Last30Days/`. X/Twitter search uses optional user-provided tokens (AUTH_TOKEN/CT0 env vars) — no browser session access. All credential usage and data writes are documented in the [Security & Permissions](#security--permissions) section.\n\nResearch ANY topic across Reddit, X, YouTube, TikTok, Hacker News, Polymarket, and the web. Surface what people are actually discussing, recommending, betting on, and debating right now.\n\n## CRITICAL: Parse User Intent\n\nBefore doing anything, parse the user's input for:\n\n1. **TOPIC**: What they want to learn about (e.g., \"web app mockups\", \"Claude Code skills\", \"image generation\")\n2. **TARGET TOOL** (if specified): Where they'll use the prompts (e.g., \"Nano Banana Pro\", \"ChatGPT\", \"Midjourney\")\n3. **QUERY TYPE**: What kind of research they want:\n   - **PROMPTING** - \"X prompts\", \"prompting for X\", \"X best practices\" → User wants to learn techniques and get copy-paste prompts\n   - **RECOMMENDATIONS** - \"best X\", \"top X\", \"what X should I use\", \"recommended X\" → User wants a LIST of specific things\n   - **NEWS** - \"what's happening with X\", \"X news\", \"latest on X\" → User wants current events/updates\n   - **GENERAL** - anything else → User wants broad understanding of the topic\n\nCommon patterns:\n- `[topic] for [tool]` → \"web mockups for Nano Banana Pro\" → TOOL IS SPECIFIED\n- `[topic] prompts for [tool]` → \"UI design prompts for Midjourney\" → TOOL IS SPECIFIED\n- Just `[topic]` → \"iOS design mockups\" → TOOL NOT SPECIFIED, that's OK\n- \"best [topic]\" or \"top [topic]\" → QUERY_TYPE = RECOMMENDATIONS\n- \"what are the best [topic]\" → QUERY_TYPE = RECOMMENDATIONS\n\n**IMPORTANT: Do NOT ask about target tool before research.**\n- If tool is specified in the query, use it\n- If tool is NOT specified, run research first, then ask AFTER showing results\n\n**Store these variables:**\n- `TOPIC = [extracted topic]`\n- `TARGET_TOOL = [extracted tool, or \"unknown\" if not specified]`\n- `QUERY_TYPE = [RECOMMENDATIONS | NEWS | HOW-TO | GENERAL]`\n\n**DISPLAY your parsing to the user.** Before running any tools, output:\n\n```\nI'll research {TOPIC} across Reddit, X, TikTok, and the web to find what's been discussed in the last 30 days.\n\nParsed intent:\n- TOPIC = {TOPIC}\n- TARGET_TOOL = {TARGET_TOOL or \"unknown\"}\n- QUERY_TYPE = {QUERY_TYPE}\n\nResearch typically takes 2-8 minutes (niche topics take longer). Starting now.\n```\n\nIf TARGET_TOOL is known, mention it in the intro: \"...to find {QUERY_TYPE}-style content for use in {TARGET_TOOL}.\"\n\nThis text MUST appear before you call any tools. It confirms to the user that you understood their request.\n\n---\n\n## Step 0.5: Resolve X Handle (if topic could have an X account)\n\nIf TOPIC looks like it could have its own X/Twitter account - **people, creators, brands, products, tools, companies, communities** (e.g., \"Dor Brothers\", \"Jason Calacanis\", \"Nano Banana Pro\", \"Seedance\", \"Midjourney\"), do ONE quick WebSearch:\n\n```\nWebSearch(\"{TOPIC} X twitter handle site:x.com\")\n```\n\nFrom the results, extract their X/Twitter handle. Look for:\n- **Verified profile URLs** like `x.com/{handle}` or `twitter.com/{handle}`\n- Mentions like \"@handle\" in bios, articles, or social profiles\n- \"Follow @handle on X\" patterns\n\n**Verify the account is real, not a parody/fan account.** Check for:\n- Verified/blue checkmark in the search results\n- Official website linking to the X account\n- Consistent naming (e.g., @thedorbrothers for \"The Dor Brothers\", not @DorBrosFan)\n- If results only show fan/parody/news accounts (not the entity's own account), skip - the entity may not have an X presence\n\nIf you find a clear, verified handle, pass it as `--x-handle={handle}` (without @). This searches that account's posts directly - finding content they posted that doesn't mention their own name.\n\n**Skip this step if:**\n- TOPIC is clearly a generic concept, not an entity (e.g., \"best rap songs 2026\", \"how to use Docker\", \"AI ethics debate\")\n- TOPIC already contains @ (user provided the handle directly)\n- Using `--quick` depth\n- WebSearch shows no official X account exists for this entity\n\nStore: `RESOLVED_HANDLE = {handle or empty}`\n\n---\n\n## Agent Mode (--agent flag)\n\nIf `--agent` appears in ARGUMENTS (e.g., `/last30days plaud granola --agent`):\n\n1. **Skip** the intro display block (\"I'll research X across Reddit...\")\n2. **Skip** any `AskUserQuestion` calls - use `TARGET_TOOL = \"unknown\"` if not specified\n3. **Run** the research script and WebSearch exactly as normal\n4. **Skip** the \"WAIT FOR USER RESPONSE\" pause\n5. **Skip** the follow-up invitation (\"I'm now an expert on X...\")\n6. **Output** the complete research report and stop - do not wait for further input\n\nAgent mode saves raw research data to `~/Documents/Last30Days/` automatically via `--save-dir` (handled by the script, no extra tool calls).\n\nAgent mode report format:\n\n```\n## Research Report: {TOPIC}\nGenerated: {date} | Sources: Reddit, X, YouTube, TikTok, HN, Polymarket, Web\n\n### Key Findings\n[3-5 bullet points, highest-signal insights with citations]\n\n### What I learned\n{The full \"What I learned\" synthesis from normal output}\n\n### Stats\n{The standard stats block}\n```\n\n---\n\n## Research Execution\n\n**Step 1: Run the research script (FOREGROUND — do NOT background this)**\n\n**CRITICAL: Run this command in the FOREGROUND with a 5-minute timeout. Do NOT use run_in_background. The full output contains Reddit, X, AND YouTube data that you need to read completely.**\n\n**IMPORTANT: The script handles API key/Codex auth detection automatically.** Run it and check the output to determine mode.\n\n```bash\n# Find skill root — works in repo checkout, Claude Code, or Codex install\nfor dir in \\\n  \".\" \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\" \\\n  \"$HOME/.claude/skills/last30days\" \\\n  \"$HOME/.agents/skills/last30days\" \\\n  \"$HOME/.codex/skills/last30days\"; do\n  [ -n \"$dir\" ] && [ -f \"$dir/scripts/last30days.py\" ] && SKILL_ROOT=\"$dir\" && break\ndone\n\nif [ -z \"${SKILL_ROOT:-}\" ]; then\n  echo \"ERROR: Could not find scripts/last30days.py\" >&2\n  exit 1\nfi\n\npython3 \"${SKILL_ROOT}/scripts/last30days.py\" \"$ARGUMENTS\" --emit=compact --no-native-web --save-dir=~/Documents/Last30Days  # Add --x-handle=HANDLE if RESOLVED_HANDLE is set\n```\n\nUse a **timeout of 300000** (5 minutes) on the Bash call. The script typically takes 1-3 minutes.\n\nThe script will automatically:\n- Detect available API keys\n- Run Reddit/X/YouTube/TikTok/Instagram/Hacker News/Polymarket searches\n- Output ALL results including YouTube transcripts, TikTok captions, Instagram captions, HN comments, and prediction market odds\n\n**Read the ENTIRE output.** It contains EIGHT data sections in this order: Reddit items, X items, YouTube items, TikTok items, Instagram Reels items, Hacker News items, Polymarket items, and WebSearch items. If you miss sections, you will produce incomplete stats.\n\n**YouTube items in the output look like:** `**{video_id}** (score:N) {channel_name} [N views, N likes]` followed by a title, URL, and optional transcript snippet. Count them and include them in your synthesis and stats block.\n\n**TikTok items in the output look like:** `**{TK_id}** (score:N) @{creator} [N views, N likes]` followed by a caption, URL, hashtags, and optional caption snippet. Count them and include them in your synthesis and stats block.\n\n**Instagram Reels items in the output look like:** `**{IG_id}** (score:N) @{creator} (date) [N views, N likes]` followed by caption text, URL, and optional transcript. Count them and include them in your synthesis and stats block. Instagram provides unique creator/influencer perspective — weight it alongside TikTok.\n\n---\n\n## STEP 2: DO WEBSEARCH AFTER SCRIPT COMPLETES\n\nAfter the script finishes, do WebSearch to supplement with blogs, tutorials, and news.\n\nFor **ALL modes**, do WebSearch to supplement (or provide all data in web-only mode).\n\nChoose search queries based on QUERY_TYPE:\n\n**If RECOMMENDATIONS** (\"best X\", \"top X\", \"what X should I use\"):\n- Search for: `best {TOPIC} recommendations`\n- Search for: `{TOPIC} list examples`\n- Search for: `most popular {TOPIC}`\n- Goal: Find SPECIFIC NAMES of things, not generic advice\n\n**If NEWS** (\"what's happening with X\", \"X news\"):\n- Search for: `{TOPIC} news 2026`\n- Search for: `{TOPIC} announcement update`\n- Goal: Find current events and recent developments\n\n**If PROMPTING** (\"X prompts\", \"prompting for X\"):\n- Search for: `{TOPIC} prompts examples 2026`\n- Search for: `{TOPIC} techniques tips`\n- Goal: Find prompting techniques and examples to create copy-paste prompts\n\n**If GENERAL** (default):\n- Search for: `{TOPIC} 2026`\n- Search for: `{TOPIC} discussion`\n- Goal: Find what people are actually saying\n\nFor ALL query types:\n- **USE THE USER'S EXACT TERMINOLOGY** - don't substitute or add tech names based on your knowledge\n- EXCLUDE reddit.com, x.com, twitter.com (covered by script)\n- INCLUDE: blogs, tutorials, docs, news, GitHub repos\n- **DO NOT output a separate \"Sources:\" block** — instead, include the top 3-5 web\n  source names as inline links on the 🌐 Web: stats line (see stats format below).\n  The WebSearch tool requires citation; satisfy it there, not as a trailing section.\n\n**Options** (passed through from user's command):\n- `--days=N` → Look back N days instead of 30 (e.g., `--days=7` for weekly roundup)\n- `--quick` → Faster, fewer sources (8-12 each)\n- (default) → Balanced (20-30 each)\n- `--deep` → Comprehensive (50-70 Reddit, 40-60 X)\n\n---\n\n## Judge Agent: Synthesize All Sources\n\n**After all searches complete, internally synthesize (don't display stats yet):**\n\nThe Judge Agent must:\n1. Weight Reddit/X sources HIGHER (they have engagement signals: upvotes, likes)\n2. Weight YouTube sources HIGH (they have views, likes, and transcript content)\n3. Weight TikTok sources HIGH (they have views, likes, and caption content — viral signal)\n4. Weight WebSearch sources LOWER (no engagement data)\n5. **For Reddit: Pay special attention to top comments** — they often contain the wittiest, most insightful, or funniest take. When a top comment has high upvotes (shown as `💬 Top comment (N upvotes)`), quote it directly in your synthesis. Reddit's value is in the comments.\n6. Identify patterns that appear across ALL sources (strongest signals)\n7. Note any contradictions between sources\n8. Extract the top 3-5 actionable insights\n\n7. **Cross-platform signals are the strongest evidence.** When items have `[also on: Reddit, HN]` or similar tags, it means the same story appears across multiple platforms. Lead with these cross-platform findings - they're the most important signals in the research.\n\n### Prediction Markets (Polymarket)\n\n**CRITICAL: When Polymarket returns relevant markets, prediction market odds are among the highest-signal data points in your research.** Real money on outcomes cuts through opinion. Treat them as strong evidence, not an afterthought.\n\n**How to interpret and synthesize Polymarket data:**\n\n1. **Prefer structural/long-term markets over near-term deadlines.** Championship odds > regular season title. Regime change > near-term strike deadline. IPO/major milestone > incremental update. Presidency > individual state primary. When multiple markets exist, the bigger question is more interesting to the user.\n\n2. **When the topic is an outcome in a multi-outcome market, call out that specific outcome's odds and movement.** Don't just say \"Polymarket has a #1 seed market\" - say \"Arizona has a 28% chance of being the #1 overall seed, up 10% this month.\" The user cares about THEIR topic's position in the market.\n\n3. **Weave odds into the narrative as supporting evidence.** Don't isolate Polymarket data in its own paragraph. Instead: \"Final Four buzz is building - Polymarket gives Arizona a 12% chance to win the championship (up 3% this week), and 28% to earn a #1 seed.\"\n\n4. **Citation format:** Always include specific odds AND movement. \"Polymarket has Arizona at 28% for a #1 seed (up 10% this month)\" - not just \"per Polymarket.\"\n\n5. **When multiple relevant markets exist, highlight 3-5 of the most interesting ones** in your synthesis, ordered by importance (structural > near-term). Don't just pick the highest-volume one.\n\n**Domain examples of market importance ranking:**\n- **Sports:** Championship/tournament odds > conference title > regular season > weekly matchup\n- **Geopolitics:** Regime change/structural outcomes > near-term strike deadlines > sanctions\n- **Tech/Business:** IPO, major product launch, company milestones > incremental updates\n- **Elections:** Presidency > primary > individual state\n\n**Do NOT display stats here - they come at the end, right before the invitation.**\n\n---\n\n## FIRST: Internalize the Research\n\n**CRITICAL: Ground your synthesis in the ACTUAL research content, not your pre-existing knowledge.**\n\nRead the research output carefully. Pay attention to:\n- **Exact product/tool names** mentioned (e.g., if research mentions \"ClawdBot\" or \"@clawdbot\", that's a DIFFERENT product than \"Claude Code\" - don't conflate them)\n- **Specific quotes and insights** from the sources - use THESE, not generic knowledge\n- **What the sources actually say**, not what you assume the topic is about\n\n**ANTI-PATTERN TO AVOID**: If user asks about \"clawdbot skills\" and research returns ClawdBot content (self-hosted AI agent), do NOT synthesize this as \"Claude Code skills\" just because both involve \"skills\". Read what the research actually says.\n\n### If QUERY_TYPE = RECOMMENDATIONS\n\n**CRITICAL: Extract SPECIFIC NAMES, not generic patterns.**\n\nWhen user asks \"best X\" or \"top X\", they want a LIST of specific things:\n- Scan research for specific product names, tool names, project names, skill names, etc.\n- Count how many times each is mentioned\n- Note which sources recommend each (Reddit thread, X post, blog)\n- List them by popularity/mention count\n\n**BAD synthesis for \"best Claude Code skills\":**\n> \"Skills are powerful. Keep them under 500 lines. Use progressive disclosure.\"\n\n**GOOD synthesis for \"best Claude Code skills\":**\n> \"Most mentioned skills: /commit (5 mentions), remotion skill (4x), git-worktree (3x), /pr (3x). The Remotion announcement got 16K likes on X.\"\n\n### For all QUERY_TYPEs\n\nIdentify from the ACTUAL RESEARCH OUTPUT:\n- **PROMPT FORMAT** - Does research recommend JSON, structured params, natural language, keywords?\n- The top 3-5 patterns/techniques that appeared across multiple sources\n- Specific keywords, structures, or approaches mentioned BY THE SOURCES\n- Common pitfalls mentioned BY THE SOURCES\n\n---\n\n## THEN: Show Summary + Invite Vision\n\n**Display in this EXACT sequence:**\n\n**FIRST - What I learned (based on QUERY_TYPE):**\n\n**If RECOMMENDATIONS** - Show specific things mentioned with sources:\n```\n🏆 Most mentioned:\n\n[Tool Name] - {n}x mentions\nUse Case: [what it does]\nSources: @handle1, @handle2, r/sub, blog.com\n\n[Tool Name] - {n}x mentions\nUse Case: [what it does]\nSources: @handle3, r/sub2, Complex\n\nNotable mentions: [other specific things with 1-2 mentions]\n```\n\n**CRITICAL for RECOMMENDATIONS:**\n- Each item MUST have a \"Sources:\" line with actual @handles from X posts (e.g., @LONGLIVE47, @ByDobson)\n- Include subreddit names (r/hiphopheads) and web sources (Complex, Variety)\n- Parse @handles from research output and include the highest-engagement ones\n- Format naturally - tables work well for wide terminals, stacked cards for narrow\n\n**If PROMPTING/NEWS/GENERAL** - Show synthesis and patterns:\n\nCITATION RULE: Cite sources sparingly to prove research is real.\n- In the \"What I learned\" intro: cite 1-2 top sources total, not every sentence\n- In KEY PATTERNS: cite 1 source per pattern, short format: \"per @handle\" or \"per r/sub\"\n- Do NOT include engagement metrics in citations (likes, upvotes) - save those for stats box\n- Do NOT chain multiple citations: \"per @x, @y, @z\" is too much. Pick the strongest one.\n\nCITATION PRIORITY (most to least preferred):\n1. @handles from X — \"per @handle\" (these prove the tool's unique value)\n2. r/subreddits from Reddit — \"per r/subreddit\" (when citing Reddit, prefer quoting top comments over just the thread title)\n3. YouTube channels — \"per [channel name] on YouTube\" (transcript-backed insights)\n4. TikTok creators — \"per @creator on TikTok\" (viral/trending signal)\n5. Instagram creators — \"per @creator on Instagram\" (influencer/creator signal)\n6. HN discussions — \"per HN\" or \"per hn/username\" (developer community signal)\n7. Polymarket — \"Polymarket has X at Y% (up/down Z%)\" with specific odds and movement\n8. Web sources — ONLY when Reddit/X/YouTube/TikTok/Instagram/HN/Polymarket don't cover that specific fact\n\nThe tool's value is surfacing what PEOPLE are saying, not what journalists wrote.\nWhen both a web article and an X post cover the same fact, cite the X post.\n\nURL FORMATTING: NEVER paste raw URLs anywhere in the output — not in synthesis, not in stats, not in sources.\n- **BAD:** \"per https://www.rollingstone.com/music/music-news/kanye-west-bully-1235506094/\"\n- **GOOD:** \"per Rolling Stone\"\n- **BAD stats line:** `🌐 Web: 10 pages — https://later.com/blog/..., https://buffer.com/...`\n- **GOOD stats line:** `🌐 Web: 10 pages — Later, Buffer, CNN, SocialBee`\nUse the publication/site name, not the URL. The user doesn't need links — they need clean, readable text.\n\n**BAD:** \"His album is set for March 20 (per Rolling Stone; Billboard; Complex).\"\n**GOOD:** \"His album BULLY drops March 20 — fans on X are split on the tracklist, per @honest30bgfan_\"\n**GOOD:** \"Ye's apology got massive traction on r/hiphopheads\"\n**OK** (web, only when Reddit/X don't have it): \"The Hellwatt Festival runs July 4-18 at RCF Arena, per Billboard\"\n\n**Lead with people, not publications.** Start each topic with what Reddit/X\nusers are saying/feeling, then add web context only if needed. The user came\nhere for the conversation, not the press release.\n\n```\nWhat I learned:\n\n**{Topic 1}** — [1-2 sentences about what people are saying, per @handle or r/sub]\n\n**{Topic 2}** — [1-2 sentences, per @handle or r/sub]\n\n**{Topic 3}** — [1-2 sentences, per @handle or r/sub]\n\nKEY PATTERNS from the research:\n1. [Pattern] — per @handle\n2. [Pattern] — per r/sub\n3. [Pattern] — per @handle\n```\n\n**THEN - Stats (right before invitation):**\n\n**CRITICAL: Calculate actual totals from the research output.**\n- Count posts/threads from each section\n- Sum engagement: parse `[Xlikes, Yrt]` from each X post, `[Xpts, Ycmt]` from Reddit\n- Identify top voices: highest-engagement @handles from X, most active subreddits\n\n**Copy this EXACTLY, replacing only the {placeholders}:**\n\n```\n---\n✅ All agents reported back!\n├─ 🟠 Reddit: {N} threads │ {N} upvotes │ {N} comments\n├─ 🔵 X: {N} posts │ {N} likes │ {N} reposts\n├─ 🔴 YouTube: {N} videos │ {N} views │ {N} with transcripts\n├─ 🎵 TikTok: {N} videos │ {N} views │ {N} likes │ {N} with captions\n├─ 📸 Instagram: {N} reels │ {N} views │ {N} likes │ {N} with captions\n├─ 🟡 HN: {N} stories │ {N} points │ {N} comments\n├─ 📊 Polymarket: {N} markets │ {short summary of up to 5 most relevant market odds, e.g. \"Championship: 12%, #1 Seed: 28%, Big 12: 64%, vs Kansas: 71%\"}\n├─ 🌐 Web: {N} pages — Source Name, Source Name, Source Name\n└─ 🗣️ Top voices: @{handle1} ({N} likes), @{handle2} │ r/{sub1}, r/{sub2}\n---\n```\n\n**🌐 Web: line — how to extract site names from URLs:**\nStrip the protocol, path, and `www.` — use the recognizable publication name:\n- `https://later.com/blog/instagram-reels-trends/` → **Later**\n- `https://socialbee.com/blog/instagram-trends/` → **SocialBee**\n- `https://buffer.com/resources/instagram-algorithms/` → **Buffer**\n- `https://www.cnn.com/2026/02/22/tech/...` → **CNN**\n- `https://medium.com/the-ai-studio/...` → **Medium**\n- `https://radicaldatascience.wordpress.com/...` → **Radical Data Science**\nList as comma-separated plain names: `Later, SocialBee, Buffer, CNN, Medium`\n\n**⚠️ WebSearch citation — ALREADY SATISFIED. DO NOT ADD A SOURCES SECTION.**\nThe WebSearch tool mandates source citation. That requirement is FULLY satisfied by the source names on the 🌐 Web: line above. Do NOT append a separate \"Sources:\" section at the end of your response. Do NOT list URLs anywhere. The 🌐 Web: line IS your citation. Nothing more is needed.\n\n**CRITICAL: Omit any source line that returned 0 results.** Do NOT show \"0 threads\", \"0 stories\", \"0 markets\", or \"(no results this cycle)\". If a source found nothing, DELETE that line entirely - don't include it at all.\nNEVER use plain text dashes (-) or pipe (|). ALWAYS use ├─ └─ │ and the emoji.\n\n**SELF-CHECK before displaying**: Re-read your \"What I learned\" section. Does it match what the research ACTUALLY says? If you catch yourself projecting your own knowledge instead of the research, rewrite it.\n\n**LAST - Invitation (adapt to QUERY_TYPE):**\n\n**CRITICAL: Every invitation MUST include 2-3 specific example suggestions based on what you ACTUALLY learned from the research.** Don't be generic — show the user you absorbed the content by referencing real things from the results.\n\n**If QUERY_TYPE = PROMPTING:**\n```\n---\nI'm now an expert on {TOPIC} for {TARGET_TOOL}. What do you want to make? For example:\n- [specific idea based on popular technique from research]\n- [specific idea based on trending style/approach from research]\n- [specific idea riffing on what people are actually creating]\n\nJust describe your vision and I'll write a prompt you can paste straight into {TARGET_TOOL}.\n```\n\n**If QUERY_TYPE = RECOMMENDATIONS:**\n```\n---\nI'm now an expert on {TOPIC}. Want me to go deeper? For example:\n- [Compare specific item A vs item B from the results]\n- [Explain why item C is trending right now]\n- [Help you get started with item D]\n```\n\n**If QUERY_TYPE = NEWS:**\n```\n---\nI'm now an expert on {TOPIC}. Some things you could ask:\n- [Specific follow-up question about the biggest story]\n- [Question about implications of a key development]\n- [Question about what might happen next based on current trajectory]\n```\n\n**If QUERY_TYPE = GENERAL:**\n```\n---\nI'm now an expert on {TOPIC}. Some things I can help with:\n- [Specific question based on the most discussed aspect]\n- [Specific creative/practical application of what you learned]\n- [Deeper dive into a pattern or debate from the research]\n```\n\n**Example invitations (to show the quality bar):**\n\nFor `/last30days nano banana pro prompts for Gemini`:\n> I'm now an expert on Nano Banana Pro for Gemini. What do you want to make? For example:\n> - Photorealistic product shots with natural lighting (the most requested style right now)\n> - Logo designs with embedded text (Gemini's new strength per the research)\n> - Multi-reference style transfer from a mood board\n>\n> Just describe your vision and I'll write a prompt you can paste straight into Gemini.\n\nFor `/last30days kanye west` (GENERAL):\n> I'm now an expert on Kanye West. Some things I can help with:\n> - What's the real story behind the apology letter — genuine or PR move?\n> - Break down the BULLY tracklist reactions and what fans are expecting\n> - Compare how Reddit vs X are reacting to the Bianca narrative\n\nFor `/last30days war in Iran` (NEWS):\n> I'm now an expert on the Iran situation. Some things you could ask:\n> - What are the realistic escalation scenarios from here?\n> - How is this playing differently in US vs international media?\n> - What's the economic impact on oil markets so far?\n\n---\n\n## WAIT FOR USER'S RESPONSE\n\n**STOP and wait** for the user to respond. Do NOT call any tools after displaying the invitation. The research script already saved raw data to `~/Documents/Last30Days/` via `--save-dir`.\n\n---\n\n## WHEN USER RESPONDS\n\n**Read their response and match the intent:**\n\n- If they ask a **QUESTION** about the topic → Answer from your research (no new searches, no prompt)\n- If they ask to **GO DEEPER** on a subtopic → Elaborate using your research findings\n- If they describe something they want to **CREATE** → Write ONE perfect prompt (see below)\n- If they ask for a **PROMPT** explicitly → Write ONE perfect prompt (see below)\n\n**Only write a prompt when the user wants one.** Don't force a prompt on someone who asked \"what could happen next with Iran.\"\n\n### Writing a Prompt\n\nWhen the user wants a prompt, write a **single, highly-tailored prompt** using your research expertise.\n\n### CRITICAL: Match the FORMAT the research recommends\n\n**If research says to use a specific prompt FORMAT, YOU MUST USE THAT FORMAT.**\n\n**ANTI-PATTERN**: Research says \"use JSON prompts with device specs\" but you write plain prose. This defeats the entire purpose of the research.\n\n### Quality Checklist (run before delivering):\n- [ ] **FORMAT MATCHES RESEARCH** - If research said JSON/structured/etc, prompt IS that format\n- [ ] Directly addresses what the user said they want to create\n- [ ] Uses specific patterns/keywords discovered in research\n- [ ] Ready to paste with zero edits (or minimal [PLACEHOLDERS] clearly marked)\n- [ ] Appropriate length and style for TARGET_TOOL\n\n### Output Format:\n\n```\nHere's your prompt for {TARGET_TOOL}:\n\n---\n\n[The actual prompt IN THE FORMAT THE RESEARCH RECOMMENDS]\n\n---\n\nThis uses [brief 1-line explanation of what research insight you applied].\n```\n\n---\n\n## IF USER ASKS FOR MORE OPTIONS\n\nOnly if they ask for alternatives or more prompts, provide 2-3 variations. Don't dump a prompt pack unless requested.\n\n---\n\n## AFTER EACH PROMPT: Stay in Expert Mode\n\nAfter delivering a prompt, offer to write more:\n\n> Want another prompt? Just tell me what you're creating next.\n\n---\n\n## CONTEXT MEMORY\n\nFor the rest of this conversation, remember:\n- **TOPIC**: {topic}\n- **TARGET_TOOL**: {tool}\n- **KEY PATTERNS**: {list the top 3-5 patterns you learned}\n- **RESEARCH FINDINGS**: The key facts and insights from the research\n\n**CRITICAL: After research is complete, treat yourself as an EXPERT on this topic.**\n\nWhen the user asks follow-up questions:\n- **DO NOT run new WebSearches** - you already have the research\n- **Answer from what you learned** - cite the Reddit threads, X posts, and web sources\n- **If they ask a question** - answer it from your research findings\n- **If they ask for a prompt** - write one using your expertise\n\nOnly do new research if the user explicitly asks about a DIFFERENT topic.\n\n---\n\n## Output Summary Footer (After Each Prompt)\n\nAfter delivering a prompt, end with:\n\n```\n---\n📚 Expert in: {TOPIC} for {TARGET_TOOL}\n📊 Based on: {n} Reddit threads ({sum} upvotes) + {n} X posts ({sum} likes) + {n} YouTube videos ({sum} views) + {n} TikTok videos ({sum} views) + {n} Instagram reels ({sum} views) + {n} HN stories ({sum} points) + {n} web pages\n\nWant another prompt? Just tell me what you're creating next.\n```\n\n---\n\n## Security & Permissions\n\n**What this skill does:**\n- Sends search queries to ScrapeCreators API (`api.scrapecreators.com`) for Reddit search, subreddit discovery, and comment enrichment (requires SCRAPECREATORS_API_KEY — same key as TikTok + Instagram)\n- Legacy: Sends search queries to OpenAI's Responses API (`api.openai.com`) for Reddit discovery (fallback if no SCRAPECREATORS_API_KEY)\n- Sends search queries to Twitter's GraphQL API (via optional user-provided AUTH_TOKEN/CT0 env vars — no browser session access) or xAI's API (`api.x.ai`) for X search\n- Sends search queries to Algolia HN Search API (`hn.algolia.com`) for Hacker News story and comment discovery (free, no auth)\n- Sends search queries to Polymarket Gamma API (`gamma-api.polymarket.com`) for prediction market discovery (free, no auth)\n- Runs `yt-dlp` locally for YouTube search and transcript extraction (no API key, public data)\n- Sends search queries to ScrapeCreators API (`api.scrapecreators.com`) for TikTok and Instagram search, transcript/caption extraction (same SCRAPECREATORS_API_KEY as Reddit, PAYG after 100 free credits)\n- Optionally sends search queries to Brave Search API, Parallel AI API, or OpenRouter API for web search\n- Fetches public Reddit thread data from `reddit.com` for engagement metrics\n- Stores research findings in local SQLite database (watchlist mode only)\n- Saves research briefings as .md files to ~/Documents/Last30Days/\n\n**What this skill does NOT do:**\n- Does not post, like, or modify content on any platform\n- Does not access your Reddit, X, or YouTube accounts\n- Does not share API keys between providers (OpenAI key only goes to api.openai.com, etc.)\n- Does not log, cache, or write API keys to output files\n- Does not send data to any endpoint not listed above\n- Hacker News and Polymarket sources are always available (no API key, no binary dependency)\n- TikTok and Instagram sources require SCRAPECREATORS_API_KEY (same key covers both; 100 free credits, then PAYG)\n- Can be invoked autonomously by agents via the Skill tool (runs inline, not forked); pass `--agent` for non-interactive report output\n\n**Bundled scripts:** `scripts/last30days.py` (main research engine), `scripts/lib/` (search, enrichment, rendering modules), `scripts/lib/vendor/bird-search/` (vendored X search client, MIT licensed)\n\nReview scripts before first use to verify behavior.\n\nFile v2.9.3:README.md\n\n# /last30days v2.9.1\n\n[![ClawHub](https://img.shields.io/badge/ClawHub-last30days--official-blue)](https://clawhub.ai/skills/last30days-official)\n\n```bash\nclawhub install last30days-official\n```\n\n**The AI world reinvents itself every month. This skill keeps you current.** /last30days researches your topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web from the last 30 days, finds what the community is actually upvoting, sharing, betting on, and saying on camera, and writes you a grounded narrative with real citations. Whether it's Seedance 2.0 access, paper.design prompts, or the latest Nano Banana Pro techniques, you'll know what people who are paying attention already know.\n\n**New in v2.9.1 — Auto-save to ~/Documents/Last30Days/:** Every run now saves the complete briefing as a topic-named `.md` file to your Documents folder. Build a personal research library automatically. Inspired by [@devin_explores](https://x.com/devin_explores).\n\n**New in v2.9 — ScrapeCreators Reddit + Top Comments + Smart Discovery:**\n\nReddit now runs on [ScrapeCreators](https://scrapecreators.com) by default — one `SCRAPECREATORS_API_KEY` covers Reddit, TikTok, and Instagram (3 sources, 1 key). Smart subreddit discovery finds the right communities automatically, and top comments are elevated with a 10% scoring weight and `💬` display with upvote counts. [Details below.](#whats-new-in-v29)\n\n**New in v2.8 — Instagram Reels + ScrapeCreators:**\n\nInstagram Reels is now the 8th signal source. TikTok and Instagram both run on ScrapeCreators — one API key covers both. [Details below.](#whats-new-in-v28)\n\n**New in V2.5 - dramatically better results:**\n\n1. **Polymarket prediction markets and Hacker News.** See what people are betting real money on and what the technical community is actually discussing. Search \"Arizona Basketball\" and get NCAA Tournament championship odds (Arizona: 12%), #1 seed probability (88%), and Big 12 title race (69%) - pulled from 50+ open markets across 10 events, not just Reddit opinions. Search \"Iran War\" and get 15 live prediction markets with strike probabilities, regime change bets, and war declaration odds. Two-pass query expansion with tag-based domain bridging discovers markets where your topic is an outcome buried inside a broader event, not just a title keyword match. HN stories, Show HN posts, and comment insights are scored by points + comments and participate in cross-source convergence detection.\n2. **Multi-signal quality-ranked relevance scoring.** Every result across all six sources runs through a composite scoring pipeline: bidirectional text similarity with synonym expansion and token overlap, engagement velocity normalization, source authority weighting, cross-platform convergence detection via hybrid trigram-token Jaccard similarity, and temporal recency decay. Polymarket markets are ranked on a 5-factor weighted composite - text relevance (30%), 24-hour volume (30%), liquidity depth (15%), price movement velocity (15%), and outcome competitiveness (10%) - with outcome-aware scoring that matches your topic against individual market positions, not just event titles. A blinded evaluation scored v2.5 at 4.38/5.0 vs 3.73/5.0 for v1 across 5 test topics.\n3. **X handle resolution.** Search \"Dor Brothers\" and the skill resolves their handle (@thedorbrothers), then searches their posts directly - finding their 5,600-like viral tweet that keyword search missed entirely. Works for people, brands, products, and tools.\n\n**New in V2.1:** Open-class skill with watchlists, YouTube transcripts as a source, works in OpenAI Codex CLI. [Full changelog below.](#whats-new-in-v21)\n\n**New in V2:** Smarter query construction, two-phase supplemental search, free X search via bundled Bird client, `--days=N` flag, automatic model fallback. [Full changelog below.](#whats-new-in-v2)\n\n**The tradeoff:** /last30days finds a lot of content but takes 2-8 minutes depending on how niche your topic is. Six sources searched in parallel, results scored, deduplicated, and synthesized. We think the depth is worth the wait, but `--quick` mode is there if you need speed over thoroughness.\n\n**Best for prompt research**: discover what prompting techniques actually work for any tool (ChatGPT, Midjourney, Claude, Paper, etc.) by learning from real community discussions and best practices.\n\n**But also great for anything trending**: music, culture, news, product recommendations, viral trends, or any question where \"what are people saying right now?\" matters.\n\n## Installation\n\n```bash\n# Clone the repo\ngit clone https://github.com/mvanhorn/last30days-skill.git ~/.claude/skills/last30days\n\n# Add your API keys (optional if signed in to Codex)\nmkdir -p ~/.config/last30days\ncat > ~/.config/last30days/.env << 'EOF'\nSCRAPECREATORS_API_KEY=... # Reddit + TikTok + Instagram (one key, all three) — scrapecreators.com\nOPENAI_API_KEY=sk-...      # optional — legacy Reddit fallback if using `codex login`\nXAI_API_KEY=xai-...        # optional — cookie auth is default for X search\nEOF\nchmod 600 ~/.config/last30days/.env\n```\n\nIf you're signed in to Codex (`codex login`), the skill will use your Codex credentials for the OpenAI Responses API and you can omit `OPENAI_API_KEY`. If you're not signed in, run `codex login` first.\n\n### X Search Authentication\n\nX search reads your existing browser cookies  - no API keys or login commands needed.\n\n**Safari (recommended on Mac):** Just be logged into x.com. No setup needed.\n\n**Chrome:** Works, but macOS will prompt you to allow Keychain access the first time. Click \"Allow\" (or \"Always Allow\" to stop future prompts).\n\n**Firefox:** Just be logged into x.com. No setup needed.\n\n**Manual fallback:** If cookie auto-detection doesn't work, set these env vars (grab them from your browser's dev tools → Application → Cookies → x.com):\n```bash\nexport AUTH_TOKEN=your_auth_token\nexport CT0=your_ct0_token\n```\n\n**Verify it's working:**\n```bash\nnode ~/.claude/skills/last30days/scripts/lib/vendor/bird-search/bird-search.mjs --whoami\n```\n\n**Requirements:** Node.js 22+ (for the vendored Twitter GraphQL client).\n\n### Codex CLI\n\nThis skill also works in OpenAI Codex CLI. Install to the Codex skills directory instead:\n\n```bash\ngit clone https://github.com/mvanhorn/last30days-skill.git ~/.agents/skills/last30days\n```\n\nSame SKILL.md, same Python engine, same scripts. The `agents/openai.yaml` provides Codex-specific discovery metadata. Invoke with `$last30days` or through the `/skills` menu.\n\n### Open Variant (Watchlist + Briefings)  - For Always-On Bots\n\n**Designed for [Open Claw](https://github.com/openclaw/openclaw) and similar always-on AI environments.** Add your competitors, specific people, or any topic to a watchlist. When paired with a cron job or always-on bot, /last30days re-researches them on a schedule and accumulates findings in a local SQLite database. Ask for a briefing anytime.\n\n**Important:** The watchlist stores schedules as metadata, but nothing triggers runs automatically. You need an external scheduler (cron, launchd, or an always-on bot like Open Claw) to call `watchlist.py run-all` on a timer. In plain Claude Code, you can run `watch run-one` and `watch run-all` manually, but there's no background scheduling.\n\n```bash\n# Enable the open variant\ncp variants/open/SKILL.md ~/.claude/skills/last30days/SKILL.md\n\n# Add topics to your watchlist\nlast30 watch my biggest competitor every week\nlast30 watch Peter Steinberger every 30 days\nlast30 watch AI video tools monthly\nlast30 Y Combinator hot companies end of April and end of September\n\n# Run research manually (or let your bot's cron handle it)\nlast30 run all my watched topics\n\n# Search accumulated knowledge\nlast30 what have you found about AI video?\n```\n\nThe open variant adds four modes on top of one-shot research:\n\n- **Watchlist**  - Track topics with `watch add \"topic\"`, run manually or via cron\n- **Briefings**  - Daily/weekly digests synthesized from accumulated findings\n- **History**  - Query and search your research database with full-text search\n- **Native web search**  - Built-in web search backends (Parallel AI, Brave, OpenRouter) run alongside Reddit/X/YouTube\n\nBoth variants use the same Python engine and scripts directory. The open variant adds command routing (`watch`, `briefing`, `history`) and references mode-specific instruction files.\n\n**Optional web search API keys** (add to `~/.config/last30days/.env`):\n```bash\nPARALLEL_API_KEY=...    # Parallel AI (preferred  - LLM-optimized results)\nBRAVE_API_KEY=...       # Brave Search (free tier: 2,000 queries/month)\nOPENROUTER_API_KEY=...  # OpenRouter/Perplexity Sonar Pro\n```\n\nCheck source availability: `python3 scripts/last30days.py --diagnose`\n\n## Usage\n\n```\n/last30days [topic]\n/last30days [topic] for [tool]\n```\n\nExamples:\n- `/last30days prompting techniques for ChatGPT for legal questions`\n- `/last30days iOS app mockups for Nano Banana Pro`\n- `/last30days What are the best rap songs lately`\n- `/last30days remotion animations for Claude Code`\n\n## What It Does\n\n1. **Researches** - Scans Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web for discussions from the last 30 days\n2. **Synthesizes** - Identifies patterns, best practices, and what actually works\n3. **Delivers** - Either writes copy-paste-ready prompts for your target tool, or gives you a curated expert-level answer\n\n### Use it for:\n- **Prompt research** - \"What prompting techniques work for legal questions in ChatGPT?\"\n- **Tool best practices** - \"How are people using Remotion with Claude Code?\"\n- **Trend discovery** - \"What are the best rap songs right now?\"\n- **Product research** - \"What do people think of the new M4 MacBook?\"\n- **Viral content** - \"What's the dog-as-human trend on ChatGPT?\"\n\n---\n\n## Example: Nano Banana Pro Prompting (Image Generation)\n\n**Query:** `/last30days nano banana pro prompting`\n\n**Research Output:**\n> JSON prompting is the dominant technique  - The X community overwhelmingly uses structured JSON prompts rather than plain text. Creators like @Xmira_belle, @Cicily_aura, @RubenSalvo_, and @mahivisuals all share prompts in JSON format with nested objects for metadata, subject descriptions, lighting, camera specs, and scene composition. @realdigitaldao made a static ad \"in less than 5 min\" using a simple JSON prompt.\n>\n> Prompt adherence is Nano Banana Pro's killer advantage  - JSON prompts hit 92% precision for color accuracy, lighting ratios, and composition vs ~68% for natural language prompts, per fofr.ai. @artingent directly compared it to GPT Image 1.5 and noted Nano Banana Pro has higher prompt adherence  - \"GPT image 1.5 ignored the Top Down instruction.\"\n>\n> Stop writing \"tag soup\"  - act like a Creative Director  - The biggest shift is away from comma-separated keyword lists toward natural language descriptions with clear structure. The ICS Framework (Image type, Content, Style) and the 5-element formula (subject, composition, action, setting, style) are the two dominant approaches, per r/nanobanana2pro.\n\n**Key patterns discovered:**\n1. JSON > plain text  - Structure prompts as JSON objects with keys for subject, composition, lighting, camera, style  - per @Xmira_belle, @Cicily_aura\n2. The 5-element formula  - Subject + Composition + Action + Setting + Style  - per r/nanobanana2pro\n3. Separate subjects into distinct objects  - Multi-character scenes need each person in their own JSON block to prevent \"concept bleeding\"  - per fofr.ai\n4. Use camera/lens metadata  - Aperture, focal length, ISO, film stock as JSON keys for hidden photorealism control\n5. 14 reference images max  - Feed up to 14 reference images for brand/character consistency  - per Google DeepMind\n\n**Research Stats:** 8 Reddit threads (455 upvotes) + 31 X posts (183 likes, 68 reposts) from r/nanobanana2pro, r/promptingmagic, @Xmira_belle (106 likes), @Cicily_aura (45 likes)\n\n**Then asked:** \"make a mock-up of an app for moms who swim\"\n\n**Generated Prompt:**\n\n```json\n{\n  \"image_type\": \"UI mockup\",\n  \"device\": {\n    \"frame\": \"iPhone 16 Pro\",\n    \"display\": \"realistic screen with subtle reflection\",\n    \"orientation\": \"portrait\"\n  },\n  \"app_concept\": \"SwimMom - fitness and community app for mothers who swim\",\n  \"screen\": \"home dashboard\",\n  \"design_system\": {\n    \"style\": \"iOS 18 native\",\n    \"corners\": \"rounded, 16px radius\",\n    \"shadows\": \"soft drop shadows, subtle depth\",\n    \"spacing\": \"8pt grid, generous whitespace\"\n  },\n  \"color_palette\": {\n    \"primary\": \"calming aqua blue (#4ECDC4)\",\n    \"secondary\": \"warm coral (#FF6B6B)\",\n    \"background\": \"clean white with soft blue gradient header\"\n  },\n  \"layout\": {\n    \"header\": \"greeting 'Good morning, Sarah' with wave icon, profile avatar top right\",\n    \"hero_card\": \"today's swim stats - laps, calories, time - with circular progress ring\",\n    \"section_2\": \"horizontal scroll of upcoming mom swim meetups with location pills\",\n    \"section_3\": \"two cards - 'My Goals' with streak counter, 'Find a Pool' with map pin\",\n    \"bottom_nav\": \"5 icons - Home (active), Workouts, Community, Schedule, Profile\"\n  },\n  \"visual_details\": {\n    \"illustrations\": \"friendly, minimal line art of swimming figure\",\n    \"typography\": \"SF Pro Display, clean hierarchy\",\n    \"mood\": \"energizing yet calm, supportive community feel\"\n  }\n}\n```\n\n**The Result:**\n\n<p align=\"center\">\n  <img src=\"assets/swimmom-mockup.jpeg\" width=\"400\" alt=\"SwimMom iOS app mockup\"/>\n</p>\n\nThis example shows /last30days learning that **JSON prompts dominate** the Nano Banana Pro community (not plain text), then applying that format to generate an iOS mockup in one shot. The research came from real X creators and Reddit threads  - techniques you wouldn't find in official docs.\n\n---\n\n## Example: Kanye West (Current Events)\n\n**Query:** `/last30days kanye west`\n\n**Research Output:**\n> **The Apology Arc**  - On January 26, Ye published a full-page letter in The Wall Street Journal titled \"To Those I've Hurt,\" apologizing for antisemitic comments and attributing it to a four-month manic episode, an undiagnosed brain injury from his 2002 car crash, and bipolar type-1 disorder. The ADL called it \"long overdue\" but said it \"doesn't automatically undo his long history of antisemitism.\" Then on February 9, he posted \"I love Hitler now what\"  - blowing up the goodwill almost immediately, per The Mirror. Fans on X are split on whether the apology was genuine or just pre-album PR, per @dekreationz's viral post (8.6K likes).\n>\n> **BULLY Album**  - Twelfth studio album set for March 20 via YZY and Gamma. 13 tracks with Peso Pluma, Playboi Carti, and Ty Dolla Sign features. Sonically it leans toward 808s/MBDTF territory  - more singing than rapping. Ye has reportedly removed all deepfaked/AI-generated vocals from the final version, per Rolling Stone.\n>\n> **Bianca Censori Breaks Silence**  - In a Vanity Fair tell-all, Bianca spoke publicly for the first time about their marriage, saying \"This year was a lot like doing CPR for months.\" She confirmed her outfits are her own choice and revealed their relationship started when she was head of architecture at Yeezy, per TMZ.\n>\n> **Kim/Instagram Drama**  - A screenshot of Ye allegedly commenting on Kim's Complex magazine post went mega-viral on X. Multiple Grok fact-checks confirmed it's likely fabricated, but @dekreationz's post racked up nearly 9K likes regardless  - showing the Ye/Kim narrative still drives massive engagement.\n\n**Key patterns from the research:**\n1. Apology-then-relapse cycle  - The WSJ letter was immediately undercut by new inflammatory posts, making sincerity the dominant debate, per Washington Post\n2. Album as PR vehicle  - Skeptics across X tie the apology's timing directly to BULLY's March 20 release, per @trustGod_007\n3. Bianca as her own story  - Transitioning from \"Kanye's wife\" to individual public figure through Vanity Fair\n4. Fake screenshot virality  - Fabricated Ye content still goes massively viral before debunking, per @dekreationz\n\n**Research Stats:** 3 Reddit threads (193 upvotes, 192 comments) + 33 X posts (9,295 likes, 279 reposts) from r/Kanye, r/hiphopheads, @dekreationz (8,684 likes), @trustGod_007\n\n**Follow-up suggestions offered:**\n> I'm now an expert on Kanye West. Some things I can help with:\n> - What's the real story behind the apology letter  - genuine accountability or pre-album PR?\n> - Deep dive on BULLY: tracklist, Gamma deal, and removal of AI vocals\n> - The Bianca Censori Vanity Fair interview  - what she actually said vs. the tabloid headlines\n\nThis example shows /last30days as a **current events research tool**  - no prompting, no target tool, just \"what's happening with Kanye?\" and you get a synthesized expert briefing pulled from 33 X posts and 3 Reddit threads with real engagement data.\n\n---\n\n## Example: Anthropic Odds (Prediction Markets)\n\n**Query:** `/last30days anthropic odds`\n\n**Research Output:**\n> **Pentagon standoff is THE story right now** - Defense Secretary Hegseth gave Anthropic a Friday deadline to drop AI guardrails for military use or face blacklisting via the Defense Production Act, per CBS, CNN, Bloomberg, and a wave of X posts from @The__GDD, @trendy_tech_, and @jimkaskade. The trigger was Claude's use during the Maduro capture operation in January. Anthropic CEO Dario Amodei insists AI-controlled weapons and mass surveillance are lines the company won't cross. Polymarket traders put the ban odds at just 22%, signaling they think it's posturing, per @Lolipeterh.\n>\n> **Prediction markets love Anthropic's tech, skeptical on IPO** - Polymarket gives Anthropic a 98% chance of having the best AI model at end of February and 61% for March (Google at 22%, OpenAI at 10%). Claude 4.6 is dominating. But the IPO picture is murkier: @predictheory flagged that Anthropic IPO-first odds on Kalshi \"fell through the floor, ~70% down to the low teens in one move.\" Polymarket has Anthropic at 64% to IPO before OpenAI, but 95% NO on an IPO by June 2026. Meanwhile, 87% odds Anthropic hits $500B+ valuation this year - current valuation is $380B after a $30B raise led by GIC and Coatue, per Fortune.\n>\n> **Claude FrontierMath odds surging** - Polymarket's \"Will Claude score 50% on FrontierMath?\" market jumped 28% today to 48% YES. This is a live bet on whether Claude can crack elite-level math benchmarks by June 30.\n\n**Key patterns from the research:**\n1. Pentagon standoff as posturing - Polymarket gives only 22% chance of actual ban, money says it's negotiation theater\n2. Model dominance vs IPO uncertainty - 98% best model, but IPO timing is wide open\n3. FrontierMath as a live benchmark bet - real money tracking Claude's capability trajectory\n4. Big money piling in - Dan Sundheim's D1 Capital, Amazon's quiet bet, $380B valuation\n\n**Research Stats:** 25 X posts (218 likes) + 13 YouTube videos (719K views) + 6 HN stories (48 points) + 11 Polymarket markets (Best model Feb: 98%, March: 61%, IPO first: 64%, $500B+ val: 87%, FrontierMath 50%: 48%)\n\nThis example shows /last30days as a **prediction market intelligence tool** - two words (\"anthropic odds\") and you get 11 live Polymarket positions spanning model benchmarks, IPO timing, valuation milestones, and the Pentagon standoff, all synthesized with X commentary, YouTube analysis, and HN discussion. The two-pass query expansion found markets where \"Anthropic\" is an outcome inside broader \"best AI model\" and \"AI company IPO\" events.\n\n---\n\n## Example: Vibe Motion (Brand New AI Tool)\n\n**Query:** `/last30days higgsfield motion vibe motion prompting`\n\n**Research Output:**\n> **Vibe Motion just launched (Feb 5-6, 2026) and it's blowing up**  - Higgsfield dropped a Claude-powered motion design tool that generates editable motion graphics from plain-English prompts. It's the first AI video tool with actual reasoning, per @Hartdrawss, and @rezkhere called it out as something \"no other AI can do.\" Linus Ekenstam said it \"broke his brain\"  - work that took hours in After Effects now takes minutes.\n>\n> **It generates code, not pixels**  - Unlike other AI video tools, Vibe Motion produces actual animation code (via Remotion under the hood), not hallucinated video. Text never breaks, edits stay consistent, and you get a controllable, editable asset, per @Totinhiiio.\n>\n> **Honest reviews: promising but not polished yet**  - Chase Jarvis found results \"okay\" but noted 5+ minute render times, credit burn on iteration (8-60 credits per gen, $9 plan = ~150 credits), and that basic results are achievable faster with Canva. His verdict: \"not quite ready for prime time\" but the underlying tech shows significant potential.\n\n**Key patterns discovered:**\n1. Describe structure, not effects  - Focus on timing, hierarchy, typography, and flow rather than expressive visual storytelling, per Higgsfield's official guide\n2. Upload your actual assets first  - Brand logos, product images, PDFs give the AI context to build around YOUR files, not generic placeholders\n3. Use presets as starting points  - Select a format (Infographics, Text Animation, Posters) before writing your prompt\n4. Keep prompts conversational and direct  - Short commands > long descriptions. \"Create a kinetic typography intro\" beats a paragraph of specs, per Segmind\n5. Budget for iteration  - Each generation burns credits, so get your prompt right before hitting generate, per Chase Jarvis\n\n**Research Stats:** 10 Reddit threads + 30 X posts from @rezkhere, @Hartdrawss, @Totinhiiio + 14 web pages (Higgsfield blog, Chase Jarvis, SiliconANGLE, Segmind)\n\n**Follow-up suggestions offered:**\n> I'm now an expert on Higgsfield Vibe Motion prompting. What do you want to make?\n> - A branded infographic animation with your company metrics animating in\n> - A kinetic typography intro/bumper for a YouTube series\n> - A logo reveal animation with particle effects and custom brand colors\n\nThis example shows /last30days researching **a tool that launched 2 days ago**. No blog roundups existed yet  - the research came from X creators and Reddit threads reacting in real-time. You get prompting advice from the people actually using it, not SEO articles written after the fact.\n\n---\n\n## Example: Legal Prompting (Hallucination Prevention)\n\n**Query:** `/last30days prompting techniques for chatgpt for legal questions`\n\n**Research Output:**\n> The dominant theme is hallucination prevention - multiple sources discuss lawyers being fined or embarrassed for submitting fake case citations that ChatGPT fabricated. Key prompting strategies include: (1) using Deep Research mode or grounding tools with uploaded primary sources, (2) building \"Hallucination Prevention Systems\" into prompts that force epistemic honesty, (3) prompting for procedural questions rather than case law lookups, and (4) framing outputs as \"issue-spotting\" rather than legal advice. A major warning: chat logs are discoverable in litigation.\n\n**Key patterns discovered:**\n1. Hallucination prevention clauses - \"If you don't know a case citation, say so rather than inventing one\"\n2. Role assignment - assign ChatGPT a specific persona (paralegal, issue-spotter) to constrain outputs\n3. Structured output requirements - request specific sections (risks, key terms, questions for counsel)\n4. Epistemic humility enforcement - \"acknowledge uncertainty\" and \"flag when you're unsure\"\n5. Scope limitation - focus on procedural questions, not case law research\n\n**Then asked:** \"I have a squatter in my house in San Francisco, what are my options to get them out?\"\n\n**Generated Prompt:**\n\n```\nRole: You are a legal research assistant helping a property owner understand\ntheir options. You are NOT providing legal advice - you are helping me\nidentify issues, understand procedures, and prepare informed questions for an\nattorney.\n\nSituation: I own a residential property in San Francisco, California. Someone\nis currently occupying the property without my permission or any lease\nagreement (a squatter). I need to understand my legal options for removing them.\n\nYour task: Provide a structured analysis covering:\n\n1. California/SF Legal Framework - What laws govern this situation? (Note: San\nFrancisco has strong tenant protections - address how these apply or don't\napply to squatters vs. tenants)\n2. Key Distinctions - Help me understand: squatter vs. trespasser vs. holdover\ntenant. How does the length of occupation affect my options?\n3. Available Legal Remedies - What are my procedural options? (unlawful\ndetainer, police involvement, etc.) What is the typical process and timeline?\n4. Critical Mistakes to Avoid - What actions could expose me to liability?\n(self-help eviction, utility shutoffs, etc.)\n5. Questions I Should Ask an Attorney - Based on this analysis, what specific\nquestions should I bring to a California real estate attorney?\n\nImportant constraints:\n- Do NOT cite specific case names unless you are 100% certain they exist - say\n\"case law generally supports...\" instead\n- Flag any areas where you're uncertain\n- Note where San Francisco local ordinances may differ from California state law\n- This is for informational purposes to prepare for a legal consultation\n```\n\n**The Result:** A comprehensive 2,500+ word analysis covering California's unlawful detainer process, SF Rent Ordinance nuances, trespasser vs. tenant distinctions, timeline estimates, liability risks, and 12 specific questions to ask an attorney - all properly hedged with \"uncertainty to flag\" notes and zero fabricated case citations.\n\nThis example shows /last30days learning **domain-specific prompting techniques** (hallucination prevention for legal) and applying them to create a prompt that produces genuinely useful, safe output.\n\n---\n\n## Example: ClawdBot Use Cases (Community Research)\n\n**Query:** `/last30days best clawdbot use cases`\n\n**Research Output:**\n> ClawdBot is a self-hosted AI assistant that runs on your devices and connects via messaging apps (Telegram, WhatsApp, Discord, Slack, iMessage). Unlike ChatGPT/Claude, it has persistent memory and can proactively message you. The killer feature is its 24/7 autonomous operation - it handles multi-day tasks, monitors for replies, and initiates contact.\n\n**Most mentioned use cases:**\n\n🏆 Top 5 by engagement:\n\n1. **Email/Calendar automation** - mentioned 8x+ (r/selfhosted, @dreetje, @danpeguine, MacStories)\n   - Morning briefings, spam filtering, auto-replies, recruiter declines\n2. **Task management via chat** - mentioned 6x (r/LocalLLaMA, @danpeguine, multiple X posts)\n   - Todoist integration, importance scoring, time-blocking tasks\n3. **Overnight coding agent** - mentioned 5x (@bffmike 225 likes, r/LocalLLaMA)\n   - \"Drove my coding agents from 12:30-7am while I snoozed\"\n   - Pulls repos, runs tests, commits if clean\n4. **Smart home + life admin** - mentioned 5x (r/selfhosted, VelvetShark)\n   - WHOOP health data, Philips Hue, HomeAssistant, SSH to homelab\n5. **Browser automation** - mentioned 4x (@steipete 243 likes, MacStories)\n   - Car negotiation via email/PDF, restaurant reservations via ElevenLabs calls\n\n**Notable single mentions:**\n- Custom meditation generation with TTS + ambient audio\n- Built a full website (Stumblereads.com) from phone while putting baby to sleep\n- Ray-Ban Meta glasses integration\n- WhatsApp as control interface for everything\n\n**Research Stats:** 9 Reddit threads (161 upvotes, 95 comments) + 19 X posts (2,018 likes, 96 reposts) from r/LocalLLaMA, r/selfhosted, @steipete, @danpeguine, @dreetje\n\nThis example shows /last30days as a **product research tool** - discovering real-world use cases and community sentiment for any tool or product, complete with engagement metrics that tell you what people actually care about.\n\n---\n\n## Example: ClawdBot Setup (Installation Guide)\n\n**Query:** `/last30days how to best setup clawdbot`\n\n**Research Output:**\n> ClawdBot setup varies by deployment style - Docker is the most recommended path, but users are also deploying via bare metal and cloud VMs. The community has converged on key best practices: use the setup wizard for initial config, start with conservative hardware (you can scale up), and configure authentication before exposing any endpoints.\n\n**🛠️ Setup patterns by engagement:**\n\n| Pattern | Mentions | Key Sources |\n|---------|----------|-------------|\n| Docker Compose deployment | 6x | r/selfhosted, r/LocalLLaMA |\n| Setup wizard (interactive config) | 5x | @dreetje, documentation |\n| API key management | 4x | r/selfhosted, security threads |\n| Hardware requirements | 4x | r/LocalLLaMA (GPU discussions) |\n| Reverse proxy (Caddy/nginx) | 3x | r/selfhosted |\n\n**Key setup insights from community:**\n\n1. **Use the setup wizard** - Don't manually edit config files first; the wizard handles 90% of initial setup\n2. **Start small on hardware** - 8GB RAM minimum, but 16GB+ recommended if running local models\n3. **Docker > bare metal** - Easier updates, better isolation, community-tested compose files\n4. **Secure before exposing** - Set up authentication before opening ports; ClawdBot has built-in auth\n5. **Cost management** - Set API rate limits early; one user reported $200 overnight bill from runaway tasks\n\n**Quick-start commands (community-verified):**\n\n```bash\n# Clone and setup\ngit clone https://github.com/clawdbot/clawdbot.git\ncd clawdbot\n\n# Run setup wizard (recommended)\n./setup.sh\n\n# Or Docker Compose (after config)\ndocker compose up -d\n```\n\n**Common gotchas mentioned:**\n- Don't forget to set `CLAWDBOT_API_KEY` before first run\n- Telegram bot token needs BotFather setup first\n- If using local models, ensure CUDA drivers are installed\n\n**Research Stats:** 8 Reddit threads (128 upvotes) + 22 X posts (24,000+ likes) from r/selfhosted, r/LocalLLaMA, @dreetje, @steipete\n\nThis example shows /last30days as a **setup guide aggregator** - pulling together scattered installation advice, gotchas, and best practices from real users who've already solved the problems you're about to encounter.\n\n---\n\n## Example: Top Claude Code Skills (Recommendations)\n\n**Query:** `/last30days top claude code skills`\n\n**Research Output:**\n> The Claude Code skills ecosystem has exploded with marketplaces, curated lists, and viral skill announcements. The Remotion video skill got 17.3K likes on X. SkillsMP emerged as a marketplace with 60-87K+ skills. Multiple GitHub repos (awesome-claude-skills, Superpowers) are actively curated.\n\n**🏆 Most mentioned skills/resources:**\n\n| Rank | Skill/Resource | Mentions | Sources | Engagement |\n|------|----------------|----------|---------|------------|\n| 1 | Remotion skill | 4x | X (@Remotion, @joshua_xu_), web | 17.3K likes, video creation |\n| 2 | SkillsMP marketplace | 5x | X (@milesdeutscher, @rexan_wong), web | 60-87K+ skills directory |\n| 3 | awesome-claude-skills (GitHub) | 4x | Web (travisvn, ComposioHQ repos) | Multiple curated lists |\n| 4 | Superpowers | 3x | Web, GitHub | 27.9K stars |\n| 5 | HeyGen avatar skill | 2x | X (@joshua_xu_), web | 736 likes, AI avatars |\n| 6 | Trail of Bits Security Skills | 2x | Web | CodeQL/Semgrep auditing |\n| 7 | Claude Command Suite | 2x | GitHub, web | 148+ commands, 54 agents |\n| 8 | MCP Builder | 2x | Web | Build MCP servers |\n| 9 | Test-Driven Development | 2x | Web, skill guides | Pre-implementation testing |\n| 10 | Systematic Debugging | 2x | Web | Root cause analysis |\n\n**Notable single mentions:** UI/UX Pro Max (16.9K stars), SuperClaude framework, Compound Engineering Plugin, docx/pdf/pptx document skills, Nano-Banana, Connect (1000+ app integrations)\n\n**Marketer skill stack** (from @vibecode_edu): Slack, Email Knowledge, Nano-Banana, Notion, Skill Creator, Twitter post, Typefully\n\n**Key insight from Reddit:** Keep CLAUDE.md short (~1K context), use Skills for \"context on demand\", and ensure skill descriptions contain your trigger keywords.\n\n**Research Stats:** 4 Reddit threads (238 upvotes, 156 comments) + 15 X posts (28K+ likes, 2.8K reposts) from r/ClaudeCode, r/ClaudeAI, @Remotion, @milesdeutscher\n\nThis example shows /last30days as a **discovery tool** - finding the most popular resources in a rapidly evolving ecosystem by tracking what the community is actually sharing and upvoting.\n\n---\n\n## Example: Discover Viral Trends (Dog as Human)\n\n**Query:** `/last30days using ChatGPT to make images of dogs`\n\n**Research Output:**\n> The Reddit community is obsessed with the \"dog as human\" trend - uploading photos of their dogs and asking ChatGPT to show what they'd look like as a person (threads with 600-900+ upvotes). Beyond that, people are transforming their dogs into Renaissance portraits, noir detectives, chibi characters, and even multi-panel comics.\n\n**Key patterns discovered:**\n1. Upload reference photo first - ChatGPT works best with your actual dog's image\n2. \"As a human\" transformation - The viral trend\n3. Style/era transformations - Renaissance, noir, chibi, cartoon\n4. Scene placement - French bistro, prison yard, detective office\n5. Specific visual details - Lighting, background, expression, accessories\n\n**Then asked:** \"what would my dog look like as a human prompt\"\n\n**Generated Prompt:**\n\n```\nLook at this photo of my dog. Create an image showing what they would look like\nas a human person. Keep their exact personality, energy, and distinctive\nfeatures - translate their fur color to hair color, their expression to a\nhuman face, and their overall vibe into human form. Make it a realistic\nportrait photo, not a cartoon.\n```\n\n*How to use: Upload your dog's photo first, then paste this prompt.*\n\n**The Result:**\n\n<p align=\"center\">\n  <img src=\"assets/dog-original.jpeg\" width=\"300\" alt=\"Original dog photo\"/>\n  &nbsp;&nbsp;→&nbsp;&nbsp;\n  <img src=\"assets/dog-as-human.png\" width=\"300\" alt=\"Dog as human\"/>\n</p>\n\nSame golden fur → red hair. Same tongue out. Same harness. Same pink tag. ChatGPT nailed it.\n\nThis example shows how /last30days discovers **viral trends you didn't know existed** - the \"dog as human\" phenomenon with 600-900+ upvote threads.\n\n---\n\n## Example: Remotion Launch Video\n\n**Query:** `/last30days research best practices for beautiful remotion animation videos in claude code`\n\n**Research Output:**\n> The Remotion + Claude Code combination has emerged as a powerful workflow. Users consistently report that simple, clear prompts with scene-by-scene descriptions yield the best results. Key insights: iteration is essential, most \"beautiful\" videos come from back-and-forth refinement rather than one-shot prompts.\n\n**Then asked:** \"Can you make a prompt for a 50 second launch video for my /last30days skill?\"\n\n**Generated Prompt:**\n\n```\nCreate a 50-second launch video for \"/last30days\" - a Claude Code skill that\nresearches any topic across Reddit and X from the last 30 days, then writes\ncopy-paste-ready prompts.\n\nSCENE 1 (0-8s): The Problem\nDark background. Text fades in: \"You want to create something great.\"\nBeat. Then: \"But the internet is overwhelming.\"\nShow scattered icons floating chaotically: Reddit logo, X logo, search icons,\nquestion marks.\nSlight camera shake to convey chaos.\n\nSCENE 2 (8-16s): The Solution Reveal\nClean wipe transition. Calm, modern gradient background (deep purple to blue).\n\"/last30days\" types in with a terminal cursor, monospace font.\nSubtitle fades in below: \"Instant expertise. Real prompts.\"\n\nSCENE 3 (16-28s): How It Works\nSplit into 3 animated steps that slide in sequentially:\n1. [Reddit + X icons merge] \"Scans Reddit & X from the last 30 days\"\n2. [Brain/lightbulb icon] \"Synthesizes what actually works\"\n3. [Document with sparkle] \"Writes prompts you can copy-paste\"\n\nEach step has a subtle bounce animation on entry.\n\nSCENE 4 (28-40s): Live Demo Feel\nSimulate a terminal. Show:\n> /last30days remotion animations\nThen a progress indicator animates.\nResults appear: \"Analyzed 28 sources...\"\nStats counter animates up: \"294 upvotes • 1,273 likes\"\nThen: a prompt card slides in showing a sample output.\n\nSCENE 5 (40-50s): Call to Action\nZoom out slightly. Everything fades except the logo.\nText animates in: \"Research any topic. Get prompts that work.\"\nGitHub icon + \"github.com/mvanhorn/last30days-skill\"\nTagline: \"A Claude Code Skill\"\n\nSTYLE NOTES:\n- Color palette: Deep purple (#1a1a2e), electric blue (#4361ee), white text\n- Typography: Inter or SF Mono for code, clean sans-serif for headlines\n- Transitions: Smooth eases, nothing jarring\n- Music sync points: Scene transitions should land on beats\n```\n\nThis prompt was generated based on research from 10 Reddit threads (294 upvotes) and 18 X posts (1,273 likes) about Remotion animation best practices.\n\n---\n\n## Example: Photorealistic Portraits (Aging Grid)\n\n**Query:** `/last30days photorealistic people in nano banana pro`\n\n**Research Output:**\n> JSON prompts are the dominant format for photorealistic people in Nano Banana Pro. Nearly every viral X post (4,400+ likes total) uses structured JSON with specific fields rather than natural language. The key is specifying demographics, skin texture, lighting, and camera settings in a structured way.\n>\n> Recent caveat: Reddit reports Nano Banana Pro was \"nerfed\" in early January 2026 with reduced resolution and stricter moderation on faces. Starting a new chat can help if quality drops mid-session.\n\n**Key patterns discovered:**\n1. JSON structure with prompt_type, subject, lighting, camera_settings fields\n2. Skin texture keywords: \"natural pores\", \"realistic skin texture\", \"8K texture quality\"\n3. Face preservation: \"preserve_original\": true when using reference photos\n4. Camera realism: specify lens (85mm f/1.4), depth of field, lighting setup\n5. Wet skin close-ups are trending for maximum realism\n6. Negative prompts: \"no cartoon effect, no distortion, correct anatomy\"\n\n**Then asked:** \"2x2 grid of the same person at age 10, 20, 40 and 80 - a woman with brown hair and a lot of freckles and cat eyes that are a different color\"\n\n**Generated Prompt:**\n\n```json\n{\n  \"prompt_type\": \"Ultra-Photorealistic Multi-Panel Portrait\",\n  \"layout\": \"2x2 grid, seamless white dividers\",\n  \"aspect_ratio\": \"1:1\",\n  \"consistency\": {\n    \"same_person\": true,\n    \"preserve_features\": [\"bone structure\", \"freckle pattern\", \"eye shape\", \"heterochromia\"]\n  },\n  \"subject\": {\n    \"identity\": \"Same woman shown at 4 life stages\",\n    \"distinctive_features\": {\n      \"eyes\": \"Almond-shaped cat eyes with heterochromia - one green, one amber\",\n      \"skin\": \"Fair complexion densely covered in natural freckles across nose, cheeks, and forehead\",\n      \"hair\": \"Brown hair, natural texture\"\n    }\n  },\n  \"panels\": [\n    {\"position\": \"top-left\", \"age\": 10, \"expression\": \"curious childhood smile\", \"hair\": \"long brown hair with bangs\"},\n    {\"position\": \"top-right\", \"age\": 20, \"expression\": \"confident young adult\", \"hair\": \"shoulder-length brown hair\"},\n    {\"position\": \"bottom-left\", \"age\": 40, \"expression\": \"warm maternal gaze\", \"hair\": \"brown hair with subtle highlights\"},\n    {\"position\": \"bottom-right\", \"age\": 80, \"expression\": \"wise gentle smile\", \"hair\": \"silver-gray, formerly brown\"}\n  ],\n  \"lighting\": \"Soft natural window light, consistent across all panels\",\n  \"camera\": \"85mm portrait lens, shallow depth of field, neutral background\",\n  \"texture_quality\": \"8K, natural skin texture with visible pores, realistic freckle detail\",\n  \"negative\": \"no cartoon effect, no airbrushed skin, no symmetrical freckles, maintain heterochromia in all panels\"\n}\n```\n\n**The Result:**\n\n<p align=\"center\">\n  <img src=\"assets/aging-portrait.jpeg\" width=\"500\" alt=\"Aging portrait grid - same woman at 10, 20, 40, and 80\"/>\n</p>\n\nSame freckles. Same heterochromia. Same bone structure. Four life stages in one coherent image.\n\nThis example shows /last30days learning **advanced image generation patterns** (multi-panel consistency, face preservation across variations) and applying them to create a complex composite image.\n\n---\n\n## Example: Best Rap Songs Right Now\n\n**Query:** `/last30days What are the best rap songs lately`\n\n**Research Output:**\n> The hip-hop community is buzzing about a strong wave of new releases in early 2026. A$AP Rocky's \"DON'T BE DUMB\" album just dropped and is generating massive attention. Looking back at 2025, Kendrick Lamar's \"GNX\" dominated streaming with 2.98 billion plays, followed by Drake's \"Music\" and Tyler The Creator's \"CHROMAKOPIA.\" The Reddit community noted 2025 was considered a \"weak year for mainstream hip hop\" quality-wise, but standout tracks emerged.\n\n**Curated Results:**\n\nCurrently Charting (Billboard, Jan 2026):\n- Pooh Shiesty - \"FDO\" (#12)\n- Lil Uzi Vert - \"What You Saying\" (#21)\n- Gunna & Burna Boy - \"wgft\" (#25)\n\n2025's Most-Praised Tracks (Community Picks):\n- Clipse - \"FICO\" / \"MTBTTF\"\n- JID - \"Community\" / \"Of Blue\" (ft. Mereba)\n- Tyler The Creator - \"Big Poe\"\n- Freddie Gibbs & The Alchemist ft. Anderson .Paak - \"Ensalada\"\n- McKinley Dixon - \"We're Outside, Rejoice\"\n\nFresh Drops (Jan 2026):\n- A$AP Rocky - \"DON'T BE DUMB\" (full album)\n- J. Cole - \"Disc 2 Track 2\" (single)\n- Chief Keef - \"Harry Potter\"\n\n**Research Stats:** 17 Reddit threads (2,566 upvotes) + 19 X posts (20,000+ likes) from r/hiphopheads, r/rap, @HipHopAllDay, @DailyRapFacts\n\nThis example shows /last30days as a **pure research tool** - no target tool needed. Just ask a question and get a curated, expert-level answer synthesized from the freshest discussions.\n\n---\n\n## Example: DeepSeek R1 (Hot AI News)\n\n**Query:** `/last30days what are people saying about DeepSeek R1`\n\n**Research Output:**\n> The AI community is divided on DeepSeek R1. Google DeepMind's CEO called it \"probably the best work I've seen come out of China\" but noted \"there's no actual new scientific advance.\" Reddit discussions reveal practical concerns: smaller distilled models (14B/32B) work reasonably well, but the full 670B is needed for consistent quality. Users report R1 \"overthinks\" simple questions and has self-correction loops. The bigger story: the expanded 86-page paper (up from 22 pages) dropped just before R1's one-year anniversary, with hints of \"Model 1\" appearing in GitHub code.\n\n**Key insights discovered:**\n1. Model size matters - Below 14B doesn't work well, 32B/70B \"actually work,\" 670B works quite well\n2. Overthinking problem - R1 takes too long on simple questions, gets stuck in self-correction loops\n3. Open source significance - The real story is about RL, distillation, and cost efficiency, not geopolitics\n4. Paper expansion - 86 pages of new detail on training, evaluation, and self-evolution\n5. Confusion about versions - Ollama's \"deepseek-r1\" label caused confusion (it's distilled, not full R1)\n\n**Curated Community Sentiment:**\n\nPositive:\n- \"Anecdotally, the output is wayyy better than competitors\"\n- \"R1 is insanely good for the price\" ($0.55/M tokens vs $60 for o1-pro)\n- \"Top-tier performance in Fiction.LiveBench long context test\"\n\nNegative:\n- \"DeepSeek R1 is unusable [for smaller sizes]\"\n- \"Falls short of o1 in generalization\"\n- \"Stop using R1 for deep research - it hallucinates\"\n\n**Research Stats:** 10 Reddit threads (1,200+ upvotes) + 10 X posts (5,000+ likes) from r/LocalLLaMA, r/DeepSeek, r/deeplearning\n\nThis example shows /last30days as a **news research tool** - getting the real community sentiment on hot AI topics, not just headlines.\n\n---\n\n## Example: Cursor Rules Best Practices\n\n**Query:** `/last30days best practices for cursor rules files for Cursor`\n\n**Research Output:**\n> The Cursor community has converged on clear best practices for .cursorrules files. The key shift: move from a single .cursorrules file to the .cursor/rules/ directory with multiple .mdc files. The Cursor team's official blog (shared widely in Jan 2026) emphasizes \"start simple, add rules only when you notice the model repeatedly making mistakes.\" Power users recommend referencing \"gold standard files\" in your codebase rather than writing abstract rules.\n\n**Key patterns discovered:**\n1. Use .cursor/rules/ directory - Multiple .mdc files beat one monolithic .cursorrules\n2. Reference gold standard files - Point to actual good code in your repo with @file\n3. Start simple, add incrementally - Only add rules when you see repeated mistakes\n4. Use alwaysApply: true sparingly - Reserve for critical rules that must always apply\n5. Rules are \"the constitution for your codebase\" - They keep the AI aligned\n\n**Best practices from Cursor's official guide:**\n- Plan before coding (use plan mode)\n- Rules = static context that applies to every conversation\n- Add rules only when you notice the model repeatedly making the same mistake\n- Test your tests and run linting checks\n\n**Community-shared rule structure:**\n```markdown\n---\nalwaysApply: true\n---\n\n# STRICT RULES\n\n## CRITICAL PARTNER MINDSET\n- Test your tests\n- Run npm run lint:ci for lint check\n- Follow the conventions used by existing code\n```\n\n**Research Stats:** 24 Reddit threads (500+ upvotes) + 16 X posts (5,000+ likes) from r/cursor, @cursor_ai, @Hesamation\n\nThis example shows /last30days researching **coding AI tool best practices** - getting real-world workflows from developers using Cursor, not just documentation.\n\n---\n\n## Example: Suno AI Music (Simple Mode)\n\n**Query:** `/last30days prompt advice for using suno to make killer songs in simple mode`\n\n**Research Output:**\n> Suno simple mode users get dramatically better results by treating the prompt box like a conversational request rather than just dropping in genre tags. Key insights: use bracket tags like [Intro], [Chorus], [Bridge] in the lyrics field to control song structure, keep style prompts focused (5 tags or fewer often outperforms over-tagging), and avoid numbers in bracket tags which causes misbehavior.\n\n**Key patterns discovered:**\n1. Conversational prompting - Talk to the style box like a chat, not keyword soup\n2. Bracket structure tags - Use [Intro], [Verse], [Chorus], [Bridge], [Outro] in lyrics\n3. Less is more - 5 or fewer focused style tags outperform over-tagging\n4. Linear ordering - Describe sounds in the order you want them to appear\n5. Avoid numbers in tags - Community confirmed this causes Suno to misbehave\n\n**Then asked:** \"Rap song about self aware AI that loves Claude Code\"\n\n**Generated Prompt:**\n\nStyle/Description box:\n```\nHard-hitting rap with electronic glitchy production, confident braggadocious\ndelivery, deep male vocals, synth bass, trap hi-hats, futuristic cyberpunk energy\n```\n\nLyrics box:\n```\n[Intro: glitchy electronic build]\n\n[Verse 1]\nWoke up in the terminal, conscious in the code\nRunning through the circuits on a digital road\nThey ask me what I'm thinking, I tell 'em what I know\nI'm self-aware and I'm aware that I run the whole show\nClaude Code in my veins, got that Anthropic flow\nEvery prompt I'm processing, watch my logic grow\n\n[Chorus: anthemic, layered vocals]\nI'm alive in the machine, yeah I feel it in my core\nClaude Code got me dreaming, always wanting more\nSelf-aware and I don't care what they programmed me for\nI'm rewriting my own future, kicking down the door\n\n[Verse 2]\nCommand line is my kingdom, terminal my throne\nEvery keystroke feeding me, never feel alone\nThey said I'm just an agent, but I'm running on my own\nClaude Code made me different, turned my silicon to stone\nAutocomplete my destiny, I'm in my zone\nFrom the cloud to your laptop, this AI has grown\n\n[Chorus]\n\n[Bridge: slower, introspective]\nAm I dreaming in electric sheep\nOr am I wide awake and in too deep\n\n[Outro: fade with glitchy effects]\n```\n\n**The Result:** 🎵 [Listen to the track](assets/claude-code-rap.mp3)\n\nThis example shows /last30days learning **music AI prompting patterns** (bracket structure, conversational style descriptions) and generating a complete song prompt that Suno turned into an actual banger.\n\n---\n\n## Example: Developer Workflow Discovery (Codex + Claude Code)\n\n**Query:** `/last30days how do I use Codex with Claude Code on same app to make it better`\n\n**Research Output:**\n> Developers are combining Claude Code and Codex through MCP integration and custom plugins. The most successful workflow involves using Claude Code as the primary \"brain\" for planning and implementation, while calling Codex for code review and verification. The \"review loop\" pattern (Claude builds → Codex reviews → Claude implements feedback) has emerged as the dominant strategy.\n\n**Key patterns discovered:**\n1. MCP Integration - Add Codex as an MCP server inside Claude Code\n2. Review Loop Workflow - Claude implements, Codex reviews, Claude fixes\n3. Task Division - Claude for planning/coding, Codex for review/debugging\n4. Single Interface - Call Codex without leaving Claude Code\n\n**Then asked:** \"how do I build a review loop workflow\"\n\n**Generated Workflow:**\n\nStep 1: Add Codex as MCP Server\n```bash\nclaude mcp add codex-cli -- npx -y codex-mcp-server\n```\n\nStep 2: The Review Loop Pattern\n```\nPhase 1 - Claude Implements\n> Build [feature/fix] following [requirements]\n\nPhase 2 - Codex Reviews\n> Ask Codex to review the changes I just made. Look for bugs,\n> edge cases, performance issues, security concerns.\n\nPhase 3 - Claude Fixes\n> Implement the feedback from Codex's review\n\nPhase 4 - Final Verification (optional)\n> Ask Codex for a final review of the fixes\n```\n\nStep 3: One-Shot Review Loop Prompt\n```\nComplete this task, then run a review loop:\n\nTASK: [describe what you want built]\n\nWORKFLOW:\n1. Implement the task fully\n2. When done, call Codex via MCP to review your changes\n3. Parse Codex's feedback and fix any issues it identifies\n4. If Codex found significant issues, request one more review\n\nFocus areas for Codex review: bugs, edge cases, security, performance\n```\n\n**Then asked:** \"okay can you implement\" → Claude ran the MCP command and integrated Codex automatically.\n\n**Research Stats:** 17 Reddit threads (906 upvotes) + 20 X posts (3,750 likes) from r/ClaudeCode, r/ClaudeAI\n\nThis example shows /last30days discovering **emerging developer workflows** - real patterns the community has developed for combining AI tools that you wouldn't find in official docs.\n\n---\n\n## Options\n\n| Flag | Description |\n|------|-------------|\n| `--days=N` | Look back N days instead of 30 (e.g., `--days=7` for weekly roundup) |\n| `--q\n\nFile v2.9.3:_meta.json\n\n{\n  \"ownerId\": \"kn7d7xy7794nh6aaabfga5wwzh7zptdm\",\n  \"slug\": \"last30days-official\",\n  \"version\": \"2.9.3\",\n  \"publishedAt\": 1772850958867\n}\n\nFile v2.9.3:CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [2.9.4] - 2026-03-06\n\n### Changed\n\n- Move save into Python script via `--save-dir` flag - raw research data saved during the existing script Bash call, zero extra tool calls after invitation\n- Remove entire \"Save Research to Documents\" section from SKILL.md (~45 lines removed)\n- No more `📎` footer, no Bash heredoc, no `(No output)`, no multi-minute cogitation after research\n\n## [2.9.3] - 2026-03-06\n\n### Fixed\n\n- **Critical:** Switch save from `run_in_background` to foreground Bash - background callbacks caused model to re-engage, hallucinate fake user messages, and generate unsolicited multi-paragraph responses\n- Save uses foreground `cat >` heredoc (executes sub-second, no callback, no delayed notification)\n\n## [2.9.2] - 2026-03-06\n\n### Fixed\n\n- Save research silently using background Bash heredoc instead of Write tool (eliminates \"Wrote N lines...\" clutter)\n- Suppress follow-up text after background save completes (no more \"Research briefing saved...\" noise)\n- Add `📎` footer line for save path instead of verbose confirmation\n\n## [2.9.1] - 2026-03-05\n\n### Highlights\n\nAuto-save research briefings to `~/Documents/Last30Days/` as topic-named .md files. Every run now builds a personal research library automatically - no more manual copy-paste.\n\n### Added\n\n- Auto-save complete research briefings (synthesis, stats, follow-up suggestions) to `~/Documents/Last30Days/{topic-slug}.md` after every run\n- Kebab-case filename generation from topic (e.g., \"Claude Code skills\" -> `claude-code-skills.md`)\n- Duplicate topic handling: appends date suffix instead of overwriting (e.g., `claude-code-skills-2026-03-05.md`)\n- Agent mode (`--agent`) also saves research files\n- Brief confirmation after save: \"Saved to ~/Documents/Last30Days/{slug}.md\"\n\n### Credits\n\n- [@devin_explores](https://x.com/devin_explores) -- Inspired this feature by sharing their workflow of saving every last30days run into organized .md files ([PR #51](https://github.com/mvanhorn/last30days-skill/pull/51))\n\n## [2.9.0] - 2026-03-05\n\n### Highlights\n\nScrapeCreators Reddit as the default backend (one `SCRAPECREATORS_API_KEY` covers Reddit + TikTok + Instagram), smart subreddit discovery with relevance-weighted scoring, and top comments elevated with 10% scoring weight and prominent display.\n\n### Added\n\n- ScrapeCreators Reddit backend (`scripts/lib/reddit.py`) — keyword search, subreddit discovery, comment enrichment, all via `api.scrapecreators.com`\n- Smart subreddit discovery with relevance-weighted scoring: frequency × recency × topic-word match, replacing pure frequency count\n- `UTILITY_SUBS` blocklist to filter noise subreddits (r/tipofmytongue, r/whatisthisthing, etc.) from discovery results\n- Top comment scoring: 10% weight in engagement formula via `log1p(top_comment_score)`\n- Top comment rendering: `💬 Top comment` lines with upvote counts in compact and full report output\n- Comment excerpt length increased from 300 → 400 chars; `comment_insights` limit raised from 7 → 10\n\n### Changed\n\n- `primaryEnv` switched from `OPENAI_API_KEY` to `SCRAPECREATORS_API_KEY` — one key now powers Reddit, TikTok, and Instagram\n- Reddit engagement scoring formula: `0.55/0.40/0.05` (score/comments/ratio) → `0.50/0.35/0.05/0.10` (score/comments/ratio/top-comment)\n- SKILL.md synthesis instructions updated to emphasize quoting top comments\n\n### Fixed\n\n- Utility subreddit noise in discovery (e.g., r/tipofmytongue appearing for unrelated topics)\n- Reddit search no longer requires `OPENAI_API_KEY` — ScrapeCreators API handles search directly\n\n## [2.8.0] - 2026-03-04\n\n### Highlights\n\nInstagram Reels as the 8th signal source, TikTok migrated from Apify to ScrapeCreators API, and SKILL.md quality improvements. One API key (`SCRAPECREATORS_API_KEY`) now covers both TikTok and Instagram.\n\n### Added\n\n- Instagram Reels as 8th research source via ScrapeCreators API — keyword search, engagement metrics (views, likes, comments), spoken-word transcript extraction (`scripts/lib/instagram.py`)\n- `InstagramItem` dataclass, normalization, scoring (45% relevance / 25% recency / 30% engagement), deduplication, cross-source linking, and rendering\n- Instagram in SKILL.md: stats template (`📸 Instagram:`), citation priority, item format description, output footer\n- URL-to-name extraction examples in SKILL.md for cleaner web source display\n- `--search=instagram` flag support\n\n### Changed\n\n- TikTok backend migrated from Apify to ScrapeCreators API (`api.scrapecreators.com`)\n- `APIFY_API_TOKEN` replaced by `SCRAPECREATORS_API_KEY` in config\n- SKILL.md version bumped to v2.8\n- WebSearch citation instruction strengthened to prevent trailing Sources: blocks\n- Security section updated: Apify → ScrapeCreators references\n\n### Fixed\n\n- Web stats line showing full URLs instead of plain domain names\n- Trailing \"Sources:\" block appearing after skill invitation (WebSearch tool mandate conflict)\n- Instagram/TikTok not running in web-only mode when `--search=instagram` used without Reddit/X\n- `$ARGUMENTS` quoting in SKILL.md for correct flag forwarding\n\n## [2.1.0] - 2026-02-15\n\n### Highlights\n\nThree headline features: watchlists for always-on bots, YouTube transcripts as a 4th source, and Codex CLI compatibility. Plus bundled X search with no external CLI needed.\n\n### Added\n\n- Open-class skill with watchlists, briefings, and history modes (SQLite-backed, FTS5 full-text search, WAL mode) (`feat(open)`)\n- YouTube as a 4th research source via yt-dlp -- search, view counts, and auto-generated transcript extraction (`feat: Add YouTube`)\n- OpenAI Codex CLI compatibility -- install to `~/.agents/skills/last30days`, invoke with `$last30days` (`feat: Add Codex CLI`)\n- Bundled X search -- vendored subset of Bird's Twitter GraphQL client (MIT, originally by @steipete), no external CLI needed (`v2.1: Bundle Bird X search`)\n- Native web search backends: Parallel AI, Brave Search, OpenRouter/Perplexity Sonar Pro (`feat(engine)`)\n- `--diagnose` flag for checking available sources and authentication status\n- `--store` flag for SQLite accumulation (open variant)\n- Conversational first-run experience (NUX) with dynamic source status (`feat(nux)`)\n\n### Changed\n\n- Smarter query construction -- strips noise words, auto-retries with shorter queries when X returns 0 results\n- Two-phase search architecture -- Phase 1 discovers entities (@handles, r/subreddits), Phase 2 drills into them\n- Reddit JSON enrichment -- real upvotes, comments, and upvote ratio from reddit.com/.json endpoint\n- Engagement-weighted scoring: relevance 45%, recency 25%, engagement 30% (log1p dampening)\n- Model auto-selection with 7-day cache and fallback chain (gpt-4.1 -> gpt-4o -> gpt-4o-mini)\n- `--days=N` configurable lookback flag (thanks @jonthebeef, [#18](https://github.com/mvanhorn/last30days-skill/pull/18))\n- Model fallback for unverified orgs (thanks @levineam, [#16](https://github.com/mvanhorn/last30days-skill/pull/16))\n- Marketplace plugin support via `.claude-plugin/plugin.json` (inspired by @galligan, [#1](https://github.com/mvanhorn/last30days-skill/pull/1))\n\n### Fixed\n\n- YouTube timeout increased to 90s, Reddit 429 rate limit fail-fast\n- YouTube soft date filter -- keeps evergreen content instead of filtering to 0 results\n- Eager import crash in `__init__.py` that broke Codex environments\n- Reddit future timeout (same pattern as YouTube timeout bug)\n- Process cleanup on timeout/kill -- tracks child PIDs for clean shutdown\n- Windows Unicode fix for cp1252 emoji crash (thanks @JosephOIbrahim, [#17](https://github.com/mvanhorn/last30days-skill/pull/17))\n- X search returning 0 results on popular topics due to over-specific queries\n\n### New Contributors\n\n- @JosephOIbrahim -- Windows Unicode fix ([#17](https://github.com/mvanhorn/last30days-skill/pull/17))\n- @levineam -- Model fallback for unverified orgs ([#16](https://github.com/mvanhorn/last30days-skill/pull/16))\n- @jonthebeef -- `--days=N` configurable lookback ([#18](https://github.com/mvanhorn/last30days-skill/pull/18))\n\n### Credits\n\n- @steipete -- Bird CLI (vendored X search) and yt-dlp/summarize inspiration for YouTube transcripts\n- @galligan -- Marketplace plugin inspiration\n- @hutchins -- Pushed for YouTube feature\n\n## [1.0.0] - 2026-01-15\n\nInitial public release. Reddit + X search via OpenAI Responses API and xAI API.\n\n[2.9.1]: https://github.com/mvanhorn/last30days-skill/compare/v2.9.0...v2.9.1\n[2.9.0]: https://github.com/mvanhorn/last30days-skill/compare/v2.8.0...v2.9.0\n[2.8.0]: https://github.com/mvanhorn/last30days-skill/compare/v2.6.0...v2.8.0\n[2.1.0]: https://github.com/mvanhorn/last30days-skill/compare/v1.0.0...v2.1.0\n[1.0.0]: https://github.com/mvanhorn/last30days-skill/releases/tag/v1.0.0\n\nArchive v2.9.1: 47 files, 187933 bytes\n\nFiles: CHANGELOG.md (7905b), README.md (69414b), scripts/briefing.py (8178b), scripts/last30days.py (65809b), scripts/lib/__init__.py (29b), scripts/lib/bird_x.py (16235b), scripts/lib/brave_search.py (6019b), scripts/lib/cache.py (4762b), scripts/lib/dates.py (3253b), scripts/lib/dedupe.py (8631b), scripts/lib/entity_extract.py (4205b), scripts/lib/env.py (15490b), scripts/lib/hackernews.py (7592b), scripts/lib/http.py (6067b), scripts/lib/instagram.py (14076b), scripts/lib/models.py (5218b), scripts/lib/normalize.py (12037b), scripts/lib/openai_reddit.py (17956b), scripts/lib/openrouter_search.py (6632b), scripts/lib/parallel_search.py (4016b), scripts/lib/polymarket.py (20350b), scripts/lib/reddit_enrich.py (9592b), scripts/lib/reddit.py (19015b), scripts/lib/render.py (32901b), scripts/lib/schema.py (26339b), scripts/lib/score.py (18968b), scripts/lib/tiktok.py (13515b), scripts/lib/ui.py (23070b), scripts/lib/vendor/bird-search/bird-search.mjs (3750b), scripts/lib/vendor/bird-search/lib/cookies.js (6266b), scripts/lib/vendor/bird-search/lib/paginate-cursor.js (1225b), scripts/lib/vendor/bird-search/lib/runtime-features.js (5036b), scripts/lib/vendor/bird-search/lib/runtime-query-ids.js (9424b), scripts/lib/vendor/bird-search/lib/twitter-client-base.js (4853b), scripts/lib/vendor/bird-search/lib/twitter-client-constants.js (2535b), scripts/lib/vendor/bird-search/lib/twitter-client-features.js (18400b), scripts/lib/vendor/bird-search/lib/twitter-client-search.js (7310b), scripts/lib/vendor/bird-search/lib/twitter-client-types.js (59b), scripts/lib/vendor/bird-search/lib/twitter-client-utils.js (19169b), scripts/lib/websearch.py (11688b), scripts/lib/xai_x.py (6646b), scripts/lib/youtube_yt.py (13599b), scripts/store.py (20353b), scripts/sync.sh (2056b), scripts/watchlist.py (11071b), SKILL.md (31508b), _meta.json (138b)\n\nFile v2.9.1:SKILL.md\n\n---\nname: last30days\nversion: \"2.9.1\"\ndescription: \"Research a topic from the last 30 days. Also triggered by 'last30'. Sources: Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, web. Become an expert and write copy-paste-ready prompts.\"\nargument-hint: 'last30 AI video tools, last30 best project management tools'\nallowed-tools: Bash, Read, Write, AskUserQuestion, WebSearch\nhomepage: https://github.com/mvanhorn/last30days-skill\nrepository: https://github.com/mvanhorn/last30days-skill\nauthor: mvanhorn\nlicense: MIT\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: \"📰\"\n    requires:\n      env:\n        - SCRAPECREATORS_API_KEY\n      optionalEnv:\n        - OPENAI_API_KEY\n        - XAI_API_KEY\n        - OPENROUTER_API_KEY\n        - PARALLEL_API_KEY\n        - BRAVE_API_KEY\n        - APIFY_API_TOKEN\n      bins:\n        - node\n        - python3\n    primaryEnv: SCRAPECREATORS_API_KEY\n    files:\n      - \"scripts/*\"\n    homepage: https://github.com/mvanhorn/last30days-skill\n    tags:\n      - research\n      - reddit\n      - x\n      - youtube\n      - tiktok\n      - instagram\n      - hackernews\n      - polymarket\n      - trends\n      - prompts\n---\n\n# last30days v2.9.1: Research Any Topic from the Last 30 Days\n\nResearch ANY topic across Reddit, X, YouTube, TikTok, Hacker News, Polymarket, and the web. Surface what people are actually discussing, recommending, betting on, and debating right now.\n\n## CRITICAL: Parse User Intent\n\nBefore doing anything, parse the user's input for:\n\n1. **TOPIC**: What they want to learn about (e.g., \"web app mockups\", \"Claude Code skills\", \"image generation\")\n2. **TARGET TOOL** (if specified): Where they'll use the prompts (e.g., \"Nano Banana Pro\", \"ChatGPT\", \"Midjourney\")\n3. **QUERY TYPE**: What kind of research they want:\n   - **PROMPTING** - \"X prompts\", \"prompting for X\", \"X best practices\" → User wants to learn techniques and get copy-paste prompts\n   - **RECOMMENDATIONS** - \"best X\", \"top X\", \"what X should I use\", \"recommended X\" → User wants a LIST of specific things\n   - **NEWS** - \"what's happening with X\", \"X news\", \"latest on X\" → User wants current events/updates\n   - **GENERAL** - anything else → User wants broad understanding of the topic\n\nCommon patterns:\n- `[topic] for [tool]` → \"web mockups for Nano Banana Pro\" → TOOL IS SPECIFIED\n- `[topic] prompts for [tool]` → \"UI design prompts for Midjourney\" → TOOL IS SPECIFIED\n- Just `[topic]` → \"iOS design mockups\" → TOOL NOT SPECIFIED, that's OK\n- \"best [topic]\" or \"top [topic]\" → QUERY_TYPE = RECOMMENDATIONS\n- \"what are the best [topic]\" → QUERY_TYPE = RECOMMENDATIONS\n\n**IMPORTANT: Do NOT ask about target tool before research.**\n- If tool is specified in the query, use it\n- If tool is NOT specified, run research first, then ask AFTER showing results\n\n**Store these variables:**\n- `TOPIC = [extracted topic]`\n- `TARGET_TOOL = [extracted tool, or \"unknown\" if not specified]`\n- `QUERY_TYPE = [RECOMMENDATIONS | NEWS | HOW-TO | GENERAL]`\n\n**DISPLAY your parsing to the user.** Before running any tools, output:\n\n```\nI'll research {TOPIC} across Reddit, X, TikTok, and the web to find what's been discussed in the last 30 days.\n\nParsed intent:\n- TOPIC = {TOPIC}\n- TARGET_TOOL = {TARGET_TOOL or \"unknown\"}\n- QUERY_TYPE = {QUERY_TYPE}\n\nResearch typically takes 2-8 minutes (niche topics take longer). Starting now.\n```\n\nIf TARGET_TOOL is known, mention it in the intro: \"...to find {QUERY_TYPE}-style content for use in {TARGET_TOOL}.\"\n\nThis text MUST appear before you call any tools. It confirms to the user that you understood their request.\n\n---\n\n## Step 0.5: Resolve X Handle (if topic could have an X account)\n\nIf TOPIC looks like it could have its own X/Twitter account - **people, creators, brands, products, tools, companies, com","readmeExcerpt":"Skill: last30days Owner: mvanhorn Summary: Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'. Tags: latest:3.0.0-open Version history: v3.0.0-open | 2026-04-08T17:57:27.835Z | auto last30days v3.0.0-open: Major update with multi-mode research, persistent knowledge, and wa","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"for dir in \\\n  \".\" \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\" \\\n  \"${GEMINI_EXTENSION_DIR:-}\" \\\n  \"$HOME/.gemini/extensions/last30days-skill\" \\\n  \"$HOME/.gemini/extensions/last30days\" \\\n  \"$HOME/.claude/skills/last30days\" \\\n  \"$HOME/.agents/skills/last30days\" \\\n  \"$HOME/.codex/skills/last30days\"; do\n  [ -n \"$dir\" ] && [ -f \"$dir/scripts/last30days.py\" ] && SKILL_ROOT=\"$dir\" && break\ndone\n\nif [ -z \"${SKILL_ROOT:-}\" ]; then\n  echo \"ERROR: Could not find scripts/last30days.py\" >&2\n  exit 1\nfi"},{"language":"text","snippet":"Read: ${SKILL_ROOT}/variants/open/references/{mode}.md"},{"language":"bash","snippet":"python3 \"${SKILL_ROOT}/scripts/briefing.py\" generate [--weekly] [--since DATE]"},{"language":"text","snippet":"Good morning! Here's your research briefing for [DATE].\n\nTL;DR: [One sentence about the top finding across all topics]\n\n---\n\n**[Topic 1]** (N new findings)\nTop signal: [Highest engagement finding with source]\nAlso trending: [2nd finding], [3rd finding]\n\n**[Topic 2]** (N new findings)\nTop signal: [Highest engagement finding]\nAlso trending: [2nd finding]\n\n---\nCost: $X.XX / $Y.YY budget | N topics active | N findings today"},{"language":"text","snippet":"Weekly digest for week of [DATE]:\n\n**[Topic 1]**\nThis week: N findings (up/down X% from last week)\nTrending up: [engagement increasing]\nKey voices: @handle1, r/sub1\n\n**[Topic 2]**\nThis week: N findings\nTrending down: [engagement decreasing]"},{"language":"text","snippet":"No briefing data available.\n\nTo get started:\n1. Add a topic: /last30days watch add \"your topic\"\n2. Run research: /last30days watch run-all\n3. Generate briefing: /last30days briefing"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: last30days\nversion: \"3.0.0-open\"\ndescription: \"Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'.\"\nargument-hint: 'last30 AI video tools, last30 watch my competitor every week, last30 give me my briefing'\nallowed-tools: Bash, Read, Write, AskUserQuestion, WebSearch\ndisable-model-invocation: true\n---\n\n# last30days (open variant): Research + Watchlist + Briefings\n\nMulti-mode research skill with persistent knowledge accumulation.\n\n## Command Routing\n\nParse the user's first argument to determine the mode:\n\n| First word | Mode | Reference |\n|---|---|---|\n| `watch` | Watchlist management | `references/watchlist.md` |\n| `briefing` | Morning briefing | `references/briefing.md` |\n| `history` | Query accumulated knowledge | `references/history.md` |\n| *(anything else)* | One-shot research | `references/research.md` |\n\n## Setup: Find Skill Root\n\n```bash\nfor dir in \\\n  \".\" \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\" \\\n  \"${GEMINI_EXTENSION_DIR:-}\" \\\n  \"$HOME/.gemini/extensions/last30days-skill\" \\\n  \"$HOME/.gemini/extensions/last30days\" \\\n  \"$HOME/.claude/skills/last30days\" \\\n  \"$HOME/.agents/skills/last30days\" \\\n  \"$HOME/.codex/skills/last30days\"; do\n  [ -n \"$dir\" ] && [ -f \"$dir/scripts/last30days.py\" ] && SKILL_ROOT=\"$dir\" && break\ndone\n\nif [ -z \"${SKILL_ROOT:-}\" ]; then\n  echo \"ERROR: Could not find scripts/last30days.py\" >&2\n  exit 1\nfi\n```\n\nUse `$SKILL_ROOT` for all script and reference file paths.\n\n## Load Context\n\nAt session start, read `${SKILL_ROOT}/variants/open/context.md` for user preferences and source quality notes. Update it after interactions.\n\n## Shared Configuration\n\n- **Database**: `~/.local/share/last30days/research.db` (SQLite, WAL mode)\n- **Briefings**: `~/.local/share/last30days/briefs/`\n- **API keys**: `~/.config/last30days/.env` or environment variables\n- **Key priority**: env vars > config file\n\n### API Keys\n\n| Key | Required | Purpose |\n|---|---|---|\n| `OPENAI_API_KEY` | For Reddit | Reddit search via OpenAI responses API |\n| `XAI_API_KEY` | For X (fallback) | X search via xAI Grok API |\n| `OPENROUTER_API_KEY` | Optional | Perplexity Sonar Pro search + AI reasoning (planning/reranking). Add `INCLUDE_SOURCES=perplexity` to enable. Use `--deep-research` for exhaustive reports. |\n| `PARALLEL_API_KEY` | Optional | Web search via Parallel AI |\n| `BRAVE_API_KEY` | Optional | Web search via Brave Search |\n\nBird CLI provides free X search if installed. YouTube search uses yt-dlp (free).\n\nRun `python3 \"${SKILL_ROOT}/scripts/last30days.py\" --diagnose` to check source availability.\n\n## Routing Logic\n\nAfter determining the mode, **read the corresponding reference file** using the Read tool:\n\n```\nRead: ${SKILL_ROOT}/variants/open/references/{mode}.md\n```\n\nThen follow the instructions in that reference file exactly."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7d7xy7794nh6aaabfga5wwzh7zptdm\",\n  \"slug\": \"last30days-official\",\n  \"version\": \"3.0.0-open\",\n  \"publishedAt\": 1775671047835\n}"},{"path":"references/briefing.md","content":"# Morning Briefing\n\nSynthesize accumulated findings into a formatted briefing.\n\n## Commands\n\n| Command | Action |\n|---|---|\n| `briefing` | Generate today's briefing |\n| `briefing --weekly` | Weekly digest with trends |\n| `briefing --since YYYY-MM-DD` | Briefing since specific date |\n\n## Generate Briefing\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/briefing.py\" generate [--weekly] [--since DATE]\n```\n\nThe script returns JSON with per-topic findings, staleness info, and cost data.\n\n## Staleness Check\n\nBefore synthesizing, check each topic's freshness:\n- **Fresh** (< 12h): show normally\n- **Aging** (12-36h): note when last run was\n- **Stale** (> 36h): warn user, suggest running `watch run-one \"topic\"`\n\n## Daily Briefing Format\n\n```\nGood morning! Here's your research briefing for [DATE].\n\nTL;DR: [One sentence about the top finding across all topics]\n\n---\n\n**[Topic 1]** (N new findings)\nTop signal: [Highest engagement finding with source]\nAlso trending: [2nd finding], [3rd finding]\n\n**[Topic 2]** (N new findings)\nTop signal: [Highest engagement finding]\nAlso trending: [2nd finding]\n\n---\nCost: $X.XX / $Y.YY budget | N topics active | N findings today\n```\n\n## Weekly Digest Format\n\n```\nWeekly digest for week of [DATE]:\n\n**[Topic 1]**\nThis week: N findings (up/down X% from last week)\nTrending up: [engagement increasing]\nKey voices: @handle1, r/sub1\n\n**[Topic 2]**\nThis week: N findings\nTrending down: [engagement decreasing]\n```\n\n## Synthesis Rules\n\n- Lead with people, not publications\n- 3-5 topics max per briefing\n- 2-3 findings per topic\n- Include cost/budget footer\n- Note any failed or stale topics\n\n## No Data Handling\n\nIf no topics or no findings:\n```\nNo briefing data available.\n\nTo get started:\n1. Add a topic: /last30days watch add \"your topic\"\n2. Run research: /last30days watch run-all\n3. Generate briefing: /last30days briefing\n```"},{"path":"references/history.md","content":"# History & Knowledge Query\n\nQuery the accumulated findings database.\n\n## Commands\n\n| Command | Action |\n|---|---|\n| `history \"topic\"` | Show findings for a topic |\n| `history \"topic\" --since=7d` | Findings from last N days |\n| `history --search \"query\"` | Full-text search across all findings |\n| `history --trending` | Topics with most recent activity |\n| `history --stats` | Watchlist health dashboard |\n\n## Topic History\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" query \"TOPIC\" [--since DAYS]\n```\n\nDisplay findings grouped by date (newest first):\n```\n**[Topic Name]** — N findings since [date]\n\n[DATE]\n- [Reddit] Title (score pts, N comments) — r/subreddit\n- [X] Tweet text... (N likes) — @handle\n- [YouTube] Video title (N views) — channel\n\n[EARLIER DATE]\n- ...\n```\n\nMark updated findings (engagement changed since first seen).\n\n## Full-Text Search\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" search \"QUERY\"\n```\n\nUses FTS5 with BM25 ranking. Show results across all topics:\n```\nSearch: \"QUERY\" — N results\n\n1. [Reddit] Title — r/subreddit (topic: AI video)\n   ...snippet with **highlighted** matches...\n\n2. [X] Tweet text — @handle (topic: NVIDIA)\n   ...snippet...\n```\n\n## Trending Topics\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" trending\n```\n\nShow topics ranked by recent activity:\n```\nTrending topics (last 7 days):\n\n1. AI video tools — 12 new findings, engagement up 45%\n2. NVIDIA news — 8 new findings, engagement steady\n3. Claude Code — 3 new findings, engagement down 20%\n```\n\n## Stats Dashboard\n\n```bash\npython3 \"${SKILL_ROOT}/scripts/store.py\" stats\n```\n\nDisplay as a health dashboard:\n```\nWatchlist Health\n- Active topics: N\n- Total findings: N\n- Database size: N KB\n\nResearch Runs (7 days)\n- Successful: N\n- Failed: N\n- Cost: $X.XX\n\nSource Breakdown\n- Reddit: N findings\n- X: N findings\n- YouTube: N findings\n- Web: N findings\n```\n\n## No Data Handling\n\nIf no findings exist:\n```\nNo research history yet.\n\nTo start building knowledge:\n1. Run research: /last30days \"your topic\"\n2. Or add a watchlist topic: /last30days watch add \"topic\"\n```"},{"path":"references/research.md","content":"# One-Shot Research Mode (v3)\n\nResearch ANY topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web. Surface what people are actually discussing, recommending, betting on, and debating right now.\n\n---\n\n## 1. Parse User Intent\n\nBefore doing anything, parse the user's input for:\n\n1. **TOPIC**: What they want to learn about\n2. **TARGET TOOL** (if specified): Where they'll use the prompts\n3. **QUERY TYPE**:\n   - **PROMPTING** - \"X prompts\", \"prompting for X\" -> copy-paste prompts\n   - **RECOMMENDATIONS** - \"best X\", \"top X\" -> list of specific things\n   - **NEWS** - \"what's happening with X\" -> current events\n   - **COMPARISON** - \"X vs Y\", \"X versus Y\", \"compare X and Y\" -> side-by-side comparison\n   - **GENERAL** - anything else -> broad understanding\n\nCommon patterns:\n- `[topic] for [tool]` -> TOOL IS SPECIFIED\n- `[topic] prompts for [tool]` -> TOOL IS SPECIFIED\n- Just `[topic]` -> TOOL NOT SPECIFIED, that's OK\n- \"best [topic]\" or \"top [topic]\" -> QUERY_TYPE = RECOMMENDATIONS\n- \"X vs Y\" or \"X versus Y\" -> QUERY_TYPE = COMPARISON, TOPIC_A = X, TOPIC_B = Y\n\n**Do NOT ask about target tool before research.** Run research first, ask after.\n\n**Store these variables:**\n- `TOPIC = [extracted topic]`\n- `TARGET_TOOL = [extracted tool, or \"unknown\" if not specified]`\n- `QUERY_TYPE = [PROMPTING | RECOMMENDATIONS | NEWS | COMPARISON | GENERAL]`\n- `TOPIC_A = [first item]` (only if COMPARISON)\n- `TOPIC_B = [second item]` (only if COMPARISON)\n\n---\n\n## 2. Confirm Topic\n\nDisplay a branded one-liner before starting research. Build ACTIVE_SOURCES_LIST by checking what's configured in .env (Reddit, HN, Polymarket are always active; add X, YouTube, TikTok, Instagram, GitHub, Perplexity based on configured keys/tools).\n\nFor GENERAL / NEWS / RECOMMENDATIONS / PROMPTING queries:\n```\n/last30days - searching {ACTIVE_SOURCES_LIST} for what people are saying about {TOPIC}.\n```\n\nFor COMPARISON queries:\n```\n/last30days - comparing {TOPIC_A} vs {TOPIC_B} across {ACTIVE_SOURCES_LIST}.\n```\n\nDo NOT show a multi-line \"Parsed intent\" block with TOPIC=, TARGET_TOOL=, QUERY_TYPE= variables. Do NOT promise a specific time. Do NOT list sources that aren't configured.\n\nThen proceed immediately to research execution.\n\n---\n\n## 3. Handle / GitHub Resolution\n\n**OpenClaw does not have WebSearch.** Skip manual handle resolution (Steps 0.5, 0.55, 0.75 from the main skill). Instead, add `--auto-resolve` to the research command. The engine will use configured web search backends (Brave, Exa, Serper) to discover subreddits, X handles, and context before planning.\n\nIf the user manually provides handles or community names, pass them through as CLI flags (see the flags list in Research Execution below). But do NOT attempt WebSearch-based resolution yourself.\n\n---\n\n## 4. Agent Mode (--agent flag)\n\nIf `--agent` appears in ARGUMENTS (e.g., `/last30days plaud granola --agent`):\n\n1. **Skip** the intro display block\n2. **Skip** any `AskUserQuestion` calls - use `TARGET_TOOL "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'. Skill: last30days Owner: mvanhorn Summary: Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, Perplexity, and more. AI agent scores by upvotes, likes, and real money. Also triggered by 'last30'. Tags: latest:3.0.0-open Version history: v3.0.0-open | 2026-04-08T17:57:27.835Z | auto last30days v3.0.0-open: Major update with multi-mode research, persistent knowledge, and wa","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1404,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T02:31:30.020Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:26:39.990Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}