sgoudelis/ground-stationPublic

Browser-based ground station suite for celestial body, mission and satellite tracking, SDR reception, hardware control, and telemetry decoding

AI summary: An open-source, browser-based ground station suite for satellite tracking and telemetry decoding.

Stars
4.8K
+-1 today
Forks
840
Watchers
81
Open issues
10
Open PRs
0
Contributors
~5
Commits
3.5K
Branches
3

JavaScriptGPL-3.0Created Mar 1, 2025Last push 2d agoLatest release v0.8.15+13 stars this week+95 this month

Quick answers

What is ground-station?
An open-source, browser-based ground station suite for satellite tracking and telemetry decoding.
What does ground-station do?
Ground Station provides a comprehensive, browser-based interface for managing amateur radio and satellite tracking operations. It integrates complex orbital mechanics calculations to predict satellite passes with direct hardware control of software-defined radios (SDRs) and motorized antenna rotators. The application allows users to visualize orbits, analyze SDR waterfalls, and decode complex telemetry packets directly within a web browser. By consolidating tracking, reception, and hardware management into a single platform, it eliminates the need for multiple disparate pieces of desktop software, streamlining the observation of celestial targets.
Who is ground-station for?
Amateur radio operators (hams), satellite tracking enthusiasts, and aerospace researchers who require a modern, integrated solution for predicting passes, controlling hardware, and decoding telemetry data.
How do I get started with ground-station?
Please consult the repository documentation for setup instructions depending on your specific hardware configuration.
How popular is ground-station on GitHub?
sgoudelis/ground-station has 4,825 stars and 840 forks on GitHub, and gained 13 stars in the last 7 days.
What license does ground-station use?
sgoudelis/ground-station is released under the GPL-3.0 license.

Star history

since Jul 29, 2026
02K4KJul 2026Aug 2026Sep 2026Oct 2026
4.8K stars as of Oct 3, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-05: 23 commits2025-10-06: 10 commits2025-10-07: 14 commits2025-10-08: 1 commit2025-10-09: 15 commits2025-10-10: 10 commits2025-10-11: 5 commits2025-10-12: 0 commits2025-10-13: 4 commits2025-10-14: 2 commits2025-10-15: 1 commit2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 2 commits2025-10-20: 11 commits2025-10-21: 6 commits2025-10-22: 19 commits2025-10-23: 3 commits2025-10-24: 13 commits2025-10-25: 4 commits2025-10-26: 11 commits2025-10-27: 4 commits2025-10-28: 7 commits2025-10-29: 1 commit2025-10-30: 4 commits2025-10-31: 7 commits2025-11-01: 8 commits2025-11-02: 7 commits2025-11-03: 5 commits2025-11-04: 27 commits2025-11-05: 30 commits2025-11-06: 17 commits2025-11-07: 10 commits2025-11-08: 9 commits2025-11-09: 17 commits2025-11-10: 14 commits2025-11-11: 12 commits2025-11-12: 5 commits2025-11-13: 23 commits2025-11-14: 17 commits2025-11-15: 27 commits2025-11-16: 36 commits2025-11-17: 27 commits2025-11-18: 24 commits2025-11-19: 18 commits2025-11-20: 17 commits2025-11-21: 6 commits2025-11-22: 20 commits2025-11-23: 14 commits2025-11-24: 14 commits2025-11-25: 12 commits2025-11-26: 0 commits2025-11-27: 9 commits2025-11-28: 3 commits2025-11-29: 2 commits2025-11-30: 8 commits2025-12-01: 15 commits2025-12-02: 6 commits2025-12-03: 5 commits2025-12-04: 13 commits2025-12-05: 13 commits2025-12-06: 4 commits2025-12-07: 30 commits2025-12-08: 7 commits2025-12-09: 2 commits2025-12-10: 6 commits2025-12-11: 7 commits2025-12-12: 7 commits2025-12-13: 8 commits2025-12-14: 4 commits2025-12-15: 4 commits2025-12-16: 2 commits2025-12-17: 28 commits2025-12-18: 10 commits2025-12-19: 11 commits2025-12-20: 17 commits2025-12-21: 26 commits2025-12-22: 18 commits2025-12-23: 16 commits2025-12-24: 1 commit2025-12-25: 15 commits2025-12-26: 11 commits2025-12-27: 8 commits2025-12-28: 3 commits2025-12-29: 5 commits2025-12-30: 0 commits2025-12-31: 12 commits2026-01-01: 6 commits2026-01-02: 5 commits2026-01-03: 3 commits2026-01-04: 9 commits2026-01-05: 11 commits2026-01-06: 9 commits2026-01-07: 15 commits2026-01-08: 9 commits2026-01-09: 8 commits2026-01-10: 15 commits2026-01-11: 16 commits2026-01-12: 16 commits2026-01-13: 13 commits2026-01-14: 3 commits2026-01-15: 16 commits2026-01-16: 5 commits2026-01-17: 6 commits2026-01-18: 5 commits2026-01-19: 7 commits2026-01-20: 4 commits2026-01-21: 5 commits2026-01-22: 9 commits2026-01-23: 18 commits2026-01-24: 14 commits2026-01-25: 12 commits2026-01-26: 5 commits2026-01-27: 10 commits2026-01-28: 9 commits2026-01-29: 3 commits2026-01-30: 4 commits2026-01-31: 6 commits2026-02-01: 0 commits2026-02-02: 3 commits2026-02-03: 8 commits2026-02-04: 4 commits2026-02-05: 6 commits2026-02-06: 1 commit2026-02-07: 5 commits2026-02-08: 12 commits2026-02-09: 13 commits2026-02-10: 1 commit2026-02-11: 6 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 1 commit2026-02-15: 6 commits2026-02-16: 1 commit2026-02-17: 4 commits2026-02-18: 0 commits2026-02-19: 1 commit2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 4 commits2026-02-24: 3 commits2026-02-25: 5 commits2026-02-26: 3 commits2026-02-27: 2 commits2026-02-28: 6 commits2026-03-01: 4 commits2026-03-02: 0 commits2026-03-03: 6 commits2026-03-04: 5 commits2026-03-05: 3 commits2026-03-06: 0 commits2026-03-07: 5 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 4 commits2026-03-13: 1 commit2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 2 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 2 commits2026-03-22: 5 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 1 commit2026-03-26: 2 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 2 commits2026-03-31: 2 commits2026-04-01: 6 commits2026-04-02: 18 commits2026-04-03: 8 commits2026-04-04: 8 commits2026-04-05: 21 commits2026-04-06: 11 commits2026-04-07: 16 commits2026-04-08: 11 commits2026-04-09: 17 commits2026-04-10: 4 commits2026-04-11: 16 commits2026-04-12: 1 commit2026-04-13: 3 commits2026-04-14: 3 commits2026-04-15: 9 commits2026-04-16: 5 commits2026-04-17: 5 commits2026-04-18: 9 commits2026-04-19: 3 commits2026-04-20: 1 commit2026-04-21: 5 commits2026-04-22: 10 commits2026-04-23: 13 commits2026-04-24: 21 commits2026-04-25: 25 commits2026-04-26: 15 commits2026-04-27: 10 commits2026-04-28: 7 commits2026-04-29: 6 commits2026-04-30: 0 commits2026-05-01: 1 commit2026-05-02: 1 commit2026-05-03: 6 commits2026-05-04: 2 commits2026-05-05: 13 commits2026-05-06: 7 commits2026-05-07: 8 commits2026-05-08: 12 commits2026-05-09: 11 commits2026-05-10: 22 commits2026-05-11: 10 commits2026-05-12: 2 commits2026-05-13: 0 commits2026-05-14: 6 commits2026-05-15: 6 commits2026-05-16: 2 commits2026-05-17: 1 commit2026-05-18: 0 commits2026-05-19: 5 commits2026-05-20: 28 commits2026-05-21: 2 commits2026-05-22: 0 commits2026-05-23: 1 commit2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 3 commits2026-05-28: 1 commit2026-05-29: 2 commits2026-05-30: 2 commits2026-05-31: 8 commits2026-06-01: 0 commits2026-06-02: 19 commits2026-06-03: 0 commits2026-06-04: 8 commits2026-06-05: 9 commits2026-06-06: 0 commits2026-06-07: 4 commits2026-06-08: 7 commits2026-06-09: 17 commits2026-06-10: 3 commits2026-06-11: 12 commits2026-06-12: 2 commits2026-06-13: 5 commits2026-06-14: 12 commits2026-06-15: 7 commits2026-06-16: 7 commits2026-06-17: 2 commits2026-06-18: 5 commits2026-06-19: 1 commit2026-06-20: 23 commits2026-06-21: 11 commits2026-06-22: 4 commits2026-06-23: 3 commits2026-06-24: 1 commit2026-06-25: 12 commits2026-06-26: 8 commits2026-06-27: 10 commits2026-06-28: 10 commits2026-06-29: 3 commits2026-06-30: 15 commits2026-07-01: 3 commits2026-07-02: 7 commits2026-07-03: 8 commits2026-07-04: 3 commits2026-07-05: 16 commits2026-07-06: 14 commits2026-07-07: 13 commits2026-07-08: 2 commits2026-07-09: 8 commits2026-07-10: 1 commit2026-07-11: 0 commits2026-07-12: 1 commit2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 7 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 1 commit2026-08-01: 5 commits2026-08-02: 1 commit2026-08-03: 3 commits2026-08-04: 0 commits2026-08-05: 1 commit2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 4 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 7 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 1 commit2026-08-24: 5 commits2026-08-25: 1 commit2026-08-26: 9 commits2026-08-27: 3 commits2026-08-28: 11 commits2026-08-29: 13 commits2026-08-30: 1 commit2026-08-31: 2 commits2026-09-01: 5 commits2026-09-02: 4 commits2026-09-03: 0 commits2026-09-04: 1 commit2026-09-05: 0 commits2026-09-06: 5 commits2026-09-07: 1 commit2026-09-08: 0 commits2026-09-09: 8 commits2026-09-10: 0 commits2026-09-11: 8 commits2026-09-12: 6 commits2026-09-13: 0 commits2026-09-14: 7 commits2026-09-15: 13 commits2026-09-16: 1 commit2026-09-17: 0 commits2026-09-18: 9 commits2026-09-19: 3 commits2026-09-20: 1 commit2026-09-21: 1 commit2026-09-22: 14 commits2026-09-23: 1 commit2026-09-24: 2 commits2026-09-25: 13 commits2026-09-26: 4 commits2026-09-27: 11 commits2026-09-28: 12 commits2026-09-29: 8 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
2,302 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Very active

    2,302 commits in 52 weeks

  • Continuous integration

    Automated checks passing

