Skip to main content
DC

Projects · Privacy

Doppler Scrub

  • Privacy
  • Audio

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

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

  • Spectrograms of a 2-minute synthetic test clip: before, two falling flyover curves and a stack of hum lines; after, only noise and one steady tone
    The 2-minute test clip before and after: both flyover curves gone
  • Doppler Scrub's result screen: tones removed, mains hum, metadata and audio changed, over a spectrogram that compares the scrubbed and original sound, with the removed tones marked
    The app after a synthetic clip: 64 tones and 8 hum harmonics removed, 3.56% of the audio changed
  • The dopplerscrub.com landing page: the headline The sky in your video knows where you are, over a field of dots with a flyover curve broken up at the scrub line
    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