Jeffrey Florek, Jr.

I’ve been playing with the Shortcuts app a lot lately, there are so many opportunities for automation!

One would think that a shorter week would entail less work than a regular week; but alas, it seems like this week has more! I’m very much looking forward to my days off.

We’re pondering the big questions this morning, i.e., “can I convince them to give me a third breakfast?”

Close-up photo of a brown long-haired chihuahua resting his chin on my leg.

After being stuck inside for the past week, I was finally able to get outside for a walk this morning. I’m feeling very fortunate to live in such a sylvan part of Queens.

Photo of a forest path surrounded by tall trees with vibrant green leaves. Fallen leaves and twigs scatter the trail.

We made freezer jam today from cherries that we wouldn’t have had time to finish. It feels good to reduce food waste and make something delicious!

I’ve managed to keep a basil plant alive for nearly a month and a half now. What a rush! 🌱

After taking a week off due to illness, I was finally able to get back outside for a run! Hopefully the air quality stays good enough that I can keep it up the whole week.

📺 Strange New Worlds may be my favorite new Star Trek. I’m a sucker for ensemble casts and episodic storytelling.

Small victory: managed to set up a GitHub Action to run the tests provided with each nand2tetris project and update a status badge in the README. Not a difficult task, especially with all the documentation available, but is it ever satisfying to see those green “passing” badges!

I’m always a little surprised by how much better I sleep in the middle of nowhere vs. the middle of Queens. Although, I suppose it’s obvious that noise and light pollution don’t foster restful sleep — even with an eye mask and earplugs.

Managed to run another half marathon and grab a new personal record of 1:38:52! Feeling very exhausted. Time to take it easy for a few days.

photo of a man wearing a running tank top with a bib and finisher's medal

Finished reading: Leviathan Falls by James S. A. Corey 📚 — I actually finished this last week. What a series! It’s been a while since I’ve finished a series that wasn’t a reread.

Making progress on my build of the Hadley 3D-printed telescope.

Photo of a partially assembled telescope made of steel rods and 3D-printed parts.

Now I need to find recipes to use up the quart of Korean BBQ sauce I have left over…

It’s disappointing when, after spending something like six hours spread out over two days, a recipe comes out looking nothing like the ridiculously perfect staged photograph in the book. But it’s delicious all the same, so I’ll count it as a win!

Managed to kill a whole day in CAD working on the conceptual design for our future house. Still needs work, but I’m happy with the progress!

Made the trek out to Central Park for my long run this morning. I think I should make a habit of this!

Screenshot of a map of central park showing a highlighted 12.4 mile route.

Successfully rooted my robot vacuum and installed Valetudo. Goodbye sketchy cloud service, hello local control!

Finished reading: Babylon’s Ashes by James S. A. Corey 📚

I’m not saying it couldn’t be worse, but I am not looking forward to my run tomorrow morning.

Screenshot of a weather forecast showing that the "feels like" temperature will be -11 degrees Fahrenheit tomorrow, Saturday February 4th 2023.

Satellite Imagery with RTL-SDR and GOES 16

Receiving full disk images of the Earth from GOES 16 with an RTL-SDR and a 2.4 GHz Parabolic Grid Antenna

Full disk image of the earth received from the GOES 16 weather satellite.

👋 Heads up!

This article was originally posted on my old website in April of 2019. While the general process of receiving images from GOES 16 won’t have changed, the software tools may have evolved since then. Make sure to read the documentation for goestools and don’t copy and paste any terminal commands below without fully understanding what you’re asking for!


After stumbling upon the online communities around software defined radio (mainly the RTL-SDR Blog and the RTL-SDR subreddit), I discovered it was possible to receive high resolution, full disk images of the Earth from NOAA’s GOES satellites using cheap and simple (relative to most other satcom systems) hardware setup. Since I’m located in the Northeastern United States, I’ve got a pretty good view of GOES-16, so I decided to see if I could actually manage to set up a receiver.


Based on a few guides I found online (see Notes below), I determined that I needed the following hardware:

  1. Raspberry Pi 3B+.
  2. An RTL-SDR software-defined radio dongle. Photograph of a Raspberry Pi single board computer with an RTL-SDR software-defined radio attached.
  3. A low noise amplifier (LNA) and SAW filter designed for the frequency that the GOES satellite uses (around 1.7 GHz). I used the SAWbird+ GOES Barebones from Nooelec.
  4. A 2.4 GHz parabolid grid antenna modified for 1.7 GHz. Photograph of a satellite dish mounted on a tripod pointing towards the sky.
  5. Various RF adapters and coaxial cables needed to connect everything together (depends on the specific setup, see Notes below). Photograph of a satellite dish showing it connected to the RTL-SDR dongle via a coaxial cable.


To setup the software side of things, I followed lxe’s guide, summarized below.

Prep your Raspberry Pi and install necessary drivers and software.

0. Get your Raspberry Pi ready

  • Download Raspbian Lite Image and Etcher
  • Use Etcher to write the image to the SD card.
  • Mount the SD card as a volume on your machine.
  • Follow this procedure to configure WiFi and SSH.
  • Plug the card into your Raspberry Pi and turn it on.
  • Find the IP address of the Raspberry Pi using your gateway/router administrative interface.

Now you can SSH into your Raspberry PI as pi with a default password raspberry.

1. Get everything up to date

From now on all commands should be run on the Raspberry Pi.

sudo apt update
sudo apt dist-upgrade
sudo reboot

2. Install dependencies

sudo apt install git build-essential cmake libusb-1.0 libopencv-dev libproj-dev

3. Install librtlsdr

Grab the latest librtlsdr source, compile it, and install the shared libraries/includes.

