/plugin marketplace add 한 줄로 설치하면 바로 쓸 수 있다. (저장소: mvanhorn/last30days-skill · ⭐5.8k · MIT)last30days는 Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, Bluesky 등 10개 이상의 플랫폼에서 최근 30일간의 논의를 병렬 수집·합성하여, 인용 기반의 리서치 보고서를 자동 생성하는 AI 에이전트 스킬이다. Claude Code 플러그인 마켓플레이스를 통해 한 줄로 설치하고 /last30days [주제] 명령 한 번으로 수동으로 수 시간이 걸릴 리서치 작업을 2~8분에 완료한다.
보통 리서치는 플랫폼마다 직접 검색창을 두드려야 합니다. last30days는 10명의 전담 기자(플랫폼 모듈)를 동시에 현장에 보내고, 각자가 가져온 원문을 교차 검증·점수화해 "관련성 45% + 최신성 25% + 참여도 30%" 공식으로 최종 브리핑을 만들어 줍니다.
핵심은 포어그라운드 실행입니다. 기자를 보내놓고 다른 일을 하면(백그라운드) 브리핑을 못 받을 수 있거든요 — 실제로 v2.9.3 이전 버전에서 백그라운드 실행 시 모델이 결과를 기다리지 않고 환각을 생성하는 버그가 있었으며, v2.9.3에서 포어그라운드 실행으로 전환하여 수정됐습니다.
Reddit만 보면 기술 커뮤니티 편향, X만 보면 단편적 의견, YouTube만 보면 길고 찾기 힘든 정보. 10개 플랫폼을 손으로 돌아다니려면 최소 2~3시간 + 중복·저품질 콘텐츠 정제까지 해야 한다.
10개+ 플랫폼을 2~8분 내 동시 스캔하고, 양방향 텍스트 유사도·참여 속도·교차 플랫폼 수렴 세 가지 신호를 조합해 최고 품질 콘텐츠만 추린다. API 키가 없어도 HN + Polymarket 무료 소스로 즉시 동작한다.
| 비교 대상 | last30days 차별점 |
|---|---|
| Perplexity | 웹 검색 기반 vs 소셜 플랫폼 커뮤니티 의견 직접 수집 |
| Tavily / Exa | 검색 API 단일 소스 vs 10개+ 플랫폼 교차 검증 |
| 수동 리서치 | 시간 투자 vs 병렬 자동화 + 관련성 점수 기반 필터링 |
| ChatGPT Browse | 범용 웹 탐색 vs 소셜·예측시장 특화 깊은 수집 |
트렌딩의 배경에는 Claude Code / Gemini CLI의 스킬 생태계 활성화가 있다. "설치만 하면 쓸 수 있는 리서치 에이전트" 수요가 폭발하면서, SKILL.md + CLAUDE.md + 테스트 455개의 체계적 구조가 "스킬을 어떻게 만들어야 하는가"의 참고 모델로 주목받고 있다.
| 기술 | 용도 | 상세 |
|---|---|---|
| Python 3 | 메인 리서치 엔진 | skills/last30days/scripts/last30days.py — 진입점 |
| asyncio / 병렬처리 | 10개+ 소스 동시 검색 | 소스별 독립 모듈로 병렬 실행 |
| SQLite | 워치리스트 + 풀텍스트 검색 | 오픈 변형(Watchlist)에서 사용 |
| dataclasses | 표준화된 데이터 모델 | 소스 간 통일된 결과 스키마 |
| 플랫폼 | 모듈 | API / 방식 |
|---|---|---|
| reddit.py, reddit_enrich.py | ScrapeCreators API / OpenAI 폴백 | |
| X (Twitter) | bird_x.py, xai_x.py | 벤더링된 GraphQL / xAI API |
| YouTube | youtube_yt.py | 트랜스크립트 추출 + 분석 |
| TikTok | tiktok.py | ScrapeCreators API |
| instagram.py | ScrapeCreators API (Reels 포함) | |
| Bluesky | bluesky.py | AT Protocol 네이티브 |
| Hacker News | hackernews.py | 공개 API (무료) |
| Polymarket | polymarket.py | 공개 API (무료) |
| 샤오홍슈 | xiaohongshu_api.py | API 통합 |
| 서비스 | 모듈 | 특징 |
|---|---|---|
| Perplexity Sonar Pro | perplexity.py | OpenRouter 경유 Perplexity Sonar Pro / Deep Research |
| OpenRouter 클라이언트 | providers.py | OpenRouter 통합 클라이언트 (다중 모델 지원) |
| 요소 | 설명 |
|---|---|
| Claude Code Plugin | .claude-plugin/ 디렉토리 — 마켓플레이스 배포 |
| Gemini CLI Extension | gemini-extension.json — Gemini CLI 통합 |
| 환경변수 관리 | ~/.config/last30days/.env (글로벌) |
| 캐시 | 24시간 TTL 캐시 (env.py 내 통합) |
SearchResult 인터페이스를 구현. 새 플랫폼 추가 시 파일 하나만 추가하면 된다.# 각 플랫폼 모듈의 공통 패턴
@dataclass
class SearchResult:
text: str
author: str
platform: str
engagement: int
timestamp: datetime
url: str
# reddit.py, bird_x.py, youtube_yt.py 등이 모두 SearchResult 반환
async def search(query: str, days: int = 30) -> list[SearchResult]:
...
--save-dir 플래그를 추가해 저장 로직을 Python 내부로 내재화.배울 것: 10개+ 이기종 API를 통일된 데이터 모델로 정규화하는 방법, dataclasses를 활용한 스키마 표준화, API 키 유무에 따른 그레이스풀 디그레이드 설계.
배울 것: 양방향 텍스트 유사도, 참여 속도 정규화, 교차 플랫폼 수렴 감지. 단순 키워드 매칭을 넘어 실제 신호 품질을 측정하는 기법을 코드로 익힐 수 있다.
배울 것: SKILL.md 5단계 워크플로우 작성법, CLAUDE.md 개발 컨텍스트 작성법, .claude-plugin/ 구조, Claude Code + ClawHub + Gemini CLI 멀티 에이전트 동시 지원.
에이전트 스킬 개발의 중요한 교훈: LLM은 비동기 결과를 잘 다루지 못한다. 외부 스크립트를 호출할 때는 반드시 포어그라운드로 실행하고 출력을 직접 읽어야 한다.
fixtures/ 디렉토리의 목 데이터 패턴을 통해 외부 API 의존 코드를 안정적으로 테스트하는 방법을 배울 수 있다. --diagnose 플래그로 소스 가용성 검증하는 패턴도 실용적이다.
| 요구사항 | 최소 | 권장 |
|---|---|---|
| Python | 3.12+ | 3.13+ |
| Node.js | 22+ | 22+ (bird-search 필수) |
| OS | macOS / Linux | macOS / Linux |
| 디스크 | 50MB+ | 캐시 포함 200MB+ |
| 메모리 | 512MB | 1GB+ (병렬 실행 시) |
| 레벨 | 필요 키 | 활성 소스 |
|---|---|---|
| 무료 | 없음 | HN + Polymarket |
| 기본 | ScrapeCreators | + Reddit, TikTok, Instagram |
| 중급 | + X 쿠키 or xAI | + X / Twitter |
| 풀셋 | + OpenAI + Brave + Bluesky 등 | 10개+ 전체 |
HN + Reddit에서 동일 주제를 검색하여 결합하는 미니 스크립트를 작성한다.
score.py의 3가지 가중치 시스템(관련성 45% + 최신성 25% + 참여도 30%)을 직접 구현한다.
last30days의 SKILL.md 구조를 참고하여 나만의 스킬(예: arXiv 논문 스캐너)을 만든다.
여러 플랫폼에서 동일 토픽이 동시에 언급되는 "수렴 신호"를 감지하는 모듈을 구현한다.
skills/last30days/scripts/watchlist.py 패턴을 참고하여 cron + SQLite 기반 자동 리서치 시스템을 구축한다.
| 일차 | 주제 | 실습 |
|---|---|---|
| 1~2일 | asyncio 기본 — coroutine, await, gather | 3개 URL 동시 페치 |
| 3~4일 | dataclasses + 타입 힌트 | SearchResult 모델 설계 |
| 5~7일 | HTTP 클라이언트 (httpx 비동기) | HN API 래퍼 만들기 |
| 일차 | 주제 | 실습 |
|---|---|---|
| 1~2일 | Reddit API (PRAW 또는 JSON 엔드포인트) | 서브레딧 검색 + 참여도 수집 |
| 3~4일 | YouTube Data API + 트랜스크립트 추출 | 특정 토픽 영상 검색 |
| 5~7일 | AT Protocol (Bluesky) 기초 | Bluesky 포스트 검색 구현 |
| 일차 | 주제 | 실습 |
|---|---|---|
| 1~2일 | TF-IDF 유사도 | scikit-learn으로 텍스트 유사도 산출 |
| 3~4일 | 문장 임베딩 (sentence-transformers) | 의미적 유사도 비교 |
| 5~7일 | 종합 점수 시스템 | 관련성+최신성+참여도 가중 합산 |
| 일차 | 주제 | 실습 |
|---|---|---|
| 1~2일 | SKILL.md 작성법 (last30days 참고) | 나만의 스킬 워크플로우 설계 |
| 3~4일 | Claude Code 플러그인 구조 | .claude-plugin/ 메타데이터 작성 |
| 5~7일 | 테스트 작성 + 배포 | fixtures 기반 테스트 + 로컬 설치 테스트 |
| 일차 | 주제 | 실습 |
|---|---|---|
| 1~2일 | SQLite 풀텍스트 검색 (FTS5) | 워치리스트 DB 설계 |
| 3~4일 | 캐시 전략 (TTL, LRU) | 24시간 캐시 레이어 구현 |
| 5~7일 | 교차 플랫폼 수렴 감지 | 엔티티 추출 + 수렴 점수 구현 |
| 키워드 | 설명 |
|---|---|
| SKILL.md | Claude Code 스킬의 워크플로우와 동작 방식을 정의하는 파일. 에이전트가 이 파일을 읽고 실행 방법을 이해한다 |
| 그레이스풀 디그레이드 | API 키가 부족해도 가용한 소스만으로 동작하는 설계 패턴. 전체 실패 대신 기능 축소 |
| 양방향 텍스트 유사도 | 쿼리→문서와 문서→쿼리 양쪽 방향으로 유사도를 측정하여 더 정확한 관련성 판단 |
| 참여 속도 정규화 | 절대 참여 수가 아닌 "시간당 참여 속도"로 정규화. 1시간에 100좋아요 > 1주일에 100좋아요 |
| 교차 플랫폼 수렴 | 동일 토픽이 Reddit, X, YouTube 등 여러 플랫폼에서 동시에 언급되는 현상. 신뢰도 지표 |
| 포어그라운드 실행 | 에이전트 스킬에서 외부 스크립트를 실행할 때 결과를 직접 기다리는 방식. 백그라운드 실행 시 모델 환각 위험 |
| ScrapeCreators | Reddit, TikTok, Instagram 등을 단일 API 키로 접근할 수 있는 범용 스크레이핑 서비스 |
| AT Protocol | Bluesky가 사용하는 분산형 소셜 네트워크 프로토콜. 오픈 표준으로 설계 |
| bird-search | X/Twitter의 GraphQL 엔드포인트를 활용하는 벤더링된 검색 클라이언트 |
| 벤더링 (Vendoring) | 외부 라이브러리를 프로젝트 내부에 직접 포함시키는 전략. 외부 의존성 관리 불필요 |
| Polymarket | 예측 시장 플랫폼. 이벤트 발생 확률을 시장 가격으로 표현. "미래 전망" 데이터로 활용 |
| TTL 캐시 | Time-To-Live 캐시. 설정 시간(24시간) 이내 동일 요청 시 캐시된 결과 반환 |
| Claude Code Plugin | Claude Code 에이전트에 기능을 추가하는 확장 패키지. 마켓플레이스를 통해 설치 가능 |
| ClawHub | Claude Code 플러그인/스킬의 패키지 매니저. npm과 유사한 역할 |
| 쿼리 확장 | 사용자 쿼리를 LLM이 재해석하여 더 효과적인 검색 쿼리로 변환하는 기법 |