Browser-based dashboard for visual and intuitive exploration of main-belt asteroids using official NASA/JPL public API data.
- Production deployment: https://asteroid-explorer.onrender.com/
- Health check: https://asteroid-explorer.onrender.com/healthz
Free Render instances can cold-start after inactivity, so the first request may take a short moment.
- Shows a prepared sample of main-belt asteroids immediately at startup for fast first paint.
- Uses that sample for charts, KPIs, and the belt navigator.
- Uses the live JPL APIs for full-catalog pagination, sorting, filtering, and object search.
- Pins a searched or table-selected object into the live sample so it appears on the map and charts even if it was not part of the prepared sample.
- Refreshes the loaded sample in memory in the background while the service is running.
- Population by size category.
- Semi-major axis vs eccentricity scatter plot.
- Semi-major axis density histogram with Kirkwood resonance guides.
- True-anomaly histogram.
- Belt navigator map.
- Full-catalog browser with server-side pagination.
- Selected-object details panel.
More detail:
This project intentionally uses a hybrid model that fits Render's free-tier constraints.
data/main-belt-startup.json
- Prepared startup sample committed into the repo.
- Includes a fixed set of non-negotiable scientifically important bodies.
- Used for initial charts, KPIs, and the belt navigator.
- Live JPL APIs
GET /api/catalogpages through the full main-belt catalog via NASA/JPL.GET /api/searchresolves named bodies and designations via NASA/JPL.- Runtime refresh updates only the currently loaded sample in memory.
Reference APIs:
- SBDB Query API:
https://ssd-api.jpl.nasa.gov/sbdb_query.api - SBDB Object API:
https://ssd-api.jpl.nasa.gov/sbdb.api
Requirements:
- Node.js 18+
Commands:
npm install
npm test
npm run devThen open:
http://localhost:4173
Regenerate data/main-belt-startup.json with the current JPL data:
npm run sample:updateOptional flags:
node scripts/update_startup_sample.mjs --size=12000
node scripts/update_startup_sample.mjs --commitWhat this command does:
- Pulls the current main-belt count from JPL.
- Re-fetches all required core bodies from
config/startup-sample-core-bodies.json. - Fills the rest of the startup sample from random JPL catalog windows.
- Writes the updated prepared sample back to
data/main-belt-startup.json. - Optionally auto-commits only the sample artifacts.
This repo is Render-first, but not Render-only.
- Reference deployment target: Render Node web service.
- Works on any Node host that can make outbound HTTPS requests to the JPL APIs.
- Static-only hosting is not enough because the app depends on same-origin API endpoints served by
server.mjs.
Current production deployment:
Recommended Render settings:
- Runtime:
Node - Build command:
npm install - Start command:
npm run serve
- No API key is required.
- No secrets are embedded in the client or server.
.env*remains ignored for future extensions, but this project does not currently need any environment secrets.
Current tests cover the core math and categorization helpers used by the frontend:
- Diameter bucketing.
- Belt-zone classification.
- Kepler solver and orbital-position sanity.
Daniel Häggström Pérez-Flecha