☄️ Meteor Scatter – Documentation v1.1
☄️

Meteor Scatter

Plugin Documentation
Client Plugin: meteorscatter.js
Server Plugin: meteorscatter_server.js
Version: 1.1
Author: Highpoint
Date: April 2026
v1.1

Table of Contents

1What is Meteor Scatter?3
2Why a Plugin?3
3Architecture – Data Sources and Components4
4Simple Explanation – How the Plugin Works5
4.1The Reflection Geometry5
4.2Score – What does the Percentage Mean?6
4.3Meteor Showers & Sporadics7
4.4Transmitter Database (fmdx.org)7
4.5The Map Panel – Display Elements8
5Technical Deep Dive10
5.1Scatter Score Calculation10
5.2Astronomy & Radiant Computation11
5.3Elevation Data and Topographic Profile12
5.4TX Spatial Grid Index & Database Optimization13
5.5fmdx.org TX Database – Server-Side Cache14
5.6GPS & PST Rotator WebSocket Listener15
5.7Local Node Proxy Server15
6Configuration Parameters16
7User Settings17
7.1Blacklist and Whitelist Configuration18
8Recommended Companion Plugins19
9Tips, Tricks & Best Practices20
10Changelog21

1 · What is Meteor Scatter?

Meteor Scatter (MS) is a radio propagation phenomenon where VHF signals (such as FM radio) reflect off the ionized trails left by meteors burning up in the Earth's upper atmosphere, typically at altitudes between 85 and 105 km.

Millions of meteoroids enter the atmosphere every day. While the visible "shooting star" may only last a fraction of a second, the ionized trail it leaves behind can reflect radio waves for several seconds (a "burst") or just a fraction of a second (a "ping"). Because these reflections occur high in the E-layer of the ionosphere, they allow communication and DX reception over distances far beyond the normal radio horizon — typically between 700 km and 2200 km.

Key factors that determine the success of meteor scatter reception:

2 · Why a Plugin?

While sporadic meteors happen randomly all over the sky, active meteor showers present a distinct geometric advantage. The ionized trails formed by shower meteors align with the radiant. To bounce a signal effectively from a specific transmitter to your receiver, the geometry must satisfy strict reflection conditions relative to the radiant's position in the sky.

Plugin goal: Automatically track the current date, time, and active meteor showers. Compute the live astronomical radiant of the shower, apply geometric scoring to all known high-power FM transmitters within the 700–2200 km range, and visualize the most likely "hotspots" for meteor scatter reception in real time.

This allows the DX operator to aim their antenna and tune their receiver to the exact frequencies and directions that the current astronomical geometry heavily favors, rather than just guessing.

3 · Architecture – Data Sources and Components

