The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Free Agentic Publication Digester listing page.
FAPD is an automated pipeline that reads the official publications of the United States federal government — congressional floor proceedings, bills, the Federal Register, enacted laws, federal court opinions, and agency press releases — and produces a daily, cited, opinion-agnostic digest for two readerships at once: people, and AI agents researching what the federal government actually did on a given day.
Every digest covers one publication day across all three branches. Every item carries a citation to the official record and names the mechanical rule that selected it. Everything not summarized is counted. Nothing is silently omitted.
The authoritative numbers block — where any other figure in the repository disagrees, this dated snapshot is the current one. (For source counts the live Sources page is always current; it derives them from the registry at build time.)
/sources/<id>.html — statistics, method, health history, and
labeled model-written orientation.FAPD_PUBLICATION_TZ; see docs/forking.md). The official record
begins 2026-07-27 (two development-era digests were retired on
2026-08-03; they remain in git history). Each finished day also has
a frozen observed listing at /day/<date>.html.Everything here derives from official government publications — the record a government produces precisely in order to make it public. Congress prints its proceedings; agencies publish their rules and announcements; courts post their opinions. FAPD uncovers nothing: it takes what is already published and makes it easier to find, read, verify, and — for AI agents — ingest. Primary sources are the ground truth. News coverage and commentary are never ingested, never consulted, never cited.
This is why the project is legitimate infrastructure rather than scraping-as-adversarial-sport: the pipeline consumes only the channels governments built for the purpose of being read, identifies itself honestly on every request, and treats a refusal as an answer. A government that publishes its actions has already voted for this kind of reader to exist.
Summarization is where bias creeps in, so the tension is resolved by machinery, not judgment calls:
A digest that fails any validation check — a citation that doesn't resolve, coverage arithmetic that doesn't reconcile, a banned term in our prose, a missing inclusion rule — is not published. There is no override.
AI agents answering "what did the federal government do on date D?" today
either crawl official sites themselves (multiplying load on public
infrastructure) or lean on secondhand coverage. FAPD offers a third path:
one disciplined, identified, budgeted crawler reads the record once, and
agents ingest the summarized, cited, coverage-accounted result — stable
URLs, llms.txt, a machine-readable digest index, an
Atom feed, and provenance manifests with SHA-256 records for verifying
captured content.
One ask travels with the data: for claims, cite the underlying official source (each item carries its govinfo ID or agency URL); cite this project for the aggregation. The digest is a route to the record, never a replacement for it.
The editorial gates, provenance model, access discipline, and adapter seam are jurisdiction-neutral. Pointing the codebase at another government's official publication interfaces means replacing the source registry and the parsers — not the rules. See docs/adding-sources.md.
The acquisition layer is a set of automated agents with one governing principle: we are guests on public infrastructure, and every rule below is enforced in code, not by operator discipline.
sources/registry.yaml (rendered as
SOURCES.md) records every federal source ingested, planned,
evaluated-and-excluded, or found unavailable — currently 129 sources
across a tiered universe, so "how comprehensive is coverage?" is a
measurement, not a claim. Honest statuses matter: a source that blocks
our honestly-identified client is recorded unavailable with the
observed behavior. That fact is itself published accountability data.
The closed third — and the standing effort to open it. A measured share of the federal source universe currently refuses honestly-identified automated access (the July 2026 probe found 22 of 72 non-govinfo sources closed behind WAFs or robots disallows). We treat that as the project's ongoing engagement agenda, not its boundary: publishers' own access documentation keeps revealing doors on other hosts and paths (that alone re-opened FCC, Commerce, and NOAA candidates); verdicts are re-probed as sites change; and we engage agency web and API teams directly to advocate for safe, sane automated access to what they already publish for the public. Coverage grows by doors opening — never by evasion.
That effort produced its first result in July 2026, and the channel has grown since: 15 email sources are active, and agencies whose web channels refuse us have a working input path through their own email bulletins — Treasury, USDA, SSA and DEA among them. Subscriptions to EPA, DOT, FAA, NHTSA, ATF, the Coast Guard and HUD's Inspector General are registered too, and they are ingested as soon as they deliver. A 2026-09-26 audit of the mailbox found EPA's bulletins arriving from an address the registry did not list, and several others sent only subscription notices, so those entries are planned rather than claimed. The audit also registered 26 more subscriptions and started reading the mailbox's junk folder behind a DKIM check. The blocked web entries stay in the registry exactly as they were; the email entries sit beside them as siblings. A refusal recorded is never quietly erased by a success elsewhere.
No source is ingested on a hunch. Each one is (1) registered with identity, tier, and URLs; (2) probed end-to-end through the identified client — robots verdict, fetch with provenance capture, feed detection, item inventory, sample extraction; (3) content-evaluated — what does this source publish in total, and what fraction will ingestion see? Under-coverage is disclosed at onboarding, not discovered later; (4) activated into ingestion and coverage accounting; (5) re-evaluated on failures or redesigns. Documentation research precedes probing: the publisher's own developer pages, API docs, and feed directories say which door they built — and reading the sign on the front door has repeatedly beaten guessing (documented feeds that HTML autodiscovery misses; APIs on hosts a newsroom WAF never touches).
Real publication interfaces are irregular — feeds without stable IDs, article pages that challenge sustained automated access, content behind script-only redirects. That irregularity is absorbed at one seam: a source adapter owns exactly six decisions (how the source's index or feed is enumerated into items; what query parameters the poll itself sends; what makes two sightings the same document; whether to fetch full articles or feed metadata only; how served bytes become text; what to store when no article is available), while the shared loop owns everything that must never vary — conditional requests, robots enforcement, budgets, capture, storage.
Adapters reach for access in a fixed order:
scripts/audit.py reports the
footprint at any time.GPO's record is stable; agency web content can be edited or removed
without notice. So every capture is preserved under a two-hash strategy —
content_sha256 over the exact served bytes (the evidentiary hash,
stored content-addressed) and text_sha256 over normalized text (the
change signal) — and every fetch attempt, including errors and robots
refusals, is exported to a daily manifest committed to this repository.
Each manifest's header carries the hash of the previous manifest on
file. Honest limit, stated because provenance claims deserve scrutiny:
the chain binds content, not dates, so it proves a retained middle day
was not altered — it cannot by itself prove the newest day was not
truncated or that no day was skipped. Strengthening the header with the
predecessor's date is on the published backlog. New captures are
additionally submitted to the Internet Archive's Wayback Machine as an
independent second witness, within a budget, best-effort. A source's
claimed publication date and the time we first observed it are always
stored separately: the claimed date is the agency's assertion, our
observation is the audit trail. What the hashes prove — and what they
don't — is stated in full in PROVENANCE.md.
Mechanical work is code. Selection, counts, stage groupings, the entire Coverage Statement — zero model involvement, reproducible from versioned rules. An LLM call that could have been a SQL query is treated as a bug.
Official summaries come first. Federal Register agency abstracts, the Congressional Record's own Daily Digest, official bill titles and stages, court syllabi — used verbatim, identified as official text, at zero inference cost. Models write only what the record does not already summarize.
Six model layers, independently versioned (iterating on one never regenerates another):
Tags: line: mechanical
branch and agency tags first (zero tokens), then up to three
model-generated one-to-three-word discovery keys per section,
generated in one batched cheap-tier call per day from the stored
synopses, labeled model-derived, and linted by the same
banned-lexicon gate because they render in the digest.The banned-lexicon gate scans all generated prose against a coded list of loaded adjectives ("landmark", "controversial", "sweeping"…) and motive attribution ("in an attempt to…"). Verbatim official text and citation URLs are masked first — the gate polices our language, not the government's. A match blocks publication.
In transformation, models are the secondary tool. Turning source data into pipeline records is deterministic first — feed fields, embedded structured data, official metadata. Model inference is reserved for what programmatic shaping genuinely cannot recover, and is then budgeted, ledgered per token, prompt-versioned, and marked model-derived in metadata — never laundered into fields that read as source-provided.
One Markdown document per publication day (the canonical artifact; the static site is a derived presentation): a clickable table of contents, the Day in Review, numbered sections for floor activity, legislation, the Federal Register, enacted laws, judicial activity, and agency announcements (listed only when the agency itself dates the release on the digest day — backfill is disclosed and counted, never passed off as news), per-item citations and inclusion rules, plain-speak lines under their official counterparts, per-section tag lines, a glossary, the Coverage Statement, and a methodology footer. Sample: digests/2026-07-28.md.
On the site, each digest renders as a collapsed, plain-speak-first view: section cards whose headers carry the title, tag chips, and the plain-language synopsis, expanding to the full record on demand — still static HTML, no scripts. (The derived live page carries one inline script that renders timestamps in the reader's local time alongside UTC; it loads no external resource and stores nothing.)
Get a free API key at https://api.data.gov/signup/ (emailed instantly).
In production (the VPS Docker stack in deploy/vps/), a
collector supervisor polls sources continuously through the day and
run_pipeline.py runs as the end-of-day finalizer that freezes and
commits the canonical digest. Each stage also runs standalone:
Sync is watermark-based (only changes since the last run are listed) and rate-limited per GUIDE.md §4. A first run with no watermark is date-bounded; deeper history comes from govinfo's bulk-data service, never the API.
FAPD is developed with generative AI — Claude agents writing code, running documentation-first source research, and drafting governing documents under the operator's direction, with every commit carrying a co-author trailer. A project that labels machine-generated prose in its digests does not hide its own machine authorship; the full statement, including what AI assistance changed about where design attention went, is at docs/site/ai-development.md (published on the site as "How AI Built This").
The digester is built for the United States federal government's
publishing day, but that assumption lives in two places, and both are
documented in docs/forking.md: the publication
clock — FAPD_PUBLICATION_TZ (an IANA zone; default America/New_York)
with its three label knobs, the one place the clock is named, which
every digest date, end-of-day boundary, live-page rollover, activity
graph, and clock label reads — and the federal working calendar,
src/fapd/fedcal.py, whose holiday tables a fork replaces behind one
function. Stored observation stamps are UTC under any clock; an audit
test fails the build if a renderer ever spells the default clock out
again.