All plugins

aircraft-doppler-geolocation

Find aircraft flyover Doppler curves in a recording, fit speed and distance, and score candidate locations against ADS-B tracks you supply. No network or credentials. Scripts run ffmpeg on the path you pass and write CSV, PNG, and JSON beside it. PyPI packages install only after Hermes dependency consent. Disclosure — skill scripts run ffmpeg and Python via the terminal tool on the recording you name and write CSV/PNG/JSON at the output path you give; no network calls; the method can geolocate where a recording was made, so use it only on recordings you are entitled to analyse.

mojomast8Toolsv0.1.1Updated 2 days ago

About

Find aircraft flyover Doppler curves in a recording, fit speed and distance, and score candidate locations against ADS-B tracks you supply. No network or credentials. Scripts run ffmpeg on the path you pass and write CSV, PNG, and JSON beside it. PyPI packages install only after Hermes dependency consent. Disclosure — skill scripts run ffmpeg and Python via the terminal tool on the recording you name and write CSV/PNG/JSON at the output path you give; no network calls; the method can geolocate where a recording was made, so use it only on recordings you are entitled to analyse.

aircraft-doppler-geolocation

Hermes plugin that locates where (and optionally when) a recording was made from the Doppler curves of aircraft flying over, often too faint to hear, matched against ADS-B flight tracks. It ships one skill and three local scripts.

It is a community plugin by Kyle Durepos. It is not a Nous Research product. The method comes from colsto's video I discovered a sound that leaks your exact location (and it's everywhere). The author released no code; these scripts are an independent implementation of the steps he describes, not his pipeline.

Catalog banner

What you get

One skill, aircraft-doppler-geolocation:aircraft-doppler-geolocation, and three scripts in skills/aircraft-doppler-geolocation/scripts/:

| Script | Job |
| --- | --- |
| doppler_track.py | Decode audio/video with ffmpeg, trace the flyover tone on a narrow-band spectrogram (Viterbi ridge), and fit base tone, speed, closest-approach slant distance, and closest-approach time. Writes CSV, PNG, JSON with a detected flag, ridge_snr_z, and rejected_because. Options --min-snr and --max-slope. |
| score_candidates.py | For a real flight track (ADS-B CSV) and candidate points (lat, lon, ground elevation), model the exact curve each point would hear using the velocity at emission time, and rank points by misfit in Hz. --plot writes a heatmap. |
| make_synthetic_test.py | Offline self-test: synthetic curved flyover buried in noise, fit, then locate the observer on a grid. |

Disclosure

  • register() only calls ctx.register_skill. No tools, hooks, or middleware.
  • doppler_track.py runs ffmpeg (no shell) on the path you pass. Scripts read only the paths you pass and write the outputs you name.
  • No network calls, credentials, telemetry, or self-updater. The plugin does not fetch ADS-B or elevation data; the skill names sources (pyopensky, traffic, adsb.lol, ADS-B Exchange, OpenTopography) for you to use.
  • Enabling the plugin asks Hermes to install numpy, scipy, soundfile, and matplotlib (pinned ranges in pyproject.toml). Install ffmpeg yourself.

Details are in SECURITY.md.

Install

Until a maintainer lists it in the Hermes catalog:

hermes plugins install mojomast/hermes-aircraft-doppler-geolocation --no-enable
hermes plugins enable aircraft-doppler-geolocation

After catalog acceptance, the reviewed install is hermes plugins install aircraft-doppler-geolocation.

Use it from a shell

S=skills/aircraft-doppler-geolocation/scripts
python $S/doppler_track.py clip.mp4 --fmin 60 --fmax 250 --out ev1
python $S/score_candidates.py track.csv candidates.csv ev1.csv --f0 110 --rec-start 1725827820 --dt-tol 2 --plot scores.png
python $S/make_synthetic_test.py

Self-test result

Images below come from real runs of the scripts on the synthetic self-test, not mockups.