What ground-station does

Ground Station provides a comprehensive, browser-based interface for managing amateur radio and satellite tracking operations. It integrates complex orbital mechanics calculations to predict satellite passes with direct hardware control of software-defined radios (SDRs) and motorized antenna rotators. The application allows users to visualize orbits, analyze SDR waterfalls, and decode complex telemetry packets directly within a web browser. By consolidating tracking, reception, and hardware management into a single platform, it eliminates the need for multiple disparate pieces of desktop software, streamlining the observation of celestial targets.

Amateur radio operators (hams), satellite tracking enthusiasts, and aerospace researchers who require a modern, integrated solution for predicting passes, controlling hardware, and decoding telemetry data.

  • Browser-based UI: Offers a modern, unified dashboard accessible from any device on the network.
  • Real-time tracking: Visualizes satellite orbits and calculates precise pass geometries using TLE data.
  • SDR integration: Directly receives, records, and analyzes radio signals with built-in waterfall displays.
  • Automated hardware control: Steers motorized antenna rotators (azimuth/elevation) to track satellites automatically as they pass.
  • Telemetry decoding: Features built-in parsers for protocols like AX.25 and raw-IQ APRS to decode satellite data on the fly.

Where teams use it

Amateur satellite tracking

Automating the tracking and reception of signals from low Earth orbit amateur satellites during brief overhead passes.

Telemetry data collection

Decoding and recording atmospheric data transmitted from high-altitude weather balloons.

Remote station operation

Controlling a fully equipped radio ground station remotely over a local network via the web browser interface.

Educational demonstrations

Visualizing orbital mechanics and radio frequency reception in real-time for university aerospace programs.

Getting started: Please consult the repository documentation for setup instructions depending on your specific hardware configuration.

README

main branch

Ground Station

Tests License: GPL v3 Release Last Release Last Commit Sponsor

Ground Station is an open-source, browser-based application for tracking satellites and celestial targets, controlling station hardware, and receiving, decoding, and recording SDR signals. Built for amateur radio operators, satellite enthusiasts, and researchers, it brings orbit visualization, multi-target tracking consoles, SDR waterfall analysis, packet and telemetry decoding, scheduled observations, and hardware management into a single web interface.

Recent Releases

  • v0.8.15 (2026-09-29): Added vector coverage details and unified property editing across celestial target context menus; improved celestial-pass pagination as results change; and optimized Earth trajectory caching with minimal non-dominated projections, duplicate-free canonical target updates, and clearer synchronization progress.
  • v0.8.14 (2026-09-28): Added configurable projections for monitored celestial objects, richer visibility and trajectory displays, Earth-relative distance, velocity, light-time, Doppler, and closest-approach metrics; improved ephemeris caching, cleanup, synchronization, and progress reporting; added configurable rotator tracking lead time; and refined dashboard status indicators, task feedback, toolbar navigation, and translations.
  • v0.8.13 (2026-09-25): Added celestial-data administration with ephemeris synchronization, live status, resilient NASA JPL Horizons fallback, vector coverage history and cleanup; improved celestial projection controls and target tracking; added azimuth columns to satellite and pass tables; and strengthened observation, tracker, and shutdown reliability.
  • v0.8.12 (2026-09-19): Added a documented, resumable release workflow with CI waiting and multi-architecture image validation; expanded Leaflet maps with NASA GIBS layers for Blue Marble, terrain, city lights, and daily MODIS/VIIRS imagery; and improved rotator selection with clear error dialogs and automatic cleanup of stale tracker ownership.
  • v0.8.11 (2026-09-18): Added an application footer with the Ground Station version, host operating system, server uptime, project, maintainer, and sponsorship links; improved satellite tracking labels and map tooltips; prevented new trackers from using local defaults as backend state preconditions; and completed Simplified Chinese translations for application settings.
  • v0.8.10 (2026-09-15): Completed and reviewed Greek, Dutch, German, Spanish, and French localization across the interface, including setup, connection and reconnection overlays, and previously inline fallback text; corrected Greek capitalization and character encoding; and removed the unused Geoscan Image decoder option from VFO settings.
  • v0.8.9 (2026-09-15): Added configurable SSTV mode overrides with improved VIS detection handling; optimized satellite transmitter loading with batched lookups and indexed fields; and improved scheduler usability with clearer SDR session state, transmitter loading feedback, expandable task configuration, richer observation tooltips, and better task-list layout and overflow handling.
  • v0.8.8 (2026-09-14): Added complete Simplified Chinese localization across all interface namespaces, including previously inline fallback text; the new language is available under account menu → Preferences → Regional & Language → Language.
  • v0.8.7 (2026-09-12): Added station-coordinate timezone detection with a manual setup override and station-based defaults for additional accounts; added recoverable map-load error handling; improved manual rotator control, stop recovery, and tracker command feedback; and added the station name and version to the browser title. Existing timezone preferences are preserved when upgrading from v0.8.6 or earlier; users with an incorrect clock can select their timezone under account menu → Preferences → Regional & Language → Timezone. Daylight saving time is handled automatically.
  • v0.8.6 (2026-09-06): Added MiriSDR support through SoapyMiri; kept dashboard grid resize handles visible while editing; centralized observation-status notification placement; and made setup-wizard tests more reliable after post-login socket hydration.

