There's a particular kind of restlessness that comes with watching fire weather. QGIS open on one monitor, WFIGS on the other, an eye on the Red Flag warnings, and somewhere in the back of your mind you're already doing the math on fuel moisture and wind direction. Most people don't live this way. GIS analysts who also run Wikipedia bots absolutely do.

Today I finished something I've wanted to build for a while: a fully automated pipeline that watches for wildfires in Tuolumne County and updates Wikipedia without me touching a thing. It went from zero to live in a single day, and that's worth writing down.

WFIGS API β†’ BdgrovesBot β†’ Wikipedia ↳ GeoJSON β†’ QGIS live layer

The problem

I created two Wikipedia pages yesterday β€” 2026 Tuolumne County wildfires and Wildfires in Tuolumne County, California. The county I work in, the terrain I map, the fires I monitor. These pages needed to exist, and now they do.

Update, October 2026: the second page, Wildfires in Tuolumne County, California, has since been deleted. Wikipedia's editors are still cautious about pages built with AI help, which is fair. The 2026 fires page is still up.

But the moment I published them I saw the problem: keeping them current is manual labor. A fire breaks out at 3am, I wake up to a Twitter alert from my own bot (@SierraNevadaWX), and then I'm supposed to go hand-edit a Wikipedia table while half asleep? That's not a system. That's just being reactive. The fix was obvious: automate it.

The build

BdgrovesBot was already half-built. It was querying WFIGS β€” the National Interagency Fire Center's wildland fire geospatial API β€” and refreshing a GeoJSON layer for my QGIS fire-monitoring setup. The Wikipedia piece existed too, but it only updated acreages for fires already in the table. New fires still meant a manual row entry.

So today I rewrote the core logic to handle both cases:

Existing fire
If a fire already has a row in the Wikipedia table, the bot updates the acreage cell automatically. Every morning, fresh numbers from WFIGS.
New fire Β· over 10 acres
The bot inserts a stub row β€” name, acreage, start date, coordinates β€” and drops <!-- bot-stub --> markers in the location and notes cells so I know exactly where to fill in by hand.
The 10-acre threshold
Below 10 acres, it logs the fire but stays out of the table. Small slapdown fires don't belong in a historical record.
Traceability
It logs the WFIGS unique fire identifier in the reference stub, so I can trace any row straight back to the source without hunting.

The authentication rabbit hole

Getting Pywikibot to authenticate cleanly for automated runs took longer than it should have. My first test run prompted me for a password interactively β€” fine for local development, completely broken for a GitHub Actions runner at 7am when no human is watching.

The fix was a Wikipedia bot password through Special:BotPasswords, stored as a GitHub Secret, with the workflow writing a passwords.py file at runtime from that secret. The file never touches the repo. The password never appears in logs. The runner writes it, uses it, and it's gone.

The moment it worked β€” Page [[2026 Tuolumne County wildfires]] saved in the GitHub Actions log, with no password prompt β€” was genuinely satisfying. That's the whole pipeline: WFIGS β†’ Python β†’ Pywikibot β†’ Wikipedia, headless, on a cron job, every morning.

The test insert

Before going live I needed to verify the write pipeline end-to-end, which meant actually writing to Wikipedia and confirming it landed. So I added a --test-insert flag that creates a clearly-labelled fake fire called "BdgrovesBot Test" and pushes it to the page.

# Dry run β€” safe, no edits, shows what the bot would do pixi run dryrun # Verify the full write path with a labelled test row pixi run python bot/tuolumne_bot.py --test-insert --no-dry-run

It worked on the first try. The row appeared exactly as designed β€” name, coordinates stub, acreage cell, start date, notes stub, reference stub. I deleted it manually a few minutes later. The whole thing took about two minutes.

That test insert is the kind of thing you can't fake in a dry run. A dry run tells you the code runs. A live test insert tells you the auth works, the table parser works, the row builder works, and the Wikipedia API accepted the edit. All different things.

BRFA: doing it by the book

Here's the thing about Wikipedia bots: you're supposed to have approval before you run them. The process is a BRFA β€” Bot Request for Approval. You file a page, join a queue, get reviewed by a member of the Bot Approvals Group, run a supervised trial, then get full approval.

I filed today: Wikipedia:Bots/Requests for approval/BdgrovesBot. The task is non-controversial β€” data maintenance on pages I created, sourced from a federal government API, no prose editing, no cross-article changes. The dry-run log is attached. The live test insert is documented. The GitHub Actions logs confirm headless authentication.

Then I switched the workflow back to dry-run mode while the BRFA is pending. The bot still runs every morning at 7am. It still queries WFIGS. It still refreshes the QGIS GeoJSON. It just doesn't write to Wikipedia until BAG signs off. When that happens, one line in the workflow file flips it live.

