From a4d09e470e5ce88baa0b5b9112cf0e30cf8d8cf8 Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Tue, 17 Feb 2026 12:16:01 -0800 Subject: [PATCH] docs: add CHANGELOG.md, release notes, and v2.1 polish Add CHANGELOG.md (Keep a Changelog format) and release-notes.md for the v2.1.0 GitHub Release. Also includes queued copy updates: plugin.json version bump to 2.1.0, YouTube added to descriptions, SKILL.md security/permissions section and ClawdBot metadata, updated watchlist examples, and v2.1 launch post refinements. Co-Authored-By: Claude Opus 4.6 --- .claude-plugin/marketplace.json | 3 +- .claude-plugin/plugin.json | 6 +-- CHANGELOG.md | 63 ++++++++++++++++++++++++++++ README.md | 12 +++--- SKILL.md | 47 +++++++++++++++++++++ docs/v2.1-tweets.md | 69 ++++++++++++++++++++++++++----- release-notes.md | 73 +++++++++++++++++++++++++++++++++ scripts/lib/ui.py | 5 +-- 8 files changed, 253 insertions(+), 25 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 release-notes.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 7e45d1a..746fa2e 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -5,7 +5,8 @@ "url": "https://github.com/mvanhorn" }, "metadata": { - "description": "Research any topic from the last 30 days across Reddit, X, and the web" + "description": "Research any topic from the last 30 days across Reddit, X, YouTube, and the web", + "version": "2.1.0" }, "plugins": [ { diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 0e51d53..180cbc5 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,12 +1,12 @@ { "name": "last30days", - "description": "Research any topic from the last 30 days across Reddit, X, and the web", - "version": "2.0.0", + "description": "Research any topic from the last 30 days across Reddit, X, YouTube, and the web", + "version": "2.1.0", "author": { "name": "mvanhorn" }, "repository": "https://github.com/mvanhorn/last30days-skill", "license": "MIT", - "keywords": ["research", "reddit", "twitter", "x", "trends", "prompts"], + "keywords": ["research", "reddit", "twitter", "x", "youtube", "trends", "prompts"], "skills": ["./"] } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2950bbf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,63 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [2.1.0] - 2026-02-15 + +### Highlights + +Three 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. + +### Added + +- Open-class skill with watchlists, briefings, and history modes (SQLite-backed, FTS5 full-text search, WAL mode) (`feat(open)`) +- YouTube as a 4th research source via yt-dlp -- search, view counts, and auto-generated transcript extraction (`feat: Add YouTube`) +- OpenAI Codex CLI compatibility -- install to `~/.agents/skills/last30days`, invoke with `$last30days` (`feat: Add Codex CLI`) +- 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`) +- Native web search backends: Parallel AI, Brave Search, OpenRouter/Perplexity Sonar Pro (`feat(engine)`) +- `--diagnose` flag for checking available sources and authentication status +- `--store` flag for SQLite accumulation (open variant) +- Conversational first-run experience (NUX) with dynamic source status (`feat(nux)`) + +### Changed + +- Smarter query construction -- strips noise words, auto-retries with shorter queries when X returns 0 results +- Two-phase search architecture -- Phase 1 discovers entities (@handles, r/subreddits), Phase 2 drills into them +- Reddit JSON enrichment -- real upvotes, comments, and upvote ratio from reddit.com/.json endpoint +- Engagement-weighted scoring: relevance 45%, recency 25%, engagement 30% (log1p dampening) +- Model auto-selection with 7-day cache and fallback chain (gpt-4.1 -> gpt-4o -> gpt-4o-mini) +- `--days=N` configurable lookback flag (thanks @jonthebeef, [#18](https://github.com/mvanhorn/last30days-skill/pull/18)) +- Model fallback for unverified orgs (thanks @levineam, [#16](https://github.com/mvanhorn/last30days-skill/pull/16)) +- Marketplace plugin support via `.claude-plugin/plugin.json` (inspired by @galligan, [#1](https://github.com/mvanhorn/last30days-skill/pull/1)) + +### Fixed + +- YouTube timeout increased to 90s, Reddit 429 rate limit fail-fast +- YouTube soft date filter -- keeps evergreen content instead of filtering to 0 results +- Eager import crash in `__init__.py` that broke Codex environments +- Reddit future timeout (same pattern as YouTube timeout bug) +- Process cleanup on timeout/kill -- tracks child PIDs for clean shutdown +- Windows Unicode fix for cp1252 emoji crash (thanks @JosephOIbrahim, [#17](https://github.com/mvanhorn/last30days-skill/pull/17)) +- X search returning 0 results on popular topics due to over-specific queries + +### New Contributors + +- @JosephOIbrahim -- Windows Unicode fix ([#17](https://github.com/mvanhorn/last30days-skill/pull/17)) +- @levineam -- Model fallback for unverified orgs ([#16](https://github.com/mvanhorn/last30days-skill/pull/16)) +- @jonthebeef -- `--days=N` configurable lookback ([#18](https://github.com/mvanhorn/last30days-skill/pull/18)) + +### Credits + +- @steipete -- Bird CLI (vendored X search) and yt-dlp/summarize inspiration for YouTube transcripts +- @galligan -- Marketplace plugin inspiration +- @hutchins -- Pushed for YouTube feature + +## [1.0.0] - 2026-01-15 + +Initial public release. Reddit + X search via OpenAI Responses API and xAI API. + +[2.1.0]: https://github.com/mvanhorn/last30days-skill/compare/v1.0.0...v2.1.0 +[1.0.0]: https://github.com/mvanhorn/last30days-skill/releases/tag/v1.0.0 diff --git a/README.md b/README.md index bc57337..cd93209 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **New in V2.1 - three headline features:** -1. **Open-class skill with watchlists.** Add any topic to a watchlist - your competitors, your partners, your board members, an emerging technology - and /last30days re-researches it on demand or via cron. Designed for always-on environments like [Open Claw](https://github.com/openclaw/openclaw) where a bot can run research on a schedule and accumulate findings over time. +1. **Open-class skill with watchlists.** Add any topic to a watchlist - your competitors, specific people, emerging technologies - and /last30days re-researches it on demand or via cron. Designed for always-on environments like [Open Claw](https://github.com/openclaw/openclaw) where a bot can run research on a schedule and accumulate findings over time. 2. **YouTube transcripts as a 4th source.** When yt-dlp is installed, /last30days automatically searches YouTube, grabs view counts, and extracts auto-generated transcripts from the top videos. A 20-minute review contains 10x the signal of a single post - now the skill reads it. Inspired by [@steipete](https://x.com/steipete)'s yt-dlp + [summarize](https://github.com/steipete/summarize) toolchain. 3. **Works in OpenAI Codex CLI.** Same skill, same engine. Install to `~/.agents/skills/last30days` and invoke with `$last30days`. Claude Code and Codex users get the same research. @@ -66,7 +66,7 @@ Same SKILL.md, same Python engine, same scripts. The `agents/openai.yaml` provid ### Open Variant (Watchlist + Briefings) - For Always-On Bots -**Designed for [Open Claw](https://github.com/openclaw/openclaw) and similar always-on AI environments.** Add your competitors, partners, board members, 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. +**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. **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. @@ -76,15 +76,13 @@ cp variants/open/SKILL.md ~/.claude/skills/last30days/SKILL.md # Add topics to your watchlist last30 watch my biggest competitor every week -last30 watch AI video generation tools -last30 tell me once a month about what my board members are up to +last30 watch Peter Steinberger every 30 days +last30 watch AI video tools monthly +last30 Y Combinator hot companies end of April and end of September # Run research manually (or let your bot's cron handle it) last30 run all my watched topics -# Get your briefing -last30 give me my briefing - # Search accumulated knowledge last30 what have you found about AI video? ``` diff --git a/SKILL.md b/SKILL.md index 4d044d4..4cbc122 100644 --- a/SKILL.md +++ b/SKILL.md @@ -4,6 +4,29 @@ version: "2.1" description: "Research a topic from the last 30 days. Also triggered by 'last30'. Sources: Reddit, X, YouTube, web. Become an expert and write copy-paste-ready prompts." argument-hint: 'last30 AI video tools, last30 best project management tools' allowed-tools: Bash, Read, Write, AskUserQuestion, WebSearch +homepage: https://github.com/mvanhorn/last30days-skill +user-invocable: true +disable-model-invocation: true +metadata: + clawdbot: + emoji: "📰" + requires: + env: + - OPENAI_API_KEY + bins: + - node + - python3 + primaryEnv: OPENAI_API_KEY + files: + - "scripts/*" + homepage: https://github.com/mvanhorn/last30days-skill + tags: + - research + - reddit + - x + - youtube + - trends + - prompts --- # last30days v2.1: Research Any Topic from the Last 30 Days @@ -452,3 +475,27 @@ After delivering a prompt, end with: Want another prompt? Just tell me what you're creating next. ``` + +--- + +## Security & Permissions + +**What this skill does:** +- Sends search queries to OpenAI's Responses API (`api.openai.com`) for Reddit discovery +- Sends search queries to Twitter's GraphQL API (via browser cookie auth) or xAI's API (`api.x.ai`) for X search +- Runs `yt-dlp` locally for YouTube search and transcript extraction (no API key, public data) +- Optionally sends search queries to Brave Search API, Parallel AI API, or OpenRouter API for web search +- Fetches public Reddit thread data from `reddit.com` for engagement metrics +- Stores research findings in local SQLite database (watchlist mode only) + +**What this skill does NOT do:** +- Does not post, like, or modify content on any platform +- Does not access your Reddit, X, or YouTube accounts +- Does not share API keys between providers (OpenAI key only goes to api.openai.com, etc.) +- Does not log, cache, or write API keys to output files +- Does not send data to any endpoint not listed above +- Cannot be invoked autonomously by the agent (`disable-model-invocation: true`) + +**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) + +Review scripts before first use to verify behavior. diff --git a/docs/v2.1-tweets.md b/docs/v2.1-tweets.md index 400ccb8..444af43 100644 --- a/docs/v2.1-tweets.md +++ b/docs/v2.1-tweets.md @@ -2,18 +2,23 @@ ## Post 1 (Hook) -V2.1 of /last30days launches today. Three headline features: +V2.1 of @slashlast30days launches today. Three headline features: -## Post 2 (Watchlist - THE KILLER FEATURE) +1. @openclaw + watchlists - automated research on your competitors, people, and topics +2. YouTube transcripts as a 4th source +3. Works in OpenAI Codex -SET IT AND FORGET IT. +## Post 2 (Watchlist + Open Claw - THE KILLER FEATURE) -Add your competitors, your partners, your board members to a watchlist. /last30days re-researches them automatically - daily or weekly - across Reddit, X, YouTube, and the web. +@openclaw + WATCHLISTS. -Ask for a briefing anytime. The research runs while you sleep. +Pair /last30days with @openclaw and it re-researches topics on a schedule across Reddit, X, YouTube, and the web. -`/last30days watch add "Competitor X product launches"` -`/last30days briefing` +"last30 watch my biggest competitor every week" +"last30 watch Peter Steinberger every 30 days" +"last30 watch AI video tools monthly" + +Research that runs while you sleep. Designed for @openclaw and always-on bots. ## Post 3 (YouTube) @@ -51,19 +56,61 @@ Asked it about @steipete. Key reveal: OpenAI and Meta both made acquisition offers for OpenClaw. He said no. He's losing $10-20K/month maintaining it. "A fun project became a world project." -## Post 8 (Close) +## Post 8 (Install) -Thank you to @hutchins for pushing me to add YouTube and to @steipete for the yt-dlp toolchain that made it possible. +Tell your @openclaw bot: -Try it: /last30days [any topic] +"Install the last30days skill from github.com/mvanhorn/last30days-skill" + +That's it. One message. + +## Post 9 (Close) + +Thank you to @hutchins for pushing me to add YouTube and to @steipete whose summarize tool showed me how yt-dlp could power transcript extraction. + +Try it: last30 [any topic] github.com/mvanhorn/last30days-skill +PS: @steipete ClawHub login is broken right now so we can't publish the official skill there yet. Hoping for a fix soon. + +--- + +## Standalone Posts + +### Greg Isenberg best tips + +Prompt: `last30 greg isenberg best tips` + +1 Reddit thread. 6 X posts. 4 YouTube videos (all transcribed). 8 web pages. + +His core playbook is ACP: Audience, Community, Product. Not the other way around. + +Big thesis: "2026 is the GREATEST time to build a startup in 30 years." Boring industries, AI agents, rapid dev tools collapsing build time. + +Most-watched: "Clawdbot Clearly Explained" (273K views), "Claude Code Built My $450K Marketing Campaign" (40K views), daily workflows with Kitze (83K views). + +@gregisenberg @slashlast30days + +### Lenny Rachitsky best learnings + +Prompt: `last30 lenny rachitsky top learnings` + +5 Reddit threads. 29 X posts. 20 YouTube videos (1.1M+ views, 5 transcribed). 30 web pages. + +"Execution is no longer the bottleneck. Clarity is." That's the thesis running through everything @lennysan has been publishing lately. + +He open-sourced 320 episode transcripts and the community went wild. 87 skills got built from them. Someone on Reddit distilled 86 discrete product skills from 100+ episodes. + +Recent guest highlights: Sherwin Wu (OpenAI) says 95% of their engineers use Codex daily. Marc Andreessen: "This is as normal as it's going to be. It's going to be much weirder very soon." Dalton Caldwell (YC): "just don't die" and avoid tar pit ideas. + +@lennysan @slashlast30days + --- ## NOTES -- Thread leads with the watchlist as the killer feature - "research that runs while you sleep" is the sticky pitch +- Thread leads with Open Claw + watchlist as the killer feature - pair with an always-on bot for automated research - YouTube is the #2 hero - the stats ("685K views, 4 transcripts read") prove it works - Codex compatibility is #3 - brief but shows cross-platform reach - Example posts prove quality with verified results from real runs diff --git a/release-notes.md b/release-notes.md new file mode 100644 index 0000000..1414a30 --- /dev/null +++ b/release-notes.md @@ -0,0 +1,73 @@ +The AI world reinvents itself every month. This skill keeps you current. + +`/last30days` researches your topic across **Reddit, X, YouTube, and the web** from the last 30 days, finds what the community is actually upvoting, sharing, and saying on camera, and writes you a prompt that works today, not six months ago. + +## Three Headline Features + +**1. Open-class skill with watchlists.** Add any topic to a watchlist -- your competitors, specific people, emerging technologies -- and /last30days re-researches it on demand or via cron. Designed for always-on environments like [Open Claw](https://github.com/openclaw/openclaw). SQLite-backed with FTS5 full-text search. + +**2. YouTube transcripts as a 4th source.** When yt-dlp is installed, /last30days automatically searches YouTube, grabs view counts, and extracts auto-generated transcripts from the top videos. A 20-minute review contains 10x the signal of a single post -- now the skill reads it. Inspired by [@steipete](https://x.com/steipete)'s yt-dlp + [summarize](https://github.com/steipete/summarize) toolchain. + +**3. Works in OpenAI Codex CLI.** Same skill, same engine, same four sources. Install to `~/.agents/skills/last30days` and invoke with `$last30days`. + +Plus: **Bundled X search** -- vendored Bird GraphQL client (MIT). No external CLI, no npm install, no API keys needed. Just Node.js 22+ and your browser cookies. + +## Real Results (verified Feb 15) + +| Topic | Reddit | X | YouTube | Web | +|-------|--------|---|---------|-----| +| Nano Banana Pro | -- | 32 posts, 164 likes | 5 videos, 98K views, 5 transcripts | 10 pages | +| Seedance 2.0 access | 3 threads, 114 upvotes | 31 posts, 191 likes | 20 videos, 685K views, 4 transcripts | 10 pages | +| OpenClaw use cases | 35 threads, 1,130 upvotes | 23 posts | 20 videos, 1.57M views, 5 transcripts | 10 pages | +| YouTube thumbnails | 7 threads, 654 upvotes | 32 posts, 110 likes | 18 videos, 6.15M views, 5 transcripts | 30 pages | +| AI generated ads | 12 threads | 29 posts, 101 likes | 3 videos, 83K views, 3 transcripts | 30 pages | + +## What's New + +### Added +- Open-class skill with watchlist, briefing, and history modes +- YouTube search + transcript extraction via yt-dlp +- OpenAI Codex CLI compatibility +- Bundled Twitter/X search (vendored Bird GraphQL, MIT) +- Native web search backends (Parallel AI, Brave, OpenRouter/Perplexity Sonar Pro) +- `--diagnose` flag for source status checking +- `--store` flag for SQLite accumulation +- Conversational first-run experience (NUX) + +### Changed +- Two-phase search architecture (entity-aware drill-down) +- Reddit JSON enrichment for real engagement metrics +- Smarter query construction with auto-retry on 0 results +- Engagement-weighted scoring (relevance 45%, recency 25%, engagement 30%) +- `--days=N` configurable lookback (thanks @jonthebeef) + +### Fixed +- YouTube/Reddit timeout resilience +- Reddit 429 rate limit fail-fast +- Eager import crash in Codex environments +- X search returning 0 results on popular topics +- Windows Unicode crash (thanks @JosephOIbrahim) + +## New Contributors + +- @JosephOIbrahim -- Windows Unicode fix ([#17](https://github.com/mvanhorn/last30days-skill/pull/17)) +- @levineam -- Model fallback for unverified orgs ([#16](https://github.com/mvanhorn/last30days-skill/pull/16)) +- @jonthebeef -- `--days=N` configurable lookback ([#18](https://github.com/mvanhorn/last30days-skill/pull/18)) + +## Credits + +- [@steipete](https://github.com/steipete) -- Bird CLI (vendored X search) and yt-dlp/summarize inspiration for YouTube transcripts +- [@galligan](https://github.com/galligan) -- Marketplace plugin inspiration +- [@hutchins](https://x.com/hutchins) -- Pushed for YouTube feature + +## Install + +```bash +# Claude Code +git clone https://github.com/mvanhorn/last30days-skill.git ~/.claude/skills/last30days + +# Codex CLI +git clone https://github.com/mvanhorn/last30days-skill.git ~/.agents/skills/last30days +``` + +30 days of research. 30 seconds of work. Four sources. Zero stale prompts. diff --git a/scripts/lib/ui.py b/scripts/lib/ui.py index 53f7a20..5b95c84 100644 --- a/scripts/lib/ui.py +++ b/scripts/lib/ui.py @@ -108,10 +108,9 @@ You can unlock more sources with API keys — just ask me how and I'll walk you Some examples of what you can do: - "last30 what are people saying about Figma" - "last30 watch my biggest competitor every week" -- "last30 tell me once a month about what my board members are up to" -- "last30 give me my morning briefing" +- "last30 watch Peter Steinberger every 30 days" +- "last30 watch AI video tools monthly" - "last30 what have you found about AI video?" -- "last30 set a budget so you don't go crazy" Just start with "last30" and talk to me like normal. """