nikivdev/code · error

release signing store is only supported on macOS

Error message

release signing store is only supported on macOS

What it means

The `f release signing store` subcommand imports a .p12 identity into the macOS keychain, which only makes sense on macOS. It uses a compile-time cfg!(target_os = "macos") check and bails at runtime on any other OS.

Source

Thrown at src/release_signing.rs:129

    let text = String::from_utf8_lossy(&output.stdout);
    let mut out = Vec::new();
    for line in text.lines() {
        // Example:
        //  1) <hash> "Developer ID Application: Name (TEAMID)"
        let Some(quoted) = line.split('"').nth(1) else {
            continue;
        };
        let name = quoted.trim();
        if !name.is_empty() {
            out.push(name.to_string());
        }
    }
    Ok(out)
}

fn store(opts: ReleaseSigningStoreOpts) -> Result<()> {
    if !cfg!(target_os = "macos") {
        bail!("release signing store is only supported on macOS");
    }

    let p12_path = opts
        .p12
        .clone()
        .context("--p12 is required (path to exported .p12)")?;
    let p12_bytes = fs::read(&p12_path)
        .with_context(|| format!("failed to read p12 file at {}", p12_path.display()))?;

    let identity = opts.identity.clone().context("--identity is required")?;
    let password = opts
        .p12_password
        .clone()
        .context("--p12-password is required")?;

    if !identity.starts_with("Developer ID Application:") {
        eprintln!(
            "Warning: identity does not look like a Developer ID Application certificate: {}",

View on GitHub (pinned to a747e741ae)

Solutions

  1. Run the store command on a macOS machine
  2. On Linux/Windows, supply signing material another way (e.g. set env vars / secrets directly with `f env set` or `gh secret set`)
  3. Gate the step in CI with `if: runner.os == 'macOS'`

Example fix

// before (linux CI)
- run: f release signing store --p12 cert.p12
// after
- run: f release signing store --p12 cert.p12
  if: runner.os == 'macOS'
Defensive patterns

Strategy: validation

Validate before calling

if (process.platform !== "darwin") {
  throw new Error("f release signing store requires macOS");
}

Type guard

const isMacOS = (): boolean => process.platform === "darwin";

Try / catch

try {
  run(["f", "release", "signing", "store", ...args]);
} catch (e) {
  if (String(e).includes("only supported on macOS")) {
    console.error("Run this step on a macOS runner.");
  } else throw e;
}

Prevention

When it happens

Trigger: Calling `f release signing store ...` (via `run`) on Linux or Windows.

Common situations: Developers on Linux trying to configure iOS/macOS release signing; CI runners on Ubuntu executing a macOS-oriented setup script.

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 nikivdev/code@a747e741ae (2026-09-01). Data as JSON: /api/errors/41c78a784bd69c53. Report an issue: GitHub.