Satellite Observer
A pure-Dart implementation of the SGP4/SDP4 orbit propagation model - the standard algorithm used by NORAD and CelesTrak to predict satellite positions from TLE elements. No runtime dependencies, no native code, no Flutter SDK.
- Dart
- SGP4/SDP4
- Orbital Mechanics

01Propagation engine
The core is a faithful Dart port of the SGP4/SDP4 algorithm, split across sgp4_core.dart, deep_space.dart, and gravity_constants.dart. Given a set of general perturbation elements (TLEs or OMM), the propagation engine advances a satellite to any future or past epoch and returns its ECI (Earth-Centered Inertial) state vector.
The engine is deliberately stateless: each propagation call takes elements and a target time and returns a result - no mutable satellite object to track.
02Observer geometry
On top of the propagation engine sits an observer layer: given the observer's geodetic latitude, longitude, and altitude, the package converts ECI position into topocentric look-angles - azimuth, elevation, and range - at any requested time. This is what feeds a compass bearing and altitude reading in a sky-view UI.
03Pass prediction and visibility
PassFinder walks a time window, detects elevation zero-crossings (rise and set), and refines them with a root-finding step for sub-second accuracy. Each predicted pass includes rise time, set time, max elevation, and compass headings at the key moments.
Visibility filtering goes further: a pass is marked as potentially naked-eye visible only when the satellite is sunlit (above Earth's shadow cone) and the observer's sky is dark enough - both conditions evaluated from geometry, no empirical tables. TwilightPhase (astronomical, nautical, civil) feeds the sky-darkness check.
04Architecture
The celestrak package is listed only as a dev_dependency (used in the example/), not a runtime dependency - the propagation engine operates on GpElements (general perturbation elements) which can be populated from any source. This separation is an explicit architectural decision: the data layer and the computation layer are independently publishable and testable.
Next
sat-spotter-cli