Personal monitor of Federal Reserve communications. Scrapes Board governor speeches and FOMC documents, scores each one for hawkish/dovish tone via local Hermes/Codex auth, and reports tone shifts as alerts and a local dashboard.
- Board governor speeches — all 7 sitting governors (Powell, Jefferson, Bowman, Barr, Cook, Miran, Waller), discovered via per-speaker RSS feeds on federalreserve.gov.
- Regional Fed bank presidents — all 12 (Williams/NY, Daly/SF, Goolsbee/Chicago, Kashkari/Mpls, Bostic/Atlanta, Logan/Dallas, Hammack/Cleveland, Schmid/KC, Collins/Boston, Paulson/Philly, Barkin/Richmond, Musalem/St. Louis), each with their own bank-specific scraper (RSS, HTML index, or headless Chromium depending on what the bank publishes).
- FOMC statements — the canonical post-meeting policy text (~8/yr).
- FOMC minutes — the deliberation record released ~3 weeks after each meeting.
- Powell press conferences — same-day Q&A transcripts (PDF, parsed via
pypdf).
- Discovers new docs from federalreserve.gov RSS feeds (per-speaker for speeches; the consolidated
press_monetaryfeed for FOMC docs). Press-conference URLs are derived from each statement's date and probed with HEAD. - Scores each doc on a -2 (very dovish) to +2 (very hawkish) scale via Hermes, using the locally configured Codex OAuth provider by default. The prompt header switches per doc-type so the model knows it's reading a speech vs a statement vs minutes vs a press-conference transcript.
- Annotates new FOMC statements with 3-5 bullet notes explaining what specific wording changed vs the previous statement and what each shift signals (separate Hermes call).
- Persists everything in SQLite at
data/fed_chirp.sqlite, keyed on URL with adoc_typediscriminator. - Analyzes for tone shifts:
- Speeches: alert when |score − speaker's 90-day mean| ≥ 1.0 or |z| ≥ 1.5.
- FOMC docs: alert when |score − prior doc of same type| ≥ 0.5 (8/yr cadence makes a 90d baseline too sparse).
- Renders a local HTML dashboard (regenerated each scan) with:
- FOMC pulse — per-meeting combined view (statement + presser as one event), with intra-meeting drift (presser − statement), meeting-over-meeting Δ, and minutes when available; per-doc-type tables below; expandable diff notes under each statement.
- Board governors — per-member 90-day mean, sparkline of last 30 speeches, most recent score.
- Recent speeches — last 30 with rationale and link.
- Emails an HTML digest when alerts fire, with diff and explanatory notes inlined for FOMC statement alerts.
Fed Chirp is an independent personal project and is not affiliated with, endorsed by, or representative of the Federal Reserve System, any Federal Reserve Bank, the Federal Open Market Committee, or any other government body. The "Fed Chirp" name and any aesthetic resemblance to official Federal Reserve material are coincidental — no claim of affiliation is made or implied.
Hawk/dove scores shown in this project are interpretations produced by a large language model via Hermes against the fixed rubric in src/fed_chirp/scoring/prompt.py. They reflect that rubric's reading of each document — not the speaker's intent, not any official position, and not consensus economic analysis. The rubric can be wrong; the model can be wrong; the scraped source can be wrong or incomplete. Treat every number as a heuristic.
Nothing in this repository or on the dashboard is investment, financial, legal, tax, or other professional advice. Do not use these scores to make trading or policy decisions on their own.
Coverage depends on best-effort web scraping of public sources (federalreserve.gov RSS, each regional Reserve Bank's website, YouTube auto-captions for some video appearances). Sources occasionally change layout, restrict access, or stop publishing; data may therefore be missing, stale, or duplicated.
Code and data are provided as-is with no warranty.
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
playwright install chromium # one-time: 4 of the 12 regional banks (Chicago,
# Cleveland, KC, Dallas) plus St. Louis and a
# couple others render their speech listings
# client-side, so we use headless Chrome to
# extract them. PlaywrightContext prefers your
# installed Chrome, falling back to the bundled
# chromium-headless-shell.
cp .env.example .env # fill in Gmail settings; Hermes defaults use local Codex authFed Chirp shells out to hermes chat -Q --provider openai-codex -m gpt-5.5 for scoring. Override with FED_CHIRP_HERMES_BIN, FED_CHIRP_HERMES_PROVIDER, FED_CHIRP_HERMES_MODEL, or FED_CHIRP_HERMES_TIMEOUT if your local Hermes setup differs.
fed-chirp scan # cron entry: discover speeches + FOMC docs, score, alert
fed-chirp backfill --since 2026-01-01 # one-time bulk fetch of everything since date
fed-chirp backfill --since 2025-11-08 --only ny_williams # restrict to one bank
fed-chirp dashboard # regenerate dashboard/index.html from existing data
fed-chirp diff <statement-url> # word-diff vs prior statement + auto-generated notes
fed-chirp annotate-diffs # backfill diff notes for any statements missing them
fed-chirp score-one <url> # debug: fetch + score a single URL (auto-detects doc type)
fed-chirp scan --dry-run # print would-be emails to stdout instead of sendingOpen dashboard/index.html in any browser to see the big-picture view.
Copy launchd/com.user.fedchirp.plist into ~/Library/LaunchAgents/ and load it with launchctl load. Runs Mon-Fri at 18:30 local.
Scoring is local-first: Fed Chirp calls your local Hermes CLI, which can use Codex OAuth instead of a paid project API key. That means scheduled scans should run on the Mac where Hermes is authenticated; the GitHub workflow is kept manual because GitHub Actions does not have access to local Codex OAuth.
- SEP / dot-plot tracking — quarterly numeric projections.
- FRASER historical backfill — pre-RSS speeches for longer baselines.
- Regional bank coverage gaps:
- Chicago has no public archive (only the latest speech is reachable via the homepage).
- Some St. Louis & Mpls "remarks" pages are short Q&A descriptions rather than full transcripts.
- Pagination needed — these listings expose only a recent window, so historical coverage is shallow despite long tenures: SF Daly (only since 2024-10 vs tenure 2018-10), Atlanta Bostic (2023-06 vs 2017-06), Mpls Kashkari (2025-04 vs 2016-01), KC Schmid (2026-03 vs 2023-08). Each parser needs to walk pagination (FacetWP for SF, RSS archive for Atlanta, paginated profile for Mpls, listing pages for KC) and then a one-shot
fed-chirp backfill --since <tenure_start> --only <key>run.