paperclipai/paperclip · error · Error

ACPX Claude requires Linux x64 or macOS ARM64/x64.

Error message

ACPX Claude requires Linux x64 or macOS ARM64/x64.

What it means

Thrown by `testEnvironment` after a successful remote platform probe when the reported OS/architecture is not one of the supported ACPX Claude platforms: Linux x86_64, or Darwin (macOS) on arm64 or x86_64. ACPX Claude's native runner only ships for these platforms, so unsupported hosts are rejected up front.

Source

Thrown at server/src/adapters/registry.ts:418

          code: profileError.code,
          level: "error" as const,
          message: profileError.message,
        }],
      };
    }
    if (profile.provider === "acpx") {
      try {
        if (profile.acpxAgent !== "claude") throw new Error("Select Codex to use the native Codex runner.");
        const target = context.executionTarget;
        if (target?.kind === "remote") {
          const probe = await runAdapterExecutionTargetShellCommand(
            `acpx-platform-${crypto.randomUUID()}`, target, "uname -s && uname -m",
            { cwd: target.remoteCwd, env: {}, timeoutSec: 15 },
          );
          if (probe.timedOut || probe.exitCode !== 0) throw new Error("Could not verify the remote ACPX runner platform.");
          const [os, arch] = probe.stdout.trim().split(/\s+/);
          if (!((os === "Linux" && arch === "x86_64") || (os === "Darwin" && ["arm64", "x86_64"].includes(arch ?? "")))) {
            throw new Error("ACPX Claude requires Linux x64 or macOS ARM64/x64.");
          }
          return {
            adapterType: "paperclip_runner", status: "warn" as const, testedAt: new Date().toISOString(),
            checks: [{ code: "acpx_remote_runtime_unverified", level: "warn" as const,
              message: "The remote platform is supported. Runtime package integrity and readiness must still be verified by the remote runner before launch." }],
          };
        }
        const { probeAcpxClaudeInstallation } = await import("@paperclipai/paperclip-runner/live");
        await probeAcpxClaudeInstallation(profile.model);
        return {
          adapterType: "paperclip_runner", status: "pass" as const, testedAt: new Date().toISOString(),
          checks: [{ code: "acpx_runtime_ready", level: "info" as const, message: "ACPX Claude runtime is installed and verified. Model access is checked when Claude runs." }],
        };
      } catch (error) {
        return {
          adapterType: "paperclip_runner", status: "fail" as const, testedAt: new Date().toISOString(),
          checks: [{ code: "acpx_runtime_unavailable", level: "error" as const, message: error instanceof Error ? error.message : "ACPX Claude runtime could not be verified." }],
        };

View on GitHub (pinned to 01ad858492)

Solutions

  1. Run the runner on a supported platform: Linux x64 or macOS ARM64/x64.
  2. If on Apple Silicon, run the runner natively (Darwin/arm64) rather than in a Linux VM/container.
  3. Check the probe output for shell banners that corrupt the `os arch` parse; run the command directly to compare.
  4. Use a non-ACPX provider for unsupported platforms.

Example fix

// before
executionTarget: { kind: "remote", host: "arm-linux-box", remoteCwd: "/srv/runner" }
// after
executionTarget: { kind: "remote", host: "linux-x64-box", remoteCwd: "/srv/runner" }
Defensive patterns

Strategy: validation

Validate before calling

const [os, arch] = (await ssh(target, "uname -s && uname -m")).stdout.trim().split(/\s+/);
const supported = (os === "Linux" && arch === "x86_64") || (os === "Darwin" && ["arm64", "x86_64"].includes(arch));
if (!supported) throw new Error(`host ${os}/${arch} unsupported for ACPX Claude`);

Type guard

function isSupportedAcpxPlatform(os, arch) {
  return (os === "Linux" && arch === "x86_64") || (os === "Darwin" && ["arm64", "x86_64"].includes(arch));
}

Try / catch

try {
  await registry.testEnvironment(profile, context);
} catch (err) {
  if (err.message.includes("requires Linux x64 or macOS")) {
    await reassignExecutionTargetToSupportedPlatform(profile);
  } else throw err;
}

Prevention

When it happens

Trigger: Remote ACPX probe succeeds (`uname -s && uname -m` returns 0) but the parsed `os`/`arch` pair is not `Linux/x86_64`, `Darwin/arm64`, or `Darwin/x86_64` — e.g. Linux aarch64, Windows, FreeBSD, or Alpine reporting an unexpected arch string.

Common situations: Pointing the ACPX Claude runner at an ARM Linux box (e.g. AWS Graviton, Raspberry Pi, Apple Silicon Linux container); targeting a Windows remote; musl/Alpine reporting unusual arch values; misparsed stdout because the remote shell prints extra banners.

Understand the failure class

Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/675f6a04b656be3d. Report an issue: GitHub.