Back to Article List

How to install and use the /last30days research skill

How to install and use the /last30days research skill

/last30days is an open source agent skill (maintained by mvanhorn) that researches any topic across Reddit, X, YouTube, TikTok, Hacker News, Polymarket, GitHub and a dozen other platforms, keeps only content from the past 30 days and synthesizes it into one cited brief. It went to #1 on GitHub trending and sits at around 50.000 stars as of eary july 2026. In this guide you'll install it on your machine or a VPS, wire up the optional API keys and set up a cron-driven watchlist so the research runs itself.

The pitch is simple.... Google ranks what editors and SEO teams publish. This skill ranks what people upvote and put money on. A Reddit thread with 1,500 upvotes, a founder's X post from Tuesday, a YouTube transcript with the five quotable sentences pulled out, Polymarket odds on a launch date. Type /last30days Peter Steinberger before a meeting and you get what he shipped this month, not his LinkedIn from 2023.

What the skill searches and what it costs

The engine is MIT licensed, tracks nothing and stores all research locally. Four sources work with zero configuration: Reddit (threads plus top comments via public JSON), Hacker News, Polymarket and GitHub (if the gh CLI is installed). YouTube transcripts join in the moment yt-dlp is on your PATH, also free.

Everything else follows a bring-your-own-keys model. X works through your own browsercookies at no cost or through an xAI key. TikTok, Instagram Reels, Threads, Pinterest and YouTube comments all run on a single ScrapeCreators key with 10,000 free calls before pay-as-you-go kicks in. Bluesky wants an app password. Perplexity Deep Research is the one genuinely paid option at roughly $0.90 per query through OpenRouter, and it's opt-in for exactly that reason.

Community contributors keep adding sources (Truth Social and Xiaohongshu are already in the engine), so check the README for the current table.

Prerequisites

The commands below assume Ubuntu 24.04, which ships Python 3.12, the minimum the engine wants. If you're starting from a blank server, run through our Ubuntu VPS setup guide first, then come back.

sudo apt update
sudo apt install -y git nodejs npm gh pipx
pipx install yt-dlp
pipx ensurepath

Node.js powers the vendored Bird client the skill uses for X search. Skip gh and yt-dlp if you want, the engine degrades gracefully, but GitHub data and YouTube transcripts are two of the best free sources so I wouldn't.

Step 1: Install the skill

There are six supported install paths. Pick the one matching where your agent lives, they don't conflict (with one Claude Code caveat noted below).

Claude Code

The recommended path, because the plugin marketplace handles updates for you:

/plugin marketplace add mvanhorn/last30days-skill
/plugin install last30days

Force an update check later with claude plugin update last30days@last30days-skill. One thing to know: Claude Code doesn't dedupe across install methods. If you install both the marketplace plugin and the npx skills copy, /last30days shows up twice. One method per machine.

Codex, Cursor, Copilot, Gemini CLI and other agent hosts

The open Agent Skills CLI covers 50+ harnesses:

npx skills add mvanhorn/last30days-skill -g

The -g flag installs globally to your user directory so the skill follows you across projects. Drop it and the install lands in ./.skills/ inside the current repo instead. Target a specific harness with -a:

npx skills add mvanhorn/last30days-skill -g -a codex
npx skills add mvanhorn/last30days-skill -g -a cursor

Update later with npx skills update last30days -g.

claude.ai in the browser

Download last30days.skill from the latest release, then upload it under Customize > Skills > + > Create skill > Upload a skill. Enable "Code execution and file creation" under Capabilities first, skills won't run without it. Updates mean re-downloading and re-uploading, which is the price of the browser convenience.

Claude Desktop

Grab the .mcpb bundle for your platform from the same releases page and drag it into Settings > Extensions. It registers as an MCP (Model Context Protocol) server, prompts for API keys (all optional) and stores them in your OS keychain. Needs Python 3.12+ on PATH. Windows support is still deferred, macOS and Linux work.

OpenClaw

If you run OpenClaw on a VPS already, this is one line:

clawhub install last30days-official

Update with clawhub update last30days-official. If skills on OpenClaw are new territory for you, our OpenClaw skills guide covers how installs, gating and invocation work in general.

Manual install on a server

For a headless box or when you want to hack on the engine:

git clone https://github.com/mvanhorn/last30days-skill.git
ln -s "$(pwd)/last30days-skill/skills/last30days" ~/.claude/skills/last30days

