The Problem

Amateur radio operators and satellite enthusiasts need to know when satellites will pass overhead, where to point their antennas, and what frequencies to use. Desktop tools like Gpredict handle this well, but Android options are limited, often require network access for calculations, or are ad-supported. Look4Sat addresses this with an offline-first Android tracker that computes orbital positions and passes locally.

What This Does

Look4Sat is a Kotlin Android app that tracks radio satellites and predicts passes up to 10 days ahead. It pulls TLE data from Celestrak and SatNOGS, then performs all orbital calculations offline using its own prediction engine in core/domain/src/main/java/com/rtbishop/look4sat/core/domain/predict/. The app shows live position, ground track on a map, pass schedules, and transceiver information.

The codebase is organized into three layers: core/domain (models, prediction math, repository interfaces), core/data (Room database, network sources, repositories), and core/presentation (Compose UI, navigation, theming). A single feature module, feature/map, handles the map view with bundled offline tiles. The build uses Gradle with a custom convention plugin system in build-logic/convention/ to keep module configurations consistent.

How To Use It

Setup: Build with Gradle. The repo has build.gradle.kts and app/build.gradle.kts, so ./gradlew assembleDebug produces an APK. The app is also published on Google Play and F-Droid.

Configuration: Station position is set in-app via Settings. No API keys or environment variables are required. TLE data updates are manual — the app recommends a weekly refresh.

Running it: The entry point is MainActivity.kt in app/src/main/java/com/rtbishop/look4sat/. Launch the app, let it download TLE data, then search by satellite name or NORAD ID.

git clone https://github.com/rt-bishop/Look4Sat.git cd Look4Sat ./gradlew assembleDebug

Real-World Use

A ham radio operator planning a satellite contact sets their station coordinates in Settings, refreshes TLE data, and searches for AO-91. The app shows the next pass time, max elevation, and the transceiver frequency. During the pass, the map view displays the ground track and footprint, helping the operator aim a directional antenna. The offline calculation engine means this works in the field without cellular coverage.

Code Health & Issues

Med - Limited test coverage - Only 2 test files exist (DataParserTest.kt, QthConverterTest.kt) for the entire prediction engine. Orbital mechanics are error-prone; the pass prediction logic in OrbitalPass.kt and NearEarthObject.kt is untested. Low - CI is release-only - .github/workflows/release.yml exists but there's no separate test/build verification workflow. Tests may not run on every push. Low - Bundled map assets - The feature/map/src/main/assets/tiles/ folder contains many WebP tiles. This keeps the map offline but inflates APK size; verify the tradeoff is acceptable. Low - No dependency version catalog - Versions are likely scattered across individual build.gradle.kts files rather than a central libs.versions.toml, making upgrades more tedious.

The Bottom Line

Look4Sat is a well-structured, genuinely offline satellite tracker with clean architecture and no ads. The prediction engine is the core value and it deserves more test coverage, but for its niche — ham radio operators who need reliable pass predictions on Android — it is a solid, practical tool. The project is mature enough for daily use and is actively distributed through both Google Play and F-Droid.