There's a thread over on CN about a jailbreak for the AAP/Seestar, if anyone wants to poke around under the hood of their Seestar. I don't have one or access to one, so all I can see is what goes out in the patches, but not the base build.


Was eyeballing a thread about stacking on the Seestar, got me wondering what ZWO was using for on-unit stacking, grabbed the 1.7.0 update and went nosing around.

root@Hadriel:/mnt/c/Users/billn/Downloads/ASIAIR# find . -name zwoair_imager | xargs grep extract.cpp
Binary file ./ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_imager matches
Binary file ./Seestar_1.6.1.apk.d/assets/deb/home/pi/ASIAIR/bin/zwoair_imager matches
Binary file ./Seestar_1.7.0.apk.d/assets/deb/home/pi/ASIAIR/bin/zwoair_imager matches
root@Hadriel:/mnt/c/Users/billn/Downloads/ASIAIR# strings ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_imager | grep extract.cpp
buf->bptr (bufw*bufh=%lu elements) at line %d in module ./sep/extract.cpp !
cat->thresh (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->npix (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->tnpix (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->xmin (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->xmax (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->ymin (nobj=%lu elements) at line %d in module ./sep/extract.cpp !
cat->ymax (nobj=%lu elements) at line %d in module ./sep/extract.cpp !

So that's SEP (, which is LGPLv3. It's statically compiled, though, not brought in as a lib.


My only visibility into what's deployed right now is what's in the update package shipped with the APK. Since you can't download the base image as you can with the AAP, it'll be hard to know for sure until they push an update for that code, unless I can physically get my hands on one. Given their track record, that's likely the only way we'll know for sure.


Cracking open the Seestar APK, some familiar looking bits inside.

The Skymap is, of course, Stellarium Web Engine, AGPL license, and thusly taints the Seestar application, both IOS and Android, and obligates ZWO to release source for it.

billn@Hadriel:~/Downloads/Seestar/assets/main/SkyMap/data$ ls
font  planets.ini  shaders  skydata  symbols  symbols.png  textures
billn@Hadriel:~/Downloads/Seestar/assets$ tar -xvf iscope.out

Cracking the asiair_armhf.deb..
billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR$ find . | grep -v wav

Usual suspects for an ASIair derivation, with some new toys.

air_ble and bsa_server seem to be a bluetooth service implementation, ostensibly for connecting to the Seestar using bluetooth instead of wifi. They're both invoked by and are from pyephem (, they get called by zwoair_imager:
billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR/bin$ strings zwoair_imager | grep python
python3 %g %g %g
ps -ef|grep "python3 /etc/zwo/esptool/"|grep -v grep|awk 'NR==1{print $2}'|xargs kill -9
python3 /etc/zwo/esptool/ -p /dev/ttyS5 -c esp32s3 write_flash 0x0000 /etc/zwo/esptool/espfirmware/bootloader.bin 0x8000 /etc/zwo/esptool/espfirmware/partition-table.bin 0xd000 /etc/zwo/esptool/espfirmware/ota_data_initial.bin 0x10000
python3 %g %g %g

Well, that's an interesting find. is part of this toolset:
"A Python-based, open-source, platform-independent utility to communicate with the ROM bootloader in Espressif chips"

This is GPL2.0 covered code.

Looking at that main binaries, compared to the last ASIair release:
billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR/bin$ ls -al ~/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_*
-rwxrwxrwx 1 billn billn     1317 Jun 20  2022 /home/billn/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/
-rwxrwxrwx 1 billn billn     5882 Nov 14  2022 /home/billn/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/
-rwxrwxrwx 1 billn billn  1601224 Feb 21 02:23 /home/billn/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_guider
-rwxrwxrwx 1 billn billn 18961784 Feb 21 02:23 /home/billn/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_imager
-rwxrwxrwx 1 billn billn   358352 Feb 21 02:23 /home/billn/Downloads/ASIAIR/ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_updater
billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR/bin$ ls -al zwoair_*
-rwxrwxrwx 1 billn billn    2357 Aug  2 22:10
-rwxrwxrwx 1 billn billn 1298064 Aug 18 00:57 zwoair_guider
-rwxrwxrwx 1 billn billn 3254720 Aug 18 00:57 zwoair_imager
-rwxrwxrwx 1 billn billn  399620 Aug 18 00:57 zwoair_updater

Looks like the guider is a bit leaner, but the imager is much, much leaner. Given that the Seestar is fixed hardware, the obvious missing bits would include the entirety of libgphoto2 and all DSLR support.

Let's crack open the imager and see what's under the hood:

billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR/bin$ strings zwoair_imager | grep ^lib | more
libusb_init fail

Breaking those down:
libcfitsio: Used for FITS file format, typically under a custom license that allows free use.
libopencv: OpenCV libraries, typically under the Apache 2 License.
libusb: Usually under the LGPL (Lesser General Public License), or a similar permissive license.
libz: Usually under the zlib License, a permissive free software license.
libnova: Likely under LGPL.
libxml2: Typically under the MIT License.
libjpeg: Custom free software license, similar to the BSD License.
libcrypto: Part of OpenSSL, which used to be under a custom license but is now under Apache License 2.0 as of version 3.0.0.
libpigpiod_if2: Likely under the Unlicense.
libwcs: WCSLIB, FITS/World Coordinate System lib,, GPL3.
libgsl: GNU Scientific Library, under the GPL. 
libavcodec, libavutil, libavformat: Part of FFmpeg, generally under the LGPL or GPL depending on how it was compiled.
librockchip_mpp: Rockchip specific (, Apache2/MIT license.
librt, libmedia-ctl, librkaiq, libeasymedia, libdl, librknn_api, libstdc++, libm, libgomp, libgcc_s, libpthread, libc: These are likely standard system libraries, often under the LGPL or another permissive license, depending on the system.

I think I noted libwcs before, possible I missed it, but libgsl is a death knell, that's not just GPL covered, that's GNU covered code. Stepping back and taking a wider gander for libwcs:
billn@Hadriel:~/Downloads/ASIAIR$ find . -name zwoair_imager
billn@Hadriel:~/Downloads/ASIAIR$ find . -name zwoair_imager | xargs strings | grep libwcs
billn@Hadriel:~/Downloads/ASIAIR$ find . -name zwoair_imager | xargs grep libwcs
Binary file ./ASIAIR_2.1/assets/patch/deb/home/pi/ASIAIR/bin/zwoair_imager matches

So that seems like a recent addition to both the ASIAir and thusly the Seestar. That likely means it's in the AM3/AM5 app as well.

Something interesting in the unpack:
billn@Hadriel:~/Downloads/Seestar/assets/deb/home/pi/ASIAIR/bin$ ls ../model/

This looks like the yolo5s_small model for use with the opencv libraries. While sifting through the updater, I found a couple hardware references that hint at the hardware involved:
ZWO AirPlus-RK3568
Rockchip RV1126

The Rockchip RV1126:
The RK3568:

Some features of the RK3568:
Integrated efficient RKNN AI processing unit
NPU with 1TOPs computing power
Embedded neural network hardware accelerator, support INT8, INT16, FP16 efficient operation
NPU hardware natively supports technologies such as pre-processing merging, channel quantization, and zero skipping
Support lossless compression of INT8, INT16, FP16 neural network parameters
The NPU core supports ordinary convolution, depth separable convolution, deconvolution, hole convolution, fully connected layer and pooling layer
NPU internal blocks include multiply-add operations, activation, LUT and precision conversion units, and support custom layer construction
Support one-click model conversion, support Caffe/TensorFlow/TF-Lite/ONNX/PyTorch/Keras/Darknet mainstream framework models

Now that's all fun and interesting, so the Seestar has a neural net processor and is rocking a CV model that will let it recognize things. I don't see a plate solver in this package, but, since they're likely following the embedded OS model of the Plus and Mini model, where a fallback/reset image is stored on the MMC, the only files that will appear in the update packages like this will be things that need updating. You'll note the absence of an indi-y package, as we usually see. Given that this is fixed hardware set, I wouldn't be shocked if there's simply no need for an INDI layer. I can't find a reference to the in here anywhere, even though it's still present. Probably just overlooked cruft that didn't get cleaned out.

Hopping back up the stack a little, let's circle back to something I noted during the unpack:
billn@Hadriel:~/Downloads/Seestar/assets/others$ strings main_S50_1.4.8.bin  | more
Aug  7 2023
tls != NULL
[0;32mI (%u) %s: App cpu up.
[0;32mI (%u) %s: Pro cpu up.
[0;31mE (%u) %s: Running on single core variant of a chip, but app is built with multi-core support.
[0;31mE (%u) %s: Check that CONFIG_FREERTOS_UNICORE is enabled in menuconfig
[0;32mI (%u) %s: Starting app cpu, entry point is %p
[0;33mW (%u) %s: 32 kHz XTAL not found, switching to internal 150 kHz oscillator
rtc_clk_xtal_freq_get() == RTC_XTAL_FREQ_40M

I suspect this is what the ESP interface is for, this binary gets pushed to a daughterboard over GPIO, and this is actual mount interface for motor controls.
billn@Hadriel:~/Downloads/Seestar/assets/others$ strings main_S50_1.4.8.bin  | grep az
azm_slew1_irun = %d
azm_slew1_ihold = %d
azm_slew2_irun = %d
azm_slew2_ihold = %d
azm_track1_irun = %d
azm_track1_ihold = %d
azm_track2_irun = %d
azm_track2_ihold = %d
azm irun = %d
 azm ihold = %d
 azm irun = %d
azm irun = %d
azm ihold = %d

I'd be willing to bet the AM3/AM5 use the same base design.


I have a theory as to why, but I'm curious why you haven't held ZWO to account for infringing indilib they way they have. There's clearly enough evidence to support the notion that they're infringing, and only doing the absolute bare minimum, if that, in terms of gpl/lgpl compliance, when forced to.


Nothing new to report, in the way of impactful changes. They published a source tree for their fork after being notified of violation, so technically they've met the requirement there. I've been in contact with a few other lib owners, with no motion to report. I've also been having a conversation with Apple's legal team about the use of GPL code in the app, without meeting the distribution terms of the GPL, but that's slow going. I won't have anything new to report until the next version drop from ZWO, or one of the lib owners responds. When I know, I'll pass it on.