Screenshots

Global Satellite Overview

Overview page with amateur satellite group (desktop)     Earth view page on mobile

Overview page with quick group selection and real-time satellite status indicators


Solar System View

Solar System view page (desktop)     Solar System view page on mobile

Solar System page for celestial-body tracking with live orbital context and interactive visualization


Login Screen

Ground Station login screen (desktop)     Ground Station login screen on mobile

Login screen for user authentication before accessing the Ground Station interface


Multi-Target Tracking Console

Multi-target tracking console focused on ISS (desktop)     Target console on mobile

Multi-target tracking console view showing an active ISS target with per-target control and live tracking telemetry


SDR Waterfall View

Waterfall view with live transcription

Waterfall view with live transcription overlay during active satellite communication


Waterfall Packet Decoding (GMSK)

Waterfall packet decoding view with GMSK and two VFOs

Waterfall view receiving GMSK and decoding with two VFOs


Telemetry Packet Viewer (Hex + ASCII)

Telemetry packet viewer with hex and ASCII columns

Packet viewer showing telemetry payload bytes in hex with ASCII side-by-side


TLE Data Synchronization

TLE synchronization page

TLE synchronization page showing real-time progress and satellite database updates


SDR Hardware Management

SDR page index

Comprehensive SDR device management interface supporting RTL-SDR, SoapySDR, and UHD/USRP radios with remote capability


File Browser & Decoders

File browser with decoded outputs and transcriptions

File browser view showing decoded weather images, packet outputs, and saved transcriptions


Observations Overview

Observations overview

Automated observations dashboard with upcoming passes and task status


DSP Topology & Performance

DSP topology and performance view

Chain of threads and processes IQ samples pass through, showing performance and data flow across the DSP pipeline


Key Features

  • Real-time Orbit Tracking: Track Earth-orbiting targets using Skyfield/SGP4 propagation from stored orbital elements.
  • Configurable Orbital Sources + Metadata Enrichment: Sync orbital data from configured sources (default CelesTrak feeds) and enrich satellites/transmitters from SatNOGS APIs.
  • Multi-Target Tracker Instances: Run multiple tracker instances in parallel (target-N slots), each with independent runtime state.
  • Automated Antenna Rotator Control: Drive connected rotators with continuous az/el updates, limit checks, and anti-thrashing retarget logic.
  • Rig Control with Doppler Correction: Control compatible rigs (rigctld/Hamlib paths) with RX/TX Doppler-corrected tuning during tracking.
  • SDR Hardware Support: RTL-SDR (USB/rtl_tcp), MiriSDR (through SoapyMiri), SoapySDR (local/remote), UHD/USRP, plus a virtual SigMF Playback SDR.
  • Live DSP Pipeline: Stream IQ to FFT/waterfall, demodulators, decoders, recorders, and browser consumers through queue-based worker orchestration.
  • IQ Recording (SigMF): Record IQ as .sigmf-data + .sigmf-meta with center frequency, sample rate, session stats, and target satellite metadata.
  • SigMF Playback: Replay recorded IQ through the same processing pipeline used for live SDR operation.
  • Data Decoding + Framing Protocols: Supported decoder paths include SSTV, APRS, FSK, GFSK, GMSK, BPSK, and GNSS, with AX.25/USP/GEOSCAN framing support in the packet pipelines.
  • APRS Packet Decoding: Dedicated raw-IQ APRS decoding with integrated NBFM/Bell 202 demodulation, AX.25 parsing, batch-boundary recovery, and decoded packet/metadata output files.
  • Transcription Services: Real-time demodulated-audio transcription via Gemini Live or Deepgram, with optional translation and file output under backend/data/transcriptions/.
  • Scheduled Observations: APScheduler-driven AOS/LOS orchestration for automatic start/stop of tracking, SDR, decoding, recording, and transcription tasks.
  • SatDump Post-Processing: Optional SatDump processing for IQ recordings, including METEOR LRPT/HRPT pipelines.
  • Performance Monitoring: Live pipeline metrics (queue utilization, throughput, drops, and component health) streamed to the frontend.
  • Responsive Web Interface: Material-UI + Socket.IO frontend for desktop, tablet, and mobile operation.
  • Authentication + User Management: Built-in login screen with role-based access control for two user types: admins and operators.
  • Interactive Solar System View: Dedicated Solar System page with live orbital context for planets and other supported bodies.
  • Celestial Body + Mission Targeting: Track selected solar-system bodies and deep-space mission targets through NASA/JPL Horizons-backed vectors.

Scheduled Observations & Automated Pass Recording

Ground Station includes a comprehensive automated observation system that can schedule and execute satellite passes without user intervention:

  • Monitored Satellites: Define satellite monitoring templates with hardware configurations, signal parameters, and task definitions. The system automatically generates scheduled observations for all qualifying passes.
  • Automated Pass Scheduling: Automatically calculate and schedule upcoming satellite passes based on configurable criteria (minimum elevation, lookahead window). The scheduler uses APScheduler to trigger observations at AOS (Acquisition of Signal) and stop at LOS (Loss of Signal).
  • Flexible Task Composition: Each observation can include multiple concurrent tasks: IQ recording (SigMF format), audio recording (WAV), protocol decoding (AFSK, GMSK, SSTV), and optional AI transcription.
  • Hardware Orchestration: Automatically controls SDR devices, antenna rotators (with satellite tracking), and rigs (with Doppler correction) during scheduled observations.
  • Live Observation Capability: Users can observe any automated pass in real-time through the web interface - view the spectrum waterfall, listen to demodulated audio, and watch live decoder output. When using the same SDR as an automated observation, users can monitor without interference, but be aware that changing the SDR's center frequency or bandwidth will affect the ongoing observation.
  • Multi-SDR Observing: Automated observations can run on one SDR while additional SDRs record, decode, and listen to the same pass in parallel.
  • Status Management: Real-time observation status tracking (scheduled, running, completed, failed, cancelled, missed) with automatic cleanup of old completed observations.
  • Session Management: Automated observations run in isolated internal VFO sessions (namespace: "internal:<observation_id>"). When using different SDRs, user sessions and automated observations operate completely independently without any interference.

Architecture

The Ground Station application is composed of a frontend, a backend, and a set of worker processes.

High-Level System Architecture

