affaan-m/ECC · error · Error

Unsupported architecture

Error message

Unsupported architecture: ${architecture}

What it means

normalizePlatform normalizes 'x64' to 'amd64' then validates the architecture against amd64/arm64. Any other arch (ia32, arm, mips, ppc, s390x, riscv, etc.) throws because no qualified Nasiko binaries exist for it.

Solutions

  1. Run on an amd64 (x86-64) or arm64 machine/VM/container
  2. Use an arm64 OS image on Apple Silicon/ARM servers (not 32-bit arm)
  3. Pass node-style arch strings: 'x64' or 'arm64'

Example fix

// before
normalizePlatform('linux', 'x86');
// after
normalizePlatform('linux', 'x64'); // normalized to amd64
Defensive patterns

Strategy: type-guard

Validate before calling

const arch = process.arch === 'x64' ? 'amd64' : process.arch;
if (!['amd64', 'arm64'].includes(arch)) {
  console.error(`Nasiko not available for ${process.arch}; need amd64 or arm64`);
  process.exit(1);
}

Type guard

function isSupportedArch(architecture) {
  const a = architecture === 'x64' ? 'amd64' : architecture;
  return ['amd64', 'arm64'].includes(a);
}

Try / catch

try {
  const rel = getQualifiedRelease(version);
} catch (e) {
  if (e.message.startsWith('Unsupported architecture')) {
    console.error('Use an amd64 or arm64 machine.');
  } else throw e;
}

Prevention

When it happens

Trigger: Running the installer on a 32-bit or non-x86/arm machine (process.arch === 'ia32', 'armv7l', 'mips', ...), or passing an explicit unsupported architecture string into normalizePlatform.

Common situations: Old 32-bit Linux/Windows hosts; Raspberry Pi on 32-bit OS; exotic CI runners (s390x/ppc64le); typos like 'x86' or 'aarch64' instead of node's arch names.

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 affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/a78bb594e6fec544. Report an issue: GitHub.

Appendix: source

Thrown at scripts/lib/nasiko-release.js:35

const MAX_BINARY_BYTES = 64 * 1024 * 1024;
const MAX_METADATA_BYTES = 64 * 1024;
const SHA256_PATTERN = /^sha256:[a-f0-9]{64}$/;

const QUALIFIED_RELEASES = Object.freeze({
  'v0.1.0': Object.freeze({
    'linux/amd64': Object.freeze({ manifestDigest: 'sha256:0df748a40f3d714b6b6a3376a1d13a224c05bdb8d1628f31ace5a7bee8ceb9de', binaryDigest: 'sha256:94a2bcab2d3832257e0111480bb7c3dcac81d63a7ae9bac53206a92c0957ee0f' }),
    'linux/arm64': Object.freeze({ manifestDigest: 'sha256:655021a129c7df4621a80d16ea4eab38018530bfe9a20da646641d9f4ac5c249', binaryDigest: 'sha256:85f9fa5cfbed6c276fce6df2d71e9d0c66d7d8e8d46a40297464833d38db7a7e' }),
    'darwin/amd64': Object.freeze({ manifestDigest: 'sha256:b4188482621efd7da5a2ab630f653665ab5f80b9aceae448b6bb5fc93e003f06', binaryDigest: 'sha256:ed6232e0bb96a2dcfd86d3c25f86021091600d52f09250403a54528bfe8100a3' }),
    'darwin/arm64': Object.freeze({ manifestDigest: 'sha256:ce7e54fa19f989a5d125c4409b3587ca9503bb5a07bc5ff223c60e0fbad437f0', binaryDigest: 'sha256:3c60f862b04eea1b9a633593b39f1a443d9ca2123cf3edfd150d313e95f3894b' }),
    'windows/amd64': Object.freeze({ manifestDigest: 'sha256:0760fe1fc98e8fedb66796aaf891a1de9268af1338c5e88b949656fda5d9f045', binaryDigest: 'sha256:0f57672d24fc3c70e4cbbf22864e65b35b9978ddaae3793803841536e682929b' }),
  }),
});

function normalizePlatform(platform = process.platform, architecture = process.arch) {
  const osName = platform === 'win32' ? 'windows' : platform;
  if (!['linux', 'darwin', 'windows'].includes(osName)) throw new Error(`Unsupported platform: ${platform}`);
  const arch = architecture === 'x64' ? 'amd64' : architecture;
  if (!['amd64', 'arm64'].includes(arch)) throw new Error(`Unsupported architecture: ${architecture}`);
  if (osName === 'windows' && arch !== 'amd64') throw new Error(`Unsupported architecture for Windows: ${architecture}`);
  return { os: osName, arch, binaryName: osName === 'windows' ? 'nasiko.exe' : 'nasiko' };
}

function getQualifiedRelease(version, platform = process.platform, architecture = process.arch) {
  if (!/^v\d+\.\d+\.\d+$/.test(String(version || ''))) {
    throw new Error('Nasiko installation requires a pinned version such as v0.1.0; latest is not allowed.');
  }
  const normalized = normalizePlatform(platform, architecture);
  const qualification = QUALIFIED_RELEASES[version]?.[`${normalized.os}/${normalized.arch}`];
  if (!qualification) throw new Error(`Nasiko ${version} is not qualified for ${normalized.os}/${normalized.arch}.`);
  return { version, ...normalized, ...qualification, license: LICENSE, sourceUrl: SOURCE_URL };
}

function digestBytes(bytes) {
  return `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
}

View on GitHub (pinned to 8321021c54)