-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Garot Conklin edited this page May 14, 2026
·
9 revisions
Signal is a fully automated, five-pass political intelligence pipeline. It ingests RSS feeds from 18 news sources spanning the full political spectrum, uses an LLM to identify entities, cluster stories, analyze cross-spectrum framing, detect non-obvious patterns, and synthesize a daily analyst-style intelligence brief — not a news summary.
The output is published automatically to flexrpl.github.io/signal every morning at 5:00 AM.
A typical news aggregator shows you headlines. Signal does something different:
- Cross-spectrum framing analysis — for every story covered by multiple outlets, it identifies what the left says, what the right says, what each side is omitting, and what the consensus facts actually are
- Non-obvious pattern detection — it looks across all stories simultaneously to find hidden connections, coordinated narratives, and suspicious timing that only become visible at the macro level
- Blindspot identification — it explicitly flags stories that only one side is covering, and analyzes what that pattern of selective coverage reveals
- Delta tracking — each run checks the previous run's watch list to identify what has materialized, escalated, or dropped off
[18 RSS Sources across the full political spectrum]
↓
[Pass 1] Entity extraction per article
→ topic, key claim, people, orgs, legislation, locations, sentiment, framing
↓
[Pass 2] Algorithmic clustering (Union-Find)
→ title similarity (rapidfuzz) + entity overlap → story clusters
↓
[Pass 3] Per-cluster cross-spectrum analysis
→ consensus facts, contested claims, left/right framing, omissions, significance
↓
[Pass 4] Cross-story correlation
→ hidden connections, narrative patterns, anomalies, blindspot analysis, watch list
↓
[Pass 5] Final brief synthesis
→ Analyst-style brief: Situation Overview, Key Actors, What Isn't Said,
Connections & Patterns, Watch List, Analyst Note
↓
[HTML Report → GitHub Pages]| Live site | flexrpl.github.io/signal |
| Brief archive | flexrpl.github.io/signal/archive.html |
| Repository | github.com/fleXRPL/signal |
| Page | What it covers |
|---|---|
| Quick Start | Get the pipeline running in under 10 minutes |
| Architecture | Deep dive into the five-pass system, data flow, and component design |
| Configuration | All sources.yaml options, adding/removing sources |
| LLM Providers | Claude vs Ollama — when to use each, how to switch |
| Scheduling | launchd setup, changing the schedule, manual triggers |
| GitHub Pages Publishing | How reports are published, the GitHub Actions workflow |
| Report Format | What each section of the brief means and how it's generated |
| Troubleshooting | Common issues and fixes including the macOS crash investigation |
| Development | Code structure, adding a new pass, testing, SonarQube |
| Future Roadmap | Phase 2 weekly summary and other planned enhancements |
| Layer | Technology |
|---|---|
| Language | Python 3.14 |
| LLM (default) | Claude Code CLI (claude -p) |
| LLM (alternative) | Ollama (qwen2.5:14b) — interactive/manual only |
| Feed parsing | feedparser |
| Full-text extraction | httpx + BeautifulSoup4 + lxml |
| Clustering | rapidfuzz (fuzzy title matching) + Union-Find |
| Terminal UI | Rich |
| Persistence | SQLite (signal.db) |
| Publishing | GitHub Pages + GitHub Actions |
| Scheduling | macOS launchd |
| Config | YAML (config/sources.yaml) |
Signal · Repository · fleXRPL · Daily political intelligence — powered by local AI
