Personal project · 2026

OrbitScope

Starlink, GPS, and the ISS on a 3D globe, watched from New York.

njoku.dev/projects/orbitscope
OrbitScope’s globe centered on the Americas, ringed with teal Starlink dots and an orange NY marker. A panel on the right searches by name and filters all, Starlink, GPS, and the ISS.

OrbitScope puts the live satellite catalog on a globe. The dots are Starlink, GPS, and the ISS. The orange marker is New York, and pass times are calculated from there.

It is not deployed yet. The code and a screenshot are on GitHub.

What you can do with it

  • Filter the sky to Starlink, GPS, the ISS, or all of them.
  • Search by name or NORAD id.
  • Click a satellite for its latitude, longitude, altitude, and the next few passes over New York. A pass counts when the satellite climbs above 10°.

The screenshot on this page is Starlink only, a bit over 10,000 satellites. GPS and the ISS are in the same catalog. The count changes when CelesTrak updates the file.

How it works

The API is Java 21 and Spring Boot. It downloads two-line element sets from CelesTrak (Starlink, GPS, and the ISS) and refreshes them every three hours. Orekit propagates those orbits. Positions for the whole catalog go out as parallel arrays, because one object per satellite was about 1.8 MB.

The globe is Cesium and TypeScript. Drawing ten thousand Entity objects was too slow, so the dots are a PointPrimitiveCollection. The map is Cesium’s built-in Natural Earth imagery, so the page does not need a Cesium ion token.

I checked the ISS against wheretheiss.at at the same timestamp. The difference was about 0.2 km. On this machine, Orekit took 165 ms for a long benchmark on 4 cores. A simpler array version took 4 ms, but it skips drag, so the globe stays on Orekit.

Run it

You need Java 21 and Node. From the repo:

./run.sh api    # http://localhost:8080
./run.sh web    # http://localhost:5173

The first API start downloads Orekit’s data files. CelesTrak returns an empty file if the request has no User-Agent, so the fetcher sends one.

Play the Kilobyte demoOpens in a new tab
KilobyteCase study
OrbitScopePersonal project
njoku.devPersonal project
Python & Java practiceIndependent study
HomePage
All projectsPage
AboutSection
ExperienceSection
SkillsSection
ContactSection
EducationSection
RésuméPrintable
Send me a messageContact form
Switch light / dark themeAppearance
GitHub@michaelnjoku347
LinkedInProfile
View this site’s sourceGitHub