The symlink keeps the install synced with the working tree, so a git pull is your update mechanism. No re-copy step.

Step 2: First run and the setup wizard

Run it once with any topic:

/last30days OpenClaw

The first run triggers an onboarding wizard (restored and locked down in v3.8.1 after it had quietly eroded across releases). It asks before touching your browser cookies for X auth, offers the ScrapeCreators signup and lets you opt in to TikTok and Instagram. Decline everything and the free sources still work fine. On hosts without modal dialogs (OpenClaw, Codex, Cursor, Gemini CLI) the same flow happens in plain prose.

A normal run fans out to every configured source in parallel, resolves the entities behind your topic first (more on that below), scores results by engagement and merges duplicates. Comparison queries that used to take 12+ minutes in v2 now finish in about 3. When it's done, the raw results save to ~/Documents/Last30Days/<slug>-raw.md and your session becomes a temporary expert on the topic. Ask follow-ups, have it draft a prompt or an email, all grounded in this month's data.

Step 3: Add API keys for X, Bluesky and short-form video

Keys live in a .env file. Two locations, in priority order: .claude/last30days.env in the current project (wins when present) and ~/.config/last30days/.env as the global fallback. The project-scoped file is the clean pattern for per-client work, drop one into each client folder and the skill picks it up when you cd in.

mkdir -p ~/.config/last30days
nano ~/.config/last30days/.env

A working skeleton:

BRAVE_API_KEY=<your-brave-key>

FROM_BROWSER=firefox

SCRAPECREATORS_API_KEY=<your-key>
INCLUDE_SOURCES=tiktok,instagram

BSKY_HANDLE=<you>.bsky.social
BSKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx

Brave covers the web search backend with 2,000 free queries a month, FROM_BROWSER pulls your X session from Firefox with no key at all and the ScrapeCreators pair unlocks short-form video. Then lock the file down:

chmod 600 ~/.config/last30days/.env

The engine warns on every run if the permissions are looser than that, which is the right kind of nagging. Use a real Bluesky app password (the 19-character xxxx-xxxx-xxxx-xxxx format), never your account password: app passwords can be scoped away from DMs and revoked individually. On macOS there's a setup-keychain.sh script that moves keys into the system Keychain instead of a plaintext file. The same hygiene rules apply to any agent box; our guide on secrets management for OpenClaw goes deeper on where credentials should and shouldn't live on a shared server.

If a source you expected isn't showing up in results, don't guess:

python3 scripts/last30days.py --diagnose

That prints a per-source availability report (which keys and CLIs were detected and which backends are reachable) without burning a full search.

Step 4: My recommended research commands

The plain form covers most days. The flags are where it gets interesting in my opinion:

/last30days Cursor vs Windsurf

Comparison mode runs entity-aware subqueries for both sides in a single pass and returns per-entity sections and a head-to-head table, then closes with a verdict grounded in what developers using both actually said this month.

/last30days OpenAI --competitors

Auto-discovers the top two peers via web search, then fans out three full pipelines in parallel and merges them into a three-way comparison.

/last30days Peter Steinberger --github-user=steipete

Person mode. Instead of keyword-matching a name in issue bodies, the engine asks what this person is shipping: PRs merged, merge rate, release notes, star growth on their repos, woven into the narrative next to their X posts.

/last30days Anthropic earnings --emit=html

Saves a self-contained dark-mode HTML brief (inline CSS, no JavaScript, works offline) to your memory directory, ready to drop into Slack or Notion. Plain-language requests like "give me a shareable HTML brief" trigger the same thing.

Two more without flags: say "eli5 on" after any run and the synthesis rewrites itself in plain language with the same citations, and every brief ends with a Best Takes section because a second judge scores results for humor and virality alongside relevance. Reddit's cleverest one-liners deserved better than being buried, and the maintainer clearly agreed.

Under all of this sits the v3 pre-research step, the part I'd call the actual product. Before a single API call fires, the engine resolves your topic into the people and places that matter: the founder's X handle, the right subreddits, the GitHub repo, the TikTok hashtags. Typing "OpenClaw" resolves the GitHub repo, r/openclaw, the creator's handles and the matching hashtags first, then searches those directly. Keyword search finds mentions. This finds the conversation.

Step 5: Run last30days on a VPS

A server is the natural home for the always-on patterns in the next step, and there's exactly one platform-specific gotcha to handle first.

