A free, open-source interactive 3D global map of terrestrial fiber optic networks and telecom backhaul infrastructure.
Inspired by OpenGridWorks for electricity grids — but for fiber.
openfibermap.github.io/OpenFiberMap (deployed via GitHub Pages)
OpenFiberMap visualizes the world's fiber optic backbone infrastructure on a CesiumJS 3D globe:
- Fiber spans — routes with operator, capacity, status, burial type, length
- Network nodes — IXPs, data centers, PoPs, submarine cable landing stations, amplifiers
- Filters — by region, operator, status, capacity class
- Search — by operator name, city, or lat/lon coordinates
- Share view — copy a URL encoding current filters + camera position
- Timeline — filter planned/under-construction builds by year range
- Info panel — full metadata + source links + PeeringDB integration
- Underground mode — translucent terrain to see buried cable routes
- 3D / 2D toggle — switch between globe and flat map views
- Node.js ≥ 20
- Python ≥ 3.10 (for ETL only)
git clone https://github.com/jastman/OpenFiberMap.git
cd OpenFiberMap
npm install
pip install -r requirements.txtcp .env.local.example .env.local
# Edit .env.local to add your Cesium ion token (free at https://ion.cesium.com)
# The app works without a token — it uses OSM imagery + flat terrain.# Offline (uses curated seed data — fast, no network required):
bash scripts/run_etl.sh --offline
# Online (fetches live data from PeeringDB, Submarine Cable Map, etc.):
bash scripts/run_etl.shnpm run dev
# → http://localhost:5173- Fork this repo
- Go to Settings → Pages → Source: set to GitHub Actions
- Optionally set
CESIUM_ION_TOKENin Settings → Secrets → Actions - Push to
main— the workflow automatically builds and deploys
The workflow runs ETL (offline mode) → Vite build → deploy to Pages.
npm install -g vercel
vercel --prod
# Set VITE_CESIUM_ION_TOKEN in Vercel dashboard → Project Settings → Environment Variables
# Or: vercel env add VITE_CESIUM_ION_TOKENvercel.json is pre-configured with correct SPA rewrites and GeoJSON cache headers.
npm run build
# Serve the dist/ directory with any static file server:
npx serve dist/
# or: nginx pointing root to dist/| Layer | Technology |
|---|---|
| Globe | CesiumJS 1.115 |
| Frontend | Vite 5 + React 18 + TypeScript 5 |
| Styling | Tailwind CSS 3 |
| ETL | Python 3 (requests, jsonschema) |
| Data format | GeoJSON (OFDS-aligned) + CZML |
| Deployment | GitHub Pages / Vercel |
OpenFiberMap/
├── public/data/ Static GeoJSON + CZML served at /data/
│ ├── fiber-global.geojson All merged features
│ ├── spans-*.geojson Per-source span files
│ ├── nodes-*.geojson Per-source node files
│ ├── fiber-*.czml Cesium CZML (generated from GeoJSON)
│ └── metadata.json Dataset statistics
├── data/
│ ├── samples/ Reference sample GeoJSON
│ └── raw/ ETL download cache (gitignored)
├── schema/
│ ├── fiber-schema.json JSON Schema (Draft 2020-12)
│ └── README.md Schema documentation
├── scripts/
│ ├── etl/ Python ETL fetchers
│ │ ├── fetch_peeringdb.py
│ │ ├── fetch_ofds_datasets.py
│ │ ├── fetch_submarine_cables.py
│ │ ├── fetch_afterfibre.py
│ │ ├── fetch_brazil_rnp.py
│ │ ├── fetch_osm.py
│ │ ├── merge.py
│ │ └── generate_czml.py
│ ├── run_etl.sh Master pipeline script
│ └── validate_schema.py Schema validator CLI
├── src/
│ ├── components/ React UI components
│ ├── hooks/ Custom React hooks
│ ├── lib/ Cesium styling + data loading
│ └── types/ TypeScript types
├── docs/
│ ├── PHASE1-DATA-SOURCES.md
│ └── CONTRIBUTING.md
└── .github/workflows/ CI/CD (deploy + validate)
All data comes from public, openly licensed sources. Every GeoJSON feature carries source, source_url, license, and attribution properties.
| Source | Region | License | Type |
|---|---|---|---|
| AfTerFibre (NSRC) | Africa | CC-BY-4.0 | Spans + Nodes |
| OFDS-datasets (stevesong) | Global | CC-BY-4.0 | Spans + Nodes |
| PeeringDB | Global | CC0-1.0 | Nodes (IXP/DC) |
| Submarine Cable Map | Global | CC-BY-SA-4.0 | Nodes (landing) |
| RNP Brazil | Brazil | CC-BY-4.0 | Spans + Nodes |
| ANATEL | Brazil | CC-BY-4.0 | Spans |
| OpenStreetMap | Global | ODbL-1.0 | Spans + Nodes |
⚠️ Data limitations: Route geometries are often approximate. Coverage is incomplete for many regions. See the About panel in the app for full disclaimer.
OpenFiberMap accepts contributions of open/publicly licensed fiber network data via the OFDS pipeline.
- Data must be publicly available under CC0, CC-BY, CC-BY-SA, ODbL, or equivalent
- Route geometries must be in WGS84 (EPSG:4326)
- Never submit data scraped from paywalled or login-required sources
-
Convert your data to the OFM GeoJSON schema:
# See schema/fiber-schema.json for the full spec # See data/samples/sample-africa.geojson for a working example
-
Validate it:
python scripts/validate_schema.py your-data.geojson -v
-
Write an ETL fetcher in
scripts/etl/fetch_yourregion.pyfollowing the pattern of existing fetchers. -
Add it to
scripts/run_etl.shandscripts/etl/merge.py'sINCLUDE_PATTERNS. -
Open a Pull Request with:
- The fetcher script
- An entry in
docs/PHASE1-DATA-SOURCES.md - A sample output file in
data/samples/
See docs/CONTRIBUTING.md for full details.
- Cesium 3D Tiles output for large-scale datasets (> 1M features)
- OSM real-time diff sync (Osmium changeset monitoring)
- User-submitted route corrections (GitHub Issues template)
- EU / GÉANT + Internet2 backbone layers
- Asia-Pacific data (APRICOT/APNIC networks)
- Crowdsourced mode (OFDS-validated submissions via PR bot)
- Export: download visible features as GeoJSON / KML
Code: MIT License — see LICENSE
Data: Each dataset retains its original license (see per-feature license property in GeoJSON). Derived merged datasets are released under ODbL 1.0 where all source licenses permit.
OpenFiberMap is a public good. If you use it, please credit the original data sources.