Sources and refresh schedule
A GitHub Actions workflow runs every three hours, at 17 minutes past the hour (GitHub can delay scheduled runs by a few minutes when it is busy). A feed that answers with a rate limit or server error is retried up to three times with increasing waits, and the run fails loudly if every feed comes back empty. It runs scripts/fetch_news.py, which reads the searches listed in data/feeds.json: Google News RSS queries for data center announcements, construction, power, policy and regional news, all using the U.S. edition of Google News. Any Google Alerts RSS feeds added to that file are read too.
We store only the headline, the publisher name, the publication time and the link. Article text is never copied; every headline links to the original publisher through Google News. The recent feed keeps 90 days of headlines (up to 3,000), and project candidates are kept for 180 days. Every headline is also written to a permanent monthly archive in data/archive/ that is never trimmed; the Newsroom's Include archive switch and the Project Atlas search it.
On topic only
A headline is kept only if its title or description says data center (or data centre, datacenter), hyperscale or colocation, or names a tracked company together with a campus, facility, site, megawatt or gigawatt. Stock-market outlets that write about data center companies without reporting on projects (for example Simply Wall St, Yahoo Finance, The Motley Fool, Seeking Alpha, MarketBeat, Benzinga and Zacks) are on a blocklist in data/feeds.json.
U.S. only
Every gazetteer place carries a country code. A story is dropped when every place it names is outside the United States. Stories from a short list of non-U.S. outlets (BBC, The Guardian, The Telegraph, The Irish Times, ABC Australia, CBC, The Globe and Mail, The Times of India, The Economic Times, The Straits Times, South China Morning Post and others) are dropped unless the title itself names a U.S. place or state. Because many foreign stories name no place we recognize, the script also drops stories with clear foreign markers (for example "data centre" spelling, foreign currencies or country names) and stories from a short list of non-U.S. outlets. Stories that name no place at all are kept. This means a few foreign stories can slip through and a few U.S. ones can be dropped.
Topics, places and companies
- Topics come from keyword rules in the script, checked in this order: Cancelled / Blocked, New Announcement, Construction, Expansion, Land Acquisition, Operations, Deals / Investment, Power / Utility, AI Infrastructure, Policy / Permits. Policy / Permits comes last and needs a governance phrase such as zoning, rezoning, moratorium, ordinance, permit, planning commission, board of supervisors, city council, public hearing, lawsuit, referendum, tax break or abatement, opposition, a ban or pause, regulation, legislation or an election; a vote, an approval, residents or a county name alone is not enough. The first match becomes the headline's topic; anything else is General. Cancelled / Blocked covers projects that are withdrawn, scrapped, denied, voted down, halted or paused, and moratoriums that pass; headlines that only call for or debate a pause are not counted. Cancelled or blocked sites are grey on the map, never count as announced projects and are never picked as the Overview's major story.
- Places come from a gazetteer (
scripts/gazetteer.json) of U.S. states, counties and cities plus foreign places used only for filtering. Each U.S. place carries coordinates and a state, which becomes the headline's two-letter state code. The title and the feed's description are both scanned. Every U.S. county and parish is in the gazetteer at its Census centroid, plus the townships that appear in the news; a county name shared by several states is resolved from the other places in the story or the outlet's home state. When a story names no place, a local outlet's home state (listed indata/feeds.json) is used. Each headline records itslocation_precision: city, county, state or source (the outlet's home state). - Companies are matched by name and common aliases (for example AWS for Amazon). "Stargate" counts toward OpenAI, Oracle and SoftBank; named campuses such as Hyperion, Prometheus, Fairwater, Colossus and Project Rainier count toward their owners. Utilities and grid operators (for example Entergy, Dominion, Georgia Power, Duke, AEP, TVA, PJM and ERCOT) are tagged separately and can be filtered in the Newsroom.
- Stories group headlines about the same event. Two headlines published within 5 days of each other join when their titles share at least half of their words (Jaccard similarity of the title words, ignoring common words and the outlet's name), or at least 30% when they also name the same city or county, or the same company in the same state. Groups chain through shared headlines, but two groups that name different states or places never merge. Each story is shown with its headline that gives the most precise place, else the earliest. The Newsroom shows one card per story with its other sources behind an "N sources" button, the Atlas shows one site per story at the most precise place any of its headlines gave, and company counts are stories, not headlines.
- Figures such as "1.2 GW" or "$10 billion" are read from the headline. Capacity figures above 20 GW are ignored because they describe grid-wide totals, not single projects.
Curated and detected projects
Curated projects (rack-shaped pins on the Atlas) are entered by hand in data/projects.json from public reporting, with exact coordinates where known. Each one has a verified flag that stays false until it has been checked against current sources.
Detected projects (ring pins) are created automatically when a headline mentions a data center or campus, a stage (announced, under construction, operational or expansion) and a U.S. place. The pin is placed at the city or county named. Sites known only to the state are not pinned: from zoom level 5 in they are added up in one translucent bubble per state, labelled with the number of stories and marked as approximate. Zoomed out to the whole country, those counts are folded into the nearest cluster circle as a small "~N" figure. Detected projects are leads to check, not confirmed facts.
Known limitations
- Keyword tagging misses context. A headline about a vote against a project can still be tagged as an announcement.
- Places can be ambiguous (Georgia, Washington, Aurora). The gazetteer favors the U.S. meaning.
- Story grouping compares title words, so coverage of one event written in very different words can still appear as separate stories.
- The archive is append-only. It was re-tagged once with the current rules; headlines those rules reject stay in the archive files marked
filteredand are hidden on the site. - Google News results vary, and paywalled or regional outlets may be missing.
- Counts and charts describe headlines, not the industry as a whole.
Report a wrong pin or headline
Open an issue on GitHub with the project name or headline, what is wrong and a source link. Corrections to curated projects go straight into data/projects.json; recurring tagging mistakes are fixed in the rules so they stay fixed on the next refresh.
Contact
Built and maintained by AG. Questions, corrections or ideas: reach out on LinkedIn.
Code
The whole site is static HTML, CSS and JavaScript with no build step. The map uses Leaflet and Leaflet.markercluster from unpkg and map tiles from OpenStreetMap, darkened with a CSS filter. Source: github.com/awigaikwad02/datacenter-watch.