A module for MagicMirror² that displays live satellite imagery of our planet as a beautiful globe on your mirror.
Fork of LukeSkywalker92/MMM-Globe, originally created by Luke Scheffler. His elegant idea of using CSS
clip-path: circle()to turn square satellite images into a globe is the heart of this module. Thank you, Luke!
Four SLIDER perspectives — GeoColor imagery from four geostationary satellites, each with day/night visualization and city lights:
From left to right: GOES-19 (Americas), Meteosat (Europe/Africa), GOES-18 (Pacific), Himawari (Asia/Australia)
The original MMM-Globe module has been unmaintained since 2021 but worked perfectly fine for years — until February 2026, when EUMETSAT discontinued their static image server at eumetview.eumetsat.int. This broke the European satellite styles (europeDiscNat, europeDiscSnow) that many European MagicMirror users relied on.
EUMETSAT migrated to a new dynamic platform at view.eumetsat.int, but this is a JavaScript web application — there are no static image URLs to point the module at. EUMETSAT does however offer a WMS (Web Map Service) endpoint that can deliver satellite images in geostationary projection — perfect for globe display (see Using EUMETSAT WMS below).
Additionally, the CIRA SLIDER service operated by NOAA/RAMMB at Colorado State University provides Meteosat full-disk imagery as PNG tiles, including the excellent GeoColor product — natural color during the day and city lights on a Blue Marble background at night. This makes for a particularly stunning globe display around sunrise and sunset.
This fork adds both options, plus a coastline/border overlay, image saving, configurable logging, and numerous bugfixes. The architecture has been completely refactored in v3.0.0: all image fetching now runs server-side in the node_helper, the frontend is a pure display layer, and all styles share a single download pipeline.
Navigate into your MagicMirror's modules folder and execute:
git clone https://github.com/rkorell/MMM-Globe.gitNo additional dependencies are needed — the module uses only Node.js built-in modules.
Add the following to your config.js:
{
module: "MMM-Globe",
position: "lower_third",
config: {
style: "geoColorEurope", // see Available Styles below
imageSize: 600,
enableImageSaving: false,
logLevel: "ERROR" // "ERROR", "WARN", "INFO", "DEBUG"
}
},For the Americas view with night city lights:
config: {
style: "geoColorUSA",
imageSize: 600
}| Option | Description |
|---|---|
style |
Image style. See Available styles below. Type: string Default: "geoColor" |
imageSize |
Size of the displayed image in pixels. Type: integer Default: 600 |
updateInterval |
How often the image is refreshed (in milliseconds). Not used for meteosat (which auto-polls every 60s and only updates when a new image is available).Default: 10 * 60 * 1000 (10 minutes) |
ownImagePath |
URL to a custom image. Overrides style when set. Works with any image URL, including EUMETSAT WMS (see below).Default: "" |
retryDelay |
Delay before retrying after a failed SLIDER API poll (milliseconds). For non-SLIDER styles, retries happen automatically at the next updateInterval.Default: 30000 (30 seconds) |
enableImageSaving |
Save each satellite image to the images/ subfolder. For the meteosat style, files are named with the SLIDER timestamp (e.g., globe_20260227123000.png) and duplicates are skipped automatically. For other styles, files are named with the local download time and duplicate images are detected via content hash (identical images are not saved again).Type: boolean Default: false |
coastlines |
Show a coastline and country border underlay beneath the satellite image. Only applies to static styles — SLIDER styles (geoColor*) already have natural coastlines in the GeoColor imagery. The underlay is subtle (semi-transparent white lines on black) and only visible where the satellite image is dark (night side), thanks to CSS mix-blend-mode: lighten. Choose the projection matching your satellite view.Values: false (off), "europe" (0° longitude), "americas" (-75.2° longitude), "asia" (140.7° longitude)Default: false |
logLevel |
Controls logging verbosity in pm2 logs. "ERROR": only errors. "WARN": adds warnings (e.g., failed fetches). "INFO": adds new images and saves. "DEBUG": adds poll activity, startup details, and duplicate detection.Values: "ERROR", "WARN", "INFO", "DEBUG" Default: "ERROR" |
These styles use the CIRA SLIDER API and auto-poll every 60 seconds. They only download when a new image is available (typically every 10-15 minutes depending on the satellite).
| Style | Satellite | Region | Status |
|---|---|---|---|
geoColorEurope |
Meteosat (0°) | Europe / Africa | Active |
geoColorUSA |
GOES-19 (75.2°W) | North / South America | Active |
geoColorPacific |
GOES-18 (137.0°W) | Pacific / West Americas | Active |
geoColorAsia |
Himawari (140.7°E) | Asia / Australia | Active |
meteosat |
(alias for geoColorEurope) |
Active |
| Style | Satellite | Region | Source | Status |
|---|---|---|---|---|
geoColor |
Himawari-8 | Asia / Pacific | RAMMB | Active |
natColor |
Himawari-8 | Asia / Pacific | RAMMB | Active |
airMass |
Himawari-8 | Asia / Pacific | RAMMB | Active |
fullBand |
Himawari-8 | Asia / Pacific | RAMMB | Active |
centralAmericaDiscNat |
GOES-16 | Americas | NOAA STAR | Active |
europeDiscNat |
Meteosat MSG | Europe / Africa | EUMETSAT | Discontinued (Feb 2026) |
europeDiscSnow |
Meteosat MSG | Europe / Africa | EUMETSAT | Discontinued (Feb 2026) |
Note: If you were using europeDiscNat or europeDiscSnow, switch to geoColorEurope — it provides the same Meteosat satellite view of Europe and Africa, with the bonus of a beautiful nighttime visualization. The old meteosat style name still works as an alias.
EUMETSAT's WMS endpoint at view.eumetsat.int can deliver satellite images in geostationary projection, which displays as a perfect globe with MMM-Globe's CSS circle clipping. Combined with the coastlines: "europe" underlay, this effectively recreates the discontinued europeDiscNat imagery — the old EUMETSAT static images had the same kind of coastline/border overlay baked in. Use the ownImagePath option with a WMS GetMap URL:
config: {
ownImagePath: "https://view.eumetsat.int/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=msg_fes:rgb_naturalenhncd&bbox=-6500000,-6500000,6500000,6500000&width=600&height=600&srs=AUTO:42003,9001,0,0&styles=&format=image/png&BGCOLOR=0x000000",
imageSize: 600,
updateInterval: 15 * 60 * 1000,
coastlines: "europe",
logLevel: "INFO" // see new images in pm2 logs
}The key parameter is srs=AUTO:42003,9001,{longitude},0 — this geostationary projection centered on the satellite's longitude produces a round Earth disc. Set BGCOLOR=0x000000 for a black background.
Some useful WMS layers:
| Layer | Description |
|---|---|
msg_fes:rgb_naturalenhncd |
Natural enhanced color (day side only, best colors) |
mtg_fd:rgb_geocolour |
MTG GeoColour (full disk, brownish tint) |
mtg_fd:rgb_truecolour |
MTG True Colour (full disk) |
The msg_fes layers update every 15 minutes, mtg_fd layers every 10 minutes. Set updateInterval accordingly.
Note: Coastlines are only applied for static styles. SLIDER styles (geoColorEurope, geoColorUSA, etc.) already include natural coastlines in their GeoColor imagery — the overlay is automatically suppressed.
The coastlines option adds a subtle underlay of coastlines and country borders beneath the satellite image. Three pre-rendered PNG overlays (1200×1200, downscaled for thinner lines) are included, each in the correct geostationary projection:
"europe"— centered at 0° longitude (Meteosat perspective)"americas"— centered at -75.2° longitude (GOES-16 perspective)"asia"— centered at 140.7° longitude (Himawari-8 perspective)
The underlay uses CSS mix-blend-mode: lighten, which means the coastlines are only visible where the satellite image is dark (night side or black background). On the bright day side, the satellite image dominates completely. This creates a natural effect where borders fade in as the Earth rotates into night.
The coastline data comes from Natural Earth (ne_10m_coastline + ne_boundary_lines_land) via the EUMETSAT WMS background layers.
The module uses a clean backend/frontend separation. The frontend knows nothing about remote URLs, polling, or image saving — it only displays what the backend provides.
Backend (node_helper.js) — all image fetching runs server-side for consistent logging in pm2 and to avoid CORS issues. Three methods with clear responsibilities:
pollSlider(SLIDER styles: geoColorEurope/USA/Pacific/Asia): Polls the CIRA SLIDER API every 60 seconds for the configured satellite, compares the latest timestamp with the previously known one, and triggers a download only when a new image is available. On error or timeout, retries afterretryDelay.pollStatic(all other styles +ownImagePath): Triggers a download at eachupdateInterval. Covers all built-in styles (geoColor, natColor, airMass, fullBand, europeDisc*, centralAmericaDiscNat) as well as custom URLs viaownImagePath.downloadAndServe(shared by both polling methods): Downloads the image, writes it toimages/current.png, and sends the local file path to the frontend. WhenenableImageSavingistrue, a timestamped copy is also saved. Duplicate detection uses SLIDER timestamps (filename-based) for meteosat and MD5 content hashes for all other styles. All HTTP requests have timeouts (15s for API calls, 30s for image downloads) to prevent stalled polling chains.
Frontend (MMM-Globe.js) — pure display layer. On start, immediately loads current.png if it exists (instant recovery after browser refresh). Receives image path updates from the backend, loads them into an <img> element, and renders with CSS clip-path: circle(). Optionally adds a coastline underlay via CSS mix-blend-mode: lighten (static styles only — SLIDER styles have natural coastlines).
- Four SLIDER perspectives: GeoColor imagery from four geostationary satellites —
geoColorEurope(Meteosat),geoColorUSA(GOES-19),geoColorPacific(GOES-18),geoColorAsia(Himawari). All provide the same beautiful day/night visualization with city lights. - Backwards compatible: The old
meteosatstyle name continues to work as an alias forgeoColorEurope. - Frontend self-recovery: The frontend now loads
current.pngimmediately on start, providing instant display after browser refresh without waiting for the next backend poll cycle. - Coastlines for static styles only: The
coastlinesoverlay is automatically suppressed for SLIDER styles, which already have natural coastlines in the GeoColor imagery.
Complete refactoring of the module's internal architecture. The frontend and backend responsibilities are now cleanly separated:
- Single download pipeline: All image fetching consolidated into one shared
downloadAndServe()method used by both SLIDER and static polling. Previously, different styles used different fetch paths with duplicated logic, and some paths downloaded images twice (once for display, once for saving). - Frontend is display-only: The frontend (
MMM-Globe.js) no longer fetches images, manages URLs, or knows aboutenableImageSaving. It receives a local file path from the backend and displays it. All polling, downloading, saving, and error handling runs in the backend (node_helper.js). - HTTP timeouts: All HTTP requests now have timeouts (15s for API calls, 30s for image downloads). Previously, a stalled HTTP connection could block the entire polling chain indefinitely.
- Configurable logging (
logLevel): Four levels (ERROR, WARN, INFO, DEBUG) with an unconditional startup message. Default is ERROR (silent operation). All logging happens in the backend (visible in pm2 logs), not in the Electron browser console. - Coastline/border underlay: Configurable
coastlinesoption with three pre-rendered overlays (europe, americas, asia) in the correct geostationary projection for each satellite view.
- Meteosat via CIRA SLIDER (
style: "meteosat"): Full-disk GeoColor imagery of Europe/Africa with day/night visualization - EUMETSAT WMS support: Use
ownImagePathwith WMS GetMap URLs in geostationary projection - Image saving for all styles:
enableImageSavingworks for all styles, not just meteosat - Smart SLIDER polling: Polls every 60s but only downloads when a genuinely new image is available
europeDiscSnowhi-res URL mismatch: The original had a key mismatch betweenimageUrls(europeDiscSnow) andhiResImageUrls(europePartSnow). UsingeuropeDiscSnowwithimageSize > 800silently failed. Both keys are now consistent.- Mixed content (HTTP → HTTPS): All RAMMB image URLs updated from
http://tohttps://. - Loose equality operators: All
==/!=replaced with strict===/!==. - Cache-buster for URLs with query string: The original appended
?timestampas a cache-buster, which broke URLs that already contain a?(such as WMS URLs). Now correctly uses&when a query string is already present. - Startup reliability: Image loading moved out of
getDom()into the backend polling loop with automatic retry on failure, so the globe appears even when the network isn't ready at boot time. - Double image downloads: When
enableImageSavingwas enabled, images were downloaded twice — once for display, once for saving. Now a single download serves both purposes. - No HTTP timeouts: The original had no timeouts on HTTP requests. A stalled connection (e.g., unresponsive image server) would silently stop all polling. Now enforced at 15s/30s.
loadImageas global function: The original'sloadImage()function was defined in the global scope, risking name collisions with other modules. Now scoped as_loadImage()inside the module.europeDiscNatheight hack: Removed a hard-coded height adjustment ingetDom()that was specific to the discontinuedeuropeDiscNatstyle's non-square image format.- Silent frontend failures: Image load errors in the frontend were swallowed silently. Now logged via
Log.warn().
.gitignoreconsolidated,images/directory excluded- Screenshot link changed to absolute GitHub URL
package.jsonupdated for fork
The module polls the SLIDER API for four geostationary satellites:
| Style | Satellite path | Coverage |
|---|---|---|
geoColorEurope |
meteosat-0deg |
Europe / Africa |
geoColorUSA |
goes-19 |
Americas |
geoColorPacific |
goes-18 |
Pacific |
geoColorAsia |
himawari |
Asia / Australia |
The polling mechanism is identical for all satellites:
- Query
https://slider.cira.colostate.edu/data/json/{sat}/full_disk/geocolor/latest_times.jsonfor available timestamps - Take the most recent timestamp (e.g.,
20260227123000) - Construct the tile URL:
https://slider.cira.colostate.edu/data/imagery/2026/02/27/{sat}---full_disk/geocolor/20260227123000/00/000_000.png
Zoom level 00 returns the full disk as a single 464×464 PNG tile — perfect for MMM-Globe's CSS circle clipping. All four satellites provide the GeoColor product with natural daytime colors and city lights on a Blue Marble background at night.
The geostationary projection AUTO:42003,9001,{lon},0 maps the visible Earth disk as seen from a geostationary satellite at the given longitude. This produces a circular Earth image that works perfectly with the module's clip-path: circle() styling.
- Luke Scheffler (@lukecodewalker on the MagicMirror forum) for creating MMM-Globe. The original module's design — a simple, elegant idea that turns satellite imagery into a globe using pure CSS — is what makes this module so appealing. This fork builds on his work.
- CIRA / RAMMB at Colorado State University for providing the SLIDER satellite imagery service, freely available to the public.
- EUMETSAT for providing the WMS endpoint and Natural Earth background layers used for the coastline underlay.
MIT — see LICENCE.