git clone
cd librtlsdr
mkdir build
cd build
sudo make -j2 install

sudo cp ../rtl-sdr.rules /etc/udev/rules.d/
sudo ldconfig
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf

sudo reoboot

4. Test your the RTL-SDR dongle


You should see something like this:

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

If it hangs, just press crtl-c to exit. It doesn’t have to finish.

If there are errors, or if the device is not recognized:

  • Reinstall the driver from Step 3
  • Ensure the dongle is secured in the USB port
  • Remove all USB hubs and plug in into the Pi directly
  • Make sure you power your Raspberry Pi with at least a 2.5A power supply
  • Check the device using lsusb command. You should see ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 or something of the like listed there. If not, try the previous steps.
  • Run dmesg and check for errors such as error -71 related to the USB device. This may mean that your RTL-SDR receiver might be broken. This happened to me, so I ordered another one, which ran fine.

5. Install goestools

git clone
cd goestools
git submodule init
git submodule update --recursive
mkdir build
cd build

sudo make -j2 install 

6. Create goesrecv.conf config

cat <<EOF > ~/goesrecv.conf
mode = "hrit"
source = "rtlsdr"

frequency = 1694100000
sample_rate = 2400000
gain = 5
bias_tee = false

max_deviation = 200e3

bind = "tcp://"
send_buffer = 1048576

statsd_address = "udp4://localhost:8125"

If you’re using a NooElec SmarTee dongle with an always-on bias tee, or if you’re powering your SAWBird through the micro USB port, set bias_tee = false under [rtlsdr].

If you’re using dongle, set bias_tee = true to power the SAWBird board.

7. Roughly point your antenna at the satellite

Find where the GOES-16 or GOES-17 satellites are in the sky at your location using

Note the azimuth and elevation.

Use an actual real compass to point your dish at the azimuth. I’ve been using the iPhone phone compass, which has a 20-30 degree error, rendering it practically useless.

Adjust your dish angle according to the elevation.

8. Run goesrecv and perform fine antenna adjustments

goesrecv -v -i 1 -c ~/goesrecv.conf

This will show output every second that looks something like this:

2018-09-15T21:52:03Z [monitor] gain:  8.44, freq: -2121.4, omega: 2.589, vit(avg):  2400, rs(sum):  0, packets: 0, drops:  55

The vit(avg) stat shows the average viterbi error rate over 1 second interval (if running with -i 1).

If there’s no signal, the vit value should be over 2000. When signal is stronger it should decrease.

This should help you point the antenna correctly. Slightly rotate the dish right or left and note whether the vit errors are increasing or decreasing.

Once you’re at the local error minimum, perform the same process to find the minimum error rate while slightly adjusting the vertical angle.

When the vit errors are at their lowest, you’ve pointed the antenna. Double check the antenna position again with a compass to make sure you’re pointed at the intended satellite; GOES-17 and GOES-16 are only about 15 degrees from each other in the sky.

9. Restart goesrecv and play around with the config parameters.

If your vit errors are under 400, and you’re observing no packet drops, you’re all set!

If the average errors are at around 1500-1800, try the following:

  • Terminate and restart goesrecv. This should allow it to readjust the gain and frequency offset to get a better read on the signal.

  • Cool the Raspberry Pi and the RTL-SDR dongle. I’ve noticed that temperature might significantly affect reception quality.

  • Play around with goesrecv.conf parameters. Try adjusting the gain and sample_rate. For the NooElec XTR or other E4000 tuners, you might need to set your gain to 10 or below.

Once you decreased the error rates, but your vit is still over 400, try making very slight adjustments to the antenna again.

10. Process packets into images

While goesrecv is running, in a separate session, run:

goesproc -c /usr/share/goestools/goesproc-goesr.conf -m packet  --subscribe tcp://

Once goesproc receives enough packets, it will start writing images and text to the locations described in /usr/share/goestools/goesproc-goesr.conf.

Writing: ./goes16/m2/ch13/2018-09-15/GOES16_M2_CH13_20180915T231750Z.jpg
Writing: ./goes16/m2/ch13_enhanced/2018-09-15/GOES16_M2_CH13_enhanced_20180915T231750Z.jpg
Writing: ./goes16/m2/ch02/2018-09-15/GOES16_M2_CH02_20180915T231750Z.jpg
Writing: ./goes16/m2/fc/2018-09-15/GOES16_M2_FC_20180915T231750Z.jpg
Writing: ./goes16/m1/ch07/2018-09-15/GOES16_M1_CH07_20180915T231820Z.jpg


Here are some of the images I was able to get off of GOES 16: False color image from GOES 16, cropped to show full resolution. Full disk image of the Earth received from GOES 16 Channel 7. Full disk image recieved from GOES 16. Colorful full disk image received from GOES 16. Enhanced with software post processing.


This wouldn’t have been possible without the work of a lot of others before me. Some of the most usefull resources I found about this subject are:

  • Pieter Noordhuis' goestools and his guide for setting up A minimal LRIT/HRIT receiver
  • This guide that goes into a little more detail about how to use goestools.
  • Additionally the RTL-SDR Blog is a wealth of knowledge about anything to do with this type of software defined radio.

Here’s a closeup of the screen — I can’t wait until this is functional.

Close up photo of a small touchscreen showing a user interface designed for operating an espresso machine.

Making progress on my Gaggiuino project. Baby steps here, but it feels great to see the screen and thermocouple working!

Photo of a microcontroller wired up to a relay, thermocouple, and touchscreen.

I need more houseplants in my life.

Keycaps finally came in — now to print a case!

Photo of a split mechanical keyboard with grey alphanumeric keycaps and blank, black modifier keycaps.