Bot compliance
  • DRY_RUN=True by default β€” edits require an explicit --no-dry-run
  • Edit summaries always cite WFIGS as the data source
  • Operated under Wikipedia bot policy Β· account User:BdgrovesBot
  • BRFA filed and pending BAG review

The fire situation, while I built this

The whole time, I had an eye on the actual map. The Pocket Fire in the Coconino National Forest, Arizona had reached 1,467 acres at zero containment β€” a Type 1 incident, the highest level, 969 personnel on scene, an estimated final cost pushing $20 million. A southeast wind event was forecast for the weekend, and the Tucson and Flagstaff NWS offices had Red Flag Warnings posted through Saturday night.

My QGIS project pulls the national active-fires layer and the NWS watches-and-warnings layer both live. I could watch the Red Flag polygon sitting right over the Coconino National Forest while I worked β€” the Pocket Fire flanking, main behavior running along the sides of the perimeter. Not the most aggressive behavior, but with a wind event incoming and zero containment, it's the kind of thing you stay up watching.

Nothing active in California. Nothing in Tuolumne County. The TuCo monitoring setup was running and quiet β€” which, when you build tools like this, is the best possible update.

What comes next

BRFA review usually takes one to two weeks. If BAG approves a trial β€” probably 20 edits β€” I'll run it, post the results, and wait for full approval. After that the bot runs fully autonomously, no human in the loop between WFIGS and Wikipedia unless it flags something.

The longer-term vision is coverage. Nevada fires. California statewide. Maybe a sister page for every county that needs one. The framework is the same every time β€” WFIGS query, table parser, stub inserter, acreage updater. Honestly, the Wikipedia pages are the hard part. The code is the easy part.

For now: one county, one bot, one BRFA in the queue. The fire map is quiet. The workflow is live. The code is clean.

Going to go watch the Pocket Fire radar loop for a while.

Source at github.com/bdgroves/bdgrovesbot. Built in Tuolumne County territory β€” if you can see the smoke from your porch, the bot already knows.


Go deeper

🎧 Listen & watch

The inner workings of Wikipedia — The Changelog, 26 November 2025, about 1 hr 49 min. Longtime Wikipedian Bill Beutler on the rules, the “cabal” that isn’t one, and how an edit sticks.

Depths of Wikipedia explores digital archives — Here & Now (WBUR/NPR), 10 June 2024, about 6 min. Annie Rauwerda on the joy of getting lost in Wikipedia and editing it herself.

Eyes on Earth Episode 65 – Rapid Fire Mapping with Remote Sensing — Eyes on Earth (USGS EROS), 10 January 2022, about 19 min. PNNL and Forest Service scientists on mapping fire perimeters day by day from satellites.

Fire Mapping, Maritime Search And Wide Angle Imaging — The MapScaping Podcast, 30 November 2023, about 46 min. Alison Harrod of Overwatch Imaging on airborne fire mapping and getting crews to trust new data.

📄 Read

Geiger, R.S. (2011). The lives of bots. In G. Lovink & N. Tkacz (eds), Critical Point of View: A Wikipedia Reader, 78–91. Institute of Network Cultures. Free PDF from the author.

Halfaker, A. & Riedl, J. (2012). Bots and cyborgs: Wikipedia’s immune system. Computer 45(3), 79–82.

Geiger, R.S. & Halfaker, A. (2013). When the levee breaks: without bots, what happens to Wikipedia’s quality control processes? Proceedings of the 9th International Symposium on Open Collaboration (WikiSym ’13), 1–6.

Keegan, B., Gergle, D. & Contractor, N. (2013). Hot off the wiki: structures and dynamics of Wikipedia’s coverage of breaking news events. American Behavioral Scientist 57(5), 595–622.

Livingstone, R.M. (2016). Population automation: an interview with Wikipedia bot pioneer Ram-Man. First Monday 21(1). Open access.

Zheng, L., Albano, C.M., Vora, N.M., Mai, F. & Nickerson, J.V. (2019). The roles bots play in Wikipedia. Proceedings of the ACM on Human-Computer Interaction 3(CSCW), 1–20. Open access.

“I was surprised how upset some people got” — Bill Adair, Nieman Lab, 25 March 2026; a cautionary tale of a bot that skipped the approval step.

📊 Data & agencies

NIFC Open Data — home of the WFIGS layers the bot reads every morning. · WFIGS Current Wildland Fire Perimeters — refreshed every five minutes. · National Interagency Fire Center — the folks in Boise behind it all.

CAL FIRE Incidents — California’s own fire list, with CSV and JSON for developers.

Pywikibot documentation — the Python library doing the editing. · Wikipedia bots — Wikipedia on its own robot helpers, from ClueBot NG to bot edit wars.

bdgrovesbot — this project’s code. · sierra-alert-bot — the @SierraNevadaWX bot that sends the 3am fire alerts.