OPEN SOURCE · 2025 · MIT LICENSE
sattrack/
A command-line satellite tracker for amateur radio operators, written by hand in C++20 to relearn the language I first learned in the late '90s.
- lang
- C++20
- build
- CMake · static ARM
- data
- CelesTrak TLEs
- model
- SGP4 · SDP4
- tests
- 224 GoogleTest cases
- license
- MIT
## why
Working a satellite on amateur radio means knowing when it will rise, where to point the antenna, and how long you have to communicate with it before it disappears below the horizon. SatTrack answers those questions from the command line: it downloads orbital elements from CelesTrak, then shows positions, look angles, real-time tracking, and upcoming passes for your station.
I mainly wrote it so I could learn modern C++. I learned the language in the late '90s, and SatTrack was my way to learn what C++11, 14, 17, and 20 added, from std::chrono time points to std::optional results.
$ sattrack passes 25544
Passes for ISS (ZARYA):
Upcoming Passes:
Satellite Start End Duration Starts In Start Az End Az Max Az Max Elev
------------------------- ------------------------- ------------------------- -------------- ------------------ ------------ ------------ ------------ ----------
25544 ISS (ZARYA) 2025-12-03 00:02:09 UTC 2025-12-03 00:06:01 UTC 3m 52s 0h 17m 9s 162.51 SSE 92.23 E 127.40 SE 14.56
25544 ISS (ZARYA) 2025-12-03 01:37:18 UTC 2025-12-03 01:43:52 UTC 6m 33s 1h 52m 18s 245.78 WSW 37.47 NE 322.04 NW 47.48
## built by hand
I wrote SatTrack myself: the TLE parser and database, the command-line interface, the pass finder above, my first orbit propagator (a Keplerian one), and the daemon, GPS, serial port, rotator, and LCD code. Where a good library already existed I used it: CLI11, curlpp, RapidJSON, spdlog, standalone Asio, and Howard Hinnant's date library.
Claude Code had a narrow, deliberate role. It wrote the unit tests and maintained the CMake build. I also had Claude Code write two specific pieces of code:
- The SGP4/SDP4 port. When I moved from my Keplerian propagator to SGP4/SDP4 for more accurate passes, I had Claude port CelesTrak's Vallado reference implementation instead of writing it myself. I wanted it integrated with the rest of the code and the C++20 standard library, so I didn't use an off-the-shelf library.
- The CelesTrak client that downloads TLE groups. This is a simple HTTP client.
## in progress
SatTrack is growing from a command-line tool into a ground-station daemon. It builds as a fully static binary for ARM boards like the BeagleBone and Raspberry Pi. The daemon reads time and position from a GPS receiver and shows them on an I²C LCD panel. The antenna rotator has a class and a serial port, but doesn't send commands yet.