Freshness right now

This page fetches every data file the site ships so it can read their dates. That is deliberately more than any other page loads; the measured size of each one is shown below.

The files this site is built from

Everything the browser loads lives in the repository's data/ folder as plain JSON. Each card names the file, links to it, says which upstream source produced it, and reports its age against the window we think it should stay inside. Where a file carries no date at all, it says so rather than guessing one.

How the freshness check works

A date on its own tells you nothing. Two months is fine for a county parcel layer and a failure for a daily news pull, so every clock above is measured against a window, and the window is stated rather than implied. Past the window, the card says stale and turns red. A provenance page that always reports everything green is worth nothing.

These windows are this project's judgement, not anyone's service level. Loudoun County has never promised us a refresh date. They are listed here in full so you can disagree with a specific one rather than with the idea of the check.

One disagreement inside our own repository is worth flagging, because it changes what counts as stale. data/PROVENANCE.md says the county updates the parcel layers "roughly every six months". scripts/watch-county.py, which reads the layers' own edit dates, records a cadence of "every month or two", and that is the string written into data/activity.json. We use the shorter of the two, because the cost of being told a layer might be stale when it is not is a moment's checking, and the cost of the other mistake is publishing a number that stopped being true two months ago.

Who publishes what

Every link below goes to the publisher's own copy, not to ours. If a figure on this site disagrees with one of these, the publisher is right and we have a bug — tell us.

Air permits, generators and reported emissions

The Air Permits & Generators page, complete dataset and review queue are public and free. They never require Pro or a login.

Who provides each fact

Virginia DEQ publishes the Air Sites layers, data-center flag, air-site status, facility name, address, classifications, primary emissions description, issued-permit index and permit PDFs. The separate AIR SITES EMISSIONS TPY table provides reported inventory emissions. PEC extracts equipment information from permit documents; its generator counts and tier fields are third-party analysis. Loudoun County GIS supplies data-center parcels and campus names. Loudoun Data Center Watch normalizes registrations, matches sources, groups county parcels by their county name, calculates totals, and records the evidence.

Registration is the cross-source key

A registration identifies an air site, which can have several permits or amendments. We preserve full registration/application numbers, dates, programs and document links in the official index. Daily and planned layers may overlap; identical registrations are deduplicated. PEC revisions are not added together: the latest permit year is used once per registration, and conflicting same-year counts are withheld. A company name alone never joins DEQ and PEC records.

County relationships

  • Direct match: a point inside a county data-center parcel, with independent data-center identity from DEQ or the permit sources; or a specific exact campus identity or street address with geographic agreement within 1,500 metres. Polygon holes are excluded. Conflicting campus candidates are held for review.
  • Likely match: at least two distinctive name tokens and at least 70% token agreement, within 750 metres of a county parcel centroid. This is labeled as incomplete evidence.
  • Unlinked / nearby: identity is not established. Nearby candidates within 1,000 metres are recorded only in the review queue, never attached to facility cards.

Generic company names, shared property ownership, and engine-related words do not establish data-center identity. Explicit non-data-center uses, cross-source geographic conflicts, source registration errors and ambiguous campus matches are withheld or reviewed. These relationships are our analysis, not a DEQ or county determination. County owners are not necessarily operators. The operator filter groups recognizable names in the DEQ label and does not assert current corporate ownership.

What a generator record means

“Backup generators documented in permit records” describes an equipment compilation. It does not mean those units are installed or operating. Permit documents can also include non-emergency engines, black-start engines and gas turbines; these equipment types and their operating modes must remain distinct. Inconsistent equipment classifications are withheld from generator totals pending document review. A Tier 4-equivalent control system is not automatically a Tier 4-certified engine.

PEC's raw capacity fields do not publish reliable units. We retain those fields without assigning kilowatts or summing a county capacity. Reviewed PDF equipment tables may publish per-unit electrical ratings (ekW or MWe) and separate engine ratings (bhp). Document reviews retain the stated units, equipment references, PDF page, permit date and limitations. Ratings are not measurements of demand or output, and a PDF's “previously permitted” section does not establish installation. Later revisions must be checked before reusing a review.

Reported emissions and permit limits

Reported emissions use DEQ table 292, joined by registration and checked against the related plant ID. Each numeric value retains its inventory year and pollutant in tons per year. Duplicate equal values are deduplicated; conflicting values are withheld, never summed. Missing and null values stay unavailable. The inventory may contain only one reporting year for a site even though the model supports annual history. It does not measure current neighborhood air quality or exposure.

Permitted emissions and operating-hour limits are conditions in a particular permit. They are separate from reported emissions and may apply per engine, per group, to testing, or across a rolling period. We do not copy PEC's pollutant columns into the reported-emissions table. Reading a permit requires its complete terms; selected equipment reviews are not legal compliance findings.

Freshness, coverage and review

The daily pipeline checks public sources and preserves the last good dataset on required-source failures. Each source has a retrieval date separate from its own update date and the county snapshot. DEQ's permit website sometimes refuses automated requests: the verified index snapshot is retained with its original date and a visible failure status. Successful GIS checks do not make that index current. A daily editorial check reviews changed PDFs, significant official decisions, publicly documented agreements and completion evidence; unresolved findings remain review items. See the daily dataset and document check report and the dated editorial review and coverage gaps.

No county match is a coverage gap, not evidence of unpermitted activity or no generators. Proposed sites may have no permit yet. Data-center flags can be incomplete; the official index and PEC are additional identification sources. Totals describe the available Loudoun compilation, not a complete installed-equipment census. The machine-readable review queue records missing matches, conflicting names/coordinates, duplicate registrations, missing document links and excluded industrial sites. Read the original sources.

What this site does not know

