
vox-pop
from mushfique-dgist
Public opinion for LLMs โ HackerNews, Reddit, 4chan, Stack Exchange, Telegram. Zero API keys.
Your LLM knows what textbooks say.
This tells it what people actually think.
9 platforms โข Semantic routing โข LLM intelligence layer โข Works without API keys
Install โข Quick Start โข Platforms โข How Routing Works โข MCP Server โข Claude Code Plugin โข Roadmap
Why?
|
Without vox-pop |
With vox-pop |
hackernews โ Then vs Now
Historical (1+ year ago):
"Rust vs. Go" โ hackernews | +481 points | 580 replies | 2017-01-18
Recent (last 6 months):
"Rust vs. Go: Memory Management" โ hackernews | +2 points | 2025-11-15
reddit โ Then vs Now
Historical:
"Experienced developer but total beginner in Rust..." โ reddit | +124 points | 34 replies | 2025-03-14
Recent:
"I rebuilt the same API in Java, Go, Kotlin, and Rust โ here are the numbers" โ reddit | +174 points | 59 replies | 2026-03-19
The shift tells a story: **2017 was a flame war. 2026 is domain-specific pragmatism.**
---
**Standard search** โ flat results from all platforms:
```bash
vox-pop search "should I learn Rust or Go" --limit 3### hackernews (45 found)
> "I am a full stack TypeScript dev looking to broaden my skill set..."
โ hackernews | +78 points | 42 replies | by throwaway_dev
Source: https://news.ycombinator.com/item?id=41907717
### 4chan /g/ (12 found)
> "Rust is a mass psychosis. Go is boring but you'll actually ship..."
โ 4chan /g/ | 129 replies | by Anonymous
### reddit (8 found)
> "After 2 years with both: Rust for systems, Go for services..."
โ reddit | +234 points | 87 replies | by senior_dev_42Python โ embed in your own tools:
import asyncio
from vox_pop.core import search_multiple, format_context, get_default_providers
async def main():
results = await search_multiple(
"best laptop for programming",
providers=get_default_providers(),
)
print(format_context(results))
asyncio.run(main())Platforms
Every platform works out of the box. No tokens, no OAuth, no rate limit headaches.
| Platform | Source | Time Filter | Threads | |
|---|---|---|---|---|
| HackerNews | Algolia Search API | Yes | Yes | |
| Pullpush + Arctic Shift + Redlib fallback | Yes | โ | ||
| 4chan | Official JSON API (since 2012) | โ | Yes | |
| Stack Exchange | Official API โ 180+ communities | Yes | Yes | |
| Telegram | Public channel web preview (t.me/s/) | โ | โ | |
| Lobsters | lobste.rs JSON API + search scraping | Yes | โ | |
| Lemmy | Public REST API โ federated instances | Yes | Yes | |
| LessWrong | GraphQL API | Yes | Yes | |
| XenForo Forums | HTML scraping (Head-Fi, AnandTech, etc.) | โ | โ |
How Routing Works
Queries can be anything โ a single word, a paragraph, an essay-length D&D rules question. vox-pop understands them all through a four-tier routing system:
User query: "i was looking into a solid laptop for linux
something from hp, what would a savvy person pick"
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Tier 1: MCP Hints โ
โ Calling LLM provides routing_hints directly โ
โ (skips all other tiers) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Tier 2: LLM Query Rewrite โ like Perplexity โ
โ Cheap LLM call rewrites query to search-optimized form โ
โ "hp laptop linux compatibility" + routes to communities โ
โ Supports: Anthropic, OpenAI, Ollama (local/free) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Tier 3: Semantic Embeddings โ free, no API key โ
โ FastEmbed (33MB model) understands meaning, not keywords โ
โ Dynamic catalog: 77 4chan boards + 180 SE sites + static โ
โ "contradictory spell behaviour" โ SE:rpg, r/DnD, /tg/ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Tier 4: Broad Defaults โ
โ Search popular destinations everywhere โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
Routes to: r/buildapc, r/linux, r/hardware โ /g/
SE:hardwarerecs, SE:askubuntu โ lemmy:linux@lemmy.mlTier 2 works like Perplexity/ChatGPT Search โ the LLM rewrites your conversational query into a clean search string and picks the right communities. Set any of these env vars to enable:
ANTHROPIC_API_KEY=... # Uses Claude Haiku (~$0.0003/query)
OPENAI_API_KEY=... # Uses GPT-4o Mini
OLLAMA_HOST=... # Uses local Ollama (free)Tier 3 runs entirely locally with zero API keys. A 33MB embedding model understands that "contradictory spell behaviour on a creature" means tabletop RPG rules โ zero shared keywords needed. On first run, it fetches all 4chan boards and Stack Exchange sites dynamically, embeds everything, and caches to disk.
| Cold start | Warm start | Singleton | |
|---|---|---|---|
| Tier 3 timing | ~7s | ~1.3s | instant |
No configuration needed. If an LLM key is set, Tier 2 is used. Otherwise Tier 3 handles it. If fastembed isn't installed, Tier 4 (broad search) still works.
Routing examples
| Query | Routes to |
|---|---|
| "best hp laptop for linux" | r/buildapc, r/linux, r/hardware, /g/, SE:hardwarerecs, SE:askubuntu |
| "contradictory spell effects on a creature" | r/dndnext, r/DnD, /tg/, SE:rpg |
| "best mechanical keyboard for programming" | r/MechanicalKeyboards, /g/, SE:hardwarerecs |
| "what are the risks of yield farming" | r/CryptoCurrency, SE:tezos, telegram:ethereum |
| "how to make authentic kimchi jjigae" | r/Cooking, /ck/ |
MCP Server
Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.
{
"mcpServers": {
"vox-pop": {
"command": "python",
"args": ["-m", "vox_pop.server"]
}
}
}Your LLM gets four tools:
| Tool | What it does |
|---|---|
search_opinions | Search all platforms for opinions on a topic |
search_opinions_perspective | Then vs Now โ historical + recent opinions side by side |
get_thread_opinions | Dive into a specific thread's comments |
list_available_platforms | Check what's available and healthy |
The routing_hints parameter lets the calling LLM specify exactly where to search:
routing_hints: "reddit:MechanicalKeyboards,4chan:g,stackexchange:hardwarerecs"When no hints are provided, the routing system handles it automatically.
Claude Code Plugin
claude plugin add /path/to/vox-popThe skill auto-triggers when your question would benefit from real opinions. Just ask naturally:
> "What do people think about living in Berlin?" โ activates
> "Should I use Next.js or Remix?" โ activates
> "Best gym routine for beginners?" โ activates
> "What's the capital of France?" โ does not activateManual search: /vox-search "your query"
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 3: Claude Code / MCP Client โ
โ Auto-triggering skill + /vox-search โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 2: MCP Server โ
โ search_opinions ยท perspectives ยท threads ยท list โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 1: Python Library โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Smart Router (4-tier) โ โ
โ โ MCP hints โ LLM rewrite โ FastEmbed โ broad โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 9 Providers with fallback chains โ โ
โ โ HN ยท Reddit ยท 4chan ยท SE ยท Telegram โ โ
โ โ Lobsters ยท Lemmy ยท LessWrong ยท XenForo Forums โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Dynamic Catalog โ โ
โ โ 77 4chan boards + 180 SE sites fetched from APIs โ โ
โ โ + 120 static destinations ยท cached to disk โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโEach provider implements automatic fallback โ if one source is down, the next is tried. Reddit alone has three fallback sources (Pullpush โ Arctic Shift โ Redlib).
Roadmap
| Version | Status | What |
|---|---|---|
| v0.1 | Shipped | 5 providers (HN, Reddit, 4chan, SE, Telegram), MCP server, Claude Code plugin |
| v0.2 | Current | 9 providers, 4-tier smart routing, LLM query rewriting, FastEmbed semantic routing, dynamic catalog |
| v0.3 | Next | Regional โ DC Inside (Korea), Naver, 5ch (Japan) |
| v0.4 | Planned | Niche โ TikTok, Discord, YouTube comments, Looksmax |
| v1.0 | Planned | Synthesis โ built-in consensus/controversy detection, confidence scores, trend tracking |
Security
| Data access | Public data only โ official APIs and public web endpoints. No login-wall scraping. |
| Credentials | Zero stored. Optional LLM keys passed via env vars at runtime, never written to disk. |
| LLM routing | When ANTHROPIC_API_KEY or OPENAI_API_KEY is set, your query text (up to 4000 chars) is sent to the respective LLM API for routing only. No queries are sent externally without an explicit API key. Without keys, routing runs entirely locally via FastEmbed. |
| Rate limits | Respected per-platform. Built-in concurrency guards. |
| User-Agent | Transparent: vox-pop/0.2 in all requests. |
| Caching | API responses (7 days) and embeddings cached locally at ~/.cache/vox-pop/. No data sent to third parties. Embeddings stored as JSON, no serialization dependencies. |
| PII | Author names from public posts included for attribution only. Never stored beyond the response. |
vox populi, vox dei
the voice of the people is the voice of god
MIT License
pip install vox-popBefore it works, you'll need: ANTHROPIC_API_KEYOPENAI_API_KEY
Install
pip install vox-popThat's it. All 9 platforms work with zero API keys. Optional LLM key unlocks smarter routing (see How Routing Works).
Quick Start
CLI โ search all 9 platforms in one command:
vox-pop search "should I learn Rust or Go"Perspective mode โ see how opinions evolved over time:
vox-pop search "rust vs go" --perspective --platforms hackernews,redditNo common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MITโ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