doppler_track.py: band spectrogram with the traced ridge (cyan) and the fitted flyover model (green).

Synthetic spectrogram with traced ridge and fit

score_candidates.py --plot: misfit per candidate on a 200 m grid, the curving ADS-B track, the top 5 ranks, and the true observer (star). Rank 1 is the true point; the mirror-image cluster on the other side of the track is ranks 3 to 5.

Candidate scoring heatmap

Terminal: the self-test, pytest, and hermes plugins validate . output captured from the box and rendered to PNG.

Self-test, pytest and hermes validate passing

A synthetic propeller tone (110 Hz, 80 m/s, 900 m altitude, gently turning) with tone amplitude 0.29 against noise σ 1.0 is recovered as f0 110.0 Hz, 80.4 m/s, slant 1039 m (true 1040 m). With the recording start known to ±2 s, the true grid point ranks first (0 m error on a 200 m grid). Without a known time, a single flyover lands at the right distance but about 1.4 km off along the track, which is the ambiguity the video describes. A second flyover at a fixed offset, or a known time, is required.

Real-world test (v0.1.1)

Run on 5 public YouTube clips (audio only), 2026-11-02:

| Clip | Result |
| --- | --- |
| Planes Flying Overhead While the Birds Sing (City Limits Sound) | 2 flyovers detected: 94.9 Hz, 59 m/s, 1.53 km, 1.27 Hz rms; and 247.6 Hz (2nd harmonic), 97 m/s, 2.08 km, 0.61 Hz rms. The two harmonics of pass 2 disagree on speed by about 8%, so treat the stderr as optimistic. |
| Cessna 421 takeoff, Puerto Princesa (Palawan Skies Aviation) | Detected in 85-145 Hz: 109.4 Hz, 63 m/s (~122 kt), 295 m. A higher band failed: the tracker hops between crossing harmonics. |
| Cessna Conquest 425 flyby, Hannover (HD1080ide) | Rejected. The plane was turning, so the straight-pass model does not apply. |
| Evening City Ambience in Amsterdam (Jeronimo Ambience) | No detections. |
| Outdoor atmosphere with plane flying over (Your Film Sounds) | Broadband roar with no tone. 0.1.0 reported a false fit here; 0.1.1 rejects it (ridge_snr_z 1.7). |

Real-world fit: City Limits Sound clip, pass 2

Spectrogram of audio from City Limits Sound's video Planes Flying Overhead While the Birds Sing in the Distance, with the traced ridge and fit.

Real-world fit: Cessna 421 takeoff

Spectrogram of audio from Palawan Skies Aviation's video Cessna 421 Golden Eagle takeoff at Puerto Princesa.

The tracker works on clean real tones. You still pick the frequency band and time window by eye from a spectrogram, and the detected flag is the guard against noise. Real tones scored 2.7 to 3.6 on ridge_snr_z and noise scored 1.7 to 2.0, so the margin is narrow. Geolocation scoring could not be tested: none of the clips gives a recording date or time, and no free historical ADS-B was used.

Limitations

  • ADS-B fetch, jet-type filtering, DEM lookup, the time-offset and silence filters, and grid generation are described in the skill but not scripted yet.
  • Detection is tested on real audio (above), but you choose the band by hand. Location scoring is tested on synthetic data only, not on real ADS-B.
  • Harmonics that cross each other and turning flights break the tracker or the straight-pass fit.
  • Needs ADS-B coverage, a date, and serious compute for large search areas.

Ethics

Use for forensics, journalism, research, or auditing your own recordings. Locating a person without consent can put them in danger; follow local law. Results are probabilistic and need independent visual confirmation. To protect your own clips: high-pass filters and talking over the tone do not reliably remove it, and it can survive phone compression; cutting segments, stronger noise suppression, and stripping timestamps help. Check your own spectrogram with doppler_track.py before publishing.

Tests

pip install -e ".[dev]"   # needs ffmpeg on PATH
python -m unittest discover -s tests -v   # or: python -m pytest tests -v