┌──────────────────────────────────────────────────────────────────────┐ │ User's Browser │ │ │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ meteorscatter.js │ │ │ │ │ │ │ │ ┌─────────────────┐ ┌──────────────────────────────────┐ │ │ │ │ │ Data Fetching │ │ Astronomy & Geometry Engine │ │ │ │ │ │ │ │ │ │ │ │ │ │ /api/fmdx ────┼──▶│ • getActiveShower() │ │ │ │ │ │ (server RAM) │ │ • getRadiantAzAlt() │ │ │ │ │ │ │ │ • getSunAltDeg() │ │ │ │ │ │ /api/.../radar ┼──▶│ • fetchLiveRadar() │ │ │ │ │ │ │ │ • calcMeteorScatter() │ │ │ │ │ │ opentopodata ─┼──▶│ • gaussianAlignment() │ │ │ │ │ │ Elevation API │ │ • midpointGreatCircle() │ │ │ │ │ │ │ │ • fetchPathElevation() │ │ │ │ │ └─────────────────┘ └──────────────┬───────────────────┘ │ │ │ │ │ │ │ │ │ ┌────────────────────────────────────▼─────────────────┐ │ │ │ │ │ State Management │ │ │ │ │ │ │ │ │ │ │ │ currentCands[] – active scored hotspots │ │ │ │ │ │ txStations[] – loaded TX database │ │ │ │ │ │ _elevCache{} – terrain elevation cache │ │ │ │ │ │ _pathElevCache{} – profile elevation cache │ │ │ │ │ │ currentRadiantAz – live shower azimuth │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ │ │ UI Layer (Leaflet.js Map) │ │ │ │ │ │ │ │ │ │ │ │ • Left list panel – grouped by location, sorted │ │ │ │ │ │ • Live map with hotspot markers & radiant lines │ │ │ │ │ │ • Elevation profile canvas with 95km meteor height │ │ │ │ │ │ • Rotor Beamwidth overlay │ │ │ │ │ │ • Status bar (Shower name, Sun Alt, Radar Status) │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ ◀── WebSocket /data_plugins ─── FM-DX-Webserver (GPS + PST Rotator) │ │ ◀── /api/meteorscatter/fmdx meteorscatter_server.js (RAM) │ │ ◀── /api/meteorscatter/proxy meteorscatter_server.js (proxy) │ │ ◀── /api/meteorscatter/radar meteorscatter_server.js (Radar Model) │ └──────────────────────────────────────────────────────────────────────┘ Server side (meteorscatter_server.js): ┌──────────────────────────────────────────────────────────────────┐ │ Priority 1: tx_search.js RAM ← zero download, shared DB │ │ Priority 2: Disk cache (fmdx_full.json) ← survives restart │ │ Priority 3: Upstream fetch ← maps.fmdx.org (last resort) │ └──────────────────────────────────────────────────────────────────┘

4 · Simple Explanation – How the Plugin Works

Unlike airplane scatter, which tracks physical moving objects in real-time, meteor scatter prediction is statistical and geometrical. The plugin calculates the best potential paths for a meteor ping to occur, right now, based on astronomical data and transmitter properties.

4.1 · The Reflection Geometry

The optimal location for a meteor to reflect a signal from a transmitter (TX) to your receiver (RX) is near the geometric midpoint between the two, at an altitude of approximately 95 km. The plugin computes this midpoint and evaluates the geometric viability.

Transmitter (TX) Receiver (RX) │ │ │ │ ▼ ▼ TX ───────────────────────────────────────────── RX ← Distance: 1400 km Earth's Surface ↗ signal path scatter ↘ TX ─────── Meteor Trail (Altitude ~95 km) ──────── RX (Hotspot Location: Midpoint)

The distance is the most critical fixed factor. Because the reflection happens at ~95 km, paths shorter than 700 km require the signal to hit the meteor trail at a very steep angle, which is inefficient. Paths longer than 2200 km are blocked by the curvature of the Earth itself.

4.2 · Score – What does the Percentage Mean?

The hotspot score is a composite of astronomical and physical factors. It determines how likely you are to receive pings from that specific transmitter *right now*.

FactorDescription
Distance CurvePeak scores are awarded to transmitters between 1200 km and 1600 km away. Scores taper off linearly below 1200 km and above 1600 km.
Transmitter ERPLogarithmic bonus. High-power transmitters (e.g., 100 kW+) add significant points because meteor scatter is heavily power-dependent.
Rotor BeamwidthMassive penalty for transmitters lying outside of your configured antenna beamwidth (when a PST Rotator is connected).
Terrain BlockingEvaluates the physical horizon at 3km and 10km to ensure the path to the 95km scatter layer is not physically blocked by mountains.
Diurnal MultiplierEarth sweeps up more random meteors on its leading edge. The score applies a multiplier that peaks around 06:00 Local Solar Time and hits a minimum around 18:00.
Shower Radiant AlignmentIf a major meteor shower is active, forward scatter heavily favors transmitters located at specific azimuths relative to the shower's radiant. The plugin applies a Gaussian reward for transmitters sitting on these ideal forward-scatter lines.
Radiant AltitudeIf the shower's radiant is below the horizon, shower meteors are blocked by the Earth. The score drops significantly (though sporadic meteors are still possible).
Sun Weighting (Optional)Meteors ionizing in sunlight can sometimes behave differently due to background D-layer ionization. This applies a slight adjustment based on solar altitude.
Live Radar ActivityA server-side simulated radar model provides dynamic multipliers to represent bursts of background activity.
Off-Beam PenaltyNegativeDrastic score reduction (gain penalty) if the candidate falls outside your receiving antenna's defined beamwidth. Calculated using live rotor telemetry or your configured static azimuth.
Terrain BlockingPenalty (x0.15)Massive score reduction if the signal path is physically blocked by local terrain. The plugin checks real topographic elevation data at 3 km and 10 km from the receiver to calculate the required take-off angle.

