Terminal UI for visualizing NASA's Deep Space Network in real-time
ls-horizons
A terminal UI for visualizing NASA's Deep Space Network in real-time.
Note: This project is under active development. Features may change and bugs are expected.

Features
- Real-time DSN monitoring β Live data from NASA's Deep Space Network XML feed
- Pass planning β Computed visibility windows for all three DSN complexes using JPL Horizons ephemeris
- Elevation sparkline β Real-time Β±2h elevation trace with truecolor gradient in Mission view
- Real star catalog β 150+ bright stars with accurate J2000 coordinates rendered in the sky view
- Astronomical projection β Proper RA/Dec to Az/El conversion using GMST/LST calculations
- JPL Horizons integration β Trajectory path arcs and geocentric RA/Dec for pass planning
- Signal propagation visualizer β Animated light-time display showing one-way/round-trip delay with pulse animation
- Mission Spotlight β Curated mission profiles with live phase tracking, MET countdown, crew info, and timeline rail (Voyager 1)
- Four view modes:
- Derived metrics:
- Event detection β Tracks link handoffs between complexes, new acquisitions, and signal losses
- Headless mode β JSON export and text summaries for scripting and monitoring
Screenshots
Dashboard View
Real-time status of all three DSN complexes with active spacecraft table showing antennas, bands, data rates, distances, and struggle indicators.
Mission Detail View
Deep dive into individual spacecraft with link details, pass schedules, elevation sparkline, and signal propagation visualizer showing light-time delay with animated pulse. PressEnter from Dashboard to jump directly here. Curated missions (like Voyager 1) show a spotlight panel with phase, MET, and timeline rail β clearly labeled as schedule-derived data.

Sky View
Animated celestial view with real star positions, spacecraft locations, and trajectory path arcs. Smooth camera transitions when cycling between spacecraft.
Orbit View
Solar system visualization showing planets at real positions (via JPL Horizons) and active spacecraft with their trajectories. Toggle star background witht.