License

MIT

README from the reviewed commit 2c3ed20; it updates when the author re-pins.

More by mojomast

4 plugins by mojomast in the catalog.

mojomastorbit-desktopYour workspace, shaped by your agent: a bundled browser desktop powered by Hermes. Describe the workflow you need; the agent can rearrange windows and panes, customize appearance, build versioned sandboxed web apps, and refine your workspace with scoped control, previews and checkpoints. Illustrated examples show a project-specific COCS 3D asset viewer and OmniVoice experiment bench; these example apps and their backends are not bundled. Includes permission-controlled desktop agent-reply notifications (generic alerts while Orbit remains open; browser/OS restrictions apply) and 100,000-character chat messages, guidance and drafts. Includes Devplan Studio for guided interviews, specifications, phased devplans and circular-development handoff exports. Optional conversational interviews require explicit service setup and a working Hermes provider login, and send project context to that provider. Includes 14 distinctive interface presets including Nous Atelier, with local wallpapers, themed icons and taskbar treatments. Agent chats include inline expandable tool activity, running/completed/failed summaries, an activity strip, a workspace agent overview and responsive toolbar controls. Missing tool-call IDs are explicitly uncorrelated. Embedded apps retain their own styling. Includes a reviewed GitHub app catalog with immutable source pins and a portable Live Telemetry package. Catalog sync (operator-run scripts/orbit_catalog.py, never triggered by the Hermes tool or at register) reads the entry list from the upstream repo's main branch at sync time and downloads third-party static app bundles at their per-entry commit pins; installed UI runs in a sandboxed iframe and never executes backend code. Optional telemetry backend staging downloads pinned Python; execution requires explicit host-code trust and separate private authenticated HTTPS setup. Backend code runs with owner privileges, not a sandbox. Disclosure — adapter talks only to the configured local Orbit server (loopback, Bearer capability from runtime_dir); mutations off by default. Optional orbit.py setup runs npm ci / node. Bundled VNC/Xpra launchers use the Orbit page's hostname and scheme; optional Linux apps require separate provisioning. Optional api.typesafe.ai requests require explicit consent and a user-supplied key. The 0.2.7 web app's opt-in Show tools panel displays tool call arguments and results for the current Hermes conversation, fetched from the local Orbit server and local Hermes session API and kept in the browser only. The Nous Atelier theme contains Nous Research logo artwork and is unofficial; Orbit is not affiliated with Nous Research.CommunityDesktop app10mojomastcomfyrizzChat-as-frontend for the Comfyrizz film pipeline: brief, plan, revise, explicit accept, generate, CPU assemble, export, and retake. Portable Agent Plugins v1 package (plugin.json, stdio mcp.json, comfyrizz-film skill) with the MCP server in-tree. Disclosure — the stdio server launches local Node that talks only to a loopback Comfyrizz engine URL (COMFYRIZZ_ENGINE_URL); optional Streamable HTTP binds 127.0.0.1 only when deliberately enabled and has no authentication, so any local process or web page in your browser can call its tools while it runs. Paid generation (Google Colab, Comfy API, or ComfyUI) is dispatched by the agent with an approval id it reads from the engine's spend card; the bundled skill tells the model to get your explicit yes first, but Hermes itself does not prompt before paid generation or retakes. Env vars are forwarded as ${VAR} from the user environment (COMFYRIZZ_ENGINE_URL, COMFYRIZZ_MCP_HTTP, COMFYRIZZ_TOKEN, and optional provider keys); no credentials are stored in the package. No self-updater.Communitytools1mojomasthermes-session-warmerOpt-in bounded idle prompt warming for explicitly allowlisted OpenAI-compatible text-chat endpoints. Sends potentially billable requests; no tool execution or conversation writes. Does not support Codex/Responses or native Anthropic. Authenticated endpoints use optional HERMES_SESSION_WARMER_API_KEY.Communitymodels