flowchart TB
    %% Cache buster: v5-20251115-updated
    %% Frontend Layer
    A[Frontend: React + Redux + MUI<br/>- Real-time UI updates<br/>- State management<br/>- Interactive satellite maps<br/>- Spectrum & waterfall display<br/>- Audio playback & recording<br/>- IQ recording & playback controls<br/>- Decoder monitoring & output display]

    %% Backend Layer
    B[Backend: FastAPI + Socket.IO<br/>- WebSocket connections<br/>- Worker process management<br/>- Database operations<br/>- TLE data fetching<br/>- Recording & file management<br/>- Decoder lifecycle management]

    %% Worker Layer
    subgraph Workers["Worker Processes"]
        direction TB
        W1[Tracker Supervisor + Tracker Instances<br/>- One tracker instance per rotator<br/>- Antenna rotator control<br/>- Rig/radio control<br/>- Real-time tracking calculations<br/>- Hardware state management]
        W2[SDR IQ Acquisition<br/>- Raw IQ sample streaming<br/>- IQ Broadcaster pub/sub<br/>- Multi-consumer support]
        W2A[FFT Processor<br/>- Spectrum computation<br/>- Waterfall generation<br/>- Real-time FFT analysis]
        W2B[Demodulators<br/>- FM/SSB/AM modes<br/>- Normal & Internal modes<br/>- Frequency translation<br/>- Audio processing<br/>- Multi-VFO support]
        W2C[IQ Recorder<br/>- SigMF format recording<br/>- Metadata capture<br/>- Satellite info tagging<br/>- Waterfall snapshot saving]
        W2D[Decoders<br/>- SSTV image decoder ✓<br/>- AFSK packet decoder WIP<br/>- LoRa/GMSK decoders WIP<br/>- Audio Broadcaster for monitoring]
        W3[SDR Local Probe<br/>- Device discovery<br/>- Local SoapySDR enumeration<br/>- Hardware capability detection]
        W4[SDR Remote Probe<br/>- Remote SoapySDR discovery<br/>- Network device scanning<br/>- Remote capability detection]
    end

    %% Hardware Layer
    subgraph Hardware["Hardware Interfaces"]
        direction LR
        H1[Antenna Rotators<br/>- Hamlib compatible<br/>- Az/El control]
        H2[Radios/Rigs<br/>- CAT control<br/>- Frequency tuning]
        H3[Local SDR Devices<br/>- RTL-SDR<br/>- SoapySDR devices<br/>- UHD/USRP]
        H4[Remote SDR Devices<br/>- SoapyRemote<br/>- rtl_tcp servers<br/>- Network receivers]
        H5[SigMF Playback<br/>- Virtual SDR device<br/>- Recording playback<br/>- SigMF metadata reader]
    end

    %% Storage Layer
    subgraph Storage["Data Storage"]
        S1[SigMF Recordings<br/>- .sigmf-data files<br/>- .sigmf-meta files<br/>- Waterfall snapshots]
        S2[Decoded Outputs<br/>- SSTV images<br/>- Packet data]
    end

    %% External Services
    subgraph External["External Data Sources"]
        E1[TLE Data Sources<br/>- CelesTrak<br/>- SatNOGS DB]
        E2[Satellite Databases<br/>- Transmitter info<br/>- Orbital data]
    end

    %% Connections - Frontend to Backend
    A <---|Socket.IO<br/>Bidirectional| B

    %% Backend to Workers
    B ---|Message Queues<br/>Commands & Status| W1
    B ---|Message Queues<br/>Stream Control| W2
    B ---|Message Queues<br/>Discovery Requests| W3
    B ---|Message Queues<br/>Remote Scanning| W4

    %% SDR IQ Distribution via IQ Broadcaster
    W2 ---|IQ Broadcaster<br/>Subscribe| W2A
    W2 ---|IQ Broadcaster<br/>Subscribe| W2B
    W2 ---|IQ Broadcaster<br/>Subscribe| W2C
    W2 ---|IQ Broadcaster<br/>Subscribe Raw IQ| W2D

    %% Demodulator to Decoder Chain
    W2B ---|Internal Mode<br/>Audio Broadcaster| W2D

    %% Data back to Backend
    W2A ---|FFT Data<br/>Spectrum/Waterfall| B
    W2B ---|Audio Data<br/>Demodulated| B
    W2D ---|Decoded Data<br/>Images/Text/Packets| B
    W2D ---|UI Audio Stream<br/>Live Monitoring| B

    %% Recording Storage
    W2C ---|Write SigMF<br/>Recording Files| S1
    W2D ---|Write Decoded<br/>Output Files| S2

    %% Hardware Control
    W1 ---|Control Commands| H1
    W1 ---|Frequency Control| H2
    W2 ---|IQ Data Streaming| H3
    W2 ---|Network Streaming| H4
    W2 ---|Playback Source| H5
    W3 ---|Device Enumeration| H3
    W4 ---|Remote Discovery| H4

    %% Storage Access
    H5 ---|Read Files| S1
    B ---|File Management| S1
    B ---|File Management| S2

    %% External Data
    B ---|HTTP/API Requests| E1
    B ---|Database Queries| E2

    %% Dark Mode Styling
    classDef frontend fill:#1a237e,stroke:#3f51b5,stroke-width:2px,color:#ffffff
    classDef backend fill:#2e7d32,stroke:#4caf50,stroke-width:2px,color:#ffffff
    classDef worker fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff
    classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff
    classDef storage fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff
    classDef external fill:#b71c1c,stroke:#f44336,stroke-width:2px,color:#ffffff

    class A frontend
    class B backend
    class W1,W2,W2A,W2B,W2C,W2D,W3,W4 worker
    class H1,H2,H3,H4,H5 hardware
    class S1,S2 storage
    class E1,E2 external

    %% Dashed borders for subgraphs
    style Workers stroke-dasharray: 5 5
    style Hardware stroke-dasharray: 5 5
    style Storage stroke-dasharray: 5 5
    style External stroke-dasharray: 5 5
Loading

Signal Processing Data Flow

This diagram shows how radio signals flow through the system from SDR hardware to decoders and UI:

flowchart TB
    %% SDR Source
    SDR[SDR Hardware<br/>RTL-SDR, SoapySDR, UHD]

    %% IQ Broadcaster
    IQB[IQ Broadcaster<br/>Pub/Sub Pattern<br/>Deep copy for each subscriber]

    %% Primary Consumers
    subgraph Consumers["IQ Consumers"]
        FFT[FFT Processor<br/>→ Spectrum Display]
        REC[IQ Recorder<br/>→ SigMF Files]
        DEMOD[Demodulator<br/>FM/SSB/AM]
        IQDEC[IQ Decoders<br/>GMSK/FSK/BPSK]
    end

    %% Demodulator Branches
    subgraph DemodBranch["Demodulator Types"]
        direction TB
        NORM[Normal Mode<br/>User Playback]
        INT[Internal Mode<br/>For Decoders]
    end

    %% Audio Broadcaster for Internal Demodulators
    AUDIOB[Audio Broadcaster<br/>Pub/Sub Pattern<br/>Deep copy for each subscriber]

    %% Decoder Chain
    subgraph DecoderChain["Audio-based Decoder Processing"]
        direction TB
        DEC[Decoder<br/>AFSK]
        UIAUDIO[UI Audio Stream<br/>Live Monitoring]
    end

    %% Output Destinations
    subgraph Outputs["Outputs"]
        SPECUI[Spectrum/Waterfall UI]
        SIGFILE[SigMF Recording Files]
        PLAYBACK[Audio Playback to User]
        DECOUT[Decoded Data<br/>Images/Text/Packets]
        AUDIOUI[UI Audio Player<br/>Decoder Monitoring]
    end

    %% Connections
    SDR -->|Raw IQ Samples| IQB
    SDR -->|Raw IQ Samples| FFT
    IQB -->|Subscribe| REC
    IQB -->|Subscribe| DEMOD
    IQB -->|Subscribe| IQDEC

    DEMOD -->|Branch| NORM
    DEMOD -->|Branch| INT

    NORM -->|Audio Queue| PLAYBACK
    INT -->|Audio Queue| AUDIOB

    AUDIOB -->|Subscribe: decoder| DEC
    AUDIOB -->|Subscribe: ui| UIAUDIO

    FFT -->|FFT Data| SPECUI
    REC -->|Write| SIGFILE
    DEC -->|Decoded Output| DECOUT
    IQDEC -->|Decoded Output| DECOUT
    UIAUDIO -->|Audio Chunks| AUDIOUI

    %% Styling
    classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff
    classDef broadcaster fill:#d84315,stroke:#ff5722,stroke-width:3px,color:#ffffff
    classDef processor fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff
    classDef output fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff
    classDef decoder fill:#1b5e20,stroke:#4caf50,stroke-width:2px,color:#ffffff

    class SDR hardware
    class IQB,AUDIOB broadcaster
    class FFT,REC,DEMOD,NORM,INT processor
    class SPECUI,SIGFILE,PLAYBACK,DECOUT,AUDIOUI output
    class DEC,UIAUDIO decoder
Loading
Key Concepts

IQ Broadcaster (Pub/Sub Pattern):

  • SDR produces raw IQ samples at high rate
  • IQBroadcaster distributes to multiple consumers simultaneously
  • Each subscriber gets independent queue with deep-copied samples
  • Slow consumers: messages dropped rather than blocking producer
  • Supports: FFT processor, demodulators, IQ recorder, decoders (LoRa/GMSK)