YouTube treats datacenter IP ranges with suspicion, so yt-dlp can hit a bot wall on a VPS even with everything configured correctly. The engine ships a fix: set LAST30DAYS_YOUTUBE_SSH_HOST=<ssh-alias> in your .env and transcript fetches route over SSH through a residential-IP machine (a home box, a Raspberry Pi behind your router) while everything else keeps running on the server. The host value is validated against a strict pattern to block SSH option injection, a nice touch for a feature most projects would ship naively.

Second thing to know for headless use: when you invoke /last30days inside Claude Code, Codex or Gemini, the host model does the planning and synthesis, no extra key needed. A cron job has no host model, so give the engine a reasoning provider in .env. Priority order is Gemini (GOOGLE_API_KEY), then OpenAI, xAI and OpenRouter, with a deterministic local fallback that works but ranks lowest on quality. One key is enough.

Resource-wise this is a light Python process that spends its life waiting on network I/O, so a small instance handles it comfortably. Any LumaDock VPS deploys in seconds on NVMe storage with full root access, which is all the skill needs, and an entry plan leaves room to run OpenClaw next to it.

Step 6: Automate a watchlist with cron and SQLite

The default behavior is a fresh snapshot per run, same topic overwrites same file. For monitoring over time, three pieces most users miss turn it into a standing research desk.

First, --store persists every finding into a SQLite database at ~/.local/share/last30days/research.db, deduped on source URL so reruns update rows instead of duplicating them. Set LAST30DAYS_STORE=1 in .env and you'll never forget the flag.

Second, the watchlist. Add topics and configure delivery:

cd last30days-skill/skills/last30days
python3 scripts/watchlist.py add "hetzner price increase" --weekly
python3 scripts/watchlist.py add "openclaw"
python3 scripts/watchlist.py config delivery "https://hooks.slack.com/services/XXX/YYY/ZZZ"
python3 scripts/watchlist.py config budget 5.00

The Slack webhook only fires when new findings appear, and the budget caps daily spend across paid sources. The schedule stored on each topic is metadata; the actual trigger is yours to own, which brings in cron:

crontab -e
0 8 * * * cd /home/USERNAME/last30days-skill/skills/last30days && python3 scripts/watchlist.py run-all >> /var/log/last30days.log 2>&1

Watchlist runs hardcode --quick with a 90-day lookback, so a morning batch across several topics stays cheap. If cron on an agent server is a new pattern for you, the same scheduling logic appears in our OpenClaw cron scheduler guide.

Third, digests. python3 scripts/briefing.py generate --weekly reads the SQLite store and emits a structured weekly summary to ~/.local/share/last30days/briefs/. Baseline a topic once with --store, add it to the watchlist, let cron run it and read one digest on Monday. That's competitor monitoring or brand listening for the cost of a small VPS and a few API calls.

Troubleshooting common errors

A source silently returns nothing. Run --diagnose before touching anything else. Nine times out of ten it's a missing key, a CLI that isn't on PATH, loose permissions on .env or a stale symlink.

YouTube transcripts fail on the server but work on your laptop. That's the datacenter bot wall from step 5. Set LAST30DAYS_YOUTUBE_SSH_HOST, or add a ScrapeCreators key, which the engine uses as a transcript fallback only when yt-dlp fails (no credits spent on success).

Public Reddit results feel shallow. The free public backend skips nested comment trees on some threads. With a ScrapeCreators key set, LAST30DAYS_REDDIT_BACKEND=scrapecreators makes it the primary Reddit backend with the public path as fallback.

Two /last30days entries in Claude Code. You installed via both the marketplace and npx skills. Remove one: npx skills remove last30days -g or uninstall the plugin.

Thin results compared to someone else's setup. Usually the web search backend. Hosts fall back to their native web search, but a configured Brave or Exa key makes a visible quality difference in entity resolution.

My answers to common questions

Do I have to pay anything to use it?

Nope. Reddit with comments, Hacker News, Polymarket, GitHub and YouTube transcripts cost nothing, and X works through your own browser cookies. Paid keys only extend coverage into short-form video and grounded web synthesis.

Your idea deserves better hosting

24/7 support 30-day money-back guarantee Cancel anytime
Ciclo de Pagamento

VPS.S1

27.49 RON Save  17 %
22.90 RON por mês
  • 2 vCPU AMD EPYC
  • 2 GB RAMMEMÓRIA
  • 30 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos

VPS.S3

68.80 RON Save  33 %
45.85 RON por mês
  • 4 vCPU AMD EPYC
  • 6 GB RAMMEMÓRIA
  • 70 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O

