Chapter 3

Operation

In this chapter, you will get some information and examples on operation and modify/extend a station with satnogs-client-rs.

Basics

satnogs-client-rs is controlled via systemd-units. To start/stop it, you can use the systemctl command:

# start the station
$ sudo systemctl start satnogs-client-rs
# stop the station
$ sudo systemctl stop satnogs-client-rs

Per default, satnogs-client-rs is enabled and will startup with your system booting up.

You can view the status of your station with the status command:

$ systemctl status satnogs-client-rs
● satnogs-client-rs.service - Lightweight SatNOGS client written in Rust
     Loaded: loaded (/etc/systemd/system/satnogs-client-rs.service; disabled; preset: enabled)
     Active: active (running) since Tue 2026-06-23 18:22:43 UTC; 7s ago
   Main PID: 3177 (satnogs-client-)
      Tasks: 2 (limit: 3920)
        CPU: 28ms
     CGroup: /system.slice/satnogs-client-rs.service
             └─3177 /usr/bin/satnogs-client-rs --log debug

Jun 23 18:22:43 beegnd-4 satnogs-client-rs[3177]: 18:22:43 [INFO] Setup complete.
Jun 23 18:22:45 beegnd-4 satnogs-client-rs[3177]: 18:22:45 [DEBUG] (3) satnogs_client_rs: Acquired upload_queue.
Jun 23 18:22:45 beegnd-4 satnogs-client-rs[3177]: 18:22:45 [DEBUG] (3) satnogs_client_rs: Upload queue empty.
Jun 23 18:22:50 beegnd-4 satnogs-client-rs[3177]: 18:22:50 [DEBUG] (3) satnogs_client_rs: Acquired upload_queue.
Jun 23 18:22:50 beegnd-4 satnogs-client-rs[3177]: 18:22:50 [DEBUG] (3) satnogs_client_rs: Upload queue empty.

This status will show only the last couple of lines in your stations log. To see a full log (and follow it while), you can use the journalctl command.

$ journalctl -u satnogs-client-rs.service
Jun 23 19:02:23 beegnd-4 systemd[1]: Started satnogs-client-rs.service - Lightweight SatNOGS client written in Rust.
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] Loading settings...
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] Fetching jobs for station 263 from https://network-dev.satnogs.org/api
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] Fetched 0 jobs from the network
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] Initialising Scheduler...
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] ... registered network polling jobs task.
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] ... registered upload task.
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] ... registered post-script runner task.
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] ... registered house keeping task.
Jun 23 19:02:23 beegnd-4 satnogs-client-rs[3649]: 19:02:23 [INFO] Setup complete.

Advanced

This section shows some advanced workflows on your station.

Securing Station by Deactivating Web Configuration

Once you’ve done with the initial configuration, you may switch off the web based configuration tool by deactivating the systemd unit:

$ systemctl stop satnogs-client-wizard
$ systemctl disable satnogs-client-wizard

You may want to do this, to avoid your station being reconfigured accidentally or to avoid attack surface in your local network. You should definitely perform this step, before exposing your station to the internet (which I only partially can recommend, depends on the scenario).

Pre-/Post Scripts

Pre- and Post-Scripts are a vital part of your station operation. They give you the chance to heavily modify the observation process without the need to touch the clients code. Pre-scripts are run before an observation and post-scripts after an observations.

Note

At the time of writing (July 2026), pre-scripts start running directly at the point of time the observation should start. Effectively, they postpone the observation until they are finished. In consequence, pre-scripts should do minimal tasks only, so that they finish fast.

Post-scripts are run asynchronously after the observation. They can perform longer tasks. Please note, that upload of artifacts will only happen, once all scripts finished.

Writing Scripts

Scripts reside either in /usr/bin/satnogs-pre or /usr/bin/satnogs-post, depending on when they shall run. Once called, the scripts current working directory (cwd) is set to the directory with the observation data. Hence, your script can assume to access the files directly, without any directory structure needed.

Tip

Scripts are run in lexicographical order of their filename. E.g., 10-first.sh will run before 20-second.py. That way, you can precisely control the order of running your scripts.

This is a listing of an observation data directory, located at /var/tmp/satnogs-client-rs/39614:

.
├── config.json
├── demo_10-shell.txt
├── demo_20-python.txt
├── demo_pre-script.txt
├── job.json
├── .processing_finished
├── .processing_started
├── rawdata.iq16le_cs16_2026-06-24T15-35-58.raw
├── satnogs_39614_2026-06-24T15-35-58.ogg
├── waterfall.png
└── wfdata.dat

1 directory, 11 files

From the job.json, your scripts can grab any information they might need. It is the exact same json structure as delivered by the satnogs network to the client.

{
  "id": 39614,
  "start": "2026-06-24T15:35:58Z",
  "end": "2026-06-24T15:42:56Z",
  "ground_station": 263,
  "tle0": "0 SEEDS",
  "tle1": "1 32791U 08021J   26174.92467520  .00016297  00000-0  51414-3 0  9991",
  "tle2": "2 32791  97.7522 173.1446 0000291 274.9009  85.2198 15.32949855988329",
  "frequency": 437485700,
  "mode": "CW",
  "transmitter": "N7SGiqMhkHpjfjeGh42wvX",
  "baud": null,
  "max_altitude": 68,
  "norad_cat_id": 32791
}

Examples for reading this json-File in Shell and Python are delivered in the standard installation of satnogs-client-rs. You can find them in the predefined directory at /usr/bin/satnogs-[pre|post] or in the source code.

The demo_* files in the listing above are generated by the demonstration scripts.

Post-Processing: Waterfall

The waterfall script is taken from the original satnogs client. It post-processes the waterfall data generated by the satnogs-flowgraphs and renders them into a .png picture.

Example: Package IQ-Data to SigMF

This section is under construction. I plan to adjust the sigmf-packer, that I published already at codeberg and in the librespace community for satnogs-client-rs.

Example: Upload IQ-Data to a Nextcloud-Share

Under construction. Same as above. Packaging and uploading should be separate scripts, though.