[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-11459":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":15,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":40,"readmeContent":41,"aiSummary":42,"trendingCount":16,"starSnapshotCount":16,"syncStatus":43,"lastSyncTime":44,"discoverSource":45},11459,"ground-station","sgoudelis\u002Fground-station","sgoudelis","Ground Station is all-in-one satellite monitoring suite",null,"https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station","JavaScript",4532,798,75,5,0,18,109,15,30.71,false,"main",[24,25,26,27,28,29,30,31,32,33,34,35,36,5,37,38,39],"antenna","fft","python","radio","react","rig","rotator","satellite","satnogs","sdr","space","tle","waterfall","bpsk","fsk","weather","2026-06-12 02:02:31","# Ground Station\n\n[![Tests](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Factions\u002Fworkflows\u002Ftests.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Factions\u002Fworkflows\u002Ftests.yml) [![License: GPL v3](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-GPLv3-blue.svg)](https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fgpl-3.0) [![Release](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Factions\u002Fworkflows\u002Frelease-from-images.yml\u002Fbadge.svg?event=push)](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Factions\u002Fworkflows\u002Frelease-from-images.yml) [![Last Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease-date\u002Fsgoudelis\u002Fground-station)](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Freleases\u002Flatest) [![Last Commit](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flast-commit\u002Fsgoudelis\u002Fground-station)](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Fcommits\u002Fmain)\n\n\n**Ground Station is a full-featured, open-source software solution for satellite tracking and radio communication.** Designed for amateur radio operators, satellite enthusiasts, and researchers, it provides\na comprehensive and easy-to-use platform for monitoring spacecraft, controlling radio equipment, and receiving\nlive radio signals from satellites.\nThis project was built with the help of Claude Code and Codex.\n\n## Screenshots\n\n\u003Cdiv align=\"center\">\n\n### Global Satellite Overview\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - overview page - amateur group.png\" alt=\"Overview page with amateur satellite group\" width=\"450\"\u002F>\n\n*Overview page with quick group selection and real-time satellite status indicators*\n\n---\n\n### Multi-Target Tracking Console\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - tracking console - multitargets - iss.png\" alt=\"Multi-target tracking console focused on ISS\" width=\"450\"\u002F>\n\n*Multi-target tracking console view showing an active ISS target with per-target control and live tracking telemetry*\n\n---\n\n### SDR Waterfall View\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - waterfall page - transcription - iss.png\" alt=\"Waterfall view with live transcription\" width=\"450\"\u002F>\n\n*Waterfall view with live transcription overlay during active satellite communication*\n\n---\n\n### Waterfall Packet Decoding (GMSK)\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - waterfall page - packet decoding gmsk.png\" alt=\"Waterfall packet decoding view with GMSK\" width=\"450\"\u002F>\n\n*Waterfall view with live GMSK packet decoding and decoded output details*\n\n---\n\n### Telemetry Packet Viewer (Hex + ASCII)\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - packet viewer - as hexascii.png\" alt=\"Telemetry packet viewer with hex and ASCII columns\" width=\"450\"\u002F>\n\n*Packet viewer showing telemetry payload bytes in hex with ASCII side-by-side*\n\n---\n\n### TLE Data Synchronization\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - tle sync page.png\" alt=\"TLE synchronization page\" width=\"450\"\u002F>\n\n*TLE synchronization page showing real-time progress and satellite database updates*\n\n---\n\n### SDR Hardware Management\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - sdrs view - table list.png\" alt=\"SDR device management\" width=\"450\"\u002F>\n\n*Comprehensive SDR device management interface supporting RTL-SDR, SoapySDR, and UHD\u002FUSRP radios with remote capability*\n\n---\n\n### File Browser & Decoders\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - file browser - weather images - decoded packets - recorded transcriptions.png\" alt=\"File browser with decoded outputs and transcriptions\" width=\"450\"\u002F>\n\n*File browser view showing decoded weather images, packet outputs, and saved transcriptions*\n\n---\n\n### Observations Overview\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - observations - overview.png\" alt=\"Observations overview\" width=\"450\"\u002F>\n\n*Automated observations dashboard with upcoming passes and task status*\n\n---\n\n### DSP Topology & Performance\n\u003Cimg src=\"frontend\u002Fpublic\u002Fground station - dsp topology - performance.png\" alt=\"DSP topology and performance view\" width=\"450\"\u002F>\n\n*Chain of threads and processes IQ samples pass through, showing performance and data flow across the DSP pipeline*\n\n---\n\n\u003C\u002Fdiv>\n\n## Key Features\n\n*   **Real-time Satellite Tracking:** Track hundreds of satellites with high-precision orbital models. TLE data is automatically updated from CelesTrak and SatNOGS.\n*   **Multi-Target Tracking Fleet:** Run multiple target trackers at the same time, each with its own rig\u002Frotator control path, so you can operate several target-hardware chains in parallel.\n*   **Automated Antenna Rotator Control:** Interface with popular antenna rotators to automatically track satellites as they pass overhead.\n*   **Rig Control (Hamlib):** Control Hamlib-compatible rigs with Doppler correction during satellite passes.\n*   **SDR Integration:** Stream and record live radio signals from a wide range of SDR devices, including RTL-SDR, SoapySDR, and UHD\u002FUSRP radios.\n*   **IQ Recording & Playback:** Record raw IQ data in SigMF format with complete metadata (center frequency, sample rate, satellite info) and play back recordings through a virtual SDR device for analysis and debugging.\n*   **Data Decoding:** Decode SSTV, FSK, GFSK, GMSK, and BPSK with AX25 USP Geoscan framing. LoRa and AFSK decoders are currently not working; help is needed.\n*   **AI-Powered Transcription:** Real-time speech-to-text for demodulated audio via Gemini Live or Deepgram. Privacy-conscious and user-keyed, with optional translation and file output to `backend\u002Fdata\u002Ftranscriptions\u002F`.\n*   **Scheduled Observations:** Define detailed observation tasks that automatically listen, decode, transcribe, and record audio and IQ during satellite passes without manual intervention.\n*   **SatDump Integration:** Decode weather satellite images from METEOR-M2 (LRPT and HRPT) via SatDump, coupled with automated observations.\n*   **Performance Monitoring:** Real-time visualization of the signal processing pipeline showing data flow between components (SDR → FFT → Demodulator → Decoder → Browser), queue health monitoring, throughput rates, and component statistics to diagnose bottlenecks and optimize performance.\n*   **Responsive Web Interface:** A modern, responsive, and intuitive web interface built with Material-UI that adapts seamlessly to desktop, tablet, and mobile devices, allowing you to control all aspects of the ground station from anywhere on your network. Works great on a tablet and cell.\n\n## Scheduled Observations & Automated Pass Recording\n\nGround Station includes a comprehensive automated observation system that can schedule and execute satellite passes without user intervention:\n\n*   **Monitored Satellites:** Define satellite monitoring templates with hardware configurations, signal parameters, and task definitions. The system automatically generates scheduled observations for all qualifying passes.\n*   **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).\n*   **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.\n*   **Hardware Orchestration:** Automatically controls SDR devices, antenna rotators (with satellite tracking), and rigs (with Doppler correction) during scheduled observations.\n*   **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.\n*   **Multi-SDR Observing:** Automated observations can run on one SDR while additional SDRs record, decode, and listen to the same pass in parallel.\n*   **Status Management:** Real-time observation status tracking (scheduled, running, completed, failed, cancelled, missed) with automatic cleanup of old completed observations.\n*   **Session Management:** Automated observations run in isolated internal VFO sessions (namespace: \"internal:\u003Cobservation_id>\"). When using different SDRs, user sessions and automated observations operate completely independently without any interference.\n\n## Planned Features & Roadmap\n\nThe following features are planned or in development:\n\n*   **Additional Decoders:**\n    *   AFSK packet decoder\n    *   LoRa decoders\n    *   NOAA APT weather satellite images\n    *   Additional telemetry formats\n\n## Architecture\n\u003Ca id=\"arch-v1\">\u003C\u002Fa>\n\nThe Ground Station application is composed of a frontend, a backend, and a set of worker processes.\n\n### High-Level System Architecture\n\n```mermaid\nflowchart TB\n    %% Cache buster: v5-20251115-updated\n    %% Frontend Layer\n    A[Frontend: React + Redux + MUI\u003Cbr\u002F>- Real-time UI updates\u003Cbr\u002F>- State management\u003Cbr\u002F>- Interactive satellite maps\u003Cbr\u002F>- Spectrum & waterfall display\u003Cbr\u002F>- Audio playback & recording\u003Cbr\u002F>- IQ recording & playback controls\u003Cbr\u002F>- Decoder monitoring & output display]\n\n    %% Backend Layer\n    B[Backend: FastAPI + Socket.IO\u003Cbr\u002F>- WebSocket connections\u003Cbr\u002F>- Worker process management\u003Cbr\u002F>- Database operations\u003Cbr\u002F>- TLE data fetching\u003Cbr\u002F>- Recording & file management\u003Cbr\u002F>- Decoder lifecycle management]\n\n    %% Worker Layer\n    subgraph Workers[\"Worker Processes\"]\n        direction TB\n        W1[Tracker Supervisor + Tracker Instances\u003Cbr\u002F>- One tracker instance per rotator\u003Cbr\u002F>- Antenna rotator control\u003Cbr\u002F>- Rig\u002Fradio control\u003Cbr\u002F>- Real-time tracking calculations\u003Cbr\u002F>- Hardware state management]\n        W2[SDR IQ Acquisition\u003Cbr\u002F>- Raw IQ sample streaming\u003Cbr\u002F>- IQ Broadcaster pub\u002Fsub\u003Cbr\u002F>- Multi-consumer support]\n        W2A[FFT Processor\u003Cbr\u002F>- Spectrum computation\u003Cbr\u002F>- Waterfall generation\u003Cbr\u002F>- Real-time FFT analysis]\n        W2B[Demodulators\u003Cbr\u002F>- FM\u002FSSB\u002FAM modes\u003Cbr\u002F>- Normal & Internal modes\u003Cbr\u002F>- Frequency translation\u003Cbr\u002F>- Audio processing\u003Cbr\u002F>- Multi-VFO support]\n        W2C[IQ Recorder\u003Cbr\u002F>- SigMF format recording\u003Cbr\u002F>- Metadata capture\u003Cbr\u002F>- Satellite info tagging\u003Cbr\u002F>- Waterfall snapshot saving]\n        W2D[Decoders\u003Cbr\u002F>- SSTV image decoder ✓\u003Cbr\u002F>- AFSK packet decoder WIP\u003Cbr\u002F>- LoRa\u002FGMSK decoders WIP\u003Cbr\u002F>- Audio Broadcaster for monitoring]\n        W3[SDR Local Probe\u003Cbr\u002F>- Device discovery\u003Cbr\u002F>- Local SoapySDR enumeration\u003Cbr\u002F>- Hardware capability detection]\n        W4[SDR Remote Probe\u003Cbr\u002F>- Remote SoapySDR discovery\u003Cbr\u002F>- Network device scanning\u003Cbr\u002F>- Remote capability detection]\n    end\n\n    %% Hardware Layer\n    subgraph Hardware[\"Hardware Interfaces\"]\n        direction LR\n        H1[Antenna Rotators\u003Cbr\u002F>- Hamlib compatible\u003Cbr\u002F>- Az\u002FEl control]\n        H2[Radios\u002FRigs\u003Cbr\u002F>- CAT control\u003Cbr\u002F>- Frequency tuning]\n        H3[Local SDR Devices\u003Cbr\u002F>- RTL-SDR\u003Cbr\u002F>- SoapySDR devices\u003Cbr\u002F>- UHD\u002FUSRP]\n        H4[Remote SDR Devices\u003Cbr\u002F>- SoapyRemote\u003Cbr\u002F>- rtl_tcp servers\u003Cbr\u002F>- Network receivers]\n        H5[SigMF Playback\u003Cbr\u002F>- Virtual SDR device\u003Cbr\u002F>- Recording playback\u003Cbr\u002F>- SigMF metadata reader]\n    end\n\n    %% Storage Layer\n    subgraph Storage[\"Data Storage\"]\n        S1[SigMF Recordings\u003Cbr\u002F>- .sigmf-data files\u003Cbr\u002F>- .sigmf-meta files\u003Cbr\u002F>- Waterfall snapshots]\n        S2[Decoded Outputs\u003Cbr\u002F>- SSTV images\u003Cbr\u002F>- Packet data]\n    end\n\n    %% External Services\n    subgraph External[\"External Data Sources\"]\n        E1[TLE Data Sources\u003Cbr\u002F>- CelesTrak\u003Cbr\u002F>- SatNOGS DB]\n        E2[Satellite Databases\u003Cbr\u002F>- Transmitter info\u003Cbr\u002F>- Orbital data]\n    end\n\n    %% Connections - Frontend to Backend\n    A \u003C---|Socket.IO\u003Cbr\u002F>Bidirectional| B\n\n    %% Backend to Workers\n    B ---|Message Queues\u003Cbr\u002F>Commands & Status| W1\n    B ---|Message Queues\u003Cbr\u002F>Stream Control| W2\n    B ---|Message Queues\u003Cbr\u002F>Discovery Requests| W3\n    B ---|Message Queues\u003Cbr\u002F>Remote Scanning| W4\n\n    %% SDR IQ Distribution via IQ Broadcaster\n    W2 ---|IQ Broadcaster\u003Cbr\u002F>Subscribe| W2A\n    W2 ---|IQ Broadcaster\u003Cbr\u002F>Subscribe| W2B\n    W2 ---|IQ Broadcaster\u003Cbr\u002F>Subscribe| W2C\n    W2 ---|IQ Broadcaster\u003Cbr\u002F>Subscribe Raw IQ| W2D\n\n    %% Demodulator to Decoder Chain\n    W2B ---|Internal Mode\u003Cbr\u002F>Audio Broadcaster| W2D\n\n    %% Data back to Backend\n    W2A ---|FFT Data\u003Cbr\u002F>Spectrum\u002FWaterfall| B\n    W2B ---|Audio Data\u003Cbr\u002F>Demodulated| B\n    W2D ---|Decoded Data\u003Cbr\u002F>Images\u002FText\u002FPackets| B\n    W2D ---|UI Audio Stream\u003Cbr\u002F>Live Monitoring| B\n\n    %% Recording Storage\n    W2C ---|Write SigMF\u003Cbr\u002F>Recording Files| S1\n    W2D ---|Write Decoded\u003Cbr\u002F>Output Files| S2\n\n    %% Hardware Control\n    W1 ---|Control Commands| H1\n    W1 ---|Frequency Control| H2\n    W2 ---|IQ Data Streaming| H3\n    W2 ---|Network Streaming| H4\n    W2 ---|Playback Source| H5\n    W3 ---|Device Enumeration| H3\n    W4 ---|Remote Discovery| H4\n\n    %% Storage Access\n    H5 ---|Read Files| S1\n    B ---|File Management| S1\n    B ---|File Management| S2\n\n    %% External Data\n    B ---|HTTP\u002FAPI Requests| E1\n    B ---|Database Queries| E2\n\n    %% Dark Mode Styling\n    classDef frontend fill:#1a237e,stroke:#3f51b5,stroke-width:2px,color:#ffffff\n    classDef backend fill:#2e7d32,stroke:#4caf50,stroke-width:2px,color:#ffffff\n    classDef worker fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff\n    classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff\n    classDef storage fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff\n    classDef external fill:#b71c1c,stroke:#f44336,stroke-width:2px,color:#ffffff\n\n    class A frontend\n    class B backend\n    class W1,W2,W2A,W2B,W2C,W2D,W3,W4 worker\n    class H1,H2,H3,H4,H5 hardware\n    class S1,S2 storage\n    class E1,E2 external\n\n    %% Dashed borders for subgraphs\n    style Workers stroke-dasharray: 5 5\n    style Hardware stroke-dasharray: 5 5\n    style Storage stroke-dasharray: 5 5\n    style External stroke-dasharray: 5 5\n```\n\n### Signal Processing Data Flow\n\nThis diagram shows how radio signals flow through the system from SDR hardware to decoders and UI:\n\n```mermaid\nflowchart TB\n    %% SDR Source\n    SDR[SDR Hardware\u003Cbr\u002F>RTL-SDR, SoapySDR, UHD]\n\n    %% IQ Broadcaster\n    IQB[IQ Broadcaster\u003Cbr\u002F>Pub\u002FSub Pattern\u003Cbr\u002F>Deep copy for each subscriber]\n\n    %% Primary Consumers\n    subgraph Consumers[\"IQ Consumers\"]\n        FFT[FFT Processor\u003Cbr\u002F>→ Spectrum Display]\n        REC[IQ Recorder\u003Cbr\u002F>→ SigMF Files]\n        DEMOD[Demodulator\u003Cbr\u002F>FM\u002FSSB\u002FAM]\n        IQDEC[IQ Decoders\u003Cbr\u002F>GMSK\u002FFSK\u002FBPSK]\n    end\n\n    %% Demodulator Branches\n    subgraph DemodBranch[\"Demodulator Types\"]\n        direction TB\n        NORM[Normal Mode\u003Cbr\u002F>User Playback]\n        INT[Internal Mode\u003Cbr\u002F>For Decoders]\n    end\n\n    %% Audio Broadcaster for Internal Demodulators\n    AUDIOB[Audio Broadcaster\u003Cbr\u002F>Pub\u002FSub Pattern\u003Cbr\u002F>Deep copy for each subscriber]\n\n    %% Decoder Chain\n    subgraph DecoderChain[\"Audio-based Decoder Processing\"]\n        direction TB\n        DEC[Decoder\u003Cbr\u002F>AFSK]\n        UIAUDIO[UI Audio Stream\u003Cbr\u002F>Live Monitoring]\n    end\n\n    %% Output Destinations\n    subgraph Outputs[\"Outputs\"]\n        SPECUI[Spectrum\u002FWaterfall UI]\n        SIGFILE[SigMF Recording Files]\n        PLAYBACK[Audio Playback to User]\n        DECOUT[Decoded Data\u003Cbr\u002F>Images\u002FText\u002FPackets]\n        AUDIOUI[UI Audio Player\u003Cbr\u002F>Decoder Monitoring]\n    end\n\n    %% Connections\n    SDR -->|Raw IQ Samples| IQB\n    SDR -->|Raw IQ Samples| FFT\n    IQB -->|Subscribe| REC\n    IQB -->|Subscribe| DEMOD\n    IQB -->|Subscribe| IQDEC\n\n    DEMOD -->|Branch| NORM\n    DEMOD -->|Branch| INT\n\n    NORM -->|Audio Queue| PLAYBACK\n    INT -->|Audio Queue| AUDIOB\n\n    AUDIOB -->|Subscribe: decoder| DEC\n    AUDIOB -->|Subscribe: ui| UIAUDIO\n\n    FFT -->|FFT Data| SPECUI\n    REC -->|Write| SIGFILE\n    DEC -->|Decoded Output| DECOUT\n    IQDEC -->|Decoded Output| DECOUT\n    UIAUDIO -->|Audio Chunks| AUDIOUI\n\n    %% Styling\n    classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff\n    classDef broadcaster fill:#d84315,stroke:#ff5722,stroke-width:3px,color:#ffffff\n    classDef processor fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff\n    classDef output fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff\n    classDef decoder fill:#1b5e20,stroke:#4caf50,stroke-width:2px,color:#ffffff\n\n    class SDR hardware\n    class IQB,AUDIOB broadcaster\n    class FFT,REC,DEMOD,NORM,INT processor\n    class SPECUI,SIGFILE,PLAYBACK,DECOUT,AUDIOUI output\n    class DEC,UIAUDIO decoder\n```\n\n#### Key Concepts\n\n**IQ Broadcaster (Pub\u002FSub Pattern):**\n- SDR produces raw IQ samples at high rate\n- IQBroadcaster distributes to multiple consumers simultaneously\n- Each subscriber gets independent queue with deep-copied samples\n- Slow consumers: messages dropped rather than blocking producer\n- Supports: FFT processor, demodulators, IQ recorder, decoders (LoRa\u002FGMSK)\n\n**Audio Broadcaster (Decoder Pattern):**\n- Only used for internal demodulators feeding decoders\n- Distributes demodulated audio to:\n  - **Decoder subscriber:** SSTV\u002FAFSK decoder processing\n  - **UI subscriber:** Live audio monitoring in browser\n- Statistics tracking: delivered\u002Fdropped message counts per subscriber\n- Graceful slow consumer handling\n\n**Chain Processing Example (SSTV):**\n1. SDR → IQBroadcaster → Internal FM Demodulator (SSTV)\n2. FM Demodulator → AudioBroadcaster input queue\n3. AudioBroadcaster → Decoder subscriber → SSTV Decoder → Image output\n4. AudioBroadcaster → UI subscriber → Browser audio player\n\n**Why Broadcasters?**\n- **Decoupling:** Producers don't know about consumers\n- **Scalability:** Add consumers without modifying producers\n- **Monitoring:** Per-subscriber statistics and health monitoring\n- **Reliability:** Slow consumers don't block fast producers\n\n*   **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.\n*   **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\u002Fsub architecture for signal distribution.\n*   **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\u002FLoRa in development), and antenna control. Workers use IQ Broadcaster and Audio Broadcaster for efficient multi-consumer signal distribution.\n\n## Third-Party Libraries & Technologies\n\n### Backend\n\n*   **[FastAPI](https:\u002F\u002Ffastapi.tiangolo.com\u002F):** A modern, fast (high-performance), web framework for building APIs with Python 3.7+ based on standard Python type hints.\n*   **[SQLAlchemy](https:\u002F\u002Fwww.sqlalchemy.org\u002F):** The Python SQL Toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.\n*   **[Skyfield](https:\u002F\u002Frhodesmill.org\u002Fskyfield\u002F):** A modern astronomy library for Python that computes positions for the stars, planets, and satellites in orbit around the Earth.\n*   **[SGP4](https:\u002F\u002Fpypi.org\u002Fproject\u002Fsgp4\u002F):** A Python implementation of the SGP4 satellite propagation model.\n*   **[Socket.IO](https:\u002F\u002Fpython-socketio.readthedocs.io\u002Fen\u002Flatest\u002F):** A library for real-time, bidirectional, event-based communication.\n*   **[pyrtlsdr](https:\u002F\u002Fpypi.org\u002Fproject\u002Fpyrtlsdr\u002F):** A Python wrapper for the RTL-SDR library.\n*   **[SoapySDR](https:\u002F\u002Fpypi.org\u002Fproject\u002FSoapySDR\u002F):** A vendor and platform neutral SDR support library.\n*   **[SatDump](https:\u002F\u002Fgithub.com\u002FSatDump\u002FSatDump):** Satellite decoder suite used for weather image decoding workflows.\n*   **[gr-satellites](https:\u002F\u002Fgithub.com\u002Fdaniestevez\u002Fgr-satellites):** GNU Radio out-of-tree modules for satellite communications decoding.\n\n### Frontend\n\n*   **[React](https:\u002F\u002Freactjs.org\u002F):** A JavaScript library for building user interfaces.\n*   **[Redux Toolkit](https:\u002F\u002Fredux-toolkit.js.org\u002F):** The official, opinionated, batteries-included toolset for efficient Redux development.\n*   **[Material-UI](https:\u002F\u002Fmui.com\u002F):** A popular React UI framework with a comprehensive suite of UI tools.\n*   **[Vite](https:\u002F\u002Fvitejs.dev\u002F):** A build tool that aims to provide a faster and leaner development experience for modern web projects.\n*   **[Socket.IO Client](https:\u002F\u002Fsocket.io\u002Fdocs\u002Fv4\u002Fclient-api\u002F):** The client-side library for Socket.IO.\n*   **[Leaflet](https:\u002F\u002Fleafletjs.com\u002F):** An open-source JavaScript library for mobile-friendly interactive maps.\n*   **[satellite.js](https:\u002F\u002Fgithub.com\u002Fshashwatak\u002Fsatellite-js):** A JavaScript library to propagate satellite orbits.\n\n## SDR Device Support\n\nDedicated worker processes provide IQ acquisition, FFT processing, and demodulation support for multiple receiver families:\n\n*   **RTL-SDR** (USB or `rtl_tcp`) workers\n*   **SoapySDR** devices locally or through SoapyRemote: RTL-SDR, Airspy, AirspyHF+, HackRF, HydraSDR, LimeSDR, PlutoSDR, UHD\u002FUSRP, and SDRplay (RSP series)\n*   **UHD\u002FUSRP** radios via a UHD worker\n*   **Need another SoapySDR device?** Open a GitHub issue and request support.\n\nThe SDR architecture uses a pub\u002Fsub pattern (IQ Broadcaster) to separate IQ acquisition from signal processing:\n*   **IQ Acquisition Workers** stream raw samples to **IQ Broadcaster**\n*   **IQ Broadcaster** distributes to multiple subscribers independently:\n    *   **FFT Processor** for spectrum\u002Fwaterfall display\n    *   **Demodulators** (FM\u002FSSB\u002FAM) for audio output in normal and internal modes\n    *   **IQ Recorder** for SigMF format file capture\n*   **Raw IQ Decoders** (BPSK, GMSK) that bypass demodulation\n*   **Audio Broadcaster** distributes demodulated audio from internal demodulators to:\n*   **Data Decoders** (AFSK) for signal decoding\n    *   **UI Audio Stream** for live monitoring in browser\n\n> **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.\n\n## IQ Recording & Playback\n\nGround Station includes comprehensive IQ recording and playback capabilities using the [SigMF (Signal Metadata Format)](https:\u002F\u002Fgithub.com\u002Fgnuradio\u002FSigMF) standard:\n\n### Recording Features\n*   **SigMF Format:** Records IQ data as `.sigmf-data` files with accompanying `.sigmf-meta` JSON metadata\n*   **Automatic Metadata:** Captures center frequency, sample rate, timestamp, and recording duration\n*   **Satellite Tracking:** Automatically tags recordings with target satellite name and NORAD ID\n*   **Waterfall Snapshots:** Saves PNG snapshots of the waterfall display alongside recordings\n*   **Multi-segment Support:** Handles parameter changes (frequency, sample rate) as separate capture segments\n*   **Real-time Monitoring:** Live duration counter and visual recording indicator in the UI\n\n### Playback Features\n*   **Virtual SDR Device:** Recordings appear as \"SigMF Playback\" SDR in the device list\n*   **Full Processing Pipeline:** Playback supports FFT display, demodulation, and all signal processing\n*   **Live-equivalent Decoding:** During playback, demodulators and decoders run exactly as they do with live SDR input\n*   **Recording Browser:** Sortable list of recordings with metadata preview (sample rate, duration, timestamp)\n*   **Seamless Integration:** Switch between live SDR and playback without changing workflows\n\n## Automated Observations\n\nGround Station includes an automated observation system for scheduled satellite passes:\n\n*   **Monitored Satellites:** Define satellite monitoring templates with hardware configurations, signal parameters, and task definitions.\n*   **Automated Pass Scheduling:** Automatically calculate and schedule upcoming passes based on configurable criteria (minimum elevation, lookahead window).\n*   **Flexible Task Composition:** Combine IQ recording (SigMF), audio recording, protocol decoding, and AI transcription in a single observation.\n*   **Hardware Orchestration:** Control SDR devices, antenna rotators (with satellite tracking), and rigs (with Doppler correction) during scheduled runs.\n*   **Live Observation Capability:** Watch the spectrum waterfall, listen to demodulated audio, and view live decoder output during automated passes.\n*   **Multi-SDR Observing:** Run automated observations on one SDR while additional SDRs record, decode, and listen to the same pass in parallel.\n*   **Status Management:** Track observation status (scheduled, running, completed, failed, cancelled, missed) with automatic cleanup of old entries.\n*   **Session Management:** Automated observations run in isolated internal VFO sessions (namespace: \"internal:\u003Cobservation_id>\").\n\n## Getting Started\n\nFor development setup, build steps, and testing, see `DEVELOPMENT.md`.\n\n## Application Configuration\n\nGround Station backend runtime options are stored in `backend\u002Fdata\u002Fconfigs\u002Fapp_config.json` and are editable in the UI at `Settings -> Settings`.\n\nConfiguration precedence is:\n\n1. CLI flags (highest priority)\n2. `app_config.json`\n3. built-in defaults (lowest priority)\n\nThe UI also exposes when a value is currently CLI-overridden and whether a change is hot-applied or restart-required.\n\n`\u002Fsettings\u002Fpreferences` is kept as a compatibility route and is now rendered as a tab inside the unified Settings page.\n\n## Docker\n\n### Building from Source\n\nThe repository includes a multi-stage `Dockerfile` that builds the React frontend and a Python environment with SDR libraries.\n\n```bash\ndocker build -t ground-station .\n\n# Option 1: Standard bridge mode (works for local SDRs)\ndocker run --rm -p 7000:7000 --device \u002Fdev\u002Fbus\u002Fusb ground-station\n\n# Option 2: Host networking (required for SoapySDR remote server discovery via mDNS)\ndocker run --rm --network host --device \u002Fdev\u002Fbus\u002Fusb ground-station\n```\n\n### Using Pre-built Docker Images\n\nPre-built multi-architecture Docker images are available for each release. For detailed instructions on using a specific release, see the [Releases page](https:\u002F\u002Fgithub.com\u002Fsgoudelis\u002Fground-station\u002Freleases).\n\n### Pull the image\n\n```bash\n# Latest release tag (recommended)\ndocker pull ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>\n\n# Or pull architecture-specific tags directly\ndocker pull ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>-amd64\ndocker pull ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>-arm64\n```\n\n### Run the container\n\n**Option 1: With SoapySDR Remote Server Discovery (Recommended)**\n\nUses host networking to enable automatic mDNS discovery of SoapySDR remote servers:\n\n```bash\n# AMD64\ndocker run -d \\\n  --platform linux\u002Famd64 \\\n  --network host \\\n  --name ground-station \\\n  --restart unless-stopped \\\n  --device=\u002Fdev\u002Fbus\u002Fusb \\\n  --privileged \\\n  -v \u002Fpath\u002Fto\u002Fdata:\u002Fapp\u002Fbackend\u002Fdata \\\n  -e GS_ENVIRONMENT=production \\\n  -e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \\\n  ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>\n\n# ARM64 (Raspberry Pi, etc)\ndocker run -d \\\n  --platform linux\u002Farm64 \\\n  --network host \\\n  --name ground-station \\\n  --restart unless-stopped \\\n  -v \u002Fdev:\u002Fdev \\\n  --privileged \\\n  -v \u002Fpath\u002Fto\u002Fdata:\u002Fapp\u002Fbackend\u002Fdata \\\n  -e GS_ENVIRONMENT=production \\\n  -e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \\\n  ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>\n```\n\n**Option 2: Standard Bridge Mode (No SoapySDR Remote Discovery)**\n\nUses standard bridge networking with port mapping:\n\n```bash\n# AMD64\ndocker run -d \\\n  --platform linux\u002Famd64 \\\n  -p 7000:7000 \\\n  --name ground-station \\\n  --restart unless-stopped \\\n  --device=\u002Fdev\u002Fbus\u002Fusb \\\n  --privileged \\\n  -v \u002Fpath\u002Fto\u002Fdata:\u002Fapp\u002Fbackend\u002Fdata \\\n  -e GS_ENVIRONMENT=production \\\n  -e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \\\n  ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>\n\n# ARM64 (Raspberry Pi, etc)\ndocker run -d \\\n  --platform linux\u002Farm64 \\\n  -p 7000:7000 \\\n  --name ground-station \\\n  --restart unless-stopped \\\n  -v \u002Fdev:\u002Fdev \\\n  --privileged \\\n  -v \u002Fpath\u002Fto\u002Fdata:\u002Fapp\u002Fbackend\u002Fdata \\\n  -e GS_ENVIRONMENT=production \\\n  -e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \\\n  ghcr.io\u002Fsgoudelis\u002Fground-station:\u003Cversion>\n```\n\n**Important Notes:**\n- Replace `\u002Fpath\u002Fto\u002Fdata` with your desired data directory path\n- Option 1 (host networking) is required for automatic discovery of SoapySDR remote servers via mDNS\n- Option 2 works for local SDRs and all other features\n- For Raspberry Pi hardware, only the Raspberry Pi 5 is recommended\n- For ARM64, using `-v \u002Fdev:\u002Fdev` ensures all USB devices are accessible\n- Access the web interface at `http:\u002F\u002F\u003CYOUR_HOST>:7000`\n\n## Contributing\n\nWe welcome contributions! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for details on how to get started.\n\n## Acknowledgments\n\nThis project uses the SatNOGS API for transmitter information.\n\n## License\n\nThis project is licensed under the GNU GPL v3. See the [LICENSE](LICENSE) file for details.\n\n\n\n![](https:\u002F\u002Fhit.yhype.me\u002Fgithub\u002Fprofile?account_id=4840328)\n![Visitors](https:\u002F\u002Fapi.visitorbadge.io\u002Fapi\u002Fvisitors?path=https%3A%2F%2Fgithub.com%2Fsgoudelis%2Fground-station&countColor=%23263759)\n","Ground Station 是一个集成了卫星跟踪和无线电通信功能的开源软件解决方案。该项目使用JavaScript开发，支持多种调制方式如BPSK、FSK等，并且能够对接SDR设备进行信号接收与解码，通过React构建的用户界面友好且直观。此外，它还提供了天线控制、TLE数据同步以及实时瀑布图显示等功能，特别适合业余无线电爱好者、卫星追踪者及空间研究领域的专业人士使用。",2,"2026-06-11 03:31:51","trending"]