Some of the questions people most want answered have no published answer, and the honest thing is to say which. These are not disclaimers to skip. They are the shape of the hole in the record, and knowing where it is tells you which claims — ours and anyone else's — cannot be true.

  • The county's record lags the ground by weeks

    Applications filed with the county appear the day they are filed. The parcel layers that carry the built and proposed counts are republished every month or two. A campus can therefore be visibly under construction while the county's own record still calls it proposed, and every count on this site inherits that lag. The exact gap for each layer is the age shown above, not an estimate.

  • An owner name is usually not the operator

    The operator field on every facility is the property owner recorded in Loudoun County land records. It is frequently a holding company formed for a single parcel rather than the brand whose servers are inside, it can be out of date, and it does not establish who is responsible for any condition a resident describes. Treat it as a pointer for further research, never as an accusation. This is the county's caveat as much as ours; it is set out in data/PROVENANCE.md.

  • Community reports are accounts, not findings

    Reports on this site are unverified first-hand accounts submitted by residents. Nobody has been out to measure anything. They are evidence that a person says something happened, which is worth recording and worth counting — and they are not findings of fact, and they do not establish that any named company caused any condition described. Counts of reports are counts of accounts.

Withheld by law

These are not gaps we could close with more work. Each one is a figure a government holds and is forbidden to publish, quoted from the document that says so. Rendered from data/finance.json.

What refreshes itself, and what does not

There is no server behind this site. GitHub Actions runs the update scripts on a schedule, commits whatever changed back to the repository, and Netlify redeploys on the push. The job definition is .github/workflows/refresh-news.yml and the scripts are in scripts/ — both are in the public repository, so the schedule below can be checked rather than believed.

Update jobs, what each one writes, and how often it runs
Job or script Runs Writes
refresh-news.yml GitHub Actions workflow, "Refresh news" Daily cron 23 10 * * * — 10:23 UTC, which is 6:23am Eastern in summer and 5:23am in winter. GitHub's scheduler is best-effort, so the real firing time drifts by minutes. Can also be run by hand from the Actions tab. Commits data/news.json, data/news-home.json, data/activity.json, data/county-fingerprint.json, data/diesel.json and the four files in feeds/ — but only if one of them actually changed. A quiet day produces no commit and no deploy.
scripts/refresh-news.py step 1 of the workflow Daily Retried once if it fails. It only fails outright when every feed is down at once. Rewrites data/news.json and data/news-home.json from the public RSS feeds listed above.
scripts/watch-county.py step 2 of the workflow Daily Also retried once. Independent of the news step: the county's servers being down is no reason to skip publishing headlines. Rewrites data/activity.json — county filings plus every change since the last run — and data/county-fingerprint.json, the parcel-by-parcel state file it compares against.
scripts/refresh-air-permits.py step 3 of the workflow Daily Retried once, like the two steps before it. It reads the parcel layers already committed in data/, so it does not depend on anything else in the job having succeeded. Rewrites data/air-permits.json, the review queue and compatibility data/diesel.json: the DEQ air-permit sites in Loudoun, the Piedmont Environmental Council's generator counts, and which parcels each could be matched to. It preserves the source and calculation method for every total.
scripts/refresh-facilities.py checked daily Daily check; reviewed changes A large unexpected change in the parcel layers can mean the county renamed a field, not that fifty data centers appeared overnight, so coverage and identity checks stop unexpected changes for review before publication. Rewrites data/facilities.geojson, data/facility-buildings.geojson, data/facility-outlines.geojson, data/districts.geojson, data/localities.json, data/summary.json and data/PROVENANCE.md.
scripts/refresh-finance.py checked daily Daily check; reviewed changes The tax sources are annual and biennial PDFs, not feeds. Checks each finance source document through scripts/check-site-data.py and records the result in maintenance-status.json, without advancing the reviewed baseline. It never writes a figure of its own — when a hash changes, a person reads the new document and edits the numbers.
scripts/build-feeds.py step 4 of the workflow Daily Runs after the news and county steps, so the feeds always describe the data being published that day. Rebuilds feeds/news.xml, feeds/activity.xml, feeds/all.xml and feeds/construction.ics from the data files above, so a feed reader can watch the county without an account here.
scripts/build-county-svg.py checked daily Daily check; reviewed changes Only needed when the county redraws its election districts. Rewrites data/county.json and the county silhouette used as this site's mark, from data/districts.geojson.

The practical consequence: daily checks can fail, upstream records can be delayed, and manually reviewed facts can drift. A recent compilation does not establish that every source is current. The cards above are how you tell which has happened.

Data this site deliberately does not have

A page about where data comes from should be equally clear about where it does not go. Three things are missing from every dataset above on purpose, and none of them can be recovered from what is published.

  • Exact report locations. When a resident files a report, a database trigger offsets the pin by a random 100–200 metres before it is ever readable, and re-offsets it if a moderator corrects the location. The published coordinates are the offset ones. There is no endpoint that returns the original, and this site's own map cannot ask for it — which is also why report pins should be read as "somewhere around here", never as an address.
  • Reporter contact details. Names, email addresses, phone numbers and social handles are stored where moderators can reach a reporter and are excluded from the public view at the database level, then stripped a second time in the browser code as a belt-and-braces measure. They are not in any file on this page and never travel to a visitor.
  • Your location. The how close am I page measures every distance inside your browser, against the parcel file listed above, and nothing about where you are is ever sent to this site — there is no server of ours to send it to. Device location, if you grant the permission, stays on the page. The one route that sends anything off your device is typing an address, which has to go to OpenStreetMap's Nominatim to be turned into coordinates, because the county publishes no geocoder. That page says so next to the box, and the coordinates come back to your browser and go no further.

The privacy policy sets this out in full, including what moderators can see and how long it is kept.