32992834ee
- Xiaohongshu search via local MCP service (opt-in, zero impact if service not running) - Reddit public JSON fallback (works with zero API keys) - Reddit priority: ScrapeCreators -> OpenAI -> public fallback - Updated env.py: Reddit always available via public fallback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
256 lines
8.6 KiB
Markdown
256 lines
8.6 KiB
Markdown
---
|
|
title: "feat: Create GitHub Release for v2.1"
|
|
type: feat
|
|
date: 2026-02-17
|
|
---
|
|
|
|
# Create GitHub Release for v2.1
|
|
|
|
## Overview
|
|
|
|
The last30days skill is at v2.1 with 2,747 stars and 317 forks, but has **zero git tags and zero GitHub Releases**. The code is already live on the public repo (`upstream/main`). All marketing copy is written. This plan creates a proper v2.1.0 GitHub Release from existing materials.
|
|
|
|
## Problem Statement
|
|
|
|
GitHub Releases provide:
|
|
- A landing page for each version with formatted release notes
|
|
- Discoverability (GitHub shows releases in the sidebar, feeds them to the Explore page)
|
|
- A stable reference point for users (`git checkout v2.1.0`)
|
|
- A "Full Changelog" diff link
|
|
- RSS feed for watchers
|
|
- New contributor callouts (community goodwill)
|
|
|
|
Currently users have no way to reference a specific version of the skill. The README says "v2.1" but there's nothing in git to anchor that.
|
|
|
|
## Proposed Solution
|
|
|
|
Create the first GitHub Release (v2.1.0) on the **public** repo using existing marketing copy. Use an annotated tag (not lightweight) for proper `git describe` support and fork propagation.
|
|
|
|
## Implementation Steps
|
|
|
|
### Phase 1: Tag and Release
|
|
|
|
#### 1. Create CHANGELOG.md
|
|
|
|
Create `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. Source material already exists:
|
|
|
|
- `README.md` "What's New in V2.1" and "What's New in V2" sections
|
|
- `docs/v2.1-tweets.md` (raw verified test results, feature descriptions)
|
|
- `docs/v2.1-launch-copy.md` (feature copy, social posts)
|
|
- `docs/pr-credits.md` (contributor credits)
|
|
- Git log (`git log --oneline` for commit references)
|
|
|
|
Structure:
|
|
```markdown
|
|
# Changelog
|
|
|
|
## [2.1.0] - 2026-02-15
|
|
|
|
### Highlights
|
|
|
|
30 days of research. 30 seconds of work. Four sources. Zero stale prompts.
|
|
|
|
Three headline features...
|
|
|
|
### Added
|
|
- Open-class skill with watchlists (SQLite-backed, FTS5)
|
|
- YouTube as 4th research source via yt-dlp (search + transcript extraction)
|
|
- OpenAI Codex CLI compatibility ($last30days invocation)
|
|
- Bundled X search (vendored Bird GraphQL client, no external CLI)
|
|
- Native web search backends (Parallel AI, Brave, OpenRouter/Perplexity Sonar)
|
|
- Briefing and history modes (open variant)
|
|
- --diagnose flag for source status checking
|
|
- --store flag for SQLite accumulation
|
|
|
|
### Changed
|
|
- Smarter query construction (strips noise words, auto-retry)
|
|
- Two-phase search (Phase 2 entity-aware drill-down)
|
|
- Reddit JSON enrichment (real upvotes/comments from reddit.com/.json)
|
|
- Engagement-weighted scoring (relevance 45%, recency 25%, engagement 30%)
|
|
- Model auto-selection with 7-day cache
|
|
|
|
### Fixed
|
|
- YouTube timeout increased to 90s
|
|
- Reddit 429 rate limit fail-fast
|
|
- YouTube soft date filter (keeps evergreen content)
|
|
- Eager import crash in __init__.py (Codex compatibility)
|
|
|
|
### New Contributors
|
|
- @JosephOIbrahim - Windows Unicode fix
|
|
- @levineam - Model fallback for unverified orgs
|
|
- @jonthebeef - --days=N configurable lookback flag
|
|
|
|
### Credits
|
|
- @steipete - Bird CLI (vendored X search) and yt-dlp inspiration
|
|
- @galligan - Marketplace plugin inspiration
|
|
- @hutchins - Pushed for YouTube feature
|
|
|
|
## [1.0.0] - 2026-01-15
|
|
|
|
Initial public release. Reddit + X search via OpenAI and xAI APIs.
|
|
```
|
|
|
|
#### 2. Create annotated tag on the public repo
|
|
|
|
```bash
|
|
cd /Users/mvanhorn/last30days-skill-private
|
|
|
|
# Tag on the current HEAD (which matches upstream/main)
|
|
git tag -a v2.1.0 -m "Release v2.1.0: Watchlists, YouTube transcripts, Codex CLI, bundled X search"
|
|
|
|
# Push to public repo
|
|
git push upstream v2.1.0
|
|
```
|
|
|
|
Use annotated tag (not lightweight) because:
|
|
- Stores tagger metadata and date
|
|
- Works with `git describe`
|
|
- Propagates to forks (317 forks)
|
|
- Supports GPG signing if desired later
|
|
|
|
#### 3. Craft release notes
|
|
|
|
Assemble from existing copy. The release body should follow this structure:
|
|
|
|
```markdown
|
|
## Highlights
|
|
|
|
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.
|
|
|
|
**Three headline features in v2.1:**
|
|
|
|
1. **Open-class skill with watchlists** - Track competitors, people, topics on a schedule.
|
|
Pair with Open Claw for automated briefings. SQLite-backed with FTS5 search.
|
|
|
|
2. **YouTube transcripts as a 4th source** - When yt-dlp is installed, searches YouTube,
|
|
grabs view counts, and reads the actual transcripts. A 20-minute review has 10x the
|
|
signal of one X post.
|
|
|
|
3. **Codex CLI compatibility** - Same skill, same engine, same four sources.
|
|
Install to `~/.agents/skills/last30days` and invoke with `$last30days`.
|
|
|
|
Plus: **Bundled X search** - Vendored Bird GraphQL client. No external CLI needed.
|
|
Just Node.js 22+ and browser cookies.
|
|
|
|
## Real Results (verified 2/15)
|
|
|
|
| Topic | Reddit | X | YouTube | Web |
|
|
|-------|--------|---|---------|-----|
|
|
| Nano Banana Pro | - | 32 posts, 164 likes | 5 videos, 98K views | - |
|
|
| Seedance 2.0 | 21 threads | 33 posts | 20 videos | 5 pages |
|
|
| OpenClaw use cases | 35 threads, 1,130 upvotes | 23 posts | 20 videos, 1.57M views | - |
|
|
| YouTube thumbnails | 7 threads, 654 upvotes | 32 posts | 18 videos, 6.15M views | - |
|
|
|
|
## 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)
|
|
- Native web search (Parallel AI, Brave, OpenRouter)
|
|
- `--diagnose` and `--store` flags
|
|
- 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
|
|
- Engagement-weighted scoring algorithm
|
|
|
|
### Fixed
|
|
- YouTube/Reddit timeout resilience
|
|
- Reddit 429 rate limit fail-fast
|
|
- Eager import crash in Codex environments
|
|
|
|
## New Contributors
|
|
|
|
- @JosephOIbrahim - Windows Unicode fix
|
|
- @levineam - Model fallback for unverified orgs
|
|
- @jonthebeef - `--days=N` configurable lookback
|
|
|
|
## Credits
|
|
|
|
- @steipete - Bird CLI and yt-dlp/summarize inspiration
|
|
- @galligan - Marketplace plugin inspiration
|
|
- @hutchins - Pushed for YouTube feature
|
|
|
|
## Install
|
|
|
|
```bash
|
|
# Claude Code
|
|
claude install-skill https://github.com/mvanhorn/last30days-skill
|
|
|
|
# Manual
|
|
git clone https://github.com/mvanhorn/last30days-skill ~/.claude/skills/last30days
|
|
```
|
|
|
|
**Full Changelog**: https://github.com/mvanhorn/last30days-skill/commits/v2.1.0
|
|
```
|
|
|
|
#### 4. Create the GitHub Release
|
|
|
|
```bash
|
|
gh release create v2.1.0 \
|
|
--repo mvanhorn/last30days-skill \
|
|
--verify-tag \
|
|
--title "v2.1.0 - Watchlists, YouTube Transcripts, Codex CLI" \
|
|
-F release-notes.md
|
|
```
|
|
|
|
No binary assets needed - this is an interpreted skill, and GitHub auto-generates source archives.
|
|
|
|
### Phase 2: Future Automation (Optional)
|
|
|
|
#### 5. Add `.github/release.yml` for auto-generated notes on future releases
|
|
|
|
```yaml
|
|
changelog:
|
|
exclude:
|
|
labels:
|
|
- ignore-for-release
|
|
categories:
|
|
- title: "Breaking Changes"
|
|
labels: [breaking-change]
|
|
- title: "Features"
|
|
labels: [enhancement, feature]
|
|
- title: "Bug Fixes"
|
|
labels: [bug, fix]
|
|
- title: "Documentation"
|
|
labels: [documentation]
|
|
- title: "Other Changes"
|
|
labels: ["*"]
|
|
```
|
|
|
|
This enables `gh release create v2.2.0 --generate-notes` for future releases with automatic PR categorization.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [x] `CHANGELOG.md` exists in repo root following Keep a Changelog format
|
|
- [x] Annotated tag `v2.1.0` exists on the public repo
|
|
- [x] GitHub Release `v2.1.0` is published at `github.com/mvanhorn/last30days-skill/releases`
|
|
- [x] Release notes include: highlights, real results table, feature list, contributor credits, install instructions
|
|
- [x] Release appears in the repo sidebar on GitHub
|
|
|
|
## Key Decisions
|
|
|
|
1. **v2.1.0 only** - Don't retroactively create v1.0.0 or v2.0.0 tags. The git history doesn't have clean boundary commits for those versions, and retroactive tags add complexity without value.
|
|
|
|
2. **Release on the public repo** (`upstream`), not the private repo. Users see `mvanhorn/last30days-skill`.
|
|
|
|
3. **CHANGELOG.md as source of truth** - The release notes are derived from CHANGELOG.md, not the other way around. Future releases update CHANGELOG.md first, then create the release.
|
|
|
|
4. **Update star count** - The existing copy says "1.5K stars" but the repo now has 2,747. Update in release notes.
|
|
|
|
## References
|
|
|
|
- Existing copy: `docs/v2.1-launch-copy.md`, `docs/v2.1-tweets.md`
|
|
- Contributors: `docs/pr-credits.md`
|
|
- README features: `README.md` "What's New" sections
|
|
- GitHub Releases docs: https://docs.github.com/en/repositories/releasing-projects-on-github
|
|
- Keep a Changelog: https://keepachangelog.com/en/1.1.0/
|