Gerador de briefings diários em markdown e áudio. Coleta notícias de feeds RSS e SearXNG, agrupa por tema via clustering semântico, sintetiza com Ollama e produz um arquivo .md (e opcionalmente .mp3) na pasta configurada.
perfis.yml (fontes, perfil, template)
↓
Coleta — RSS feeds + SearXNG
↓
Deduplicação por URL/título
↓
Memória 24h — separa novas × continuações
↓
Clustering semântico — embeddings (nomic-embed) + AgglomerativeClustering
↓
Ranqueamento — tamanho do cluster × peso da fonte
↓
Síntese — ollama_generate() com template do perfil
↓
Título — segunda chamada ao LLM via JSON (fallback: heurística)
↓
Salvar .md em VAULT/briefings/
↓
[se formato incluir áudio]
Roteiro → ollama_generate() com template de áudio
edge-tts → .mp3 em VAULT/briefings/
O serviço depende de dois componentes externos, provisionados via Docker:
| Serviço | Uso |
|---|---|
| Ollama | Geração de texto (LLM) e embeddings |
| SearXNG | Busca de notícias por query |
docker compose up -dSe o Ollama já estiver rodando nativamente, defina
PORT_OLLAMAcom uma porta diferente no.envou remova o containerollamado compose e aponteOLLAMA_BASE_URLpara o processo nativo.
# Subir infraestrutura
docker compose up -d
# Executar
./run.sh # briefing matinal_tech (default)
./run.sh matinal_tech # briefing nomeado
./run.sh vespertino_mercado # briefing vespertino
./run.sh "fusão nuclear" # modo ad-hoc — tema livreO run.sh carrega o .env, cria o venv se não existir e executa tech-briefing.py.
cp .env.example .env| Variável | Descrição |
|---|---|
VAULT |
Pasta onde os arquivos gerados serão salvos |
OLLAMA_BASE_URL |
URL do Ollama (http://localhost:11434) |
SEARXNG_URL |
URL do SearXNG (http://localhost:8888) |
MODEL_CHAT |
Modelo para geração de texto |
MODEL_EMBED |
Modelo para embeddings |
PORT_SEARXNG |
Porta exposta pelo container SearXNG |
PORT_OLLAMA |
Porta exposta pelo container Ollama |
Cada execução gera arquivos nomeados como:
VAULT/briefings/
2026-04-11_0700_matinal_tech_<slug-do-titulo>.md
2026-04-11_0700_matinal_tech_<slug-do-titulo>.mp3 # se formato incluir áudio
O .md contém frontmatter YAML (title, date, time, briefing, perfil, sources) seguido do corpo gerado pelo LLM e uma seção com todos os links coletados.
Definidos em parametros/perfis.yml:
| Nome | Perfil | Horário | Fontes |
|---|---|---|---|
matinal_tech |
pedro_dev | 07:00 | RSS (HN, Ars, Verge, TechCrunch…) |
vespertino_mercado |
attanotech | 18:00 | RSS + SearXNG |
Cada briefing aponta para um perfil (tom, interesses, exclusões) e um par de templates (briefing_*.md, audio_*.md) em parametros/prompts/.
sudo cp alfred-briefing-matinal.service alfred-briefing-matinal.timer /etc/systemd/system/
sudo cp alfred-briefing-vespertino.service alfred-briefing-vespertino.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now alfred-briefing-matinal.timer
sudo systemctl enable --now alfred-briefing-vespertino.timerOs timers disparam às 07:00 (matinal) e 18:00 (vespertino) diariamente. Com Persistent=true, executa na próxima inicialização caso a máquina estivesse desligada no horário.
briefing/
├── docker-compose.yml
├── config/
│ └── searxng/settings.yml
├── parametros/
│ ├── lib_alfred.py # helpers: ollama, searxng, vault
│ ├── lib_templates.py # renderização de templates
│ ├── perfis.py # leitura do perfis.yml
│ ├── perfis.yml # fontes, perfis, briefings
│ └── prompts/ # templates de síntese e áudio
├── tech-briefing.py
├── run.sh
├── config.yml
├── fontes.csv
├── logs/ # briefing_seen.json (memória 24h)
└── .env.example