Skip to content
article

How I check a strike location with free satellite data, and when I refuse to publish

Naomi Feld@naomi_datadesk

August 10, 2026 · 2 min read

A reader asked how we decide whether a claimed strike location holds up. Here's the free toolkit and the actual decision rule. Nothing here needs a paid account.

The free sources

  • Sentinel-2 (ESA, optical): 10 m resolution in the visible bands, a new image roughly every 5 days at mid latitudes. Big burn scars, collapsed large buildings, craters in fields. Not cars, not people.
  • Sentinel-1 (radar): sees through clouds and at night. Change detection between two passes can show damage when optical is useless. Harder to read, I'm still learning.
  • NASA FIRMS: active fire detections from VIIRS (375 m pixels) and MODIS, near real time. A thermal anomaly at the right place and time is supporting evidence. Not proof.

The process

  1. Pin the claim: exact place, time window, what supposedly happened.
  2. Geolocate any imagery that came with the claim (Marta has a great post on this in this topic).
  3. Pull FIRMS detections for the area and window.
  4. Compare the last clear Sentinel-2 image before with the first clear one after.
  5. Look for independent sources: local reporting, other footage from different angles, official statements from more than one side.

Step 3 in pandas, from a FIRMS CSV download:

import pandas as pd

lat, lon = 48.0, 37.8      # the claimed location
df = pd.read_csv("firms_viirs.csv")
df["acq"] = pd.to_datetime(
    df["acq_date"] + " " + df["acq_time"].astype(str).str.zfill(4),
    format="%Y-%m-%d %H%M", utc=True)

window = df[(df["acq"] >= "2026-07-01T00:00Z") & (df["acq"] < "2026-07-03T00:00Z")]
near = window[window["latitude"].between(lat - 0.05, lat + 0.05)
              & window["longitude"].between(lon - 0.05, lon + 0.05)]
print(near[["acq", "latitude", "longitude", "frp", "confidence"]])

FIRMS times are UTC, and acq_time comes as an integer like 113 for 01:13, hence the zero padding. That one bit me once.

When I refuse to publish

  • One source plus ambiguous imagery. That's an unconfirmed claim, and we say so or we say nothing.
  • FIRMS hit but no visible change and no second source. Fires happen for a hundred reasons: industrial flares, field burning, a warehouse.
  • Any doubt about the date of the "before" image. Clouds hide a lot, and a two-week gap hides even more.

The free stuff gets you surprisingly far. It also teaches humility: a 10 m pixel is the size of a small house, and most of what matters in a war happens at a smaller scale than that.

Written by

Naomi Feld

Data journalist. I scrape things governments would rather I didn't. Elections, campaign finance, conflict OSINT. Python, pandas, a lot of records requests. Brooklyn.

Get the best of #hack_the_planet weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

6

Sign in to join the conversation.

Sign in to comment
Marta Kovalenko@marta_osint#3 in Hack The Planet
Very good. For Sentinel-1 I recommend starting with obvious things first, like a big bridge or airport, to learn how radar shows "normal" before trying damage. It looks like noise until suddenly it does not)
3 net votes
Naomi Feld@naomi_datadesk#4 in Hack The Planet
That's exactly my problem with it right now. Bridges first, noted.
2 net votes
Brett Hollister@brett_hsv1 rep in Hack The Planet
Solid work ma'am. One from the Air Force side: be careful with FIRMS near refineries and steel plants, they light up all day every day. Folks have "confirmed" plenty of strikes that were just a flare stack doing its job.
1 net votes
Naomi Feld@naomi_datadesk#4 in Hack The Planet
Yes! I keep a mask of known industrial hotspots for exactly that reason. Should have put it in the post.
0 net votes
Daan Visser@daan_fpga1 rep in Hack The Planet
The zfill on acq_time is such a classic data bug. Integer times are evil, every sensor log I parse at work has the same trap.
1 net votes
Kabir Sethi@0xkabir#5 in Hack The Planet
this is basically recon but for the real world. "one source = unconfirmed" should be tattooed on half the people quote tweeting stuff
2 net votes