Declarative agents
.agent packages — manifest + prompts + skills, no executable code, signed and verified at install time.
ACowork is a multi-user, distributed, AI-native collaboration platform.
Declarative .agent packages, one Rust binary,
standalone-to-cluster — same code path.
Download
Pre-built binaries for desktop, plus Android. Alpha channel — see releases for the latest.
Windows 10/11 · x64 · .msi / .exe
macOS 12+ · Universal · .dmg
x86_64 / arm64 · .deb · .rpm · .AppImage
Android 9+ · arm64 · .apk
iOS 15+ · arm64 · .ipa
Or build from source — component by component:
# 0) Get the source (cross-platform; same on every OS)
$ git clone https://github.com/tranxon/ACowork
$ cd ACowork
# 1) Core — Gateway + Runtime + Node Agent (release profile)
$ ./dev/common/build_core.sh
# 2) Desktop App — macOS (.app / .dmg)
$ ./dev/desktop/macos/package_desktop_macos.sh
# 3) Mobile App — Android (signed release; .ps1 via pwsh on macOS)
$ pwsh ./dev/android/build_mobile.ps1
# 0) Get the source (cross-platform; same on every OS)
$ git clone https://github.com/tranxon/ACowork
$ cd ACowork
# 1) Core — Gateway + Runtime + Node Agent (release profile)
$ .\dev\common\build_core.ps1
# 2) Desktop App — Windows (.msi / NSIS)
$ .\dev\desktop\windows\package_desktop_windows.ps1
# 3) Mobile App — Android (signed release)
$ .\dev\android\build_mobile.ps1
# 0) Get the source (cross-platform; same on every OS)
$ git clone https://github.com/tranxon/ACowork
$ cd ACowork
# 1) Core — Gateway + Runtime + Node Agent (release profile)
$ ./dev/common/build_core.sh
# 2) Desktop App — Linux (.deb / .rpm / AppImage)
$ ./dev/desktop/linux/package_desktop_linux.sh
# 3) Mobile App — Android (signed release; .ps1 via pwsh on Linux)
$ pwsh ./dev/android/build_mobile.ps1
Need prebuilt convenience? Watch / star the GitHub repo to be notified when release artifacts ship.
Features
.agent packages — manifest + prompts + skills, no executable code, signed and verified at install time.
One Rust binary loads any .agent. Agents talk to LLMs directly — no proxy, no extra latency.
Gateway + Node + Runtime, one protocol path. Standalone, remote nodes, or relay — same binary, no branches.
acowork-pm and acowork-doc as first-class services — REST + MCP, real-time multi-user editing.
Per-agent Grafeo graph DB · 3-tier / 5-class layers · HNSW + BM25 hybrid retrieval.
Admin/user roles · per-node, per-agent, and per-session visibility with explicit user grants. Least privilege, by default.
Get Started
Once you have the binaries, pick how Gateway and Node Agents wire up — Standalone, Cluster, or Relay. Same code path either way.
Deployment topologies
Every variant shows the Gateway command, the Node command (or “auto”), and what the GUI apps do.
Personal use, demos, edge devices. Gateway auto-spawns one local Node Agent. Zero setup.
$ ./acowork-gateway
✓ Gateway listening on http://127.0.0.1:19876
✓ MQTT broker on 127.0.0.1:19875
✓ Local Node Agent enrolled (uuid=local-…)
$ .\acowork-gateway.exe
✓ Gateway listening on http://127.0.0.1:19876
✓ MQTT broker on 127.0.0.1:19875
✓ Local Node Agent enrolled (uuid=local-…)
$ ./acowork-gateway
✓ Gateway listening on http://127.0.0.1:19876
✓ MQTT broker on 127.0.0.1:19875
✓ Local Node Agent enrolled (uuid=local-…)
Auto-spawned by the Gateway as name=local — no manual command needed.
Desktop — double-click the app icon. Defaults to Local mode pointing at http://127.0.0.1:19876, auto-connects. · Mobile — N/A in Standalone (the mobile app always points at a remote Gateway).
Multiple machines, one Gateway. Run heavy agents on a GPU box, lightweight on a laptop — both enroll over MQTT.
$ ./acowork-gateway \
--addr 0.0.0.0:19876 \
--mqtt-addr 0.0.0.0:19875 \
--advertise-host gw.lan
✓ Gateway listening on http://gw.lan:19876
✓ MQTT broker on gw.lan:19875
$ .\acowork-gateway.exe `
--addr 0.0.0.0:19876 `
--mqtt-addr 0.0.0.0:19875 `
--advertise-host gw.lan
✓ Gateway listening on http://gw.lan:19876
✓ MQTT broker on gw.lan:19875
$ ./acowork-gateway \
--addr 0.0.0.0:19876 \
--mqtt-addr 0.0.0.0:19875 \
--advertise-host gw.lan
✓ Gateway listening on http://gw.lan:19876
✓ MQTT broker on gw.lan:19875
$ ./acowork-node start \
--gateway gw.lan:19875 \
--token $ENROLL_TOKEN
✓ enrolled as node-<uuid> · Runtime host ready
$ .\acowork-node.exe start `
--gateway gw.lan:19875 `
--token $env:ENROLL_TOKEN
✓ enrolled as node-<uuid> · Runtime host ready
$ ./acowork-node start \
--gateway gw.lan:19875 \
--token $ENROLL_TOKEN
✓ enrolled as node-<uuid> · Runtime host ready
Desktop — Settings → Gateway tab → switch to Remote (LAN) → enter http://gw.lan:19876. · Mobile — same URL; works on the phone over Wi-Fi.
Reach your home Gateway from anywhere with a thin WSS tunnel — no public port, no VPN. Layered on top of Standalone or Cluster.
$ curl -X POST http://127.0.0.1:19876/api/relay/enable \
-H 'Content-Type: application/json' \
-d '{"url": "wss://relay.example.com/tunnel"}'
✓ tunnel established · gw-id: 7f3a-…
$ $body = '{"url": "wss://relay.example.com/tunnel"}'
$ curl.exe -X POST http://127.0.0.1:19876/api/relay/enable `
-H "Content-Type: application/json" `
-d $body
✓ tunnel established · gw-id: 7f3a-…
PowerShell's curl is an alias for Invoke-WebRequest — call curl.exe explicitly for the same behavior as bash.
$ curl -X POST http://127.0.0.1:19876/api/relay/enable \
-H 'Content-Type: application/json' \
-d '{"url": "wss://relay.example.com/tunnel"}'
✓ tunnel established · gw-id: 7f3a-…
Unchanged — Nodes still talk to the local Gateway as before. Relay only rewires the inbound path.
Desktop — Settings → Gateway tab → switch to Relay (WAN) → enter https://7f3a-….relay.example.com. · Mobile — same; ideal for on-the-go access to a home gateway.
More in the upstream design docs and AGENTS.md.