Audio Broadcaster (Decoder Pattern):

  • Only used for internal demodulators feeding decoders
  • Distributes demodulated audio to:
    • Decoder subscriber: SSTV/AFSK decoder processing
    • UI subscriber: Live audio monitoring in browser
  • Statistics tracking: delivered/dropped message counts per subscriber
  • Graceful slow consumer handling

Chain Processing Example (SSTV):

  1. SDR → IQBroadcaster → Internal FM Demodulator (SSTV)
  2. FM Demodulator → AudioBroadcaster input queue
  3. AudioBroadcaster → Decoder subscriber → SSTV Decoder → Image output
  4. AudioBroadcaster → UI subscriber → Browser audio player

Why Broadcasters?

  • Decoupling: Producers don't know about consumers
  • Scalability: Add consumers without modifying producers
  • Monitoring: Per-subscriber statistics and health monitoring
  • Reliability: Slow consumers don't block fast producers
  • Frontend: The frontend is a single-page application built with React, Redux Toolkit, and Material-UI. It communicates with the backend using a socket.io connection for real-time updates, including decoded data display and live audio monitoring.
  • Backend: The backend is a Python application built with FastAPI. It provides a REST API and a socket.io interface for the frontend. It manages worker processes, decoder lifecycle, and coordinates the pub/sub architecture for signal distribution.
  • Workers: The worker processes are responsible for the heavy lifting. They perform tasks such as satellite tracking, SDR streaming, signal demodulation, data decoding (SSTV implemented, AFSK/LoRa in development), and antenna control. Workers use IQ Broadcaster and Audio Broadcaster for efficient multi-consumer signal distribution.

Third-Party Libraries & Technologies

Backend

  • FastAPI: A modern, fast (high-performance), web framework for building APIs with Python 3.7+ based on standard Python type hints.
  • SQLAlchemy: The Python SQL Toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.
  • Skyfield: A modern astronomy library for Python that computes positions for the stars, planets, and satellites in orbit around the Earth.
  • NASA/JPL Horizons API: Ephemeris vectors and observer geometry for solar-system body tracking.
  • SGP4: A Python implementation of the SGP4 satellite propagation model.
  • Socket.IO: A library for real-time, bidirectional, event-based communication.
  • pyrtlsdr: A Python wrapper for the RTL-SDR library.
  • SoapySDR: A vendor and platform neutral SDR support library.
  • SatDump: Satellite decoder suite used for weather image decoding workflows.
  • gr-satellites: GNU Radio out-of-tree modules for satellite communications decoding.
  • GNSS-SDR: Open-source software-defined GNSS receiver used by the GNSS decoder path.

Frontend

  • React: A JavaScript library for building user interfaces.
  • Redux Toolkit: The official, opinionated, batteries-included toolset for efficient Redux development.
  • Material-UI: A popular React UI framework with a comprehensive suite of UI tools.
  • Vite: A build tool that aims to provide a faster and leaner development experience for modern web projects.
  • Socket.IO Client: The client-side library for Socket.IO.
  • Leaflet: An open-source JavaScript library for mobile-friendly interactive maps.
  • MapLibre Maps: Open-source map rendering engine used for 2D and globe map views.
  • satellite.js: A JavaScript library to propagate satellite orbits.

SDR Device Support

Dedicated worker processes provide IQ acquisition, FFT processing, and demodulation support for multiple receiver families:

  • RTL-SDR (USB or rtl_tcp) workers
  • Airspy / Airspy HF+ native worker support (Airspy HF+ currently untested)
  • SoapySDR devices locally or through SoapyRemote: RTL-SDR, Airspy, HackRF, HydraSDR, LimeSDR, MiriSDR, PlutoSDR, UHD/USRP, and SDRplay (RSP series)
  • UHD/USRP radios via a UHD worker
  • Need another SoapySDR device? Open a GitHub issue and request support.

The SDR architecture uses a pub/sub pattern (IQ Broadcaster) to separate IQ acquisition from signal processing:

  • IQ Acquisition Workers stream raw samples to IQ Broadcaster
  • IQ Broadcaster distributes to multiple subscribers independently:
    • FFT Processor for spectrum/waterfall display
    • Demodulators (FM/SSB/AM) for audio output in normal and internal modes
    • IQ Recorder for SigMF format file capture
  • Raw IQ Decoders (BPSK, GMSK) that bypass demodulation
  • Audio Broadcaster distributes demodulated audio from internal demodulators to:
  • Data Decoders (AFSK) for signal decoding
    • UI Audio Stream for live monitoring in browser

Note: The signal processing components (demodulators, broadcasters, decoders) were developed with assistance from Claude AI (Anthropic) to handle complex DSP algorithms. These components are clearly marked in the source code and are licensed under GPL-3.0 like the rest of the project.

IQ Recording & Playback

Ground Station includes comprehensive IQ recording and playback capabilities using the SigMF (Signal Metadata Format) standard:

Recording Features

  • SigMF Format: Records IQ data as .sigmf-data files with accompanying .sigmf-meta JSON metadata
  • Automatic Metadata: Captures center frequency, sample rate, timestamp, and recording duration
  • Satellite Tracking: Automatically tags recordings with target satellite name and NORAD ID
  • Waterfall Snapshots: Saves PNG snapshots of the waterfall display alongside recordings
  • Multi-segment Support: Handles parameter changes (frequency, sample rate) as separate capture segments
  • Real-time Monitoring: Live duration counter and visual recording indicator in the UI

Playback Features

  • Virtual SDR Device: Recordings appear as "SigMF Playback" SDR in the device list
  • Full Processing Pipeline: Playback supports FFT display, demodulation, and all signal processing
  • Live-equivalent Decoding: During playback, demodulators and decoders run exactly as they do with live SDR input
  • Recording Browser: Sortable list of recordings with metadata preview (sample rate, duration, timestamp)
  • Timeline Scrubbing: A playback position slider above the waterfall status bar shows elapsed/total time and supports seeking to a target time
  • Seamless Integration: Switch between live SDR and playback without changing workflows

Automated Observations

Ground Station includes an automated observation system for scheduled satellite passes:

  • Monitored Satellites: Define satellite monitoring templates with hardware configurations, signal parameters, and task definitions.
  • Automated Pass Scheduling: Automatically calculate and schedule upcoming passes based on configurable criteria (minimum elevation, lookahead window).
  • Flexible Task Composition: Combine IQ recording (SigMF), audio recording, protocol decoding, and AI transcription in a single observation.
  • Hardware Orchestration: Control SDR devices, antenna rotators (with satellite tracking), and rigs (with Doppler correction) during scheduled runs.
  • Live Observation Capability: Watch the spectrum waterfall, listen to demodulated audio, and view live decoder output during automated passes.
  • Multi-SDR Observing: Run automated observations on one SDR while additional SDRs record, decode, and listen to the same pass in parallel.
  • Status Management: Track observation status (scheduled, running, completed, failed, cancelled, missed) with automatic cleanup of old entries.
  • Session Management: Automated observations run in isolated internal VFO sessions (namespace: "internal:<observation_id>").

Getting Started

For development setup, build steps, and testing, see DEVELOPMENT.md.

Security

Ground Station is intended for hobby use on a trusted private network with trusted administrators. Before reporting a vulnerability, read the project's security policy for its supported versions, trust boundaries, and reporting process.

Application Configuration

Ground Station backend runtime options are stored in backend/data/configs/app_config.json and are editable in the UI at Settings -> Settings.

Configuration precedence is:

  1. CLI flags (highest priority)
  2. app_config.json
  3. built-in defaults (lowest priority)

The UI also exposes when a value is currently CLI-overridden and whether a change is hot-applied or restart-required.

/settings/preferences is kept as a compatibility route and is now rendered as a tab inside the unified Settings page.

