The RETINA Map is Open Source

Posted by

·

The Perdido Institute published the source code for RETINA, our public map of surveillance cameras in New Orleans, today, November 9, 2026. The code is in a public repository at github.com/mwollenweber/retina, where anyone can read it and check our claims about the map against it.

Source code is the set of instructions a program runs. A repository is the folder, with its full change history, where a project keeps that code.

We introduced RETINA a week ago in The Perdido Institute Is Open. This post explains what RETINA is, why New Orleans needs it, and why we are showing how it works.

What RETINA is

RETINA is a public map of surveillance cameras and automated license plate readers in New Orleans. A license plate reader is a camera that photographs every passing plate and logs the time and place.

As of November 9, 2026, the data file behind the map holds 1,155 points, up from 1,117 on opening day.

CategoryPointsWhere the data comes from
NOPD and Real Time Crime Center cameras528The City’s public safety camera map on nolagis.maps.arcgis.com
Flock and other automated license plate readers450OpenStreetMap
City traffic cameras90The City’s traffic camera dataset on data.nola.gov
Suspected Project NOLA cameras72Public records, entered by the Institute
Unknown ownership15OpenStreetMap

The Real Time Crime Center is the city’s camera monitoring hub. OpenStreetMap is a free map of the world that volunteers edit.

Project NOLA is a private camera network that sent NOPD real-time facial recognition alerts. NOPD Superintendent Anne Kirkpatrick paused those alerts in April 2025, Axios reported.

You can filter the map by operator. Each point’s popup has a Street View link so you can check the placement yourself.

Why New Orleans needs it

RETINA draws its 1,155 points from four separate places. The City publishes its traffic cameras in one dataset and its public safety cameras on a separate map. Every license plate reader point on RETINA comes from OpenStreetMap volunteers, and every suspected Project NOLA point comes from public records.

The rest of this section is the Institute’s position.

Residents cannot weigh in on surveillance they cannot see. A person deciding whether to speak at a City Council meeting, file a records request, or ask about the camera on a neighbor’s building needs to know what is on the block. RETINA puts that in one place.

Location matters to the law too. Section 147-2 of the City Code limits NOPD’s use of facial recognition to a list of enumerated crimes and states that it shall not be used as a surveillance tool, as the opening post describes. Checking whether the city follows that rule starts with knowing where the cameras are and who operates them.

The map updates itself

RETINA refreshes every data source on a schedule, with no one at the Institute touching it. The schedule is in the repository’s data refresh guide.

SourceRefresh
City traffic cameras on data.nola.govOnce a day
City public safety cameras on nolagis.maps.arcgis.comOnce a day
OpenStreetMap, including Flock and other plate readersEvery 6 hours
Project NOLA records spreadsheetOnce a day
The data file the live map readsRebuilt every 15 minutes

The live map at retina.perdidoinstitute.com runs on this schedule. On November 9, 2026, its data file carried a build time of 1:49 p.m. Central when we loaded the map minutes later.

The point count shows the same thing. The map grew from 1,117 points on November 2 to 1,155 on November 9. Thirty-four of the 38 new points are license plate readers, and every license plate reader point on the map arrives through the OpenStreetMap sync.

Automating a source takes little code. Each sync is a small scheduled job that downloads a public dataset, matches each camera to the record RETINA already holds, updates it in place, and adds what is new. The guide says these jobs finish in seconds. Running one twice never creates a duplicate, and a sync never overturns a reviewer’s decision to reject a camera.

Adding another public dataset means writing one more job of the same shape. Changing how often a source refreshes means editing one schedule line.

When the City adds a camera to its public map, or a volunteer maps a new Flock reader in OpenStreetMap, RETINA picks it up on the next run. The Institute is volunteer-run, and scheduled jobs keep 1,155 points current without volunteer hours.

Why we published the code

We ask City Hall to show its records, and we hold RETINA to the same standard. That is our position. The facts below are what the public code lets you check.

The opening post said the map has no analytics, no trackers, and no account, and that your browser contacts two hosts when it loads. The map’s code is in the frontend folder, where any reader can confirm that.

The jobs that pull the City’s datasets and OpenStreetMap are in the lambdas folder, so anyone can see which sources feed the map and how each record is labeled. The repository’s README states that RETINA pulls nothing from other camera-mapping sites.

Public code gets read by people who did not write it. If RETINA mishandles a photo or misplaces a camera because of a bug, write to [email protected].

How a resident’s report becomes a point on the map

The scheduled jobs cover cameras that someone has already published. Residents supply the rest. The README describes four steps.

  1. A resident spots a camera and files a report through Report a camera on the map, with a pin, the host business, and photos.
  2. RETINA stores the report as pending. Nothing is public at this stage.
  3. A reviewer at the Institute approves or rejects the camera and each photo.
  4. The next 15-minute rebuild adds the approved camera to the data file the map reads.

RETINA limits what it keeps about the person who files a report. Each item below comes from the README and the scheduled jobs guide.

  • RETINA re-encodes every photo and strips all EXIF before the photo reaches storage. EXIF is the hidden data a phone writes into a photo, including GPS coordinates and the device serial number.
  • If a reporter sets no pin, RETINA uses the photo’s GPS as a location hint and then discards it.
  • RETINA never publishes a reporter’s contact information or notes. The publishing job refuses to run if those fields appear in its output.
  • The report form limits each IP address to 10 reports an hour by default to block spam. An IP address is the number that identifies an internet connection.

One more job can copy field-verified Project NOLA cameras into OpenStreetMap, where they stay available to everyone. It runs as a dry run by default, which means it logs what it would add and changes nothing.

What we do not know

Every point on the map is a best-effort placement, and the Project NOLA points are suspected cameras. The map says so on its About panel.

We do not know how many cameras the map is missing. As of November 9, 2026, the data file has no points in the private camera category, no point with a field photo, and no point flagged for facial recognition.

The OpenStreetMap sync covers a 10-mile radius from downtown, which reaches into Jefferson and St. Bernard parishes. Some of the 450 license plate reader points sit outside Orleans Parish. We have not counted how many.

How to help

Read the code. If you find a bug, a privacy problem, or a claim in this post that the code does not support, write to [email protected].

Report a camera. Open RETINA, find your block, and use Report a camera for anything missing. The README’s field guide says Project NOLA cameras are usually larger than ordinary business cameras, often on a pan-tilt mount on the outside of a cooperating business, and pointed at the street. Send a close-up and a wider shot that shows the building.

Then sign the petition to stop illegal surveillance in New Orleans and send it to someone who lives here.