The SIEM-aware coding and security agent — a branded distribution of opencode that ships with UTMStack's SIEM tooling, the ThreatWinds model provider, and a curated set of skills and subagents already configured.
Find your platform below and copy the matching command. The installer detects your CPU architecture automatically — there is one command per operating system, not per architecture.
curl -fsSL https://raw.githubusercontent.com/utmstack/utmstack-cli/main/install | bashcurl -fsSL https://raw.githubusercontent.com/utmstack/utmstack-cli/main/install | bashirm https://raw.githubusercontent.com/utmstack/utmstack-cli/main/install.ps1 | iexRun this in PowerShell, not cmd.exe. The installer always installs the
x64 build. On an ARM64 machine it runs under Windows' built-in x64
emulation, where the full interactive TUI works (verified on Windows 11 ARM64).
There is no native ARM64 build: the Bun-compiled ARM64 binary can't initialize
OpenTUI's terminal renderer — a toolchain limitation that breaks opencode's own
windows-arm64 binary identically — so shipping one would just crash. The x64
build under emulation is the supported ARM64 path.
| Location | |
|---|---|
| macOS / Linux | ~/.utmstack/bin/utmstack |
| Windows | %USERPROFILE%\.utmstack\bin\utmstack.exe |
The installer adds that directory to your PATH and also installs the
UTMStack MCP server, which provides the SIEM
tools. Open a new terminal afterwards so PATH takes effect.
Set UTMSTACK_SKIP_MCP=1 to skip the MCP server. Set UTMSTACK_VERSION=1.2.3
to install a specific version instead of the latest.
Every combination below gets a prebuilt binary:
| Operating system | Architecture | Notes |
|---|---|---|
| macOS 12+ | Apple Silicon (arm64) |
|
| macOS 12+ | Intel (x64) |
includes a no-AVX2 build for older Macs |
| Linux (glibc 2.35+) | x86_64 |
Ubuntu 22.04+, RHEL 9+, Debian 12+ |
| Linux (glibc 2.39+) | arm64 / aarch64 |
Ubuntu 24.04+, Debian 13+, Kali rolling |
| Windows 10/11 | x64 |
native |
| Windows 11 | ARM64 |
via x64 emulation (no native ARM64 build) |
Older or virtualised x64 CPUs: many cloud VMs lack AVX2. The installer
detects this and fetches a -baseline build automatically — no action needed.
Alpine / musl Linux is not covered by these binaries, which are built against glibc. Build from source there (see below).
32-bit systems are not supported.
The utmstack binary is not code-signed. It runs normally — signing is not required to
execute anything — but two situations are worth knowing about.
On macOS, binaries fetched by curl are not quarantined, so the installer works as-is;
downloading an asset from the Releases page in a browser will trip Gatekeeper (clear it
with xattr -dr com.apple.quarantine ~/.utmstack/bin/utmstack).
On Windows, SmartScreen triggers on Mark-of-the-Web, which browsers apply and
Invoke-WebRequest does not — so install.ps1 is normally silent. If Defender flags the
binary anyway, verify its SHA256 against the release's checksums.txt and add an exclusion
for %USERPROFILE%\.utmstack\bin.
This matches how opencode itself is distributed. Every release publishes checksums.txt,
and the installers verify against it and refuse to install if they cannot.
You configure two independent things, and it's worth keeping them straight:
| What it's for | How to set it | |
|---|---|---|
| ThreatWinds API key | the LLM that powers the assistant | utmstack → /connect (or utmstack providers login) |
| UTMStack connection | your SIEM — the URL + API key or username/password | utmstack-mcp init, or just ask the assistant |
These are different systems with different credentials. The ThreatWinds key authenticates the model; the UTMStack connection is how the assistant reaches your SIEM's alerts, logs, and agents.
utmstack # start the CLI, then /connect to paste your ThreatWinds API keyConnecting your UTMStack — two ways:
- Run the wizard:
utmstack-mcp initprompts for the URL and credentials, validates them against the live API, and stores them in a0600file. - Or just tell the assistant: "connect to my UTMStack at https://utm.example.com with API
key …" or "change my UTMStack URL to …". It configures the connection for you and the
change takes effect immediately — no restart. (It deliberately can't enable remote
command execution that way; that stays a
utmstack-mcp init/ config-file decision.)
Either path keeps credentials out of shell history and out of any file you might share.
SIEM tools — the utmstack MCP server is enabled by default: alert search
and triage, log explorer and SQL, incidents, correlation rules, data filters,
agent inventory, and remote command execution on endpoints.
Remote command execution is opt-in per server (allowAgentCommands). It
grants a root/SYSTEM shell on an endpoint, and SIEM log content — which is
partly written by attackers — reaches the model through log and alert search.
Enable it only where you want that capability.
Models — the threatwinds provider is preconfigured
(silas-1.6-pro by default, silas-1.6 for small tasks). Add your API key with
/connect in the TUI or utmstack providers login.
Skills and subagents — 26 skills and 9 subagents are embedded in the binary and extracted to your config directory on first run, covering planning, code review, systematic debugging, test-driven development, and web testing. They are version-gated: an upgrade refreshes them without touching skills you added.
Config lives in ~/.config/utmstack/utmstack.json (%APPDATA%\utmstack on
Windows). The defaults are written on first run and are yours to edit — the CLI
never overwrites an existing config.
The directory is separate from opencode's, so this CLI and a stock opencode
install coexist without touching each other's settings. An opencode.json in
the same directory is still read, with utmstack.json taking precedence.
bun install
cd packages/opencode
OPENCODE_VERSION=1.0.0 bun run script/build.ts --singleThe binary lands in dist/opencode-<platform>-<arch>/bin/utmstack. Embedded
skills and agents are regenerated from packages/opencode/src/assets on every
build; bundled-assets.gen.ts is generated and not tracked in git.
This is a fork of opencode. Branding and defaults are confined to a small set of files so upstream changes remain straightforward to merge:
| Path | Purpose |
|---|---|
packages/core/src/global.ts |
app name — relocates every config/data/cache directory |
packages/opencode/src/index.ts |
script name, bootstrap invocation |
packages/opencode/src/config/utmstack-bootstrap.ts |
seeds default config, extracts embedded assets |
packages/opencode/src/config/config.ts |
reads utmstack.json ahead of opencode.json |
packages/opencode/src/plugin/threatwinds.ts |
makes threatwinds a first-class auth provider |
packages/opencode/script/gen-bundled-assets.ts |
embeds skills and agents into the binary |
packages/opencode/script/build.ts |
binary name, release asset naming, archive hygiene |
packages/opencode/src/installation/index.ts |
update checks point at this repo, not upstream |
packages/tui/src/logo.ts, packages/opencode/src/cli/ui.ts |
wordmarks |
install |
installer, plus the MCP install step |
Skills and subagents come from
osmontero/opencode-skills. They
carry their own licenses, preserved alongside each one in
packages/opencode/src/assets/ — a mix of MIT (Jesse Vincent, Osmany Montero)
and Apache-2.0 (Anthropic, PBC). Those LICENSE.txt files ship with the bundle
and are extracted to your config directory with the skills themselves.
Upstream opencode documentation is preserved in README.upstream.md.
opencode's license applies to the upstream code. See LICENSE.