Docker

Building from Source

The repository includes a multi-stage Dockerfile that builds the React frontend and a Python environment with SDR libraries.

docker build -t ground-station .

# Option 1: Standard bridge mode (works for local SDRs)
docker run --rm -p 7000:7000 --device /dev/bus/usb ground-station

# Option 2: Host networking (required for SoapySDR remote server discovery via mDNS)
docker run --rm --network host --device /dev/bus/usb ground-station
SDRplay build dependency

The image includes the legacy SDRplay RSP API v3.15 required by SoapySDRPlay3; it does not use SDRplay's current SDRconnect installer, which has a different API/installation layout. The Dockerfile downloads a pinned archive commit and verifies its SHA-256 before installation. The archive contains the v3.15 API's amd64 and arm64 libraries, so both Docker target architectures remain supported.

The API is proprietary SDRplay software. Review and accept its included EULA before building or distributing an image that contains it. To update the archive deliberately, provide matching values for both arguments; never update only the commit or only the checksum:

docker build \
  --build-arg SDRPLAY_API_ARCHIVE_COMMIT=<immutable-commit> \
  --build-arg SDRPLAY_API_ARCHIVE_SHA256=<sha256-of-the-codeload-tarball> \
  -t ground-station .

Using Pre-built Docker Images

Pre-built multi-architecture Docker images are available for each release. For detailed instructions on using a specific release, see the Releases page.

Pull the image

# Latest release tag (recommended)
docker pull ghcr.io/sgoudelis/ground-station:<version>

# Or pull architecture-specific tags directly
docker pull ghcr.io/sgoudelis/ground-station:<version>-amd64
docker pull ghcr.io/sgoudelis/ground-station:<version>-arm64

Run the container

Option 1: With SoapySDR Remote Server Discovery (Recommended)

Uses host networking to enable automatic mDNS discovery of SoapySDR remote servers:

# AMD64
docker run -d \
  --platform linux/amd64 \
  --network host \
  --name ground-station \
  --restart unless-stopped \
  --device=/dev/bus/usb \
  --privileged \
  -v /path/to/data:/app/backend/data \
  ghcr.io/sgoudelis/ground-station:<version>

# ARM64 (Raspberry Pi, etc)
docker run -d \
  --platform linux/arm64 \
  --network host \
  --name ground-station \
  --restart unless-stopped \
  -v /dev:/dev \
  --privileged \
  -v /path/to/data:/app/backend/data \
  ghcr.io/sgoudelis/ground-station:<version>

Option 2: Standard Bridge Mode (No SoapySDR Remote Discovery)

Uses standard bridge networking with port mapping:

# AMD64
docker run -d \
  --platform linux/amd64 \
  -p 7000:7000 \
  --name ground-station \
  --restart unless-stopped \
  --device=/dev/bus/usb \
  --privileged \
  -v /path/to/data:/app/backend/data \
  ghcr.io/sgoudelis/ground-station:<version>

# ARM64 (Raspberry Pi, etc)
docker run -d \
  --platform linux/arm64 \
  -p 7000:7000 \
  --name ground-station \
  --restart unless-stopped \
  -v /dev:/dev \
  --privileged \
  -v /path/to/data:/app/backend/data \
  ghcr.io/sgoudelis/ground-station:<version>

Important Notes:

  • Replace /path/to/data with your desired data directory path
  • Option 1 (host networking) is required for automatic discovery of SoapySDR remote servers via mDNS
  • Option 2 works for local SDRs and all other features
  • For Raspberry Pi hardware, only the Raspberry Pi 5 is recommended
  • For ARM64, using -v /dev:/dev ensures all USB devices are accessible
  • Access the web interface at http://<YOUR_HOST>:7000
  • For TLS reverse-proxy deployments, see deploy/nginx/README.md

Preparing local SDR hardware

For direct USB receivers, the host administrator must configure USB access before starting the container. See Preparing SDR Hardware on the Host for device-specific udev rules, USB passthrough, and verification steps.

Contributing

We welcome contributions! Please see the CONTRIBUTING.md file for details on how to get started.

AI-Assisted Development

Ground Station is developed with the assistance of large language model (LLM) coding agents. They are used for tasks such as implementation, debugging, testing, documentation, and code review. The project maintainer directs their work, manages architectural decisions, serves as the final reviewer of all changes, and remains responsible for what is accepted into the project.

Sponsorship

Sponsorship through GitHub Sponsors is voluntary support for the continued development and maintenance of Ground Station. It does not purchase development time, technical support, consulting, feature priority, influence over the project roadmap, or any promise of future work. Contributions and requests are considered through the project's normal process.

Acknowledgments

This project uses the SatNOGS API for transmitter information.

License

This project is licensed under the GNU GPL v3. See the LICENSE file for details.

Visitors

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Discussions

all 12

Releases and announcements

