vox-pop
Opinião pública para LLMs — HackerNews, Reddit, 4chan, Stack Exchange, Telegram. Zero chaves de API.
Documentação
Seu LLM sabe o que os livros dizem.
Isto diz a ele o que as pessoas realmente pensam.
9 plataformas • Roteamento semântico • Camada de inteligência LLM • Funciona sem chaves de API
Instalar • Início Rápido • Plataformas • Como o Roteamento Funciona • Servidor MCP • Plugin Claude Code • Roteiro
Por quê?
|
Sem vox-pop
|
Com vox-pop
|
Instalação
pip install vox-pop
É isso. Todas as 9 plataformas funcionam sem chaves de API. Uma chave LLM opcional desbloqueia roteamento mais inteligente (veja Como o Roteamento Funciona).
Início Rápido
CLI — pesquise em todas as 9 plataformas em um único comando:
vox-pop search "should I learn Rust or Go"
Modo perspectiva — veja como as opiniões evoluíram ao longo do tempo:
vox-pop search "rust vs go" --perspective --platforms hackernews,reddit
## 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
A mudança conta uma história: 2017 foi uma guerra de comentários. 2026 é pragmatismo específico de domínio.
Pesquisa padrão — resultados planos de todas as plataformas:
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_42
Python — incorpore em suas próprias ferramentas:
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())
Plataformas
Sem tokens, sem OAuth, sem dores de cabeça com limites de taxa. O status é medido, não aspiracional —
vox-pop platforms --check reexecuta isso contra endpoints ao vivo.
Reddit e Lobsters estão atualmente bloqueados. Ambos estão atrás de intersticiais de prova-de-trabalho Anubis que servem uma página de desafio em vez de conteúdo. Isso não é um problema de configuração e nenhuma mudança de cabeçalho o resolve. O suporte ao Reddit está sendo migrado para a API OAuth oficial; Lobsters agora relata o bloqueio explicitamente em vez de retornar um resultado vazio.
| Plataforma | Status | Fonte | Filtro de Tempo | Tópicos | |
|---|---|---|---|---|---|
| HackerNews | Funcionando | Algolia Search API | Sim | Sim | |
| Bloqueado | Pullpush + Arctic Shift + fallback Redlib | Sim | — | ||
| 4chan | Funcionando | API JSON oficial (desde 2012) | — | Sim | |
| Stack Exchange | Funcionando | API oficial — mais de 180 comunidades | Sim | Sim | |
| Telegram | Somente recentes | Pré-visualização web de canais públicos (t.me/s/) | — | — | |
| Lobsters | Bloqueado | lobste.rs API JSON + raspagem de busca | Sim | — | |
| Lemmy | Funcionando | API REST pública — instâncias federadas | Sim | Sim | |
| LessWrong | Funcionando | API GraphQL | Sim | Sim | |
| Fóruns XenForo | Instável | Raspagem de HTML (Head-Fi, AnandTech, etc.) | — | — |
Como o Roteamento Funciona
As consultas podem ser qualquer coisa — uma única palavra, um parágrafo, uma pergunta de regras de D&D do tamanho de um ensaio. vox-pop entende todas elas através de um sistema de roteamento em quatro níveis:
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.ml
Nível 2 funciona como Perplexity/ChatGPT Search — o LLM reescreve sua consulta conversacional em uma string de busca limpa e escolhe as comunidades certas. Defina qualquer uma dessas variáveis de ambiente para ativar:
ANTHROPIC_API_KEY=... # Uses Claude Haiku (~$0.0003/query)
OPENAI_API_KEY=... # Uses GPT-4o Mini
OLLAMA_HOST=... # Uses local Ollama (free)
Nível 3 roda inteiramente localmente com zero chaves de API. Um modelo de embeddings de 33MB entende que "comportamento contraditório de feitiços em uma criatura" significa regras de RPG de mesa — zero palavras-chave compartilhadas necessárias. Na primeira execução, ele busca todos os boards do 4chan e sites do Stack Exchange dinamicamente, incorpora tudo e armazena em cache no disco.
| Início frio | Início quente | Singleton | |
|---|---|---|---|
| Tempo do Nível 3 | ~7s | ~1.3s | instantâneo |
Nenhuma configuração necessária. Se uma chave LLM estiver definida, o Nível 2 é usado. Caso contrário, o Nível 3 cuida disso. Se o fastembed não estiver instalado, o Nível 4 (busca ampla) ainda funciona.
Exemplos de roteamento
| Consulta | Roteia para |
|---|---|
| "melhor notebook hp para linux" | r/buildapc, r/linux, r/hardware, /g/, SE:hardwarerecs, SE:askubuntu |
| "efeitos contraditórios de feitiços em uma criatura" | r/dndnext, r/DnD, /tg/, SE:rpg |
| "melhor teclado mecânico para programação" | r/MechanicalKeyboards, /g/, SE:hardwarerecs |
| "quais são os riscos de yield farming" | r/CryptoCurrency, SE:tezos, telegram:ethereum |
| "como fazer kimchi jjigae autêntico" | r/Cooking, /ck/ |
Servidor MCP
Funciona com Claude Code, Cursor, Windsurf e qualquer cliente compatível com MCP.
{
"mcpServers": {
"vox-pop": {
"command": "python",
"args": ["-m", "vox_pop.server"]
}
}
}
Seu LLM recebe quatro ferramentas:
| Ferramenta | O que faz |
|---|---|
search_opinions | Pesquisa em todas as plataformas por opiniões sobre um tópico |
search_opinions_perspective | Então vs Agora — opiniões históricas + recentes lado a lado |
get_thread_opinions | Mergulha nos comentários de um tópico específico |
list_available_platforms | Verifica o que está disponível e saudável |
O parâmetro routing_hints permite que o LLM chamador especifique exatamente onde pesquisar:
routing_hints: "reddit:MechanicalKeyboards,4chan:g,stackexchange:hardwarerecs"
Quando nenhuma dica é fornecida, o sistema de roteamento cuida disso automaticamente.
Plugin Claude Code
claude plugin add /path/to/vox-pop
A habilidade dispara automaticamente quando sua pergunta se beneficiaria de opiniões reais. Basta perguntar naturalmente:
> "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 activate
Pesquisa manual: /vox-search "your query"
Arquitetura
┌──────────────────────────────────────────────────────────┐
│ 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 │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
Cada provedor implementa fallback automático — se uma fonte estiver fora do ar, a próxima é tentada. Só o Reddit tem três fontes de fallback (Pullpush → Arctic Shift → Redlib).
Roteiro
| Versão | Status | O quê |
|---|---|---|
| v0.1 | Lançado | 5 provedores (HN, Reddit, 4chan, SE, Telegram), servidor MCP, plugin Claude Code |
| v0.2 | Atual | 9 provedores, roteamento inteligente em 4 níveis, reescrita de consultas via LLM, roteamento semântico FastEmbed, catálogo dinâmico |
| v0.3 | Em andamento | Reddit via API OAuth oficial — substitui o caminho bloqueado do Redlib |
| v0.4 | Não iniciado | Regional — DC Inside (Coreia), Naver, 5ch (Japão) |
Contribuindo
New provider? → Subclass Provider in src/vox_pop/providers/base.py
New routing destination → Add to DESTINATIONS in router.py (one line)
Dynamic catalog source → Add a _fetch_*_destinations() function in router.py
Better LLM prompt? → Improve _LLM_SYSTEM in router.py
Multilingual support? → Swap FastEmbed model to bge-m3 in SemanticRouter
Dead instance? → Open an issue with the instance URL
Regional platform? → DC Inside, Naver, 5ch, VK, Bilibili — all welcome
Segurança
| Acesso a dados | Somente dados públicos — APIs oficiais e endpoints web públicos. Sem raspagem atrás de login. |
| Credenciais | Zero armazenadas. Chaves LLM opcionais passadas via variáveis de ambiente em tempo de execução, nunca gravadas em disco. |
| Roteamento LLM | Quando ANTHROPIC_API_KEY ou OPENAI_API_KEY está definido, o texto da sua consulta (até 4000 caracteres) é enviado à respectiva API LLM apenas para roteamento. Nenhuma consulta é enviada externamente sem uma chave de API explícita. Sem chaves, o roteamento roda inteiramente localmente via FastEmbed. |
| Limites de taxa | Respeitados por plataforma. Guardas de concorrência integradas. |
| User-Agent | Transparente: vox-pop/0.2 em todas as requisições. |
| Cache | Respostas de API (7 dias) e embeddings armazenados em cache localmente em ~/.cache/vox-pop/. Nenhum dado enviado a terceiros. Embeddings armazenados como JSON, sem dependências de serialização. |
| PII | Nomes de autores de postagens públicas incluídos apenas para atribuição. Nunca armazenados além da resposta. |
vox populi, vox dei
a voz do povo é a voz de deus
Licença MIT