pulsar
EN

Building from source

Requirements: Bun, CMake (≥ 3.21), a C++20 compiler, and Qt 6.9+ development files including the WebSockets module.

# Debian/Ubuntu
sudo apt install g++ cmake qt6-base-dev qt6-base-dev-tools qt6-declarative-dev \
  qt6-websockets-dev qml6-module-qtquick qml6-module-qtquick-controls

# Fedora
sudo dnf install gcc-c++ cmake qt6-qtbase-devel qt6-declarative-devel qt6-qtwebsockets-devel

# Arch
sudo pacman -S base-devel cmake qt6-base qt6-declarative qt6-websockets qt6-quickcontrols2

# macOS
brew install cmake qt

# Windows: install Qt 6.9 via the online installer, then pass -DCMAKE_PREFIX_PATH=<qt>/lib/cmake

Then:

bun install
cmake -S . -B build && cmake --build build

The build produces:

  • build/bin/qml-host — the Qt host (renders QML, runs native dialogs/tray);
  • build/bin/bridge — the C++ process supervisor for the runtime;
  • build/bin/launcher — the Qt-free single-file launcher.

Qt is located with CMake's find_package(Qt6), so pass -DCMAKE_PREFIX_PATH=<qt> if it is not in a standard location. PULSAR_QMAKE still selects the qmake used when packaging (pulsar build bundles Qt).

Releases are produced by a CI matrix (.github/workflows/release.yml) that builds on Linux, macOS and Windows and packages Qt per platform (ldd on Linux, otool + framework copy on macOS, windeployqt on Windows).

Single-file layout

pulsar build appends a payload to launcher:

[ launcher ][ payload container ][ payload offset + magic ]
             ├─ bin/qml-host, bin/bridge, bin/qt.conf
             ├─ runtime                  (Bun standalone: runtime + app + SDK)
             ├─ app/…                     (QML, assets, manifest)
             └─ lib/Qt/…                  (bundled Qt, Linux/macOS)
                                          or Qt DLLs beside the host on Windows

At startup the launcher extracts the payload into the user cache and execs the host, which loads its own Qt — from lib/Qt via RPATH on Linux/macOS, or from the DLLs next to the executable on Windows — never from the system. Use --slim to omit Qt and rely on the system installation.

pulsar build reuses the Qt that ships with the installed toolchain; when the host has no bundled Qt (dev builds) it falls back to qmake. Set PULSAR_QT_ROOT to point at a specific Qt tree.