I made a similar site 20 years ago (an applet, what else) and a lot of people seem to be wondering "how does it work" or "where does the data come from?". I can only describe how I implemented it, but it's probably similar.<p>Data is not "real time" for each satellite in any sense. But since satellites follow orbits, it's enough to have recent state, and you can extrapolate where they are. The data comes from places like NORAD, and has a standardized format called a "Two line element set". <a href="https://en.wikipedia.org/wiki/Two-line_element_set" rel="nofollow">https://en.wikipedia.org/wiki/Two-line_element_set</a><p>Here is the current state of the international space station for example as described in a TLE:<p><pre><code> ISS (ZARYA)
1 25544U 98067A 19238.30917157 .00002323 00000-0 48072-4 0 9991
2 25544 51.6438 13.4147 0007728 328.5901 233.9236 15.50389701186137
</code></pre>
It's mostly opaque but we can see near the end of the second line that at the current orbit means it does around 15.5 orbits per day.
When I implemented my app, I just grabbed some data from a public link with up to date TLE's. Such as this one, for the 100 brightest satellites is a good start for a simple visualization app.<p><a href="https://www.celestrak.com/NORAD/elements/visual.txt" rel="nofollow">https://www.celestrak.com/NORAD/elements/visual.txt</a><p>Once you have the TLE for a satellite which describes where it was a while ago, you need a function that gives you the <i>current</i> state vector for the satellite, given the time delta since the known state. Far from earth this can be done approximately with simple orbital mechanics, but close to earth you need to account for athmospheric drag and also the uneven or "bumpy" gravitational field. At some point someone devised a set of algorithms for this called the simplified perturbations models in 1988 <a href="https://en.wikipedia.org/wiki/Simplified_perturbations_models" rel="nofollow">https://en.wikipedia.org/wiki/Simplified_perturbations_model...</a><p>Basically current_state = SGP4(old_state, time_since_old_state)<p>Luckily, these functions were released together with a Fortran implementation, so porting it to whatever language you want is fairly straight forward. Here is an example port of SGP4 to python <a href="https://github.com/brandon-rhodes/python-sgp4/blob/master/sgp4/propagation.py" rel="nofollow">https://github.com/brandon-rhodes/python-sgp4/blob/master/sg...</a>