EPYC VPS.P1

41.26 RON Save  22 %
32.08 RON por mês
  • 2 vCPU AMD EPYC
  • 4 GB RAMMEMÓRIA
  • 40 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

EPYC VPS.P2

77.98 RON Save  24 %
59.62 RON por mês
  • 2 vCPU AMD EPYC
  • 8 GB RAMMEMÓRIA
  • 80 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

EPYC VPS.P4

137.65 RON Save  23 %
105.52 RON por mês
  • 4 vCPU AMD EPYC
  • 16 GB RAMMEMÓRIA
  • 160 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

EPYC VPS.P5

183.55 RON Save  25 %
137.65 RON por mês
  • 8 vCPU AMD EPYC
  • 16 GB RAMMEMÓRIA
  • 180 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

EPYC VPS.P6

275.35 RON Save  25 %
206.50 RON por mês
  • 8 vCPU AMD EPYC
  • 32 GB RAMMEMÓRIA
  • 200 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

EPYC VPS.P7

321.25 RON Save  29 %
229.45 RON por mês
  • 16 vCPU AMD EPYC
  • 32 GB RAMMEMÓRIA
  • 240 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

Genoa VPS.G2

114.70 RON Save  20 %
91.75 RON por mês
  • 2 vCPUAMD EPYC Genoa 4ª geração 9xx4 com 3,25 GHz ou similar, na arquitetura Zen 4. AMD EPYC G4
  • 4 GB DDR5MEMÓRIA
  • 50 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

Genoa VPS.G4

206.50 RON Save  22 %
160.60 RON por mês
  • 4 vCPUProcessador AMD EPYC com núcleos vCPU dedicados, em hardware de servidor empresarial. AMD EPYC G4
  • 8 GB DDR5MEMÓRIA
  • 100 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

Genoa VPS.G6

413.05 RON Save  22 %
321.25 RON por mês
  • 8 vCPUProcessador AMD EPYC com núcleos vCPU dedicados, em hardware de servidor empresarial. AMD EPYC G4
  • 16 GB DDR5MEMÓRIA
  • 200 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

Genoa VPS.G7

734.35 RON Save  22 %
573.70 RON por mês
  • 8 vCPUProcessador AMD EPYC com núcleos vCPU dedicados, em hardware de servidor empresarial. AMD EPYC G4
  • 32 GB DDR5MEMÓRIA
  • 250 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6O suporte a IPv6 está indisponível no momento na França, Finlândia ou Países Baixos. incluídos
  • Backup automático grátisInclui um espaço de backup que você pode configurar para diário, semanal ou mensal.

AMD Ryzen VPS.R1

77.98 RON Save  18 %
64.21 RON por mês
  • 1 CPU dedicada AMD Ryzen 9 7950X com 4,5 GHz ou similar, na arquitetura Zen 4. vCPU
  • 4 GB DDR5MEMÓRIA
  • 50 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6 incluídos O suporte a IPv6 está indisponível no momento na França, Finlândia ou nos Países Baixos.
  • Backup automático incluso

AMD Ryzen VPS.R2

137.65 RON Save  17 %
114.70 RON por mês
  • 2 CPUs dedicadas AMD Ryzen 9 7950X com 4,5 GHz ou similar, na arquitetura Zen 4. vCPU
  • 8 GB DDR5MEMÓRIA
  • 100 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6 incluídos O suporte a IPv6 está indisponível no momento na França, Finlândia ou nos Países Baixos.
  • Backup automático incluso

AMD Ryzen VPS.R4

504.85 RON Save  18 %
413.05 RON por mês
  • 8 CPUs dedicadas AMD Ryzen 9 7950X com 4,5 GHz ou similar, na arquitetura Zen 4. vCPU
  • 32 GB DDR5MEMÓRIA
  • 400 GB NVMeDISCO
  • Banda ilimitada
  • IPv4 & IPv6 incluídos O suporte a IPv6 está indisponível no momento na França, Finlândia ou nos Países Baixos.
  • Backup automático incluso

Your agent runs wild. Your bill doesn't.

Easily deploy Hermes in one click on Ubuntu 24.04 with AMD EPYC, NVMe storage and unmetered bandwidth. The price stays the same whatever the agent does, no setup fees, no overage charges and no tier traps.

GPU products are in high demand at the moment. Fill the form to get notified as soon as your preferred GPU server is back in stock.