Cohesix 1.2.0 quickstart
Cohesix 1.2.0 is a published release. Download its archives and native host packages from the 1.2.0 release page. Check the release notes for the supported hosts, targets and qualification limits before choosing a download.
Cohesix is a control-plane OS that runs in QEMU or on a Raspberry Pi 4. Its shell, gateway, Python client and desktop UI run on your Mac or Linux host. This guide gets you from a release archive to an authenticated console, then shows how several clients can share one target through the gateway.
After your first connection, use the use-case guide to choose a 1.2.0 workflow. The host-tool guide covers the relevant CLI, gateway and evidence commands; Adoption describes a separate selected signed component-package installation.
Choose your download
Use all files from the same release. For 1.2.0:
When upgrading from 1.1.0-beta, extract into new directories and install the
bundled Python wheel there. Keep each host’s binaries, QEMU image and generated
contracts together. Export existing evidence before replacing a target image;
copying an old policy or generated configuration into the new bundle does not
migrate it. The bundled Python distribution and individual tools have their
own package versions; VERSION.txt identifies the overall release.
| You want to… | Download | What it contains |
|---|---|---|
| Run QEMU or operate a Pi from an Apple Silicon Mac | Cohesix-1.2.0-MacOS.tar.gz |
Mac binaries, a Mac QEMU guest, Python wheel and runtime setup |
| Run QEMU or operate a Pi from Linux ARM64, including Jetson | Cohesix-1.2.0-linux.tar.gz |
Linux binaries, a Linux QEMU guest, Python wheel and runtime setup |
| Boot a physical Raspberry Pi 4 | Cohesix-1.2.0-Pi4.tar.gz plus your host’s archive above |
A complete SD-card image, image metadata and documentation |
Native host packages
The Mac .pkg and Linux .deb set are separate host installation choices.
Check their installers.json package hashes against the downloaded bytes and
verify publisher trust independently: macOS must accept the Developer ID
Installer signature and stapled notarization; Linux must verify
installers.json.asc with an already trusted publisher key. The package
manifest alone cannot establish publisher identity. Use the package hashes
and signing records from the published release page.
The Debian publisher key fingerprint is
6840 71A2 AF49 8008 930C F6AE EBB8 ECC4 9397 F8C2. Its public copy is
cohesix-debian-publisher-2026.asc.
Confirm this fingerprint through a trusted release announcement before
using the key to verify a package signature.
On a supported Apple Silicon Mac, install the verified
Cohesix-1.2.0-MacOS.pkg with macOS Installer. Open SwarmUI from
Applications, Finder, Spotlight or the Dock. The host tools live in
/Library/Application Support/Cohesix/bin; the app resolves them without a
Terminal PATH. The installed cohesix-uninstall helper in that directory
checks the package receipt and owned file hashes before removing package code.
It leaves user state, credentials, models and evidence in place.
On the JetPack 7.2.1 ARM64 reference host, install the verified
cohesix-controller_1.2.0_arm64.deb with apt. The optional
cohesix-swarmui_1.2.0_arm64.deb adds the GNOME application entry and
desktop dependencies. Open SwarmUI from GNOME search or the application
grid. Headless controller use needs only the controller package; tools are
under /usr/lib/cohesix/bin. apt remove or apt purge removes package
code and desktop registration, while external operator state remains separate.
Keep the 1.1.0-beta extracted directory intact for side-by-side migration;
native installation does not adopt its credentials or evidence automatically.
These native packages install the host controller and, where selected, SwarmUI.
They do not install the seL4 QEMU guest image, qemu/run.sh, or a QEMU
executable. To run the VM, keep the matching Mac or Linux release archive and
its guest files together, select QEMU with setup_environment.sh --with-qemu, and
follow Boot the QEMU guest. Package installation by
itself does not provision a bootable VM.
Each archive contains QUICKSTART.md, README.md, RELEASE_NOTES.md,
VERSION.txt and MANIFEST.sha256. The Pi archive has no bin/, Python
runtime or qemu/run.sh; run the host tools from the Mac or Linux archive.
Host archives also carry the source-checked NeMo client wheel, Linux ARM64
dependency lock and explicit installer. Install that optional kit only on a
compatible Linux client host after checking its recorded hashes and selecting
a private environment; see the bundled
integrations/nemo-agent-toolkit/README.md.
You do not need Rust, seL4 build tools, or a GPU to use the prebuilt host tools.
For a source checkout, use Build from source below.
1. Extract and verify
Use a new directory for each archive. The examples use Bash; on a Mac,
enter bash in Terminal first. In each additional terminal, use Bash and
change into the same extracted host bundle. Replace archive names with the
one you downloaded; do not paste angle-bracket placeholders literally.
mkdir -p "$HOME/cohesix-releases"
cd "$HOME/cohesix-releases"
tar -xzf "$HOME/Downloads/Cohesix-1.2.0-MacOS.tar.gz"
cd Cohesix-1.2.0-MacOS
Before running anything, verify all manifest entries:
# macOS
shasum -a 256 --check MANIFEST.sha256
# Linux
sha256sum --check MANIFEST.sha256
Every entry must report OK. Check VERSION.txt and RELEASE_NOTES.md for
the intended release and its limitations. Obtain archives from the trusted
release publisher; the internal hashes detect changed files, not publisher
identity. Keep the archive so you can make another clean extraction.
2. Set up the Mac or Linux host
Run these commands from the host bundle root, including when your target is a Pi. Installation may download host packages and ask for administrator access; run the script as your normal user:
./scripts/setup_environment.sh
./scripts/setup_environment.sh --check
source .venv/bin/activate
The script installs host runtime dependencies and the bundled Python wheel into
this bundle’s .venv. It does not build Cohesix or install CUDA drivers. QEMU
is optional for host-only or Pi operation. Before Step 3, run:
./scripts/setup_environment.sh --with-qemu
./scripts/setup_environment.sh --check --with-qemu
On Mac, setup checks the actual four-core HVF startup envelope. If the current
Homebrew QEMU fails it, setup builds the pinned QEMU 10.1.0 with the Cohesix
HVF fix from hash-checked upstream source in your user directory. This needs
Homebrew build dependencies and at least 2 GiB free; it does not replace the
system QEMU. On Linux, setup uses Ubuntu’s qemu-system-arm package and checks
four-core KVM startup. If your system QEMU cannot start that profile, setup
stops with a clear error instead of silently using TCG. --check never
installs or builds packages. The release launcher selects the verified QEMU
from this bundle’s .venv when present.
On a Linux host without a desktop, add --headless to both setup commands;
this omits SwarmUI’s graphical libraries while retaining the controller,
Python and optional QEMU dependencies.
| Host | Requirements and behavior |
|---|---|
| Mac | macOS 26 or later and Apple Silicon. Homebrew supplies build dependencies if pinned QEMU is needed. The four-core HVF startup probe must pass; advertising HVF is insufficient. Use a native ARM64 terminal, not Rosetta. |
| Linux | The release reference is JetPack 7.2.1 / L4T 39.2.1 on ARM64, with Ubuntu 24.04 as its package base. Setup uses apt and enables Universe for required runtime packages; the default desktop path includes WebKitGTK 4.1. Other releases and x86-64 have no Release B qualification claim. |
| Linux QEMU | For the native release profile, /dev/kvm must be readable/writable by your user and the host counter must be 31.25 MHz. The Linux guest is built for that counter; the Mac guest is built for 24 MHz. The setup probe checks startup; a guest boot and authenticated client check remain separate. |
| NVIDIA host | The selected Jetson has JetPack 7.2.1, L4T 39.2.1 and CUDA toolkit 13.2.2. Optional GPU discovery needs the compatible CUDA/NVML stack. Keep Jetson’s board-managed driver packages; the runtime installer does not replace them. |
Verify the tools without a target:
./bin/coh doctor --mock
./bin/cohsh --transport mock --role queen
At the coh> prompt, try help, ls /, cat /proc/boot, then quit.
Mock output is simulated. You can also create a sample evidence pack and run a
packaged Python example:
./bin/coh evidence pack --mock --out out/evidence/quickstart-mock
./bin/coh evidence timeline --input out/evidence/quickstart-mock
python python/cohesix-py/examples/lease_run.py --mock
For a physical Pi, continue with Install the Pi image.
3. Boot the QEMU guest
In terminal 1, from the host bundle root:
./qemu/run.sh
Leave it running. The launcher uses four cores and GICv3, with HVF on Mac and
KVM on eligible Linux hosts. Wait for [mark] root-console.start.ok and the
cohesix> prompt. The serial console supports ping, bi, caps mcs,
smp mcs, mem and netstats for boot and network inspection.
The default forwarded endpoints are 127.0.0.1:31337 (TCP console), UDP
31338 and TCP 31339. If occupied, stop the prior instance or select free host
ports, for example:
TCP_PORT=32337 UDP_PORT=32338 SMOKE_PORT=32339 ./qemu/run.sh
Use the chosen TCP port when connecting below. Do not change CPU, timer, core count or machine options to get around a failed native boot. A Linux fallback to TCG is a slower diagnostic run and does not establish native release acceptance. A different Linux counter frequency needs a compatible guest build.
Continue with Connect to your target, using
127.0.0.1 and port 31337 unless you changed the host port.
4. Install the Pi 4 SD image
Use a Pi 4, a suitable power supply, an SD card and reader, an HDMI display and a USB keyboard. Connect Ethernet to your local network, or use the boot menu to configure Wi-Fi. The host computer must be able to reach the selected Pi address. Cohesix boots directly on the Pi; you do not first install Raspberry Pi OS or run the Linux host bundle on the bare Cohesix target.
Extract the -Pi4 archive and verify its MANIFEST.sha256 as in step 1.
The following commands run from that Pi bundle root. Verify the image
sidecar too:
# macOS
(cd image && shasum -a 256 --check cohesix-pi4-sd.img.sha256)
# Linux: use sha256sum --check in the same image directory instead.
image/cohesix-pi4-sd.img is the complete raw MBR/FAT32 image. Read
image/cohesix-pi4-sd.json: the card’s byte capacity must be at least
minimum_target_bytes. Extra capacity on larger cards remains unallocated;
no expansion is needed. Flashing replaces the whole card, including any
saved network settings. Back up anything you need before proceeding.
Write and read back on Mac
Discover the removable card again after insertion. Apple’s built-in SDXC reader
appears as an internal, physical disk, so inspect diskutil list rather than
filtering for external disks. Replace diskN below with the exact whole disk;
check its model, removable status and byte size using diskutil info. The
commands erase the selected disk:
diskutil list
diskutil info /dev/diskN
diskutil unmountDisk /dev/diskN
sudo python3 - image/cohesix-pi4-sd.img /dev/rdiskN <<'PY'
import hashlib
import os
from pathlib import Path
import plistlib
import subprocess
import sys
image, raw = Path(sys.argv[1]), sys.argv[2]
if not raw.startswith('/dev/rdisk') or not raw[10:].isdigit():
raise SystemExit('select an explicit whole raw disk such as /dev/rdisk22')
whole = '/dev/disk' + raw[10:]
info = plistlib.loads(subprocess.check_output(['diskutil', 'info', '-plist', whole]))
if not (info.get('WholeDisk') and info.get('RemovableMedia')
and info.get('Writable') and info.get('VirtualOrPhysical') == 'Physical'
and info.get('BusProtocol') == 'Secure Digital'
and info.get('TotalSize', 0) >= image.stat().st_size):
raise SystemExit('selected disk is not a writable removable SD card of sufficient size')
with image.open('rb') as source, open(raw, 'r+b', buffering=0) as card:
while chunk := source.read(1024 * 1024):
if card.write(chunk) != len(chunk):
raise SystemExit('short SD write')
card.flush()
os.fsync(card.fileno())
source.seek(0)
expected, actual = hashlib.sha256(), hashlib.sha256()
with open(raw, 'rb', buffering=0) as readback:
while chunk := source.read(1024 * 1024):
expected.update(chunk)
data = readback.read(len(chunk))
if len(data) != len(chunk):
raise SystemExit('short SD readback')
actual.update(data)
if actual.digest() != expected.digest():
raise SystemExit('SD readback differs from the distributed image')
print('SD write and whole-image readback: PASS')
PY
diskutil eject /dev/diskN
Keep the raw device open through the readback: macOS can otherwise remount the
new FAT partition and write Spotlight/FSEvents files before a separate cmp
starts. Eject immediately after PASS; do not mount or browse the card between
verification and eject. Do not boot on a write, readback or eject error.
Write and read back on Linux
Identify the removable whole disk by model, transport and byte size. It may
be /dev/sdX or /dev/mmcblkN. Unmount each mounted partition shown by
lsblk; for example, use sudo umount /dev/sdX1 for that listed partition.
Substitute the verified whole disk in the write and readback commands:
lsblk --bytes --output NAME,SIZE,TYPE,TRAN,MODEL,MOUNTPOINTS
sudo dd if=image/cohesix-pi4-sd.img of=/dev/sdX bs=4M conv=fsync status=progress
IMAGE_BYTES=$(stat -c %s image/cohesix-pi4-sd.img)
sudo cmp -n "$IMAGE_BYTES" image/cohesix-pi4-sd.img /dev/sdX
Require a successful write and a zero-exit, silent comparison. To inspect the
target’s credential reference, reinsert the reader so the new partition table is
recognised, then mount the FAT partition using your desktop disk utility.
Unmount it after reading and eject or safely remove the card. Do not use a
partition such as /dev/sdX1 as the destination for the raw image.
First boot and network configuration
Before booting, obtain the exact Pi image’s Queen console credential from its
provisioner as described in step 5. The queen ticket entry in the card’s
cohesix-root-task-resolved.json identifies its secret_ref; the reference is
not the credential value. The Pi credential can differ from the QEMU bundle’s
and is separate from the Wi-Fi password.
Insert the ejected card into the Pi, attach HDMI and the USB keyboard, then power it on. The image stops at Cohesix boot menu; it does not automatically skip network setup. For a first installation:
- Select 2 — Change network settings.
- Select Automatic (DHCP), or Manual (static IPv4) with a valid address, subnet prefix and optional gateway for your network.
- Select Ethernet (wired) or Wi-Fi (wireless). For Wi-Fi, enter the SSID and password on the attached USB keyboard. They are visible on the local display and hidden from serial output; do not enter passwords over serial.
- On Review network settings, select 2 — Save settings and restart.
- After restart, verify Saved network settings loaded, then select 1 — Boot with saved settings.
The Boot once without saving option is temporary. Saving creates
cohesix.env on the card; treat that file and the card as credentials. Changing
networks later uses the same menu, without reflashing. If keyboard setup is
unavailable, the bounded offline cohesix.env procedure is in
First-boot network policy.
Wait for the cohesix> console and inspect netstats. For DHCP, find the
assigned address in the boot/network output or your router’s lease table;
for static mode, use the address you configured. Confirm the active interface
and address before connecting. A blank display or missing USB input is a
boot/input problem, not a reason to guess network settings. A correctly wired
serial console at 115200 baud can retain boot output; use one serial owner
and follow Hardware Bring-up for capture and diagnostics.
5. Connect to your target
In terminal 2, change into the Mac or Linux host bundle. Obtain the Queen
console credential from the provisioner of the exact target image. For QEMU,
inspect the queen entry in configs/generated/root_task_resolved.json; for Pi,
inspect the image’s cohesix-root-task-resolved.json. Selected manifests retain
a secret_ref, such as env:COH_TICKET_QUEEN_KEY, rather than the credential
value. Use the value supplied through that reference when the image was built.
An older development manifest may instead contain a literal secret; inspect
it locally without printing it into shared logs. The Pi’s cohesix.env network
settings and Wi-Fi password are separate from console authentication.
Ticket credentials are embedded in the target image. Treat an image built with private deployment credentials as private too. A public evaluation image must use a separate explicitly shared keyset, never keys used by a private hive. Changing a host environment variable or editing a copied manifest does not rotate the credential in an existing target image; rebuild and qualify the replacement image with the new credential.
Enter the target credential without putting it in shell history (Bash):
read -r -s -p 'Target console token: ' COHSH_AUTH_TOKEN
printf '\n'
export COHSH_AUTH_TOKEN
export COH_AUTH_TOKEN="$COHSH_AUTH_TOKEN"
TARGET_HOST=127.0.0.1
TARGET_PORT=31337
For Pi, replace 127.0.0.1 with its actual IP address. For an alternate QEMU
forward, use the selected host TCP port. Connect:
./bin/cohsh --transport tcp --tcp-host "$TARGET_HOST" \
--tcp-port "$TARGET_PORT" --role queen
At coh>, try these read-only observations:
ping
ls /
cat /proc/boot
cat /proc/root/reachable
cat /proc/schedule/summary
cat /proc/lease/summary
ls /shard
quit
Success means the authenticated session attached, the reads returned bounded
responses, and /proc/boot identifies the intended target. quit closes the
session; it does not power off the Pi. The canonical Worker namespace is
/shard. Runtime observations and mock output are different proof sources;
this quickstart is not a complete hardware or performance qualification.
TCP authentication provides no encryption. Keep QEMU forwards on loopback. Use a private controlled network for Pi, or terminate an encrypted tunnel/VPN on a host gateway. Only one direct TCP client may own the target at a time.
6. Share the target through the gateway
Close the direct cohsh session first. In terminal 2, retaining the target
address and credential above, choose a separate strong request token for gateway
writes and start the gateway:
read -r -s -p 'New gateway request token: ' HIVE_GATEWAY_REQUEST_AUTH_TOKEN
printf '\n'
export HIVE_GATEWAY_REQUEST_AUTH_TOKEN
export COH_REST_URL=http://127.0.0.1:8080
./bin/hive-gateway --bind 127.0.0.1:8080 \
--tcp-host "$TARGET_HOST" --tcp-port "$TARGET_PORT"
In terminal 3, from the host bundle root:
export COH_REST_URL=http://127.0.0.1:8080
curl --fail --silent --show-error "$COH_REST_URL/v1/meta/status"
./bin/cohsh --transport rest --rest-url "$COH_REST_URL" --role queen
Require connected: true before using the REST-backed shell. These clients
share the gateway’s upstream role and ticket. For writes, securely set the
same HIVE_GATEWAY_REQUEST_AUTH_TOKEN in the client terminal; a new terminal
does not inherit variables exported in terminal 2.
After quitting the shell, launch the desktop UI through that same gateway:
SWARMUI_TRANSPORT=rest SWARMUI_REST_URL="$COH_REST_URL" ./bin/swarmui
SwarmUI needs a graphical desktop. On a headless Jetson, use the CLI/REST
clients or an existing remote desktop; xvfb-run provides an off-screen test
display, not a visible desktop. Python users can activate .venv in this
terminal and follow Python support for RestBackend.
For optional real NVIDIA inventory, run ./bin/gpu-bridge-host --list on the
Linux GPU host; Host tools covers publishing it through the
gateway. GPU discovery does not establish model execution.
When finished, quit clients, stop the gateway with Ctrl-C, then exit QEMU
with Ctrl-A, followed by X. Avoid cutting Pi power while its boot menu is
saving settings. Clear credentials from each terminal that used them:
unset COHSH_AUTH_TOKEN COH_AUTH_TOKEN HIVE_GATEWAY_REQUEST_AUTH_TOKEN
If something fails
| Symptom | Next check |
|---|---|
| Manifest or image readback mismatch | Stop. Re-extract a trusted archive, or rediscover and rewrite the intended card; do not boot mismatched media. |
| Wrong executable format or GLIBC error | Use the matching native ARM64 bundle and a compatible Ubuntu runtime. Do not copy individual binaries between releases. |
| Missing Python, QEMU or WebKit library | Run the host setup script, then --check. Activate this extraction’s .venv for Python. |
| HVF/KVM unavailable, or TCG fallback | Check native architecture, QEMU accelerator support and Linux /dev/kvm permissions. Keep the guest’s declared timer profile. |
| Pi remains in the menu | Select the displayed boot action after saving/restarting. Check whether the menu reports saved or default settings. |
| TCP refused or timeout | Keep QEMU running, check its forwarded port, or verify the Pi’s selected interface/IP and host route. Check for a previous direct client. |
Missing credential or ERR AUTH |
Obtain the Queen credential used to build the exact image; its manifest may contain only a secret_ref. Placeholder credentials are rejected; gateway request tokens and Wi-Fi passwords are different credentials. |
| Busy console or gateway disconnected | Quit direct clients, leave one gateway as TCP owner, and connect additional clients through REST. |
See Userland and CLI for commands, Hardware Bring-up for Pi diagnostics, and Host tools for mounts, GPU bridges, tickets and evidence packs. For 1.2.0 CUDA/LoRA, Mac MLX, MCP/A2A and NeMo workflows, start with the use-case guide and check your installed profile against current status.
Build from source
This section requires a source checkout; the runtime bundles intentionally omit the build toolchain. Follow the source README for the Mac or Linux installer. The installers prepare dependencies; they do not build Cohesix host binaries or seL4 target artifacts. Complete the source README’s external seL4 preparation and QEMU profile build before running the Mac source build below. Then activate the tools from the repository root:
source "$HOME/.cargo/env"
source .venv/bin/activate
export SEL4_BUILD_DIR="$PWD/out/sel4/profile-v2/qemu-smp-production"
./scripts/cohesix-build-run.sh \
--sel4-build "$SEL4_BUILD_DIR" --out-dir out/cohesix \
--profile release --root-task-features release-qemu,bootstrap-trace \
--cargo-target aarch64-unknown-none --transport tcp
Use out/cohesix/host-tools/ in place of the release’s bin/ for host commands.
The Linux installer supplies host-build dependencies and diagnostic QEMU; the
native Linux release lane requires its own built 31.25 MHz KVM seL4 profile.
See the release factory for native builds and
release qualification. Do not mix checkout artifacts with an extracted release.