-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Signal is a fully automated political intelligence pipeline. It ingests RSS feeds from 18 news sources spanning the full political spectrum and reduces them through a layered intelligence hierarchy — from raw articles to daily tactical signals, to weekly emerging patterns, to monthly strategic shifts.
The result is not a news summary. It is a longitudinal intelligence system that grows more analytically powerful the longer it runs.
Three reports are generated automatically:
- Daily brief — published every morning at 4:00 AM via a five-pass pipeline (Passes 1–5)
- Weekly summary — published every Monday at 6:00 AM via Pass 6, identifying story arcs, watch list evolution, and structural patterns across the week
- Monthly intelligence — published on the 1st of each month at 7:00 AM via Pass 7, synthesizing daily and weekly data into month-scale trend analysis (partial months supported)
All reports are published automatically to flexrpl.github.io/signal.
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
Signal reduces noise through three layers. Each layer reads from the layer below it and operates at a longer time horizon.
[18 RSS Sources — full political spectrum]
↓
── TACTICAL (Daily, 4:00 AM) ────────────────────────────────────────────────
[Pass 1] Entity extraction per article
→ topic, key claim, people, orgs, legislation, sentiment, framing
↓
[Pass 2] Algorithmic clustering (Union-Find)
→ title similarity + entity overlap → story clusters
↓
[Pass 3] Per-cluster cross-spectrum analysis
→ consensus facts, left/right framing differences, omissions, significance
↓
[Pass 4] Cross-story correlation
→ hidden connections, narrative patterns, blindspot analysis, watch list
↓
[Pass 5] Final brief synthesis
→ Situation Overview, Key Actors, What Isn't Said,
Connections & Patterns, Watch List, Analyst Note
↓
[Daily brief → signal.db → GitHub Pages]
── PATTERNS (Weekly, Monday 6:00 AM) ────────────────────────────────────────
[signal.db — 7 daily briefs]
↓
[Pass 6] Weekly synthesis
→ Story arcs, what escalated, what was buried,
blindspot of the week, watch list evolution
↓
[Weekly report → GitHub Pages]
── STRATEGIC (Monthly, 1st of month 7:00 AM) ────────────────────────────────
[signal.db — daily briefs + weekly summaries for the month]
↓
[Pass 7] Monthly synthesis
→ Month in review, story arcs, watch list scorecard,
coverage patterns, emerging actors
↓
[Monthly 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 | Data flow, component design, SQLite schema, LLM call budget |
| Configuration | All sources.yaml options, adding/removing sources |
| LLM Providers | Claude vs Ollama — when to use each, how to switch |
| Scheduling | launchd setup for all six jobs, manual triggers, logs |
| Weekly-Reports | Weekly synthesis — how it works, when it runs, output format |
| Monthly-Reports | Monthly synthesis — partial months, sections, Jul 1 install |
| Social-Cards | Bluesky social cards — setup, card designs, manual posting |
| GitHub-Pages-Publishing | How reports are published, the GitHub Actions workflow |
| Analytics | GA4 setup, what is tracked, how to view data or disable |
| Report-Format | What each section of the daily 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 |
| Testing | Test suite — running, coverage, conventions, adding tests |
| Future-Roadmap | Intelligence synthesis roadmap: monthly, quarterly, and beyond |
| 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 |
| Card rendering | Playwright (headless Chromium) + Jinja2 |
| Social posting | atproto (Bluesky AT Protocol client) |
| Terminal UI | Rich |
| Persistence | SQLite (signal.db) |
| Publishing | GitHub Pages + GitHub Actions |
| Scheduling | macOS launchd (6 jobs) |
| Config | YAML (config/sources.yaml) + .env
|
Signal · Repository · fleXRPL · Daily political intelligence — powered by local AI

