Demodulate and decode signal into packet stream.


You need a proper antenna system (incl. LNA and filter) to receive the LRIT and HRIT signals.

See A minimal LRIT/HRIT receiver for an example setup.

You can use goesrecv with an RTL-SDR (make sure you have one with the R820T tuner chip), or an Airspy (confirmed to work with the Mini). The raw signal is then processed by the demodulator and turned into a stream of 1s and 0s. This is then passed to the decoder where the bitstream is synchronized and error correction is applied. Every valid packet is then forwarded to downstream tools (e.g. goeslrit or goesproc).


-c, --config=PATH

Path to configuration file

-v, --verbose

Periodically show statistics

-i, --interval=SEC

Interval for --verbose


The configuration file uses TOML syntax. Look further down for a sample configuration file.


There are a few ways to keep an eye on the signal quality and goesrecv performance. You may use more than one method or none at all.


Specify the --verbose option to make goesrecv periodically write stats to stdout. This can be useful if you need immediate feedback about the signal lock and signal quality. The interval can be controlled with the --interval option. Also see Options.

Example output (when running with -v -i 1):

2018-04-18T04:28:08Z [monitor] gain: 22.54, freq:  2899.3, omega: 1.618, vit(avg):   54, rs(sum):    0, packets: 57, drops:  0
2018-04-18T04:28:09Z [monitor] gain: 22.51, freq:  2917.1, omega: 1.618, vit(avg):   55, rs(sum):    0, packets: 57, drops:  0
2018-04-18T04:28:10Z [monitor] gain: 22.53, freq:  2924.1, omega: 1.618, vit(avg):   56, rs(sum):    2, packets: 56, drops:  0
2018-04-18T04:28:11Z [monitor] gain: 22.53, freq:  2952.2, omega: 1.618, vit(avg):   55, rs(sum):    0, packets: 57, drops:  0

Field glossary:

  • gain – Multiplier to normalize signal

  • freq – Frequency offset of signal

  • omega – Samples per symbol in clock recovery

  • vit(avg) – Average number of bit errors corrected by Viterbi decoder

  • rs(sum) – Total number of errors corrected by Reed-Solomon across packets

  • packets – Number of packets decoded

  • drops – Number of packets dropped

nanomsg and JSON

You can configure goesrecv to bind the stats_publisher handlers for the demodulator and decoder to some valid nanomsg address (see the sample configuration).

The stats are passed using the nanomsg publish/subscribe functionality. The stats are sent on a publisher socket. To receive them you connect a subscriber socket, and subscribe it to the zero length topic (such that you receive all messages). Refer to nn_pubsub(7) for more information about nanomsg publish/subscribe.

Example of the raw output of the demodulator stats:

$ nanocat --sub --connect tcp:// --raw
{"timestamp": "2018-04-18T04:52:58.357Z","gain": 2.2494e+01,"frequency": 2.9813e+03,"omega": 1.6181e+00}
{"timestamp": "2018-04-18T04:52:58.379Z","gain": 2.2494e+01,"frequency": 3.0140e+03,"omega": 1.6181e+00}

Example of the raw output of the decoder stats:

$ nanocat --sub --connect tcp:// --raw
{"timestamp": "2018-04-18T04:54:22.974Z","skipped_symbols": 0,"viterbi_errors": 44,"reed_solomon_errors": 0,"ok": 1}
{"timestamp": "2018-04-18T04:54:22.995Z","skipped_symbols": 0,"viterbi_errors": 35,"reed_solomon_errors": 0,"ok": 1}


You can forward the goesrecv stats to some monitoring and graphing tool using the statsd protocol. This is a simple connection free line based text protocol that can encode counters, gauges, histograms, etc. The UDP address to send these stats to is configurable under the [monitor] section (see the sample configuration).

There are many tools that can deal with the statsd protocol. For example, tools that folks have used with goesrecv in the past include InfluxDB (self-hosted) and Circonus (hosted).

Sample configuration

## Use LRIT mode for GOES-15.
# mode = "lrit"
## Use HRIT mode for GOES-16 or later.
# mode = "hrit"
source = "airspy"

# The section below configures the sample source to use.
# You can leave them commented out to use the default values for the
# demodulator mode you choose ("lrit" or "hrit"). To use and configure
# any of them, uncomment the section below, and change the demodulator
# source field to match the source you want to use.

# [airspy]
# frequency = 1694100000
## By default, goesrecv will use the lowest sample rate available.
## This is 2.5 MSPS for the R2 and 3.0 MSPS for the Mini.
## Because different Airspy models support different sample rates,
## it is recommended to leave the "sample_rate" field commented,
## so that it works for either model.
# sample_rate = 3000000
# gain = 18
# bias_tee = false

# [rtlsdr]
# frequency = 1694100000
# sample_rate = 2400000
# gain = 30
# bias_tee = false
# device_index = 0

# [nanomsg]
# sample_rate = 2400000
# connect = "tcp://"
# receive_buffer = 2097152

max_deviation = 200e3

bind = "tcp://"
send_buffer = 2097152

bind = "tcp://"
send_buffer = 1048576

bind = "tcp://"
send_buffer = 1048576

# The demodulator stats publisher sends a JSON object that describes
# the state of the demodulator (gain, frequency correction, samples
# per symbol), for every block of samples.
bind = "tcp://"

# The decoder stats publisher sends a JSON object for every packet it
# decodes (Viterbi corrections, Reed-Solomon corrections, etc.).
bind = "tcp://"

# The monitor can log aggregated stats (counters, gauges, and
# histograms) to a statsd daemon. Because this uses UDP, you can keep
# this enabled even if you haven't setup a statsd daemon yet.
statsd_address = "udp4://localhost:8125"