146 total
  1. v0.8.15v0.8.15Sep 29, 2026

    ## Docker Image **Version:** 0.8.15 **Environment:** production **Git Commit:** 75084ebd **Build Date:** 20260929 📖 **[View Project Documentation](https://github.com/sgoudelis/ground-station)** ### Commits in this release: - 75084ebd chore(version): bump to v0.8.15 - cd9ec480 **feat(celestial): optimize Earth trajectory caching with non-dominated projections** - 48026763 **feat(celestial): update context menus and dialogs for property editing enhancements** - ed9a7c51 **feat(celestial): add vector coverage dialog and context menu integration** - 62a6aaf5 **feat(celestial): enhance pagination handling and update tests** ### Pull the Docker image: **For AMD64 systems:** ```bash docker pull --platform linux/amd64 ghcr.io/sgoudelis/ground-station:0.8.15 ``` **For ARM64 systems (Raspberry Pi, etc):** ```bash docker pull --platform linux/arm64 ghcr.io/sgoudelis/ground-station:0.8.15 ``` Or pull architecture-specific tags directly: ```bash # AMD64 docker pull ghcr.io/sgoudelis/ground-station:0.8.15-amd64 # ARM64 docker pull ghcr.io/sgoudelis/ground-station:0.8.15-arm64 ``` ### Run the container: **Option 1: With SoapySDR Remote Server Discovery (Recommended)** Uses host networ

  2. v0.8.14v0.8.14Sep 28, 2026

    ## Docker Image **Version:** 0.8.14 **Environment:** production **Git Commit:** a315a374 **Build Date:** 20260928 📖 **[View Project Documentation](https://github.com/sgoudelis/ground-station)** ### Commits in this release: - a315a374 chore(version): bump to v0.8.14 - 2aa8629e **feat(celestial): add Earth-relative metrics handling and UI integration** - f6872b81 **feat(celestial): add toolbar scrolling with overflow handling and localization updates** - 4a3b12c7 **feat(celestial): enhance cache handling, snapshot retention, and solar sync progress reporting** - 1c37ab9e **feat(celestial): enhance cache handling, snapshot retention, and solar sync progress reporting** - 2f74d759 **feat(tasks): add CircularProgress indicator for running tasks in popover** - 6f982e68 **feat(celestial): add projection dialog for monitored passes and related tests** - 543f742a **feat(celestial): implement solar system body and observer-related calculations** - 24825ade **feat(celestial): add target edit dialog tests and unify "Monitored" terminology** - 87bf8f2c **feat(celestial): enhance pass boundary handling and improve projection limit display** - 00bd93d6 **feat(celestial): add 3D trajectory dis

  3. v0.8.13v0.8.13Sep 25, 2026

    ## Docker Image **Version:** 0.8.13 **Environment:** production **Git Commit:** 371a0c80 **Build Date:** 20260925 📖 **[View Project Documentation](https://github.com/sgoudelis/ground-station)** ### Commits in this release: - 371a0c80 chore(version): bump to v0.8.13 - b74896c9 feat(celestial): add deletion support for vector snapshots and enhance history with snapshot counts - 928a67d6 feat(celestial): update default past hours to 6 for projection settings - 9d55b7c4 feat(observations): ensure tracker removal keeps locks free and improve safe shutdown handling - ab139784 feat(celestial): enable network fetch fallback for expired cache entries - 974f8482 feat(celestial): introduce target key handling in tracking and celestial payloads - 972b7be1 fix(drone): replace deprecated `--time` flag with `--timeout` in container stop commands - 95159d4a feat(celestial): add ProjectionSelector component and integrate with topbar - 4e3d2efc feat(earthview): add azimuth support across translations and UI components - 133fd3ad feat(observations): refine conflict handling and update logic for scheduled observations - 29d950cc feat(celestial): ensure consistent target key replacement and enhance

  4. v0.8.12v0.8.12Sep 19, 2026

    ## Docker Image **Version:** 0.8.12 **Environment:** production **Git Commit:** 80f21b9d **Build Date:** 20260919 📖 **[View Project Documentation](https://github.com/sgoudelis/ground-station)** ### Commits in this release: - 80f21b9d chore(version): bump to v0.8.12 - aa29a9b9 chore(deps): update `anyio` to v4.14.2 in requirements and pyproject files - 59ade400 feat(rotator): add error handling dialog for rotator selection and ensure consistent ownership logic - 8cbd5ee6 feat(layers): add multiple new NASA GIBS EPSG:4326 tile layers and refactor tile creation logic - 3f31dfed feat(release): add CI wait logic for GitHub Tests with configurable timeout - efaab86e docs: add RELEASE.md detailing release process and script usage - b10c0414 docs(README): update with v0.8.11 release details - 5f105761 chore(version): bump to v0.8.11 ### Pull the Docker image: **For AMD64 systems:** ```bash docker pull --platform linux/amd64 ghcr.io/sgoudelis/ground-station:0.8.12 ``` **For ARM64 systems (Raspberry Pi, etc):** ```bash docker pull --platform linux/arm64 ghcr.io/sgoudelis/ground-station:0.8.12 ``` Or pull architecture-specific tags directly: ```bash # AMD64 docker pull ghcr.io/sgoudel

  5. v0.8.11v0.8.11Sep 18, 2026

    ## Docker Image **Version:** 0.8.11 **Environment:** production **Git Commit:** aa48a4a8 **Build Date:** 20260918 📖 **[View Project Documentation](https://github.com/sgoudelis/ground-station)** ### Commits in this release: - 344f3a64 feat(tracker): ensure new trackers no longer rely on local defaults for state preconditions - 9d369bdb fix(ui): improve layout and tooltip logic for satellite tracking components - 4909cfbc fix(i18n): complete zh translations for the app settings page - 9871054e fix(ui): improve layout and tooltip logic for satellite tracking components - b2d00a06 feat(ui): add application footer with system and server information - d0557090 chore(version): bump to v0.8.10 and update README with release details ### Pull the Docker image: **For AMD64 systems:** ```bash docker pull --platform linux/amd64 ghcr.io/sgoudelis/ground-station:0.8.11 ``` **For ARM64 systems (Raspberry Pi, etc):** ```bash docker pull --platform linux/arm64 ghcr.io/sgoudelis/ground-station:0.8.11 ``` Or pull architecture-specific tags directly: ```bash # AMD64 docker pull ghcr.io/sgoudelis/ground-station:0.8.11-amd64 # ARM64 docker pull ghcr.io/sgoudelis/ground-station:0.8.11-arm64 ```

Code frequency

additions and deletions
+33.5K-33.5KWeek of 2025-09-28: +18,394 linesWeek of 2025-09-28: -9,533 linesWeek of 2025-10-05: +11,850 linesWeek of 2025-10-05: -3,960 linesWeek of 2025-10-12: +245 linesWeek of 2025-10-12: -2,549 linesWeek of 2025-10-19: +12,768 linesWeek of 2025-10-19: -3,166 linesWeek of 2025-10-26: +5,813 linesWeek of 2025-10-26: -3,488 linesWeek of 2025-11-02: +19,490 linesWeek of 2025-11-02: -8,593 linesWeek of 2025-11-09: +25,545 linesWeek of 2025-11-09: -12,093 linesWeek of 2025-11-16: +20,804 linesWeek of 2025-11-16: -7,372 linesWeek of 2025-11-23: +10,738 linesWeek of 2025-11-23: -7,048 linesWeek of 2025-11-30: +5,630 linesWeek of 2025-11-30: -2,480 linesWeek of 2025-12-07: +10,789 linesWeek of 2025-12-07: -2,662 linesWeek of 2025-12-14: +7,556 linesWeek of 2025-12-14: -2,554 linesWeek of 2025-12-21: +9,036 linesWeek of 2025-12-21: -3,682 linesWeek of 2025-12-28: +20,681 linesWeek of 2025-12-28: -8,665 linesWeek of 2026-01-04: +10,783 linesWeek of 2026-01-04: -3,602 linesWeek of 2026-01-11: +8,418 linesWeek of 2026-01-11: -2,601 linesWeek of 2026-01-18: +8,137 linesWeek of 2026-01-18: -2,384 linesWeek of 2026-01-25: +9,596 linesWeek of 2026-01-25: -7,003 linesWeek of 2026-02-01: +1,954 linesWeek of 2026-02-01: -743 linesWeek of 2026-02-08: +8,308 linesWeek of 2026-02-08: -7,618 linesWeek of 2026-02-15: +196 linesWeek of 2026-02-15: -79 linesWeek of 2026-02-22: +2,117 linesWeek of 2026-02-22: -163 linesWeek of 2026-03-01: +2,799 linesWeek of 2026-03-01: -802 linesWeek of 2026-03-08: +883 linesWeek of 2026-03-08: -323 linesWeek of 2026-03-15: +356 linesWeek of 2026-03-15: -271 linesWeek of 2026-03-22: +244 linesWeek of 2026-03-22: -17 linesWeek of 2026-03-29: +8,879 linesWeek of 2026-03-29: -7,249 linesWeek of 2026-04-05: +7,515 linesWeek of 2026-04-05: -3,489 linesWeek of 2026-04-12: +10,628 linesWeek of 2026-04-12: -1,596 linesWeek of 2026-04-19: +15,469 linesWeek of 2026-04-19: -5,371 linesWeek of 2026-04-26: +7,409 linesWeek of 2026-04-26: -2,392 linesWeek of 2026-05-03: +22,381 linesWeek of 2026-05-03: -9,964 linesWeek of 2026-05-10: +8,025 linesWeek of 2026-05-10: -2,017 linesWeek of 2026-05-17: +3,400 linesWeek of 2026-05-17: -1,120 linesWeek of 2026-05-24: +862 linesWeek of 2026-05-24: -622 linesWeek of 2026-05-31: +12,106 linesWeek of 2026-05-31: -6,653 linesWeek of 2026-06-07: +33,511 linesWeek of 2026-06-07: -15,785 linesWeek of 2026-06-14: +9,242 linesWeek of 2026-06-14: -2,547 linesWeek of 2026-06-21: +4,872 linesWeek of 2026-06-21: -8,941 linesWeek of 2026-06-28: +12,306 linesWeek of 2026-06-28: -2,243 linesWeek of 2026-07-05: +6,621 linesWeek of 2026-07-05: -1,178 linesWeek of 2026-07-12: +275 linesWeek of 2026-07-12: -15 linesWeek of 2026-07-19: +0 linesWeek of 2026-07-19: -0 linesWeek of 2026-07-26: +2,722 linesWeek of 2026-07-26: -258 linesWeek of 2026-08-02: +1,213 linesWeek of 2026-08-02: -84 linesWeek of 2026-08-09: +0 linesWeek of 2026-08-09: -0 linesWeek of 2026-08-16: +3,155 linesWeek of 2026-08-16: -1,254 linesWeek of 2026-08-23: +8,361 linesWeek of 2026-08-23: -1,747 linesWeek of 2026-08-30: +698 linesWeek of 2026-08-30: -577 linesWeek of 2026-09-06: +5,967 linesWeek of 2026-09-06: -2,087 linesWeek of 2026-09-13: +12,292 linesWeek of 2026-09-13: -2,067 linesWeek of 2026-09-20: +0 linesWeek of 2026-09-20: -0 linesSep 28, 2025Sep 20, 2026
+431K lines added, -182.7K removed over the last year.

