RoamingEye is designed so new data is easy to add. There are two common kinds of contribution. Both are great first PRs.
The timeline's switchable layers live in one catalog. To add one:
-
Find the GIBS layer. Browse NASA Worldview or the GIBS layer list and note the exact WMS layer identifier and its temporal coverage.
-
Add it to
LAYERSinsrc/lib/timeline.ts:lst: { id: "lst", label: "Land surface temp", wmsLayer: "MODIS_Terra_L3_Land_Surface_Temp_Monthly_Day", start: { year: 2000, month: 3 }, description: "Monthly daytime land-surface temperature.", },
-
Register it in
LAYER_ORDER(same file) so the selector shows it. -
Add a unit test in
timeline.test.tsif it has any special handling. -
Run
npm run dev, pick the new layer, and scrub. Done — the selector, prefetch, and scrubbing all work automatically.
Tip: if the layer needs a non-default resolution or date convention, that lives alongside the layer config; keep any new logic pure and tested.
Overlays are self-contained classes implementing the MapOverlay interface in
src/overlays/types.ts:
export interface MapOverlay {
readonly id: string;
readonly label: string;
readonly icon: string; // inline SVG (see src/ui/icons.ts)
readonly object: THREE.Object3D;
readonly defaultOn?: boolean;
ensureLoaded?(): Promise<void>; // lazy data fetch on first enable
}Steps:
- Create
src/overlays/MyOverlay.ts. Build a Three.js object (lines, points, a mesh). UselatLngToVector3(lat, lon, radius)fromsrc/lib/geo.tsto place things on the globe — pick a radius just above the base (≈1.001–1.004) to layer cleanly. If it loads remote data, fetch it viafetchJsonfromsrc/lib/net.tsinsideensureLoaded(). - Add an icon to
src/ui/icons.ts(a small inline SVG). - Register it in the
overlaysarray insrc/main.ts. The toolbar, lazy-loading, and toggling are wired automatically. - Bundle data if needed: drop a slimmed file in
public/data/(and, ideally, extendscripts/prepare-data.mjsso it's reproducible). Keep files small. - Attribute the source in
DATA_SOURCES.mdand the in-app footer if it's a new provider.
Look at GraticuleOverlay (pure geometry), BordersOverlay (fetched GeoJSON →
lines), and CitiesOverlay (points) as references.
-
npm run lint && npm run typecheck && npm run test && npm run buildpass. - Data source is open and attributed.
- Commits are signed off (
git commit -s).
Thank you for widening what RoamingEye can show the world. 🌍