QSO Graph SDK (QGSDK)
The build kit for QSO Graph's applications: the tools it takes to compile and package them, installed with one command, at pinned versions. Part of the qso-graph family of amateur-radio tools; sister to JTSDK (WSJT-X) and FLSDK (fldigi).
Choose what you work on, and get exactly its tools. Each kind of work is a profile:
| Profile | For | Installs |
|---|---|---|
desktop | QSO Graph Desktop, the Electron hub | Node.js, Rust, and Go and CMake for its FIPS crypto module; on Windows also Ninja, NASM, libclang, Perl and git |
logger | QSO Graph Logger, the Qt application | Qt, its compiler, CMake, Ninja; NSIS on Windows for the installer |
mcp | qso-graph's MCP servers | uv, and the Pythons the servers test against (3.11 to 3.13); git on Windows |
Install one or several; run the installer again with another profile to add it.
Why it exists. A program nobody else can build is a program nobody else can keep alive. QGSDK writes down, as code, everything it takes to build an application, so a new maintainer starts from one command instead of from someone's memory.
QGSDK is the tooling; an application is compiled and packaged from its own checkout, with these tools.
What each profile installs
| Version | Windows | Linux | macOS | For | |
|---|---|---|---|---|---|
| logger | |||||
| Qt | 6.12.0 | MinGW build | GCC build | universal build (Apple silicon and Intel) | the framework the logger is written in |
| Compiler | MinGW 13.1.0, Qt's own, matched to Qt's libraries | the system's GCC | Apple's clang (Xcode command-line tools) | ||
| CMake | 3.30.5 | ✓ | ✓ | ✓ | configures and builds; CPack makes the packages |
| Ninja | 1.12.1 | ✓ | ✓ | ✓ | runs the build |
| NSIS | 3.13 | ✓ | the Windows installer | ||
| desktop | |||||
| Node.js | 26.9.0 | ✓ | ✓ | ✓ | the application, and its build |
| Rust | 1.99.1 | ✓ | ✓ | ✓ | the credential core; installed with rustup, inside the prefix |
| Go | 1.27.3 | ✓ | ✓ | ✓ | building AWS-LC's FIPS module |
| CMake | 4.4.4 | ✓ | ✓ | ✓ | building AWS-LC's FIPS module |
| Ninja, NASM | 1.13.2, 3.02 | ✓ | building AWS-LC's FIPS module on Windows | ||
| libclang | 23.1.4 | ✓ | bindgen, which the FIPS module needs on Windows (only libclang and its headers are unpacked) | ||
| Perl | 5.42.3.1 | ✓ | the FIPS module's build on Windows (Strawberry Perl's portable build; only perl\ is unpacked) | ||
| C/C++ compiler | Microsoft's C++ Build Tools (needs an administrator) | the system's GCC | Apple's clang (Xcode command-line tools) | ||
| git | MinGit 2.56.0 | the system's | the Xcode command-line tools' | ||
| mcp | |||||
| uv | 0.13.6 | ✓ | ✓ | ✓ | the servers' environments, tests and builds |
| Python | 3.11 to 3.13 | ✓ | ✓ | ✓ | installed by uv, inside the prefix |
| git | MinGit 2.56.0 | the system's | the Xcode command-line tools' | ||
| every profile | |||||
| Python | 3.14.10 | ✓ | ✓ | ✓ | QGSDK's own scripts only; never part of an application |
What QGSDK can't install without root or admin rights comes from the system, and the installer checks for it first: on Windows Microsoft's C++ Build Tools (desktop); on Linux a C++ compiler and the libraries Qt uses (logger), a C/C++ compiler, make, unzip and libatomic (desktop), and git (desktop, mcp); on macOS Apple's Xcode command-line tools (every profile). It names what's missing, with the one command that installs it. Linux arm64 (a Raspberry Pi 5) has the desktop and mcp profiles; Qt's Linux build, and so the logger, is x86-64 only.
Every version is pinned, and every download checked, in manifest.json: the one
place to change them.
Developer setup (Windows)
You need nothing installed first: no Python, no git, no Visual Studio, no Qt account, no admin rights. The one exception is the desktop profile: Rust on Windows links with Microsoft's C++ Build Tools, which only Microsoft's installer can install, as an administrator. The installer checks and, if they're missing, prints the one command:
winget install Microsoft.VisualStudio.2022.BuildTools --override "--quiet --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"
-
Get QGSDK: download the latest release's
.zipfrom Releases, check it (Verify your download) and unpack it; or clone this repository. -
Install the tools for your profiles (once; the logger is about 2 GB and a few minutes):
powershell -ExecutionPolicy Bypass -File bootstrap\install.ps1 -Profiles desktop,mcpLeave out
-Profilesand it asks. Everything goes into.\prefixbeside this checkout. Running it again installs only what's missing or changed. Removing QGSDK is deleting the folder. -
Load the tools into your shell, whenever you open a new one:
. .\prefix\qgsdk-env.ps1 # PowerShellprefix\qgsdk-env.cmd # cmd -
Work in the application's checkout: QSO Graph Desktop with
npm(its README); the logger with CMake; an MCP server withuv. Keep QSO Graph Desktop's checkout near the top of a drive (C:\src\qso-graph-desktop, say): Microsoft's compiler can't open a path longer than 260 characters, and the credential core's build folders nest deep.
qgsdk doctor shows what's installed and where; qgsdk profiles lists the profiles. qgsdk build --source <logger checkout> is a shortcut for the logger's configure-and-build step; you never need it.
Developer setup (Linux)
Tested on Rocky Linux 9, Debian 12 and Ubuntu 24.04; any x86-64 distribution of that age or newer should work.
-
Install what your profiles need from your distribution (the one step that needs root). For every profile:
# Fedora / RHEL / Rocky / Almasudo dnf install gcc-c++ mesa-libGL-devel mesa-libEGL-devel libxkbcommon-devel tar dbus-libs fontconfig freetype libbrotli glib2 libwayland-cursor libxkbcommon-x11 xcb-util xcb-util-cursor xcb-util-image xcb-util-keysyms xcb-util-renderutil xcb-util-wm git gcc make unzip libatomic# Debian / Ubuntusudo apt install g++ libgl-dev libegl-dev libxkbcommon-dev curl tar libdbus-1-3 libfontconfig1 libfreetype6 libglib2.0-0 libwayland-cursor0 libxkbcommon-x11-0 libxcb-cursor0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-render0 libxcb-shape0 libxcb-util1 libxcb-xkb1 git build-essential unzip libatomic1The
desktopprofile alone needs a C/C++ compiler,make,git,unzipand libatomic (build-essential git unzip libatomic1on Debian); themcpprofile alone needs onlygit,curlandtar. The installer checks for everything its profiles need and prints the line for you if anything is missing. -
Get QGSDK: download the latest release's
.tar.gzfrom Releases, check it (Verify your download) and unpack it; or clone this repository. -
Install the tools for your profiles (once; the logger is about 2 GB, under a minute on a fast line). No root:
bootstrap/install.sh --profile desktop --profile mcp -
Load the tools into your shell, whenever you open a new one:
. ./prefix/qgsdk-env.sh -
Work in the application's checkout, as on Windows.
Developer setup (macOS)
macOS 14 or newer, Apple silicon or Intel.
-
Install Apple's Xcode command-line tools, if you haven't (the one step that needs an administrator):
xcode-select --install -
Get QGSDK: download the latest release's
.tar.gzfrom Releases, check it (Verify your download) and unpack it; or clone this repository. -
Install the tools for your profiles (once). No root:
bootstrap/install.sh --profile desktop --profile mcpLeave out
--profileand it asks. Everything goes into./prefix; running it again installs only what's missing or changed. -
Load the tools into your shell, whenever you open a new one:
. ./prefix/qgsdk-env.sh -
Work in the application's checkout, as on Windows.
Verify your download
Each release carries SHA256SUMS, and GitHub's signed record that this repository's Release workflow
made every file. In the folder you downloaded to:
(Get-FileHash qgsdk-0.1.0.zip -Algorithm SHA256).Hash # Windows: compare with SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing # Linux
shasum -a 256 -c SHA256SUMS --ignore-missing # macOS
With the GitHub CLI, on any platform, this checks who made it:
gh attestation verify qgsdk-0.1.0.zip -R qso-graph/qso-graph-sdk
Checking it works
On a clean machine (a fresh VM or container is best):
powershell -ExecutionPolicy Bypass -File tests\windows-check.ps1 # Windows
tests/check.sh # Linux and macOS
Each installs QGSDK from nothing with every profile (or those named with -Profiles / --profile).
For the logger it builds a small Qt program, builds it again with plain CMake, and runs both (on
Windows it also checks NSIS runs); for mcp it runs each of the servers' Pythons through uv, and git,
and checks they are the prefix's; for desktop it clones QSO Graph Desktop, checks the Node.js and Rust
it pins are the ones installed, and runs its setup, build and fast check. It ends with == PASS or
== FAIL: <what>. CI runs them on Windows, Linux (x86-64 and arm64) and both kinds of Mac whenever the
installer changes, and weekly, so a moved download, or a QSO Graph Desktop pin QGSDK doesn't match, is
found within a week.
What it downloads, and their licences
None of these is part of this repository; each is downloaded from its publisher and used under its own licence.
| Tool | Profile | Licence |
|---|---|---|
| Python (python.org's Windows build; python-build-standalone on Linux and macOS) | every profile | PSF-2.0 |
| aqtinstall, and its Python dependencies | every profile | MIT (each dependency its own) |
| Qt | logger | LGPL-3.0-only (open-source edition) |
| MinGW-w64 and GCC (Windows) | logger | GPL-3.0 with the GCC Runtime Library Exception; MinGW-w64's runtime ZPL-2.1 |
| CMake | logger | BSD-3-Clause |
| Ninja | logger | Apache-2.0 |
| NSIS (Windows) | logger | zlib/libpng, with parts under bzip2 and CPL-1.0 |
| uv | mcp | MIT OR Apache-2.0 |
| MinGit, from Git for Windows (Windows) | desktop, mcp | GPL-2.0-only |
| Node.js | desktop | MIT |
| Rust, and rustup | desktop | MIT OR Apache-2.0 |
| Go | desktop | BSD-3-Clause |
| CMake (Kitware's build) | desktop | BSD-3-Clause |
| Ninja (Windows) | desktop | Apache-2.0 |
| NASM (Windows) | desktop | BSD-2-Clause |
| libclang, from LLVM (Windows) | desktop | Apache-2.0 WITH LLVM-exception |
| Perl, from Strawberry Perl (Windows) | desktop | Artistic-1.0-Perl OR GPL-1.0-or-later |
Learn more
- docs/: how QGSDK works, and the decisions behind it (MinGW, aqtinstall, CMake presets, profiles)
- CONTRIBUTING.md: how to propose a change
- Licence: GPL-3.0-or-later (LICENSE, NOTICE), like JTSDK and FLSDK