Cross-platform support

llamaclaw aims to work on every mainstream OS. Current state + roadmap.

Support matrix (target vs actual)

OS

Target

esml

turboquant

perseus

tide

kronos

luci

autoresearch

macOS (Apple Silicon)

tier-1

N/A

✅ (MPS)

macOS (Intel)

tier-2

⚠️ arm-only currently

N/A

⚠️

Linux x86_64

tier-1

N/A

✅ (CUDA branch)

Linux aarch64 (Pi 5)

tier-1

✅ native

⚠️ no GPU path

Linux aarch64 (cloud ARM)

tier-2

⚠️

⚠️

Windows 11 x86_64 (native)

tier-2

❌ untested

❌ untested

❌ untested

❌ untested

❌ untested

N/A

Windows 11 (WSL2)

tier-1

N/A

FreeBSD

tier-3

⚠️

⚠️

⚠️

⚠️

N/A

Legend: ✅ tested in CI / ⚠️ should work but not verified / ❌ broken or unsupported / N/A not applicable (e.g. Pi-only).

Tier definitions

Tier 1 — First-class support. CI runs on every push, bugs block releases. Tier 2 — Best-effort support. CI runs weekly, bugs get fixed, community contributions welcome. Tier 3 — Community-maintained. Patches accepted, no guarantee of release-day testing.

Windows support plan

Windows native support is the biggest gap. Three paths, in order of effort:

Path A — Windows CI (lowest effort, biggest coverage win)

Add windows-latest to the CI matrix in:

  • llamaclaw/esml: pytest on Windows + R on Windows (Rtools)

  • llamaclaw/tide: Go cross-compile to windows/amd64

  • llamaclaw/kronos: Rust x86_64-pc-windows-msvc target

  • llamaclaw/turboquant: pytest + C bridge via MSVC

  • llamaclaw/perseus: pytest (pure Python, should Just Work)

Estimated effort: ~4 hours spread across repos.

Path B — Native Windows installer (medium effort)

llamaclaw/installer already ships install.ps1. Harden it:

  • Chocolatey package

  • Scoop bucket

  • Winget manifest

  • MSI installer for esml

Estimated effort: ~2 days.

Path C — Path handling audit (low effort, high impact)

Windows uses \ separators and different file semantics. Audit:

  • Any os.path.join("foo/bar/baz")Path("foo", "bar", "baz")

  • Any hardcoded /tmp/tempfile.gettempdir()

  • LF vs CRLF in git via .gitattributes (we have this)

  • Case sensitivity: Windows is case-insensitive; our fn/ has polya.py and polyA.py as separate files — conflict on Windows

  • Shell scripts (install.sh) need PowerShell equivalents (install.ps1 exists; keep parity)

Estimated effort: ~1 day per repo.

FreeBSD / other Unix

For BSDs, most of the stack works because Python + R + Go + Rust all support it. The pain points:

  • luci uses systemd-specific bits (not BSD-portable) — would need rc.d equivalents

  • deploy has Linux-specific udev rules for NVMe BFQ

  • perseus-relay systemd unit needs a BSD rc.d equivalent

Strategy: accept community patches, don’t actively support.

Platform-specific notes

macOS

  • Apple Silicon (M1/M2/M3/M4): primary dev environment. Homebrew-first install path.

  • Rosetta / Intel: works but slower; not actively tested anymore.

  • System Python: never use it. Use brew install python@3.12 or pyenv.

  • R: brew install r or CRAN’s macOS binary.

Linux

  • Ubuntu 22.04 / 24.04: primary CI target. Build deps: gfortran libopenblas-dev pkg-config.

  • Debian 12+: same as Ubuntu.

  • Fedora / RHEL: works via dnf install openblas-devel gcc-gfortran; not in CI.

  • NixOS: Nix flake welcome as a community contribution.

  • Alpine (musl): our Docker images use Alpine for tide and kronos. Not recommended for esml (scipy wheels don’t work on musl).

Windows 11

  • WSL2 is the recommended path today. Install Ubuntu under WSL, then follow the Linux install instructions. Full parity with Linux CI.

  • Native Windows: work in progress. See the matrix above.

  • PowerShell 7+: install.ps1 targets PowerShell 7. PowerShell 5 may work but isn’t tested.

Raspberry Pi 5

Pi 4 / Pi Zero 2 W

Community territory. Pi 4 works with reduced expectations (slower BLAS, limited RAM). Pi Zero 2 W is too slow for anything except the Go tide TUI.

Chromebooks / Android

Not targeted. If you’re running Linux in a container on Chrome OS, treat it as Linux aarch64 or x86_64 depending on your chip.

Release checklist for new OS support

Before adding a new OS to tier-1:

  1. CI runs on every push and passes.

  2. Install guide in getting-started/install.md has a section for it.

  3. At least one contributor with that OS as their daily driver.

  4. Dependabot tracks OS-specific deps where applicable.

  5. Perseus + Luci exec-approvals tested on the new OS.

The current shortlist (this quarter)

  1. Add windows-latest to llamaclaw/tide CI — pure Go, should be a 1-line change.

  2. Add windows-latest to llamaclaw/perseus CI — pure Python, same.

  3. Path-handling audit on esml — find any non-pathlib.Path file IO, convert.

  4. Resolve the polya.py / polyA.py case-sensitivity issue — impacts Windows + macOS with case-insensitive filesystems.

  5. Winget manifest for esml — enables winget install esml.

Progress tracked in github.com/llamaclaw/installer/issues.