Commits per week

last 52 weeks
1480Week of 2025-10-05: 78 commitsWeek of 2025-10-12: 7 commitsWeek of 2025-10-19: 58 commitsWeek of 2025-10-26: 42 commitsWeek of 2025-11-02: 105 commitsWeek of 2025-11-09: 115 commitsWeek of 2025-11-16: 148 commitsWeek of 2025-11-23: 54 commitsWeek of 2025-11-30: 64 commitsWeek of 2025-12-07: 67 commitsWeek of 2025-12-14: 76 commitsWeek of 2025-12-21: 95 commitsWeek of 2025-12-28: 34 commitsWeek of 2026-01-04: 76 commitsWeek of 2026-01-11: 75 commitsWeek of 2026-01-18: 62 commitsWeek of 2026-01-25: 49 commitsWeek of 2026-02-01: 27 commitsWeek of 2026-02-08: 33 commitsWeek of 2026-02-15: 12 commitsWeek of 2026-02-22: 23 commitsWeek of 2026-03-01: 23 commitsWeek of 2026-03-08: 5 commitsWeek of 2026-03-15: 4 commitsWeek of 2026-03-22: 8 commitsWeek of 2026-03-29: 44 commitsWeek of 2026-04-05: 96 commitsWeek of 2026-04-12: 35 commitsWeek of 2026-04-19: 78 commitsWeek of 2026-04-26: 40 commitsWeek of 2026-05-03: 59 commitsWeek of 2026-05-10: 48 commitsWeek of 2026-05-17: 37 commitsWeek of 2026-05-24: 8 commitsWeek of 2026-05-31: 44 commitsWeek of 2026-06-07: 50 commitsWeek of 2026-06-14: 57 commitsWeek of 2026-06-21: 49 commitsWeek of 2026-06-28: 49 commitsWeek of 2026-07-05: 54 commitsWeek of 2026-07-12: 8 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 6 commitsWeek of 2026-08-02: 5 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 11 commitsWeek of 2026-08-23: 43 commitsWeek of 2026-08-30: 13 commitsWeek of 2026-09-06: 28 commitsWeek of 2026-09-13: 33 commitsWeek of 2026-09-20: 36 commitsWeek of 2026-09-27: 31 commitsOct 5, 2025Sep 27, 2026
2.3K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 13 commitsSun 1:00 — 2 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 3 commitsSun 6:00 — 1 commitsSun 7:00 — 5 commitsSun 8:00 — 22 commitsSun 9:00 — 40 commitsSun 10:00 — 33 commitsSun 11:00 — 38 commitsSun 12:00 — 43 commitsSun 13:00 — 25 commitsSun 14:00 — 29 commitsSun 15:00 — 35 commitsSun 16:00 — 30 commitsSun 17:00 — 49 commitsSun 18:00 — 40 commitsSun 19:00 — 64 commitsSun 20:00 — 59 commitsSun 21:00 — 56 commitsSun 22:00 — 26 commitsSun 23:00 — 21 commitsMon 0:00 — 13 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 3 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 12 commitsMon 9:00 — 6 commitsMon 10:00 — 8 commitsMon 11:00 — 11 commitsMon 12:00 — 32 commitsMon 13:00 — 29 commitsMon 14:00 — 20 commitsMon 15:00 — 24 commitsMon 16:00 — 24 commitsMon 17:00 — 25 commitsMon 18:00 — 38 commitsMon 19:00 — 31 commitsMon 20:00 — 44 commitsMon 21:00 — 62 commitsMon 22:00 — 57 commitsMon 23:00 — 26 commitsTue 0:00 — 22 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 1 commitsTue 6:00 — 3 commitsTue 7:00 — 4 commitsTue 8:00 — 13 commitsTue 9:00 — 36 commitsTue 10:00 — 48 commitsTue 11:00 — 34 commitsTue 12:00 — 33 commitsTue 13:00 — 35 commitsTue 14:00 — 32 commitsTue 15:00 — 37 commitsTue 16:00 — 19 commitsTue 17:00 — 28 commitsTue 18:00 — 23 commitsTue 19:00 — 25 commitsTue 20:00 — 34 commitsTue 21:00 — 50 commitsTue 22:00 — 34 commitsTue 23:00 — 18 commitsWed 0:00 — 9 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 2 commitsWed 7:00 — 1 commitsWed 8:00 — 7 commitsWed 9:00 — 12 commitsWed 10:00 — 17 commitsWed 11:00 — 16 commitsWed 12:00 — 23 commitsWed 13:00 — 16 commitsWed 14:00 — 16 commitsWed 15:00 — 17 commitsWed 16:00 — 27 commitsWed 17:00 — 25 commitsWed 18:00 — 31 commitsWed 19:00 — 33 commitsWed 20:00 — 47 commitsWed 21:00 — 51 commitsWed 22:00 — 24 commitsWed 23:00 — 28 commitsThu 0:00 — 5 commitsThu 1:00 — 1 commitsThu 2:00 — 2 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 5 commitsThu 8:00 — 16 commitsThu 9:00 — 19 commitsThu 10:00 — 30 commitsThu 11:00 — 36 commitsThu 12:00 — 40 commitsThu 13:00 — 23 commitsThu 14:00 — 19 commitsThu 15:00 — 18 commitsThu 16:00 — 24 commitsThu 17:00 — 36 commitsThu 18:00 — 42 commitsThu 19:00 — 42 commitsThu 20:00 — 30 commitsThu 21:00 — 34 commitsThu 22:00 — 48 commitsThu 23:00 — 22 commitsFri 0:00 — 2 commitsFri 1:00 — 2 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 5 commitsFri 8:00 — 9 commitsFri 9:00 — 15 commitsFri 10:00 — 23 commitsFri 11:00 — 29 commitsFri 12:00 — 19 commitsFri 13:00 — 10 commitsFri 14:00 — 19 commitsFri 15:00 — 16 commitsFri 16:00 — 24 commitsFri 17:00 — 13 commitsFri 18:00 — 35 commitsFri 19:00 — 57 commitsFri 20:00 — 37 commitsFri 21:00 — 46 commitsFri 22:00 — 33 commitsFri 23:00 — 30 commitsSat 0:00 — 12 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 3 commitsSat 6:00 — 0 commitsSat 7:00 — 6 commitsSat 8:00 — 6 commitsSat 9:00 — 21 commitsSat 10:00 — 40 commitsSat 11:00 — 30 commitsSat 12:00 — 22 commitsSat 13:00 — 32 commitsSat 14:00 — 30 commitsSat 15:00 — 29 commitsSat 16:00 — 11 commitsSat 17:00 — 27 commitsSat 18:00 — 47 commitsSat 19:00 — 39 commitsSat 20:00 — 64 commitsSat 21:00 — 47 commitsSat 22:00 — 48 commitsSat 23:00 — 31 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits2,379 (100%)
Community commits4 (0%)

2,383 commits in total over the last year.

DateListRankStars gained
Mar 18, 2026daily#21+156
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    456.7K stars · TypeScript

  • donnemartin/system-design-primer

    Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

    373.2K stars · Python

  • practical-tutorials/project-based-learning

    Curated list of project-based tutorials

    285.8K stars · Python

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    272.8K stars · JavaScript

  • react/react

    The library for web and native user interfaces.

    250.9K stars · JavaScript

  • tensorflow/tensorflow

    An Open Source Machine Learning Framework for Everyone

    200.7K stars · C++