Score colour scale in the UI

score ≥ 80% (Excellent)
Red
score ≥ 60% (High)
Orange
score ≥ 40% (Medium)
Yellow
score < 40% (Low)
Green

4.3 · Meteor Showers & Sporadics

The plugin tracks major annual meteor showers automatically based on the current date:

When a shower is active, the map will display the Ideal Lines (Forward Scatter) radiating from your receiver. Tuning to transmitters along these lines drastically improves the odds of catching bursts.

If no shower is active, or if you select "Sporadic (Background)" from the dropdown, the plugin relies purely on diurnal timing, distance, and ERP to score the best candidate transmitters.

4.4 · Transmitter Database (fmdx.org)

The TX database originates from maps.fmdx.org/api/ and is managed entirely on the server side by meteorscatter_server.js. By default, it queries transmitters between 700 km and 2200 km from your receiver.

Each transmitter entry provides:

4.5 · The Map Panel – Display Elements

┌──────────────────────────────────────────────────────────────────────┐ │ 📡 Scatter Candidates │ ☄️ Meteor Scatter ⚙ ↺ ✕ │ ├──────────────────────────────┤ [Auto (Current Date)] │ │ v 🇫🇷 Paris [FRA] │ │ │ [83%] │ ┌───────────────────────────────┐ │ │ ▶ 87.80 MHz France Mus │ │ │ │ │ ▶ 91.30 MHz Inter │ │ [Leaflet Map] │ │ │ │ │ │ │ │ > 🇩🇪 Munich [DEU] │ │ 🔵 Receiver QTH │ │ │ [67%] │ │ 🟡/🟠/🔴 Midpoint Hotspots │ │ │ │ │ ─ ─ Shower Ideal Lines │ │ │ > 🇬🇧 London [GBR] │ │ ◣◢ Rotor Beamwidth Wedge │ │ │ [44%] │ │ │ │ │ │ │ │ │ │ │ └───────────────────────────────┘ │ │ │ │ │ │ ┌───────────────────────────────┐ │ │ │ │ RX ──── TX [Elev. Profile] │ │ │ │ │ Line of sight + 95km meteor │ │ │ │ │ representation │ │ │ │ └───────────────────────────────┘ │ ├──────────────────────────────┴───────────────────────────────────────┤ │ Time: 14:30 | Radar: Normal | Shower: Perseids (peak 8/12) │ └──────────────────────────────────────────────────────────────────────┘
ElementMeaning
Candidate list (left panel)Grouped by transmitter location/city. Clicking a group expands it to show all frequencies at that site. Rows show frequency, PS name, polarisation, ERP, and score.
Shower DropdownAllows you to override the auto-detected meteor shower, or force "Sporadic" background mode.
Hotspot dots on mapLarge, semi-transparent colored circles marking the geographic midpoint (the optimal reflection zone) between you and the transmitter.
TX dots on mapSmall colored circles marking the actual transmitter location.
Shower Ideal LinesCyan lines radiating from your QTH. These lines represent ±90° offset from the current shower radiant. Transmitters lying along these lines offer the best forward-scatter geometry.
Rotor Beamwidth ConeA red cone indicating your current antenna beamwidth. Transmitters outside this wedge are heavily penalized.
Tune buttonClicking a frequency in the list sends a tune command (T{freq_kHz}) to the FM-DX-Webserver.
Audio Stream Play/StopClicking the play icon next to a frequency will fetch and start the live audio webstream for that station.
Elevation profileShown below the map when a TX is clicked. Shows the terrain along the path, Earth's curvature effects, line-of-sight boundaries, and visually marks the 95 km meteor reflection height.
Status barDisplays current time, number of active hotspots mapped, score cutoff, current solar altitude, rotor position, radar status, and active shower details.

