← Dashboard
Methodology
# Methodology
## Scope and candidate roster
The working date is October 14, 2026, in America/New_York. “National office this fall” is interpreted as federal legislative elections in fall 2026: U.S. House, U.S. Senate (including special elections), and nonvoting House delegates. There is no presidential election in this cycle. Governors and state offices are excluded. Louisiana House candidates running in its November 3 open primary are included; the Louisiana Secretary of State explains the schedule. American Samoa’s nonpartisan delegate election includes a candidate identified as Republican by the roster source.
The base roster is the October 14 download of The Green Papers’ 2026 candidate spreadsheet, saved unchanged under `assets/sources/greenpapers_download/`. Records must be candidates (not merely incumbent officeholders), be running for an included federal office, and have a fall 2026 election date. Republican ballot labels and Republican write-ins are included. Current candidates explicitly listed with Republican affiliation but another partisan/independent ballot label form a separate supplement; they do not enter the Republican summary. This inclusion follows the source’s affiliation listing and does not independently certify party registration.
State candidate pages from The Green Papers and Ballotpedia are preserved. Republican candidates listed in Ballotpedia’s current 2026 general-election lists are matched by state, office, district, and normalized name, rather than by name alone. Historical election results and primary losers are not used as current candidates. Ballotpedia added two Republican write-ins absent from the base download. Candidate-specific corrections and website sources are in `data/roster_amendments.json`. Cross-check matches are evidence of agreement between these sources, not an independent audit of every official ballot. The full source spreadsheet remains available for inspection. Candidate IDs beginning with `G` are Green Papers record keys, not FEC IDs; FEC IDs are stored separately.
The candidate roster is a sourced census attempt, not a guarantee that every late-filed write-in or recently changed candidacy has been independently verified. It is frozen for this study so the population does not change between months. The denominator includes candidates whose websites did not yet exist or were not archived in earlier months.
John Kitover is the one entry expressly marked unconfirmed by the Green Papers source. Searchable campaign material refers to the March primary, while his current personal sites emphasize the 2027 Chicago mayoral race. He is retained as an explicitly unconfirmed federal write-in record, with that uncertainty in the roster; he must not be described as an independently certified November candidate.
Two affiliation conflicts were resolved using more direct evidence: the Libertarian Party identifies Heather McElwain as its write-in candidate, and Avery Ayers describes his campaign as an independent write-in candidacy. Both remain in the supplement, with the original Green Papers affiliations preserved. The inconsistent election date on the Libertarian page was not adopted.
Alaska’s official general-election candidate listing identifies challenger Daniel J. Sullivan Jr. as a certified registered Republican. He is included in the primary group despite the blank party label in the source spreadsheet. He is distinct from incumbent Dan S. Sullivan; an initial surname-based cross-check that assigned the incumbent’s Ballotpedia page to both people was corrected. Their separate FEC IDs, websites, and archived pages are preserved. The final roster contains 487 primary Republican candidates and 13 supplemental records. The `republican_nonpartisan_ballot` category covers Republican affiliation without a Republican label printed on the ballot (American Samoa and this Alaska candidate).
## Campaign websites and domain changes
Campaign websites come from the candidate sources. The current listed URL is requested only to check its destination and identity; these live pages are saved separately and are never counted as historical observations. Listed and current campaign domains are both queried when a campaign has moved. Bare and `www` hosts are treated as equivalent. Unrelated redirects (including an old Jim Baird domain’s gambling-site destination) are excluded. Corrections are preserved in the roster notes.
An outlier review found that Chris Chaffee’s old Senate domain retained his name in its title while serving unrelated gambling articles. Those captured pages are rejected, rather than treated as zero-mention campaign pages. Maryland’s official candidate list supplied his current `chaffeeamericafirst.com` domain. Repeated phrases characteristic of the observed unrelated gambling content are checked in the body as well as the title; the same validation applies to every candidate.
The spreadsheet also assigned Krista Penn’s website to Jim Kingston. That site is excluded for Kingston, whose campaign terms identify `jimkingston.org`. Christy Peterson’s historical homepage copies contain campaign text despite unrelated content on the current `www` host; the valid historical observations are retained. These checks show why a current error or hack is not, by itself, grounds to discard all earlier captures.
When a source points to a specific campaign section within a larger website, only that section is included and its entry page serves as the homepage. This applies to Christina Clement’s listed campaign page and Gene Douglass’s redirected Substack campaign section. Warren Davidson’s explicit `/landing-page/` destination is grouped with the root homepage. Candidate-specific path restrictions and aliases are recorded in the roster amendments; unrelated pages on the larger hosts are excluded.
Social-platform-only links and absent campaign websites receive explicit missing-data statuses. The study does not treat Facebook/Instagram/X profiles, government officeholder sites, or donation platforms as campaign-owned websites. This means a candidate without a retrieved campaign website remains in the roster, rather than disappearing from the graph.
## Six-month window and archive selection
The six **completed calendar months** before the working date are April, May, June, July, August, and September 2026. October is not included. The month window was chosen before viewing results.
For each known campaign domain, the Internet Archive CDX index is requested for captures from `20260401000000` through `20260930235959`, with original HTTP status 200 and MIME type `text/html`. Original responses, query URLs, timestamps, and pagination are saved. A failed index query is distinguished from a successful query with no captures. The domain query discovers archived HTML pages, including older content still archived during the window; it cannot discover pages Wayback never captured.
URLs are restricted to the identified campaign hosts (bare/`www`), not arbitrary subdomains. Fragments, tracking parameters, `http` versus `https`, and trailing slashes are normalized. Search results, feeds, login/admin pages, APIs, WordPress implementation files, and non-HTML assets are excluded. Calendar exports and mechanically generated calendar date, month, day, week, category, tag, pagination, and filter views are excluded; individual authored event pages remain eligible. This rule was added after URL inspection revealed an effectively unbounded calendar crawl on one domain, before site totals were interpreted. The rule applies to every candidate, and the full unfiltered CDX responses remain saved. Other meaningful content query parameters are retained. Root and common root aliases such as `/index.html` and `/home` are treated as the homepage. Equivalent paths on known old and new domains are grouped as one page. Each original URL is retained in the evidence.
Broken relative asset paths containing `.js/` or `.css/`, consecutive repetitions of the same path segment three or more times, repeated nested pagination paths, and account/password pages are also excluded. These rules address observed crawl traps and apply uniformly across candidates. Campaign-hosted social-post archives remain eligible even when numerous; they are not discarded merely to reduce download time.
For every canonical page and month, the selected capture is the one **nearest 12:00 UTC on the 15th of that same month**, with earlier timestamps breaking ties. This is one page observation per month, not every intra-month revision. If that capture fails retrieval or validation, up to two other captures from the same month are attempted in the same proximity order. The substitution is recorded. No capture outside the requested month is used. Exact capture times, offsets, requested URLs, final replay URLs, and response information are recorded. If Wayback redirects outside the month or campaign domains, the response is rejected.
The resulting site-month is an **observed archive page set**, with pages potentially captured on different days. It must not be described as a coherent full-site snapshot taken at one moment. The earliest and latest page capture dates and the selected/successful page counts are included in the monthly dataset. Page sets can differ between months.
## Saved copies and text extraction
Original HTML and extracted UTF-8 text are saved for every usable selected version, with SHA-256 checksums. Some raw Wayback replays preserve gzip or Zstandard compression without conventional response headers. These payloads are decoded before parsing, with the original compressed bytes retained. Non-HTML payloads, archive error/challenge pages, known unrelated parked/gambling pages, and pages with fewer than 20 extractable words are excluded from counts and given a failure status. The latter rule reduces false zeros from empty JavaScript shells; it may exclude a legitimate very short campaign landing page.
When a saved HTML payload’s SHA-1 (Base32) exactly matches a CDX content digest, another selected capture with that same verified digest may reuse the identical saved HTML. Metadata marks `retrieval_method=verified_cdx_digest_reuse` and identifies the originally downloaded source. This avoids downloading byte-identical content repeatedly; it does not substitute content across unequal hashes. A CDX match without a locally verified payload hash is insufficient for this optimization.
The copies are HTML evidence and extracted text, not full visual mirrors of every stylesheet, photograph, video, font, or script dependency. Text extraction uses BeautifulSoup/lxml on the saved HTML. It excludes the HTML head (including metadata/title), scripts, styles, templates, `noscript`, SVG, iframes, canvas, comments, the Wayback toolbar, and elements explicitly hidden using `hidden`, `aria-hidden=true`, inline `display:none`, or inline `visibility:hidden`. Navigation and footer text remain. CSS class-based visibility is not evaluated, and JavaScript is not executed, so the text is not a pixel-perfect rendering of the original browser view.
Text nodes are separated with newlines and whitespace is normalized. Image-alt mentions are counted separately at page level and excluded from the main text measures. Words embedded in images or video, as well as text loaded only by JavaScript, are not counted. Consequently this is not a complete test of removing Trump photographs or image-based endorsements.
## Counting rules
- A mention is a case-insensitive whole-word match to `\btrump\b`. This counts `Trump`, `TRUMP`, `Trump’s`, `Trump-endorsed`, and `anti-Trump`; it does not count `Trumpism` or `trumpeter`.
- The measure is lexical: it does not distinguish Donald Trump from another person named Trump, an ordinary use of “trump,” positive versus negative references, or quotations versus the campaign’s own voice.
- A word is a Unicode alphanumeric token, allowing internal straight or curly apostrophes: `\b[^\W_]+(?:['’][^\W_]+)*\b`. Hyphenated compounds are separate words; numbers count as tokens; standalone punctuation and underscores do not.
- `mentions_per_word = trump_mentions / word_count`.
- `mentions_per_1000_words = 1000 × mentions_per_word`.
- Missing or invalid text has null metrics, never zero. A retrieved valid page with no mention has a true zero.
Page-level metrics are retained for every selected version. The broader site total sums unique exact extracted page texts within a candidate-month. Exact text duplicates (for example, query aliases and multiple archived URLs resolving to the same page) are counted once in these totals. Shared navigation appearing on otherwise different pages is **not** removed; therefore a Trump reference in a common footer can appear many times in site totals. The homepage is reported separately and is the primary comparison.
## Comparison and graph
The heatmap includes every roster candidate and all six months, including missing observations. Each observed cell prints both the raw count and the rate per 1,000 words. The exact per-word rate, denominator, timestamps, and source links are available in the cell details and CSV. Colors may be capped at the observed 95th percentile for readability; printed numbers are never capped. Missing values have a separate grey color. Filtered, sorted, candidate-level, homepage, and collected-site views are available offline in `dashboard.html`.
April–September changes require usable observations at both fixed endpoints; an earlier or later available month is not silently substituted. A separate same-page endpoint file compares the intersection of page paths available in both months. The headline trend is the unweighted mean homepage rate for a **balanced panel** of the same candidates observed in all six months. Coverage is charted separately. These precautions reduce changes caused solely by the mix of candidates or pages observed; they do not make missingness random or establish motives.
The study can document changes in captured text. It cannot establish deliberate political distancing, recover missing archive versions, or support a nationwide percentage without considering coverage. Rotating news, redesigns, word-count changes, switched domains, and changing page coverage are competing explanations for some measured changes.
## Reproducibility and validation
Scripts and dependencies are saved in the project. Tests cover whole-word matching, denominators, hidden/script text, image-alt separation, real zeros versus empty shells, challenge pages, compression handling, URL normalization, and exclusion of unrelated hosts. Source pages, raw CDX responses, capture manifests, downloaded evidence, failed-request statuses, and provenance links make the results auditable. The dashboard is self-contained and uses no network dependencies or animations.