Inspiration: i wanted to build something that pushed way past normal web dev something that needed real math real data pipelines and heavy real time rendering standard crud apps are boring so i picked satellite tracking because it demands sgp4 orbital mechanics tight sub frame rendering budgets and processing thousands of state vectors per second i wanted to build an actual universe in the browser
What it does : OrbitVoyage is a high performance 3d satellite tracker and collision detection system it takes raw two line element tle data from norad celestrak calculates orbital positions using the sgp4 algorithm and renders hundreds of satellites on a 3d webgl globe but it doesnt just look cool it actively monitors for potential satellite collisions in near real time it processes miss distances and broadcasts high risk events to the client using websockets all while keeping a strict 16ms frame budget for a crazy smooth 60fps
How we built it: the backend is a nestjs cron job that pulls tle catalogs from celestrak every hour for stuff like starlink gps and the iss it caps at 360 objects per batch to keep latency low parses them and caches them in memory then it sends the batches to a python service that runs sgp4 propagation to get position and velocity in eci coords on the frontend i wrote a custom orbitmath file to get keplerian elements using the vis viva equation and angular momentum cross product a separate service scans everything every 30 seconds to compute miss distances and time of closest approach if the risk score is above a certain threshold it blasts the event to all clients via websocket
Challenges we ran into: the first massive issue was scale low earth orbit is like 400km up and geo is 36000km up if i mapped that normally leo would be invisible and geo would be off screen i fixed this by writing a logarithmic altitude compression math formula so visual altitude is log 1 plus altitude divided by 450 times 0 45 this keeps the orbital bands in order but visible next was the frame budget updating 250 satellites and 3d math every frame kills performance i used react usememo heavily and switched the three js globe to use instanced meshes which dropped my draw calls from over 250 down to exactly 1 finally tle data gets stale fast and celestrak goes down sometimes to fix this i built a fallback with 12 hardcoded famous objects like the iss and hubble so even if the network dies the globe never looks empty
Accomplishments that we're proud of: im super proud of actually making heavy space math work with frontend rendering doing the vis viva equation in typescript managing a nestjs and python microservice architecture and hitting a perfect 60fps with three js instanced meshes while calculating collision math in the background is a huge flex for me
What we learned: i learned the deep details of orbital mechanics like the difference between earth centered inertial coords and regular geographic coords i leveled up my webgl skills big time realizing that instancing is the only way to get real 3d performance and i learned how to build backend pipelines that dont crash when third party apis fail
What's next for OrbitVoyage: right now collision detection is o n squared which is heavy so i want to build an octree or k d tree on the backend to pre filter pairs and drop the math complexity to o n log n i also want to compile the sgp4 math into webassembly so the browser can just do the propagation natively without talking to the backend and lastly add a database to track orbital decay over time
Log in or sign up for Devpost to join the conversation.