A Chrome extension that brings geo-spatial awareness into NFV orchestration workflows, helping network operators plan and schedule service deployments over Non-Terrestrial Networks (NTN).
Managing network services over Non-Terrestrial Networks presents a unique challenge: the infrastructure — LEO/MEO satellites — is constantly moving, while the end users and service areas are fixed to the ground. Classical ETSI MANO orchestrators like Open Source MANO (OSM) are designed for static infrastructure and have no native concept of satellite visibility windows or coverage constraints.
OSM-GIS bridges that gap. It is a browser extension that overlays an interactive map directly inside the OSM dashboard (or any compatible web UI). The operator can:
- Visualise the real-time position and ground track of one or more satellites, propagated live from TLE data fetched from Celestrak.
- Draw or select a target geographic area — the region where the network service must be reachable.
- Calculate the time windows during which each satellite has coverage over that area (i.e. when a pass occurs).
- Export those windows as cron-based scheduling triggers compatible with OSM's NSD
additionalParams, enabling the orchestrator to automatically instantiate and terminate the service only when the satellite is overhead.
The result is a workflow where the operator defines where the service is needed, the extension computes when the satellite will be there, and OSM handles how the service is deployed — all without leaving the browser.
The extension is composed of two complementary injection modes and a self-contained map application.
Chrome Extension
│
├── inject_panel.js Content script (runs on every page)
│ └── Looks for a <div id="map"> in the host page.
│ If found, replaces its content with an <iframe>
│ pointing to popup.html. This is the primary mode
│ used inside the OSM dashboard, where the map
│ panel is embedded directly in the workflow UI.
│
├── popup.html / popup.js Standalone popup (toolbar icon)
│ └── Opened when the user clicks the extension icon.
│ Useful outside the OSM dashboard or for quick
│ access. Attempts to auto-detect the active
│ satellite name from the current tab's DOM.
│
└── Map Application (popup.html + modules/)
├── modules/map.js OpenLayers map, all layers, draw interaction
├── modules/ui_manager.js UI events, layer toggles, WFS-T, pass calculation
├── modules/satellite_utils.js TLE propagation, coverage window algorithm
├── modules/time_manager.js Real / simulated time switch
└── modules/config.js Runtime config loaded from chrome.storage
| Layer | Source | Purpose |
|---|---|---|
| Base map | CartoDB Dark Matter (XYZ) | Dark background for contrast |
| Political boundaries | Local GeoServer WFS (ne:countries) |
Country outlines for geographic context |
| Coverage areas | Local GeoServer WFS (i2cat:coverage_areas) |
Persistent service areas stored server-side |
| Satellite orbit | Computed from TLE (satellite.js) | Predicted ground track for the next ~3 hours |
| Satellite marker | Computed from TLE, updates every 500 ms | Real-time position icon |
| Clouds / Precipitation | OpenWeatherMap tile API | Optional weather overlay |
| ITU BBMaps layers | ITU public WMS | Transmitters, submarine cables, earth stations, nodes |
When the OSM UI renders a VIM Accounts page, inject_panel.js detects the <div id="map"> placeholder and fills it with the map iframe. The popup also scrapes the VIM account names from the table (app-vim-account-details tbody tr) and pre-loads the matching TLEs, so the satellite(s) assigned to that VIM appear on the map immediately.
Drawn or selected coverage areas are persisted to GeoServer via WFS-T (transactional insert and delete), making them available across sessions and users.
-
Load satellites — Type one or more satellite names (comma-separated) in the Satellite field and press Enter. TLE data is fetched from Celestrak. The orbit ground track is drawn on the map and the satellite marker starts updating in real time.
-
Select or draw a target area — Click an existing country or coverage polygon on the map to select it, or click Draw Region to draw a custom polygon. The drawn area is saved to GeoServer automatically.
-
Calculate passes — Click Calc Passes. The extension propagates the satellite position at 30-second intervals over the next ~3 hours and uses bisection to find precise entry/exit times for each pass over the selected area.
-
Export to OSM — Click the Status label to toggle to cron format. The output is a YAML block ready to paste into an OSM NSD as
additionalParams.triggers. Click COPY to inject it directly into the#configtextarea of the active OSM tab. -
Manage layers — Use the Layers dropdown to toggle weather overlays, ITU infrastructure data, and the political base map.
- Chrome (or any Chromium-based browser) version 109 or later (Manifest V3 support required).
- A running GeoServer instance accessible from the browser, with:
- A WFS layer
ne:countriesfor political boundaries. - A WFS-T layer
i2cat:coverage_areasfor persistent drawn areas (schema inplugin/schema.xml).
- A WFS layer
- An OpenWeatherMap API key if you want to use the weather overlay layers.
- An OSM (Open Source MANO) deployment if you want the full dashboard integration and cron export workflow. The extension works as a standalone satellite tracker without it.
- Clone or download this repository.
- Open Chrome and navigate to
chrome://extensions. - Enable Developer mode (toggle in the top-right corner).
- Click Load unpacked and select the
plugin/directory. - Right-click the extension icon and choose Options to set your GeoServer URL and OpenWeatherMap API key.
All runtime configuration is stored in chrome.storage.local and edited via the Options page (right-click the extension icon → Options).
| Setting | Default | Description |
|---|---|---|
| GeoServer Base URL | http://172.27.12.34:8082/geoserver |
Base URL for all WFS and WFS-T requests |
| OpenWeatherMap API Key | (bundled key) | Used for clouds and precipitation tile layers |
To simulate a specific date/time for pass calculation (useful for testing), edit TIME_CONFIG in plugin/modules/time_manager.js and set useSimulatedTime: true.
plugin/
├── manifest.json Extension manifest (MV3)
├── popup.html Main map UI
├── popup.js Entry point (ES module)
├── popup.css UI styles
├── inject_panel.js Content script — iframe injector
├── options.html Settings page
├── options.js Settings page logic
├── ol.js OpenLayers (bundled)
├── ol.css OpenLayers styles
├── proj4.js Proj4 projection library (bundled)
├── satellite.min.js satellite.js SGP4 library (bundled)
├── saticon.png Satellite marker icon
├── schema.xml GeoServer WFS-T schema for coverage_areas
└── modules/
├── config.js Runtime config + chrome.storage loader
├── map.js OpenLayers map, layers, interactions
├── satellite_utils.js TLE propagation, coverage windows, formatters
├── time_manager.js Real / simulated time
└── ui_manager.js UI event wiring and orchestration
Licensed under the GNU AFFERO GENERAL PUBLIC LICENSE. See https://www.gnu.org/licenses/agpl-3.0.en.html.
For licensing enquiries: techtransfer@i2cat.net
Third-party libraries bundled in this repository (ol.js, proj4.js, satellite.min.js) are subject to their own respective licenses (BSD 2-Clause, MIT, and MIT respectively).