Satellite Intersection Monitoring Pipeline for Locating Every Threatening Orbital Neighbor
All-vs-all satellite conjunction screener. Scans the full public catalog (~30,000 objects) for sub-5 km close approaches in about 20 seconds on consumer hardware.
Validated against CelesTrak SOCRATES: when filtered to equivalent scope (payload-vs-catalog, excluding intra-constellation pairs) and given identical TLE input, 99.9% of SOCRATES events are also flagged by this pipeline, with TCA agreeing to 1 ms and miss distance to 0.5 m at p95 - see Validation below for the breakdown. Full all-vs-all screening finds ~58,000 conjunctions per 24h window, including secondary pairs that SOCRATES excludes.
Backtested against the 2009 Iridium 33 / Cosmos 2251 collision and the 1996 CERISE / Ariane debris collision. The pipeline flags both at the deployed configuration, 0.698 km and 0.895 km from a true separation of zero. The error is dominated by TLE accuracy, not the screening.
| SIMPLETON | CelesTrak SOCRATES Plus | |
|---|---|---|
| Input | Space-Track TLEs | Space-Track TLEs |
| Propagator | SGP4 (Orekit) | SGP4 (STK) |
| Window | 24h (configurable) | 7 days |
| Threshold | 5 km (configurable) | 5 km |
| Scope | All-vs-all (~500M pairs) | Primaries vs secondaries |
| 24h conjunctions | ~58,000 (~19,000 filtered to SOCRATES scope) | ~19,000 |
| Compute time | ~20 seconds (~4,200x realtime) | ~10 hours (17x realtime) |
Full-catalog screening in 20 seconds is not the point. Screening accuracy is capped by public TLE quality, so out-speeding other screeners on the same data doesn't add anything. The value is what cheap screening unlocks.
For example, collision-avoidance maneuver planning. Dodging one conjunction can steer a satellite into several new ones, so finding a burn that clears the threat without creating worse ones means screening the whole catalog against each candidate maneuver. At seconds per scan, a brute-force sweep of hundreds of candidate burns is actually feasible. It's just a matter of adding "phantom" candidate satellites to the catalog before running the detection pipeline.
It could also help with debris-removal target selection and launch-window screening.
The detection pipeline has four stages:
Rather than calling SGP4 at every timestep, the propagator stage evaluates SGP4 at knot points spaced minutes apart and fills intermediate positions using cubic Hermite interpolation on position and velocity. At the recommended 252 s knot gap that is one real SGP4 call per 21 steps, and the scan still reproduces a no-interpolation reference exactly.
At each timestep, all satellite positions are hashed into a 1024 x 1024 x 1024 3D cell grid. Candidate pairs are generated only from same and neighboring cells. This eliminates the O(n^2) pairwise comparison.
Coarse detections are sorted by pair and timestep, clustered into events, and reduced to the closest detection per event.
Between two interpolated timesteps (12 seconds apart), relative motion is effectively linear, so squared distance is quadratic, therefore the minimum of a quadratic is just one division. No golden section, no Brent's method, no iterative SGP4 calls. Most candidates get discarded here because the analytical minimum exceeds the 5 km threshold plus a margin. Only survivors get a single SGP4 call to confirm. Events that pass are scored with collision probability synthesized from empirical SGP4 error models.
Both pipelines were run on the same TLE catalog over the same 7-day window with matching scoping filters (primary-vs-all, intra-constellation excluded, formation-flight excluded). Events match when both pipelines flag the same satellite pair with TCAs within 1 minute.
| Events | Count |
|---|---|
| SOCRATES total | 134,598 |
| SIMPLETON total | 134,758 |
| Matched | 134,472 |
| SIMPLETON only | 286 |
| SOCRATES only | 126 |
99.9% of SOCRATES events are also flagged by this pipeline. 99.8% of this pipeline's events are also flagged by SOCRATES. Agreement is flat at 99.7%+ across all seven days.
On matched events, TCA agrees to 1 ms and miss distance to 0.5 m at p95.
Methodology, TLE replication procedure, and analysis of the remaining 0.1% available at docs/7.
The docs/ directory contains experiments from benchmarking each tunable parameter. The coarse tolerance and the grid cell are derived from the step using an equation, which leaves the step and the knot gap as the only free parameters.
Fastest configuration at each accuracy level:
| Step (s) | Knot gap | Jaccard | Missed | Extra | Time |
|---|---|---|---|---|---|
| 12 | 252s | 1.00000 | 0 | 0 | 19.2s |
| 9 | 351s | 0.99998 | 0 | 1 | 18.2s |
| 9 | 450s | 0.99973 | 15 | 1 | 17.9s |
| 10.8 | 497s | 0.99949 | 30 | 0 | 17.7s |
Default configuration (bold) is the fastest that reproduces the conservative reference exactly.
- Java 25
- Spring Boot 4
- Orekit 13
- PostgreSQL / Flyway
- HTMX / Thymeleaf
Five Spring Modulith modules:
- Ui - Controllers and scheduled jobs
- Conjunction - Detection algorithms and conjunction storage
- Ingestion - Catalog synchronization from Space-Track
- Satellite - Satellite entity and repository
- Spacetrack - HTTP client for Space-Track.org API
- Java 25
- Docker Compose
- Space-Track.org account
Copy the example environment file and fill in your Space-Track credentials:
cp .env.example .env# Both PostgreSQL and the application
docker compose up
# Local
docker compose up postgres -d
./mvnw spring-boot:run