☄️
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:
- Distance: Due to the geometry of the Earth and the ~95 km reflection altitude, the optimal distance is usually between 1000 km and 1600 km. Distances below 700 km require very steep reflection angles, and distances over 2200 km are physically blocked by Earth's curvature.
- Transmitter Power (ERP): Higher effective radiated power dramatically increases the chance of receiving a decodable burst.
- Diurnal Variation: The Earth "sweeps" up more background sporadic meteors on its leading edge. This means meteor scatter is statistically best in the early morning (around 6 AM local time) and worst in the early evening (around 6 PM).
- Meteor Showers: Annual meteor showers (like the Perseids or Geminids) provide a massive spike in activity. During a shower, meteors originate from a specific point in the sky called the radiant, making forward scatter highly directional and predictable.
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*.
| Factor | Description |
| Distance Curve | Peak scores are awarded to transmitters between 1200 km and 1600 km away. Scores taper off linearly below 1200 km and above 1600 km. |
| Transmitter ERP | Logarithmic bonus. High-power transmitters (e.g., 100 kW+) add significant points because meteor scatter is heavily power-dependent. |
| Rotor Beamwidth | Massive penalty for transmitters lying outside of your configured antenna beamwidth (when a PST Rotator is connected). |
| Terrain Blocking | Evaluates the physical horizon at 3km and 10km to ensure the path to the 95km scatter layer is not physically blocked by mountains. |
| Diurnal Multiplier | Earth 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 Alignment | If 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 Altitude | If 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 Activity | A server-side simulated radar model provides dynamic multipliers to represent bursts of background activity. |
| Off-Beam Penalty | Negative | Drastic 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 Blocking | Penalty (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
4.3 · Meteor Showers & Sporadics
The plugin tracks major annual meteor showers automatically based on the current date:
- Quadrantids (Peak ~Jan 3)
- Lyrids (Peak ~Apr 22)
- Eta Aquariids (Peak ~May 6)
- Perseids (Peak ~Aug 12)
- Orionids (Peak ~Oct 21)
- Leonids (Peak ~Nov 17)
- Geminids (Peak ~Dec 14)
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:
- Frequency (87.5–108.0 MHz)
- ERP – Effective Radiated Power in kW
- Location – latitude, longitude, city name, ITU country code
- Station name / PS name – programme name
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) │
└──────────────────────────────────────────────────────────────────────┘
| Element | Meaning |
| 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 Dropdown | Allows you to override the auto-detected meteor shower, or force "Sporadic" background mode. |
| Hotspot dots on map | Large, semi-transparent colored circles marking the geographic midpoint (the optimal reflection zone) between you and the transmitter. |
| TX dots on map | Small colored circles marking the actual transmitter location. |
| Shower Ideal Lines | Cyan 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 Cone | A red cone indicating your current antenna beamwidth. Transmitters outside this wedge are heavily penalized. |
| Tune button | Clicking a frequency in the list sends a tune command (T{freq_kHz}) to the FM-DX-Webserver. |
| Audio Stream Play/Stop | Clicking the play icon next to a frequency will fetch and start the live audio webstream for that station. |
| Elevation profile | Shown 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 bar | Displays 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
- Min/Max Distance (km): Sets the minimum and maximum distance for the great-circle path between the transmitter and receiver. Airplane scatter typically occurs between 400 km and 1500 km.
- Min TX ERP (kW): Filters out weak transmitters. Higher ERP values generally produce more reliable scatter reflections.
- Min Score (%): Hides candidates falling below this percentage score.
- Strict Min Score: When enabled, the plugin strictly enforces the minimum score, potentially showing fewer results if none meet the threshold. When disabled (auto relax), the plugin may lower the threshold to ensure some candidates are always displayed.
- Frequency Filter: Allows you to apply a whitelist or blacklist to ignore local, strong, or unwanted frequencies. See Section 7.1.
Antenna & Rotor Setup
- Antenna Beamwidth: Defines the horizontal opening angle (in degrees) of your receiving antenna (e.g., 50°). Aircraft and transmitter paths falling outside this cone will receive a severe off-beam gain penalty.
- Static Azimuth (No Rotor): If you do not have an active motorized rotor connected to the webserver, set your antenna's fixed pointing direction here. The map will project your beam cone based on this value, and the off-beam penalty will be calculated against it.
Display & Scoring
- Target candidates: The target number of high-scoring candidates the prediction engine should try to find and display in the side panel.
- Map draw limit: The maximum number of hotspots/aircraft pairs drawn on the Leaflet map simultaneously (to prevent browser lag).
- Sun weighting: When enabled, applies a daytime absorption penalty to the score based on the current solar elevation angle at the receiver's location.
Terrain Configuration
- Real Terrain Blocking: When enabled, the plugin performs a topographic line-of-sight check near your receiver. If local hills or mountains physically block the required take-off angle towards the scatter event, the candidate's score is drastically reduced (x0.15) to reflect the blocked signal path.
- RX/TX antenna height AGL (m): The height above ground level for your receiving antenna and the assumed height for transmitting antennas. Used to calculate radio horizons more accurately.
- Collapse groups by default: Determines whether the candidate list on the left side is expanded or collapsed upon loading.
Live Radar Integration
- Live Radar Data: The plugin periodically fetches live radar telemetry to determine current atmospheric scatter activity. Depending on the current live status, global score multipliers may be applied dynamically to reflect real-world propagation conditions.
System UI
- Use Metric System: Toggles distance and altitude displays between kilometers/meters and miles/feet.
- Web server automatically right-aligned: If checked, the main FM-DX-Webserver dashboard UI will shift to the right when the plugin is active, preventing the side panel from overlapping your tuner controls.
7.1 · Blacklist and Whitelist Configuration
Place plain text files in the plugins/MeteorScatter/ directory on the server:
blacklist.txt – frequencies to exclude (one per line, e.g. 98.00)
whitelist.txt – frequencies to include exclusively (all others hidden)
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
| Plugin | Benefit with Meteor Scatter |
| RDS-Logger | Logs all RDS PI codes and station names received. Useful for post-event analysis of which scatter events actually produced a decodable signal. |
| AI-Denoise | For equalising and denoising audio signals during scatter reception. Meteor pings are often noisy and distorted, benefiting heavily from AI-based noise reduction. |
| RDS-AI-Decoder | For decoding RDS as quickly as possible during short-term scatter bursts. Accelerates PI/PS identification within the narrow burst window. |
| PST Rotator | Enables 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
- Patience is Key: Meteor scatter requires waiting. Set your receiver to an empty frequency, point your antenna according to the hotspot map, and wait for "pings" (short whistles) or "bursts" (sudden audio fragments).
- Trust the Distance: Unlike tropo, 300 km is a *terrible* distance for MS. Aim for hotspots in the 1200 - 1500 km range.
- Watch the Radiants: During major showers like the Perseids (August) or Geminids (December), ignore the background and strictly follow the cyan "Ideal Lines" radiating from your QTH on the map.
- Early Morning is Best: If no shower is active, wake up early. 6 AM local time is statistically the peak of daily background sporadic meteor activity.
10 · Changelog
Version 1.1 – April 2026 Current
- Live Radar Model: Added server-side simulated radar data (via
/api/meteorscatter/live_radar) that feeds dynamic scoring multipliers based on background bursts.
- Antenna Beamwidth & Rotor Penalties: Hotspots outside the defined antenna beamwidth (when connected to a PST Rotator) receive massive scoring penalties. The beamwidth is visualized as a red cone overlay on the map.
- Terrain Blocking Checks: Optional checking algorithm (3km and 10km path horizon checks) penalizes candidates that are physically obstructed by terrain.
- Refined Shower Model: Gaussian modeling of the proximity to meteor shower peak dates and radiant elevation modeling (rewards mid-elevation alignments).
Version 1.0 – April 2026
- Meteor Scatter Prediction Engine: Core geometry and astronomy algorithms implemented for calculating optimal 95km reflection midpoints.
- Shower Tracking: Automatic tracking of major annual meteor showers (Quadrantids, Lyrids, Eta Aquariids, Perseids, Orionids, Leonids, Geminids) with radiant-based forward scatter lines.
- Diurnal & Sun Modeling: Scoring system accounts for Earth's leading edge and solar altitude.
- Server-Side Caching: High-performance TX and Elevation database caching via
meteorscatter_server.js.
- Interactive UI: Live Leaflet map with hotspot markers, grouped list panel, and integrated audio streaming.
- Frequency Filtering: Support for whitelist/blacklist to hide local splatter frequencies.
- Auto Update Checker: The plugin now alerts users if a new version is available on GitHub.
- UI Additions: Web server interface can now automatically align to the right.