Projects · Privacy
Doppler Scrub
On 3 November I read a post on X about a video in which a YouTube creator, Colsto, worked out where a clip was filmed from the planes flying over it. My first thought was "what if we build the thing that takes those planes out?", and I built it that day.
- to clean a 2-minute test clip
- 7.7 s
- open source
- MIT
dopplerscrub.comGitHubThe video that started it
As a plane passes, its engine tone drops in pitch. The shape of that drop gives its speed and the moment it was closest. Public flight tracks then show which aircraft it was, which puts the camera under its path. The hum from the power grid can date a clip, because the grid's 50/60 Hz frequency drifts slightly over time and that drift is logged.
Doppler Scrub removes plane and vehicle tones, that hum, and the GPS and device metadata. It keeps voices, birds, wind and room tone. Each removed tone is filled with background noise matched to the room, because a silent gap would trace the same curve.
It runs in the browser on your phone or laptop. The video never leaves your device, and the code is open so you can check that. A jet's broadband rumble still rises and falls around the moment it passed. So far I've tested it on synthetic flyovers plus a handful of real phone clips.
Screens

The 2-minute test clip before and after: both flyover curves gone 
The app after a synthetic clip: 64 tones and 8 hum harmonics removed, 3.56% of the audio changed 
The landing page: a flyover curve on a field of dots, broken up at the scrub line
How it's built
The scrub is one Python file. It tracks tones on a spectrogram, a picture of pitch over time, keeps the ones that glide steadily down or sit on the grid's harmonics, and fills them with shaped noise. The page runs that same file in the browser through Pyodide, which puts Python in a web page, so there's no backend. Mediabunny reads and writes the video with the browser's own codecs instead of FFmpeg, so a hostile file never reaches a C decoder in the page.
I built it with Claude Code and tracked it in Linear. My first detector, tuned on synthetic tones, missed a faint glide on my own phone clip that a messaging app had re-compressed.
Spec
- Status
- Live at dopplerscrub.com
- License
- MIT, open source
- Runs
- In the browser, on phone or laptop; the video never leaves the device
- Removes
- Aircraft and vehicle Doppler tones, mains hum and its harmonics, GPS, capture time and device metadata
- Keeps
- Voices, birds, wind, room tone; the picture is copied untouched
- Test
- 2-minute synthetic clip with 2 simulated flyovers, 7.7 s on a laptop, both flight curves at noise level
- Make smaller
- Optional 1080p re-encode with the device's own encoder; a 23 MB test clip came out at 7.7 MB
- Stack
- Python (numpy, scipy) via Pyodide, Mediabunny, WebCodecs, three.js, Vercel
- Built with
- Claude Code
- Built
- 3 Nov 2026 to now
- Code
- github.com/danielcanton/doppler-scrub