NOPD Drone Flights Are Now Tweeted as They Are Logged

Posted by

·

Every NOPD drone flight now gets posted to X within minutes of NOPD logging it. The posts come from DroneWatch, a small open-source tool I released today, and they appear on @MWollenweber.

NOPD publishes its Skydio drone flight records as a public ArcGIS layer. Each record carries the flight’s stated purpose, a free-text description, takeoff and landing times, an NOPD item number when the officer entered one, and the flight path. DroneWatch polls that layer every few minutes and posts one tweet per new flight.

The first batch it caught shows why the feed is useful. On Thursday, November 5, 2026 at 1:58 PM, NOPD uploaded 63 flights at once. Those flights took place between October 20 and October 26, so they reached the public record 10 to 16 days after the drones flew. NOPD listed 45 as Call for Service, 6 as Training, 4 as Tactical Operations, 4 as Special Event, and 4 with no purpose given. Here is that post.

What each post contains

A single-flight post reads like this:

NOPD drone flight: Tactical Operations
"Swat Roll"
Wed Sep 16, 2026, 4:46–4:57 PM (11 min)
Item #I-16149-26
https://www.google.com/maps/search/?api=1&query=29.95578,-90.01414

The first line is the purpose NOPD selected. The quoted line is the officer’s description, when one exists. Times are New Orleans local. The item number is the NOPD incident number, which is the key for matching a flight to a police report or a public records request. The map link drops a pin at the center of the flight path’s bounding box.

The log only records what the officer typed. Many flights carry no description and no item number. A Training flight on October 20, 2026 had neither, so its post is three lines: purpose, time, and map pin. When a post shows a blank purpose or no item number, that is the state of NOPD’s own record, not a gap in DroneWatch.

When NOPD uploads a large batch, the account also posts a summary like the November 5 example above: the span of flight dates, the upload time, the delay, and the count by purpose.

How it works

DroneWatch is an AWS Lambda written in Python. On each run it pulls the attributes of every flight in NOPD’s layer, about 150 KB, and compares the flight IDs against a DynamoDB table of flights it has already posted. New flights go out oldest first. It fetches only a flight’s bounding box, because the full paths run past 100 MB.

NOPD does not upload in order. Flights arrive in batches days after they happen, and the record IDs do not follow takeoff time. That is why the tool diffs the whole table on every run instead of asking for “flights since last time.”

A few guards keep it honest. The first run records every existing flight and posts nothing. If more than 50 new flights appear at once, which usually means NOPD rebuilt the layer with new IDs, it posts nothing and raises an error until a human confirms the batch. Each run posts at most 10 flights and leaves the rest for the next run. A flight is marked as posted only after X accepts the tweet, so failures retry.

You do not need AWS or an X account to use it. The repository includes a local mode:

pip install -r requirements-dev.txt
python src/app.py --preview 3
python src/app.py --watch --every 15

--preview prints the post text for the latest flights. --watch runs the same new-flight detection as the Lambda, keeps its state in a local JSON file, and prints each new flight as JSON to stdout. Nothing leaves your machine. Deployment instructions and the ArcGIS dump script are in the README.

Why this matters

NOPD publishes the flight log, but almost nobody reads an ArcGIS layer. A feed puts each flight in front of people as it enters the record, with a map pin and an item number they can act on. If a drone flew over your block, you can now find the flight, the stated purpose, and the incident number without filing a records request.

The delay is itself a finding. The November 5 upload came 10 to 16 days after the flights. A log that lags by two weeks cannot be checked against what residents saw on a given night unless someone records the gap. DroneWatch records it on every batch.

The blank fields are a finding too. Four of the 63 October flights list no purpose at all. [LINK: my earlier review of the January through April 2026 flight records found 273 flights, and about 75 percent of them left the reason field empty.] A purpose menu that officers skip is not oversight. NOPD’s own policy on drone use sets the rules for when and why a drone can fly, and the public cannot test those rules against a blank.

I will keep using the feed and the underlying records to file complaints where a flight does not match the policy, and to request the body-worn camera and incident reports tied to the item numbers that do appear. The code is public so that anyone can verify what the account posts, run their own copy, or point it at another agency’s Skydio layer.

Follow @MWollenweber for the flights. The code is at github.com/mwollenweber/DroneWatch.