* feat(windows): build and publish a Windows bundle alongside the other platforms
Windows had CI but no downloadable artifact. A release/* push produced an
AppImage per Linux arch and a macOS .app tarball, and nothing a Windows user
could open.
`build-windows` mirrors those jobs: a CROSS build on ubuntu-latest -- nix does
not run on Windows, so there is no Windows runner here; executing the result on
real Windows is what logos-windows-ci's native-smoke leg does. The release job
needs it, downloads it, and attaches artifacts/*-windows.zip.
bin-bundle-dir rather than `default`: it is the same portable directory the
AppImage and .app jobs package, laid out the way the app expects (bin/ +
lib/qt-6/{plugins,qml} + an explicit qt.conf). A PE records no rpath, so that
layout IS the deployment contract.
.zip rather than .tar.gz, because this is the one artifact here whose users are
on Windows, where Explorer opens a zip and nothing opens a tarball.
THE PACKAGING STEP ASSERTS RATHER THAN TRUSTING ITS EXIT CODE. The bundle's DLLs
are symlinks into the nix store, and an archive of dangling links extracts to a
tree that cannot start. nix-bundle-lgx shipped exactly that: `cp -a` implies
--no-dereference, the payload lost 75% of its files, and the step exited 0. So
this copies with -L and then compares the zip's entry count against the bundle's
file count, failing on a shortfall; it also refuses a bundle with no .exe.
The comparison is `<`, not `!=`: a zip counts directory entries too, so a
healthy bundle legitimately produces MORE entries than files. Rehearsed against
a real bundle on an x86_64-linux builder -- 1677 files -> 1768 zip entries,
3 .exe, 0 dangling links after cp -rL, 117 MB.
Named logos-basecamp-x86_64-windows.zip: the full word `windows`, because
logos-release-set's classifier matches on it and a bare `win` would swallow
every darWINd asset.
* ci(windows): drop the disk reclaim -- the runner has 108 GiB, not 14
The step's own justification was the reason to keep it and it does not hold:
"ubuntu-latest ships ~14 GiB free" came from this project's notes, written
before GitHub upgraded the hosted runners. A real run of this workflow reports
/dev/root 145G 37G 108G 26% /
so the step was deleting ~10 GiB from a disk with 108 GiB already free, and
paying ~20 s per job for it.
The Windows job substitutes the mingw closure from the Attic cache rather than
building it, so the build-time store requirement is lower still.
Kept available, not deleted: logos-windows-ci's nix-setup still exposes
free-disk-space, defaulting to false, so a genuinely disk-bound job can opt in.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
logos-basecamp
Download
Prebuilt binaries for Linux (AppImage) and macOS (DMG):
- Stable release — latest release
- Latest RC / development build — all releases
Release candidates are marked as pre-release, so /releases/latest skips them. If the stable release is significantly older than the RCs on the releases page, you probably want an RC.
How to Build
Using Nix (Recommended)
Local Build
The local build produces a standard Nix derivation whose dependencies live in /nix/store. It is the fastest way to iterate during development but is not portable — it only runs on the machine that built it.
nix run .
# or: nix build '.#app' && ./result/bin/LogosBasecamp
Local builds require local .lgx packages, generated with:
nix bundle --bundler github:logos-co/nix-bundle-lgx github:your-user/your-module#lib
Portable Builds
Portable builds are fully self-contained — no /nix/store references at runtime. They work with portable .lgx packages. That is, releases from logos-modules, downloads from the Package Manager UI, or generated with:
nix bundle --bundler github:logos-co/nix-bundle-lgx#portable github:your-user/your-module#lib
| Output | Platform | Format |
|---|---|---|
bin-bundle-dir |
Linux, macOS | Flat directory with bin/ and lib/ |
bin-appimage |
Linux | Single-file .AppImage executable |
bin-macos-app |
macOS | .app bundle (ad-hoc signed, unsigned for distribution) |
Self-contained directory bundle (all platforms)
nix run .#bin-bundle-dir
# or: nix build '.#bin-bundle-dir' && ./result/bin/LogosBasecamp
Linux AppImage (Linux only)
nix build '.#bin-appimage'
./result/logos-basecamp.AppImage
MacOS App bundle (macOS only)
nix build '.#bin-macos-app'
open result/LogosBasecamp.app
Parallel Instances (--user-dir)
--user-dir <path> (or -u) sets the base directory so multiple Basecamp instances can run side-by-side with isolated plugins/, modules/, module_data/, and logs/. The path is used verbatim.
# Two instances with isolated state
./result/bin/LogosBasecamp --user-dir /tmp/basecamp-a &
./result/bin/LogosBasecamp --user-dir /tmp/basecamp-b &
Equivalent to setting the LOGOS_USER_DIR env var.
Development Shell
nix develop
Note: In zsh, quote the target (e.g., '.#app') to prevent glob expansion.
If you don't have flakes enabled globally:
nix build --extra-experimental-features 'nix-command flakes'
Nix Organization
The nix build system is organized into modular files in the /nix directory:
nix/default.nix- Common configuration and main application buildnix/app.nix- Application-specific compilation settingsnix/main-ui.nix- UI components compilation
Modules
Blockchain
The Blockchain App lets you run your own blockchain node.
The app currently supports:
- Joining the Logos Testnet
- Participating in consensus (chain-following and proposing blocks)
- Making and receiving transfers
You can run the Blockchain App through the Logos Basecamp, or standalone by building and running the app from source, instructions here.
LEZ Wallet
The Logos Execution Zone Wallet App lets you interact with the Logos Execution Zone (LEZ). It is currently limited to basic account operations. This showcases both private and public execution through RISCV emulation and ZK Proofs.
The wallet currently supports:
- Initializing private/public accounts
- Inspecting private/public account balances
- Public to Public transfers
- Private to Private transfers
You can run the LEZ Wallet through Logos Basecamp, or standalone by building and running from source, see instructions here.
Storage
The Logos Storage App allows you to publish, download, and share files with other Logos users. You can run it both in standalone mode, or as part of the main Logos Basecamp.
Sharing files requires direct connection across nodes, so you will need to set up your router to allow NAT traversal either via UPnP, or manual port forwarding. The app will help you figure out if your NAT traversal is working with a reachability check.
Check the app's README file for more information on how to build, run, and troubleshoot it.
Chat
The Logos Chat App lets you send and receive private 1:1 messages, where messages are transferred over Logos Delivery, the decentralised transport layer. You can run it both in standalone mode, or as part of the main Logos Basecamp.
In the current testnet demo, the app supports:
- Creating and sharing your intro bundle (a contact identifier others can use to reach you)
- Starting private conversations by pasting a counterparty's intro bundle
- Sending and receiving messages in real time
To start a conversation, share your bundle with another user (via the "Share Bundle" button), and paste theirs into the new conversation dialog.
Check the app's README for instructions on how to build and run it in standalone mode.
Mix Demo Chat
You can use the Mix Demo Chat app to send anonymous chat messages over the mixnet. This demonstrates two core primitives working end-to-end:
- Decentralised discovery with capability filtering
- Anonymous message routing over the mixnet
Your chat client will first discover the necessary addresses and keys for a pool of mix nodes (using the capability discovery API) and then proceed to route every published message through this libp2p mix overlay network.
You can run Mix Demo Chat inside the Logos Basecamp. On loading, the UI will show the following:
- Status is shown as Ready
- LP Peer count increasing over time before stabilising
- Mix peer count increasing over time before stabilising
- Warning message
Waiting for network peers...disappears once 3 mix nodes are discovered
Once the warning message disappears, you can send messages, which will be receivable by others running the app.
Sent messages appear in the Messages section of the UI once they have been successfully delivered over the mix layer.
Mix Demo Chat can also be run as a standalone app. To do so, or for more information, refer to the module repo and instructions here.
Testing
Smoke Test
Validates the app starts without QML errors or crashes:
nix build .#smoke-test -L
cat result/smoke-test.log
UI Integration Tests
End-to-end tests that open apps, click buttons, and verify visible text using the QML Inspector.
Run via Nix (fully hermetic, suitable for CI — no Node.js or npm required):
nix build .#integration-test -L
cat result/integration-test.log
Run with Node.js (requires Node.js and a built app):
# Build the app and test framework (one-time):
nix build
nix build .#logos-qt-mcp -o result-mcp
# Run headless (launches the app, runs tests, kills the app):
node tests/ui-tests.mjs --ci ./result/bin/LogosBasecamp
# Or run against an already-running app:
node tests/ui-tests.mjs
# Run a subset:
node tests/ui-tests.mjs modules
Tests are defined in tests/ui-tests.mjs using the test framework from logos-qt-mcp. See the logos-qt-mcp README for the full test API.
AI Agent Interaction (MCP)
An MCP server allows AI assistants (Claude, etc.) to interact with a running instance of the app — inspecting the UI, clicking elements, reading properties, and taking screenshots.
Build the logos-qt-mcp package (one-time, includes the MCP server, test framework, and Qt plugin):
nix build .#logos-qt-mcp -o result-mcp
The .mcp.json in this repo is pre-configured to use the MCP server from result-mcp/mcp-server/. Start the app (inspector is enabled by default in debug/dev builds), and the agent can use tools like qml_find_and_click, qml_screenshot, qml_list_interactive, etc. See the logos-qt-mcp README for the full list of available tools.
Requirements
Build Tools
- CMake (3.16 or later)
- Ninja build system
- pkg-config
Dependencies
- Qt6 (qtbase)
- Qt6 Widgets (included in qtbase)
- Qt6 Remote Objects (qtremoteobjects)
- logos-liblogos
- logos-cpp-sdk (for header generation)
- logos-capability-module
- logos-package-manager
- zstd
- krb5
- abseil-cpp
Disclaimer
This repository forms part of an experimental development environment and is not intended for production use.
See the Logos Core repository for additional information about the experimental development environment: https://github.com/logos-co/logos-liblogos