--- name: last30days-openclaw description: OpenClaw adaptation of @mvanhorn's last30days skill. Research any topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and web (Tavily). Includes watchlists, briefing generation, and historical query mode. license: MIT metadata: upstream_author: "@mvanhorn" upstream_repo: "https://github.com/mvanhorn/last30days-skill" adaptation: "OpenClaw adaptation by Tommy" modified: "2026-03-30 - Added Tavily as default web search backend" --- # last30days-openclaw > **Attribution:** This skill is an OpenClaw adaptation of **@mvanhorn's** MIT-licensed project: . ## What is original vs adapted ### Original (from @mvanhorn) - Core Python research engine (`scripts/last30days.py` + `scripts/lib/*`) - Multi-source data collection and ranking logic - Watchlist, briefing, and history database architecture - Vendored `bird-search` X client and source connectors ### OpenClaw adaptation (this folder) - OpenClaw skill packaging (`skill.json`, this `SKILL.md`) - OpenClaw-first storage paths under `~/.openclaw/workspace` - OpenClaw secrets file convention: `~/.openclaw/workspace/.secrets/last30days.env` - OpenClaw cron helper: `scripts/openclaw_watchlist_run.sh` - Setup helper for secrets: `scripts/setup_openclaw_env.sh` - **Tavily integration** as default web search backend (high quality, AI-enhanced results) ## Runtime paths (OpenClaw defaults) - Secrets: `~/.openclaw/workspace/.secrets/last30days.env` - DB: `~/.openclaw/workspace/data/last30days/research.db` - Briefings: `~/.openclaw/workspace/data/last30days/briefs/` - Output artifacts: `~/.openclaw/workspace/data/last30days/out/` ## Required API Keys | Key | Purpose | Priority | |-----|---------|----------| | **TAVILY_API_KEY** | Web search (default) | Highest | | SCRAPECREATORS_API_KEY | Reddit + TikTok + Instagram | Required for social | Optional: - `BRAVE_API_KEY`, `PARALLEL_API_KEY`, `OPENROUTER_API_KEY` - Alternative web backends - `XAI_API_KEY` - X/Twitter search via xAI API ## Setup ```bash cd ~/.openclaw/workspace/skills/last30days-openclaw ./scripts/setup_openclaw_env.sh python3 scripts/last30days.py --diagnose ``` ## macOS X-cookie support (Bird) The vendored Bird client reads browser cookies on macOS. - Log into x.com in Safari/Chrome/Firefox - Verify auth: ```bash node scripts/lib/vendor/bird-search/bird-search.mjs --whoami ``` If that fails, set `AUTH_TOKEN` + `CT0` in the secrets file. ## Command routing Use first token to route mode: - `watch ...` → watchlist management - `briefing ...` → briefing generation - `history ...` → history/FTS queries - anything else → one-shot research ## One-shot research (default mode) Run via OpenClaw `exec`: ```bash cd ~/.openclaw/workspace/skills/last30days-openclaw python3 scripts/openclaw_run.py "TOPIC" # equivalent engine call: # python3 scripts/last30days.py "TOPIC" --emit=compact --no-native-web ``` - Use `--quick` or `--deep` for depth. - Use `--store` to persist findings. - Use `--search reddit,x,youtube,tiktok,instagram,hn,polymarket,web` for source subsets. ## Watchlist mode ```bash python3 scripts/watchlist.py add "TOPIC" python3 scripts/watchlist.py list python3 scripts/watchlist.py run-one "TOPIC" python3 scripts/watchlist.py run-all ``` ### OpenClaw cron integration Use this wrapper in a scheduled exec/cron job: ```bash ~/.openclaw/workspace/skills/last30days-openclaw/scripts/openclaw_watchlist_run.sh ``` This writes logs to: `~/.openclaw/workspace/logs/last30days-watchlist.log` ## Briefing mode ```bash python3 scripts/briefing.py generate python3 scripts/briefing.py generate --weekly python3 scripts/briefing.py show --date YYYY-MM-DD ``` ## History mode ```bash python3 scripts/store.py query "TOPIC" --since 7d python3 scripts/store.py search "QUERY" python3 scripts/store.py trending python3 scripts/store.py stats ``` ## Notes - If native web keys are absent, run with `--no-native-web` and use OpenClaw's `web_search` tool for web supplementation. - Preserve source weighting in synthesis: Reddit/X/YouTube/TikTok/Instagram/HN/Polymarket signals first, web second. - Never remove attribution to @mvanhorn when republishing this adaptation.