Installation
Requirements
- Terminal with truecolor support β The UI uses 24-bit color for gradients and styling. Most modern terminals work fine (iTerm2, Alacritty, Kitty, Windows Terminal, GNOME Terminal, etc.). Basic terminals like older xterm or screen may have limited color support.
- Go 1.21+ β For building from source
From source
go install github.com/litescript/ls-horizons/cmd/ls-horizons@latest
Make sure your Go bin directory is on your PATH:
export PATH="$(go env GOPATH)/bin:$PATH"
Build locally
git clone https://github.com/litescript/ls-horizons.git
cd ls-horizons
go build -o ls-horizons ./cmd/ls-horizons
Pre-built binaries
Pre-built binaries are available in os-builds/. These are statically linked with no dependencies. Note that they may lag behind the latest source.
Linux (x64):
./os-builds/linux-amd64/ls-horizons
macOS ARM (Apple Silicon):
./os-builds/mac-arm/ls-horizons
Windows (x64):
.\os-builds\windows-amd64\ls-horizons.exe
Windows users: Use Windows Terminal for best results. It's included by default on Windows 11, or install free from the Microsoft Store on Windows 10. The legacy cmd.exe and PowerShell windows have limited color support and may not render correctly. Windows Terminal defaults to a dark background; the legacy blue PowerShell background will look odd with this app.
Usage
Interactive TUI
# Launch with default 5-second refresh
ls-horizons
Custom refresh interval
ls-horizons --refresh 30s
Use specific ephemeris source
ls-horizons --ephem horizons # JPL Horizons (default)
ls-horizons --ephem dsn # DSN-derived only
ls-horizons --ephem auto # Horizons with fallback
Keybindings:
| Key | Action | |-----|--------| | 1 or d | Dashboard view | | 2 or m | Mission detail view | | 3 or s | Sky view | | 4 or o | Orbit view | | Tab | Cycle through views | | Enter | Open Mission view for selected spacecraft (Dashboard) | | j/k or β/β | Navigate lists | | [/] or β/β | Cycle spacecraft (Mission/Sky/Orbit) | | h | Toggle pass panel (Mission view) | | l | Toggle labels (Sky view) | | c | Cycle complex filter (Sky view) | | p | Toggle trajectory path (Sky view) | | t | Toggle star background (Orbit view) | | u | Check for updates | | q | Quit |
Headless Mode
# Print summary table once
ls-horizons --summary
Summary with ASCII mini sky view
ls-horizons --summary --mini-sky
Watch mode: refresh every 30 seconds
ls-horizons --summary --watch 30s
Single-line "now playing" mode
ls-horizons --now
Show card for specific spacecraft
ls-horizons --sc VGR1
Show only changes between fetches
ls-horizons --diff --watch 30s
Beep on important events (TTY only)
ls-horizons --summary --watch 30s --beep
Show event log
ls-horizons --events
Export JSON snapshot to file
ls-horizons --snapshot-path snapshot.json
Export JSON to stdout (for piping)
ls-horizons --snapshot-path -
All Flags
| Flag | Default | Description | |------|---------|-------------| | --refresh | 5s | Data refresh interval (1s - 5m) | | --ephem | auto | Ephemeris source: horizons, dsn, or auto | | --summary | false | Print text summary instead of TUI | | --mini-sky | false | Show ASCII mini sky view | | --now | false | Single-line now-playing mode | | --sc | "" | Show card for specific spacecraft | | --diff | false | Show only changes between fetches | | --beep | false | Beep on important events (TTY only) | | --events | false | Show event log | | --watch | 0 | Repeat output at interval | | --snapshot-path | "" | Export JSON to file (- for stdout) | | --log-level | info | Log level (debug, info, warn, error) | | -l, --log-file | "" | Write logs to file (e.g., ~/ls-horizons.log) |
Data Sources
NASA Deep Space Network
Live telemetry data from NASA's publicly available DSN feed:
https://eyes.nasa.gov/dsn/data/dsn.xml
The DSN consists of three antenna complexes positioned roughly 120Β° apart around Earth:
- Goldstone (GDSCC) β Mojave Desert, California, USA
- Canberra (CDSCC) β Tidbinbilla, Australia
- Madrid (MDSCC) β Robledo de Chavela, Spain
JPL Horizons
Spacecraft trajectory data from NASA/JPL's Horizons system:
https://ssd.jpl.nasa.gov/api/horizons.api
Used for computing accurate sky positions, trajectory path arcs, and range/light-time estimates when DSN data is unavailable. Supports 45+ spacecraft with NAIF SPICE ID mappings including Voyager 1/2, JWST, Mars rovers, Juno, New Horizons, and more.
Yale Bright Star Catalog
Star positions sourced from the Yale Bright Star Catalog and IAU star names. The sky view renders 150+ stars down to magnitude ~4.5, with brightness-based rendering (brighter stars get larger glyphs).
Architecture
cmd/ls-horizons/ Entry point and CLI flags
internal/
βββ astro/ Astronomical calculations
β βββ coords.go RA/Dec β Az/El transforms, GMST/LST
β βββ frames.go Coordinate frame conversions (ecliptic, etc.)
β βββ visibility.go Ground station visibility calculations
β βββ sun.go Sun position calculations
β βββ stars.go Star catalog with 150+ bright stars
βββ dsn/
β βββ models.go Data structures (Station, Antenna, Link, etc.)
β βββ parser.go XML feed parsing
β βββ fetcher.go HTTP client with retry logic
β βββ derive.go Distance, velocity, struggle index
β βββ passplan.go Pass planning with elevation thresholds
β βββ elevtrace.go Elevation trace computation for sparklines
β βββ spacecraft.go Spacecraft catalog with mission metadata
β βββ spacecraft_view.go Multi-antenna tracking abstraction
β βββ solarsystem.go Solar system cache with planet positions
β βββ observer.go DSN complex observer locations
β βββ export.go JSON and text export
βββ ephem/ Ephemeris providers
β βββ provider.go EphemerisProvider interface
β βββ horizons.go JPL Horizons API client (ephemeris + RA/Dec)
β βββ dsn_provider.go DSN-derived fallback
β βββ targets.go NAIF SPICE ID mappings (45+ spacecraft)
βββ state/
β βββ state.go Thread-safe state with pass plan and elevation trace caching
βββ missions/ Mission spotlight layer
β βββ models.go MissionProfile, SpotlightState, DataProvenance
β βββ catalog.go Curated profiles (Voyager 1)
β βββ aliases.go Spacecraft name/code resolution
β βββ runtime.go Live phase/MET/countdown computation
β βββ viewmodel.go Display formatting helpers
βββ ui/
β βββ ui.go Bubble Tea main model with request queue
β βββ dashboard.go Dashboard view with EnterβMission flow and spotlight badges
β βββ mission_detail.go Mission view with pass panel, elevation sparkline, and spotlight
β βββ sky_view.go Sky projection with braille arc rendering
β βββ solarsystem_view.go Orbit view with ecliptic projection and mission HUD
βββ logging/
β βββ logging.go Structured logging
βββ version/
βββ version.go Version and update checking
Why "ls-horizons"?
A play on the Unix ls command β this tool lets you "list" what's happening at the horizons of our solar system. Also a nod to NASA's New Horizons mission to Pluto and beyond.
Changelog
- 0.9.1 β Retire completed Artemis II mission profile from spotlight catalog
- 0.9.0 β Mission Spotlight: curated Artemis II & Voyager 1 profiles with live phase/MET/countdown, crew display, timeline rail, data provenance labels, and graceful handling of unsupported ephemeris lookups
- 0.8.0 β Signal propagation delay visualizer, ephemeris range/light-time fallback via Horizons
- 0.7.3 β Fix orbit trace mismatch when rapidly switching focused spacecraft
- 0.7.2 β Fix Mission tab spacecraft selection, fix "pass in now" grammar
- 0.7.1 β Only shimmer update result, not "checking" state
- 0.7.0 β Seamless in-app restart after update (Unix), Windows graceful fallback
- 0.6.0 β Update check UX with shimmer reveal animation, in-app update install
- 0.5.0 β Elevation sparkline in Mission view, per-spacecraft caching
- 0.4.0 β Visibility engine, sun separation angle, Doppler modeling
- 0.3.0 β JPL Horizons ephemeris integration, trajectory path arcs,
--ephemflag - 0.2.0 β Real star catalog, astronomical projection, SpacecraftView abstraction
- 0.1.0 β Initial release: TUI dashboard, sky view, headless modes, event tracking
Contributing
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Run tests:
go test ./...andgo vet ./... - Submit a pull request
License
MIT License β see LICENSE for details.
Acknowledgments
- NASA/JPL for the public DSN data feed and Horizons ephemeris system
- Yale Bright Star Catalog for star position data
- Bubble Tea for the excellent TUI framework
- Lip Gloss for terminal styling