Back in 2016, I became interested in Othernet‘s satellite filecasting service, which back then was called Outernet. Outernet was a start up company that offered a free global satellite service with which some internet contents such as weather updates or Wikipedia pages were broadcast. The main goal of the company was making this content available in developing countries, remote locations, and in general, in places that couldn’t afford an internet connection. Outernet started being popular with Amateur radio operators, hobbyists and makers, who saw it as an interesting project to set up at home for fun.
Most of the Outernet’s software stack was open source, and their receivers were some kind of embedded Linux system. However, the key parts of the receiver, which were the demodulator and the implementation of the filecasting protocol, were closed source and the protocols and specs they used were not documented publicly. Unhappy with this, I wrote in their forums asking if these software pieces could be open sourced. After receiving a negative reply, I decided to try to reverse-engineer all this, with the goal of writing some documentation and producing an open-source alternative implementation.
In the end I was quite successful, and I was able to reverse-engineer most of the protocols, and write gr-outernet, which was a GNU Radio demodulator, and free-outernet, which was a Python implementation of the filecasting receiver. These allowed anyone to set up a receiver from scratch using any SDR, a computer, and just these two pieces of software. This approach was popular with some people, who preferred it as a lower-level alternative that they could set up to learn more about how Outernet worked (the receiver printed out lots of debug information about the packets being received).
I produced a good amount of material related to this project back then, such as a talk in 33C3, another talk in the Spanish FAQin congress, a featured post in GNU Radio’s blog, several posts describing the Outernet protocols, and some more advanced posts about LDPC decoding algorithms (I’m grateful to George Hopkins for reverse-engineering the LDPC decoder algorithm from Outernet’s binaries).
However, some time after I moved on from this project to other things, Outernet ceased their L-band service, which was what my project implemented. After this, my software had some historical interest, but not much practical usefulness. Later, Outernet resumed their activities as Othernet with a Ku-band service using LoRa modems, which they continue doing currently. I never had the time to look into this new Othernet system in detail.
A few days ago, I was positively surprised to see that Othernet has forked off my free-outernet project as open-ondd, and is maintaining it now and updating it to support the current protocols (which apparently have relatively few changes). Their idea is that open-ondd can run in a PC or embedded hardware, receive by UDP the LoRa frames decoded by their Dreamcatcher hardware, and implement the filecasting protocols to reconstruct the files and do other stuff. The main use case for this is that since it’s an open-source Python software, it will enable developers and advanced users to set this up in diverse hardware and extend its functionality to implement perhaps more creative uses of the Othernet data stream.
I’m very happy about this. First, because it gives a new use to my software, which had become pretty useless. Second, because it gives Othernet the opportunity to engage with their community of developers and expand their software ecosystem. I think this case is an example of how open source can have a very positive impact given the appropriate business models.
Now I’m interested in seeing a DIY Othernet receiver built from scratch around open-ondd, in the same way that gr-outernet and free-outernet could be used as a stand-alone receiver for the L-band service. If I find some time, I’ll try to set up a proof of concept using either an Arduino + SX1268 (probably with the nice board that Bob Mattaliano N6RFM sent me), or give a try to gr-lora and see if it can demodulate the LoRa frames.