Skip to content

Building from Source

VirtEngine is developed against Go 1.25.5. The build is Makefile-driven and produces a single binary, virtengine, containing the full node and client functionality.

RequirementNotes
Go 1.25.5With GOPATH set and $GOPATH/bin in $PATH
C/C++ compilergcc or clang — required for C dependencies (libusb, libhid)
GNU make 4+macOS ships an ancient make; install via Homebrew (keg-only — prepend its gnubin to PATH)
direnv ≥ 2.32.xThe repo uses direnv extensively for environment setup
PlatformArchStatus
Darwinamd64 / arm64Supported
Linuxamd64 / arm64Supported
Linuxarmhf (GOARM 5,6,7)Not supported
Windowsamd64Experimental
  1. Install dependencies.

    Terminal window
    # macOS
    brew install curl wget jq direnv coreutils make npm
    export PATH="$(brew --prefix)/opt/make/libexec/gnubin:$PATH"
    # Debian-based Linux
    sudo apt update
    sudo apt install -y jq curl wget build-essentials ca-certificates npm direnv gcc
  2. Clone and build.

    Terminal window
    git clone https://github.com/virtengine/virtengine
    cd virtengine
    make virtengine

    The compiled executable is written to .cache/bin. Inside the repository environment it takes precedence over any system-wide virtengine.

The build creates a .cache directory at the source root for pinned versions of temporary build tools (protoc and friends), installed only when a target needs them:

.cache/
bin/ # build tools
run/ # work directories for _run examples
versions/ # version markers used to detect tool upgrades

Set VE_DEVCACHE to relocate it. Tool versions and install rules live in make/init.mk and make/setup-cache.mk.

For published release tags, installation paths exist via Homebrew and an install script:

Terminal window
brew tap virtengine/tap
brew install virtengine
Terminal window
curl -sSfL https://raw.githubusercontent.com/virtengine/virtengine/main/install.sh | sh

Before production use, verify the tag is actually published and the network posture matches your deployment — see Mainnet Launch Posture.