5 · Technical Deep Dive

5.1 · Scatter Score Calculation

The core scoring function calcMeteorScatter(rxLat, rxLon, tx, ctx) is evaluated for every transmitter passing the distance filter (700-2200 km).

Step 1 – Base Score (Distance & ERP)

Distance shapes the baseline score. The ideal reflection zone is 1200 - 1600 km. Penalties apply outside this window. ERP is added logarithmically.

let score = 100;
if (dist < 1200) score -= (1200 - dist) * 0.05;
if (dist > 1600) score -= (dist - 1600) * 0.05;

score += Math.min(15, Math.log10(Math.max(1e-6, tx.erp)) * 5);

Step 2 – Beamwidth & Terrain Blocking Penalty

In version 1.1, transmitters outside the configured rotor beamwidth suffer massive penalties. Also, a physical horizon check reduces scores if the signal path is obstructed.

// Rotor beamwidth check
const halfBeam = S.beamwidth / 2;
if (adiff > halfBeam) {
    score -= ((adiff - halfBeam) * 2.5);
}

// Terrain Blocking (if enabled)
const maxScatterDist = 2000 + radioHorizonRx + radioHorizonTx;
if (dist > maxScatterDist) {
    score -= 40;
}

Step 3 – Shower Radiant Alignment (If Active)

If a meteor shower is active, the algorithm determines the two ideal forward-scatter azimuths (±90° from the radiant azimuth). A Gaussian curve evaluates how close the transmitter's bearing is to these ideal lines.

const diff1 = Math.abs(txBrg - ctx.ideal1), adiff1 = Math.min(diff1, 360 - diff1);
const diff2 = Math.abs(txBrg - ctx.ideal2), adiff2 = Math.min(diff2, 360 - diff2);
const minDiff = Math.min(adiff1, adiff2);

// Apply Gaussian alignment reward
const alignment = gaussianAlignment(minDiff, 45);
score *= (0.25 + 0.75 * alignment);

Step 4 – Diurnal Variation

Sporadic background meteors peak roughly at 6:00 AM local solar time and hit a trough at 18:00. This interacts with seasonal variations as well.

5.2 · Astronomy & Radiant Computation

The plugin internally tracks time via Julian Dates to compute celestial mechanics without relying on external APIs.

Radiant Azimuth & Altitude

Using the shower's Right Ascension (RA) and Declination (Dec), the plugin calculates the Local Sidereal Time (LST) and transforms the equatorial coordinates into local horizontal coordinates (Azimuth, Altitude) to determine exactly where in your sky the meteors are coming from.

function getRadiantAzAlt(raDeg, decDeg, lat, lon, date) {
    // Converts RA/Dec to Az/Alt via Greenwich Mean Sidereal Time (GMST)
    ...
    return { az: azRad / PI_180, alt: altRad / PI_180 };
}

Solar Altitude & Diurnal Curve

Sun altitude is used for optional D-layer weighting. The local solar hour is calculated based on the receiver's longitude to model the Earth's leading edge sweeping up meteors.

5.3 · Elevation Data and Topographic Profile

