Follow these steps to build this version of Vortex on every platform.

Build Guide - Vortex

Vortex builds from one repository to three run targets: a Qt6 desktop executable, a WebAssembly web bundle, and an Android APK. Each target renders the same demo app from the same C++ tree, the same .lyr styles, and the same JSON themes.

All targets require CMake 3.22+ and a C++17 compiler.

Step 1 - Clone Vortex

Clone Vortex from the Codeberg repository. The Layers engine is a submodule at ext/Layers, so clone recursively:

git clone --recursive https://codeberg.org/HuntrSoftware/vortex.git

If you already cloned without --recursive, fetch the submodule:

git submodule update --init

Step 2 - Desktop (Qt 6)

Requires Qt6 with the Core, Gui, Widgets, Svg, and Network modules. Multimedia is optional: without it, Video widgets render a placeholder box.

From the project root:

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/platforms/desktop/vortex-desktop

Headless screenshots

The desktop runner has a built-in screenshot harness, so you can verify appearance without a display:

QT_QPA_PLATFORM=offscreen VORTEX_SHOT=/tmp/vortex.png \
  ./build/platforms/desktop/vortex-desktop

Setting VORTEX_SHOT2 as well captures a second shot after simulating clicks; VORTEX_CLICK names the widgets to click (comma-separated). Any extra windows open at capture time are saved alongside as <stem>.win<N>.png.

Step 3 - Web (Emscripten)

Requires the Emscripten SDK (emcc). The shared styles/ and themes/ are baked into the WASM filesystem at build time; vortex.js + vortex.wasm are emitted into platforms/web/demo/.

source /path/to/emsdk/emsdk_env.sh
emcmake cmake -B build-web -DCMAKE_BUILD_TYPE=Release
cmake --build build-web -j

WASM must be served over HTTP (not file://):

python3 -m http.server 8099 --directory platforms/web/demo
# then open http://localhost:8099/

Step 4 - Android

Builds classic Views (no Compose). Requires:

  • The Android SDK and NDK 29 (ANDROID_HOME set or auto-detected)
  • A JDK 17 with compiler: javac, not just a JRE (on Fedora, the java-*-openjdk-devel package)

The Gradle project pins AGP 9.0.1, Gradle 9.2.1 (built-in Kotlin, no separate Kotlin plugin), compileSdk 36, minSdk 26, CMake 3.22.1, and the arm64-v8a ABI. The shared styles/ and themes/ are synced into the module's generated assets at build time: single-sourced, not duplicated.

cd platforms/android
export ANDROID_HOME=$HOME/Android/Sdk   # adjust as needed
./gradlew assembleDebug

Install and launch on a USB-connected device:

adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n com.huntrsoftware.vortex/.MainActivity

Screenshot back to the host:

adb shell screencap -p /sdcard/vortex.png && adb pull /sdcard/vortex.png

Building everything at once

./build-all.sh

Builds all three platforms in one pass (reusing already-configured build trees, probing $EMSDK and $ANDROID_HOME/$JAVA_HOME for toolchains) and prints a per-platform pass/fail summary. A platform whose toolchain is missing is reported, not fatal.

Tests

When Vortex is built as the top-level project (rather than inside a consuming app), the native build also produces the static-emitter test: a headless check that pins the static-web emitter's exact HTML/CSS output and verifies the demo app emits deterministically:

./build/tests/vortex-static-emitter-test

Next steps

To build an application of your own on the framework, see the app development guide.

Appearance
Theme
—