dopplerprint
Work out where an audio recording was made from the aircraft you can hear in it.
A real flyover at Livermore, CA. The heatmap peaks next to the true microphone position (white dot); the faint patch across the flight track is the mirror solution that a single pass cannot rule out.
A passing propeller aircraft or helicopter leaves a tone in the recording whose pitch falls as it goes by. The shape of that curve fixes the aircraft's speed, its closest distance and the moment it was closest. dopplerprint fits those curves, looks up which aircraft were flying at that time in public ADS-B archives, and searches the ground for the point that would have heard every one of them at the right time and pitch.
Status: early research software. It works on real recordings when the start time is known to within a few minutes and the area to within a few kilometres. Contiguous US only. See Accuracy for what has been measured.
Quick start
pip install dopplerprint
dopplerprint locate recording.mp3 --start "2026-05-14 10:02 -07:00" --near "Livermore, CA"
Give it the local time the recording started, with its UTC offset (add "±10m" if unsure), and roughly where:
a place name, lat,lon or a bounding box. dopplerprint finds the aircraft passes in the audio, downloads that
day's ADS-B once (about 3.5 GB, after asking; cached in ~/.cache/dopplerprint), and prints the best location
with a confidence level and the aircraft it matched. It writes result.html (map, tracks and spectrogram),
result.geojson, result.gpkg for QGIS, and result.json.
From Python: dopplerprint.locate("recording.mp3", start=..., near=...) returns the same report as a dict.
Every flag, the cache and exit codes: docs/USAGE.md.
Prebuilt wheels cover Linux, macOS and Windows. Audio is decoded natively (WAV, FLAC, MP3, AAC/M4A, Ogg); no ffmpeg needed. To build from source, see CONTRIBUTING.md.
Accuracy
Distance from the best-scoring point to the known microphone position, on real recordings and real ADS-B data.
| Benchmark | Setup | Result |
|---|---|---|
| Livermore, CA: 40 recordings, one light-aircraft flyover each (Pathak 2026) | Start time known to ±2 s; 4 km search radius, not centred on the microphone | Right aircraft in 34/40. Median error 207 m; 5 within 100 m, 27 within 500 m. |
| Oyster Bay, NY: colsto's recording, two flyovers | Same setup as DOPPLERGEIST's published replay (±5 s, 5.6 km radius) | 79 m (DOPPLERGEIST: 52 m on the same inputs) |
What these numbers do and don't show:
- The flyover's position in the recording is supplied, not discovered: these runs test the location search,
not automatic detection.
locatedetects passes automatically; that path is not yet benchmarked. - One flyover leaves two mirror solutions, one on each side of the flight track, and trades position along the track against the clock. Most errors over 1 km are one of these. A second aircraft usually resolves them.
- The 6 misses picked a different aircraft and land 2–5 km away.
- The Oyster Bay reference is a public approximate coordinate, not a surveyed position.
How it works
- Audio. Decode, whiten and build a log-frequency spectrogram. Find tonal ridges and fit a constant-velocity Doppler curve to each: rest frequency, speed, closest-approach distance and time.
- ADS-B. Stream adsb.lol daily archives into a compact Parquet store. Jets are kept but flagged, since their tones are rarely visible.
- Search. Score candidate locations coarse to fine (200 m down to 25 m). Each candidate must explain every flyover under one shared clock offset, and loses score for loud aircraft it should have heard but didn't.
- Output. Ranked locations with a relative-likelihood map, as HTML, GeoJSON and GeoPackage.
Details: architecture, physics, audio,
ADS-B store, geodesy and terrain. The research behind each choice is in
docs/research/.
Responsible use
This tool can place a recording, and so the person who made it, on a map. Use it on your own recordings, on material published for this purpose, or with the recordist's consent. Don't use it to find, track or expose people.
Credits and data
- Method: colsto's video "This background sound leaks your exact location". DOPPLERGEIST (MIT) is an independent implementation and our comparison baseline. Project structure and GeoPackage output follow thunderprint.
- ADS-B: adsb.lol, © adsb.lol contributors, ODbL 1.0.
Track stores built from it, and the test fixtures in
crates/dp-core/tests/fixtures/adsb/, stay under ODbL. - Aircraft types: tar1090-db.
- Place names: OpenStreetMap Nominatim, data © OpenStreetMap contributors (ODbL); one request per name, cached.
- Terrain: USGS 3DEP (public domain); fallback Copernicus GLO-30, © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018, provided under COPERNICUS by the European Union and ESA.
- Geoid: NGA EGM2008 (public domain) via PROJ-data;
assets/geoid/is a CONUS crop. - Livermore recordings: Praveen Pathak, Zenodo 23424278, CC BY 4.0. Header image imagery: USGS The National Map / NAIP, public domain.
Licence
MIT, see LICENSE. Data keeps its own licence (above). Contributions welcome: CONTRIBUTING.md.
Metadata
Release files for dopplerprint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dopplerprint-0.1.0.tar.gz | 2.0 MB | With provenance | Details for dopplerprint-0.1.0.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| dopplerprint-0.1.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details for dopplerprint-0.1.0-cp311-abi3-win_amd64.whl |
| dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ ARM64 | Details for dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl |
| dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details for dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
| dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details for dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl |
| dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details for dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl |
Total release size: 78.2 MB
Release files / dopplerprint-0.1.0.tar.gz
| Download URL | dopplerprint-0.1.0.tar.gz |
|---|---|
| Size | 2.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b05a4bdce8bb8f11672688fb8440ed4ef6d0d93c7937e580ac75a84488d0d01c
|
|
BLAKE2b-256 checksum How to use checksums |
f5ccf1ff7807948016eb2e068de1ddcef9bcb7e7331295c3ece2dcccce438dde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / dopplerprint-0.1.0-cp311-abi3-win_amd64.whl
| Download URL | dopplerprint-0.1.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 8.9 MB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
02bcde56870d521bca7dcc0467971873ca2ed1cefe3aa623d5bc39247c641a51
|
|
BLAKE2b-256 checksum How to use checksums |
5db176cd0bd35fcbbd0b9c62d3a0a2e58bc3dc40847ad676495097ea260b360c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl
| Download URL | dopplerprint-0.1.0-cp311-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 22.7 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
a197d85b641eba632ba18c4564bdc0686029d0cea4fe81861119f8ba4d807cab
|
|
BLAKE2b-256 checksum How to use checksums |
aef8622c4bdf5bd05468e319c29a646ae9aa49ebf8fd5bd55ec898ad2fdd8e34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | dopplerprint-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 27.1 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9d5314c766517c7fdbfeda725b6f7c2ea6cb5fb4d359b4f903d67a7349220eb2
|
|
BLAKE2b-256 checksum How to use checksums |
bc3901435cc6e62bd707815561eb9b898836cb8785d0c4f526d84f1ac249f27b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | dopplerprint-0.1.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 8.5 MB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
12433b8c15b87bd2c12ccfe739434491500168665565fc1da6eb4a0f033dfad9
|
|
BLAKE2b-256 checksum How to use checksums |
e4d6f1d855d58568e5bc5cbdefd1d95abc1cfa53e503f5fb8cfa2d4484dc4ecd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | dopplerprint-0.1.0-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 9.0 MB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
1bdcd974c3f45a3afffb21951c5a6aeb3c9c0646ce9d23f9df094f8e9da965d5
|
|
BLAKE2b-256 checksum How to use checksums |
85c32c5de42525c4b16e85cfef0f202e40da197c66a49cc27e9eb8d5dc730268
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logSecurity for dopplerprint 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for dopplerprint-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.