Like Airplane Scatter, terrain elevation data is fetched from APIs and cached on the server (elevation_cache.json) to prevent rate limits.

The profile is built from 75 equidistant great-circle sample points. However, instead of tracking a 10 km cruising aircraft, the profile highlights the 95 km meteor layer at the midpoint.

Elevation profile cross-section (schematic): Altitude (Log scale visually) ▲ │ [Meteor at 95,000m] │ ★ │ / \ │ / \ │ / \ │ ──────────────────────/───────────────\──────────────── │ ████████████████████/███████████████████\█████████████ ← Terrain │ └──────────────────────────────────────────────────────▶ Distance (RX → TX) RX TX

The profile canvas accounts for Earth's curvature drop mathematically, ensuring that paths over 2000 km correctly show the horizon blocking effect.

5.4 · TX Spatial Grid Index & Database Optimization

To keep the browser responsive, the server script (meteorscatter_server.js) performs a pre-filter. When the client requests the database, the server already culls transmitters outside the requested radius (e.g., 2200 km) and below the minimum ERP (e.g., 100 kW).

5.5 · fmdx.org TX Database – Server-Side Cache

The full 50 MB fmdx.org dataset is managed on the server with a priority cascade identical to Airplane Scatter:

Priority 1 – tx_search.js RAM (zero download, shared with webserver core) Priority 2 – Disk cache (fmdx_full.json, survives server restart) Priority 3 – Upstream fetch from maps.fmdx.org (last resort)

5.6 · GPS & PST Rotator WebSocket Listener

The plugin listens to /data_plugins. If GPS data is broadcasted, it automatically updates the receiver's QTH. If a PST Rotator is active, the red rotor line is rendered on the live map.

5.7 · Local Node Proxy Server

The meteorscatter_server.js backend attaches to the FM-DX-Webserver HTTP server and exposes proxy endpoints for audio streams and elevation APIs, securely dodging CORS restrictions.

6 · Configuration Parameters

The plugin contains several hardcoded parameters at the top of meteorscatter.js related to the astronomical databases and UI updates.

// Major meteor showers (ZHR = Zenithal Hourly Rate)
const METEOR_SHOWERS = [
    { id: "quadrantids",   name: "Quadrantids",   start: [1, 1],  end: [1, 5],  ... },
    { id: "perseids",      name: "Perseids",      start: [7, 17], end: [8, 24], ... },
    ...
];

// Score colour thresholds
const SCORE_EXCELLENT     = 80;
const SCORE_HIGH          = 60;
const SCORE_MEDIUM        = 40;

7 · User Settings

The plugin offers a variety of customizable parameters accessible via the gear icon in the map header. These settings allow you to tailor the scatter prediction engine to your specific location, equipment, and preferences.

General & Filters

Antenna & Rotor Setup

Display & Scoring

Terrain Configuration

Live Radar Integration

System UI

7.1 · Blacklist and Whitelist Configuration

Place plain text files in the plugins/MeteorScatter/ directory on the server:

Lines starting with # are treated as comments and ignored. Only values in the FM broadcast range (87.5–108.0 MHz) are accepted.

8 · Recommended Companion Plugins

PluginBenefit with Meteor Scatter
RDS-LoggerLogs all RDS PI codes and station names received. Useful for post-event analysis of which scatter events actually produced a decodable signal.
AI-DenoiseFor equalising and denoising audio signals during scatter reception. Meteor pings are often noisy and distorted, benefiting heavily from AI-based noise reduction.
RDS-AI-DecoderFor decoding RDS as quickly as possible during short-term scatter bursts. Accelerates PI/PS identification within the narrow burst window.
PST RotatorEnables precise antenna aiming toward the calculated hotspot and radiant forward-scatter lines, utilizing the plugin's built-in beamwidth overlay.

9 · Tips, Tricks & Best Practices

10 · Changelog

Version 1.1 – April 2026 Current


Version 1.0 – April 2026