Building from Source
End users install pre-built binaries via Homebrew, apt, yum, or apk (see Getting Started). This page is for contributors who want to build everything locally from a fresh clone.
Prerequisites
Expand each one for per-OS install commands.
Aileron's modules require it. go version should report at least go1.25.0.
brew install goUse your distro's package manager, or download the official tarball from go.dev/dl.
# Debian / Ubuntu (may lag behind upstream; check version)
sudo apt-get install golang-gowinget install GoLang.GoAll build commands go through task. See taskfile.dev for other install options.
brew install go-tasksh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/binscoop install taskThe webapp and docs targets build through pnpm, so task build will
fail without them. The simplest setup is corepack enable after installing Node,
then corepack prepare [email protected] --activate.
brew install node
corepack enable
corepack prepare [email protected] --activateInstall nvm (https://github.com/nvm-sh/nvm), then run:
nvm install 24
corepack enable
corepack prepare [email protected] --activatewinget install OpenJS.NodeJS
corepack enable
corepack prepare [email protected] --activateRecommended extras
Get lint feedback locally ahead of CI.
brew install golangci-lintcurl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/binscoop install golangci-lintGitHub's CLI, used by the PR workflow.
brew install ghSee cli.github.com/manual/installation for other distros.
sudo apt-get install ghwinget install GitHub.cliOnly required if you're touching the Docker images under deploy/.
Docker Desktop is the simplest path.
brew install --cask dockerInstall Docker Engine via your distro; see docs.docker.com/engine/install.
curl -fsSL https://get.docker.com | shwinget install Docker.DockerDesktopBuild everything
task buildThis is the all-in-one entry point. It builds the three binaries, the docs site, the webapp, and the Docker containers. Output lands under build/. The first run pulls Go modules and pnpm installs the webapp and docs dependencies; subsequent runs are incremental.
Build a single binary
Each binary has its own Taskfile entry. Output is the same build/<binary> path:
task build:cli # aileron
task build:mcp # aileron-mcp
task build:enclave # aileron-enclaveThe CLI build embeds the webapp. If you’ve made changes to it, regenerate first (see the next section).
Embedded assets
The local webapp
The daemon ships with the local webapp embedded via go:embed from internal/app/webapp_dist/. To pick up webapp changes in the daemon:
task build:webapp # builds webapp/, copies output into internal/app/webapp_dist
task build:cli # re-embeds the new webapp bytes into the daemon binaryFor iterating on the webapp without rebuilding the daemon every change, use task dev:webapp. The dev server at localhost:5173 hot-reloads; aileron launch continues serving the embedded build.
Generated API types
The daemon’s HTTP API is defined in internal/api/openapi.yaml. Server interfaces and request/response types are generated:
task generate:apiPer the project’s CLAUDE.md, the spec is the source of truth. Hand-editing internal/api/gen/server.gen.go is not supported; any API change starts in the spec.
Build the docs site
task build:docs # static build under docs/dist/
task dev:docs # live dev server at localhost:4321The docs site is Astro + Svelte. Pages live under docs/src/content/docs/ (Markdown / MDX); the sidebar is configured in docs/src/lib/navigation.ts. Build artifacts are not committed.
Build for release
task release:snapshot # GoReleaser snapshot (no publish)This produces the same artifacts CI ships on tag pushes: .deb, .rpm, .apk, and the Homebrew formulas. The snapshot run does not publish anything; it’s the dry run.
Reproducibility notes
- The
go.workworkspace pins the Go module set acrosscmd/,internal/,sdk/, andtest/.go build ./...from the root won’t work; always invoke from a specific module directory or usetask. - The four binaries are version-coupled. A
task buildis the supported way to get a matched set; ad-hocgo buildagainst one of the four is fine for iteration but the resulting binary is only guaranteed to talk to a same-commit peer.