{"record":{"id":"2624c2323c21083e","repo":"commaai/openpilot","slug":"unsupported-platform-m-supported-platforms","errorCode":null,"errorMessage":"Unsupported platform: '{m}'. Supported platforms: {supported}","messagePattern":"Unsupported platform: '(.+?)'\\. Supported platforms: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"openpilot/tools/plotjuggler/juggle.py","lineNumber":47,"sourceCode":"\n\ndef print_jotpluggler_banner():\n  purple = \"\\033[95m\" if sys.stdout.isatty() else \"\"\n  reset = \"\\033[0m\" if purple else \"\"\n  print(f\"{purple}+-------------------------------------------------------------+{reset}\")\n  print(f\"{purple}|{reset} JotPluggler is the future! Try it like this:                {purple}|{reset}\")\n  print(f\"{purple}|{reset}   ./openpilot/tools/jotpluggler/jotpluggler --demo --layout tuning    {purple}|{reset}\")\n  print(f\"{purple}|{reset}                                                             {purple}|{reset}\")\n  print(f\"{purple}|{reset} PlotJuggler will be deleted soon.                           {purple}|{reset}\")\n  print(f\"{purple}|{reset} Missing a feature? Open an issue or post in #dev-openpilot. {purple}|{reset}\")\n  print(f\"{purple}+-------------------------------------------------------------+{reset}\")\n\n\ndef install():\n  m = f\"{platform.system()}-{platform.machine()}\"\n  supported = (\"Linux-x86_64\", \"Linux-aarch64\", \"Darwin-arm64\")\n  if m not in supported:\n    raise Exception(f\"Unsupported platform: '{m}'. Supported platforms: {supported}\")\n\n  if os.path.exists(INSTALL_DIR):\n    shutil.rmtree(INSTALL_DIR)\n  os.mkdir(INSTALL_DIR)\n\n  url = os.path.join(RELEASES_URL, m + \".tar.gz\")\n  with requests.get(url, stream=True, timeout=10) as r, tempfile.NamedTemporaryFile() as tmp:\n    r.raise_for_status()\n    with open(tmp.name, 'wb') as tmpf:\n      for chunk in r.iter_content(chunk_size=1024 * 1024):\n        tmpf.write(chunk)\n\n    with tarfile.open(tmp.name) as tar:\n      tar.extractall(path=INSTALL_DIR, filter=\"data\")\n\n\ndef get_plotjuggler_version():\n  out = subprocess.check_output([PLOTJUGGLER_BIN, \"-v\"], encoding=\"utf-8\").strip()","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/commaai/openpilot/blob/516ec1e68203439a73f340f1d0b3b91eabc626ee/openpilot/tools/plotjuggler/juggle.py#L29-L65","documentation":"Raised by install() in juggle.py when the combination platform.system()-platform.machine() is not one of the prebuilt PlotJuggler bundles: Linux-x86_64, Linux-aarch64, or Darwin-arm64. juggle.py downloads a pinned prebuilt tarball from the releases URL rather than compiling, so any other platform/arch pair has nothing to fetch.","triggerScenarios":"Running openpilot/tools/plotjuggler/juggle.py on e.g. Darwin-x86_64 (Intel Mac), Linux on riscv/armv7 (e.g. 32-bit ARM SBC), or Windows (platform.system() == 'Windows'). The f-string interpolates the detected machine string, e.g. \"Unsupported platform: 'Darwin-x86_64'\".","commonSituations":"Intel macOS users (no Darwin-x86_64 build), Raspberry Pi 32-bit OS users (Linux-armv7l), Windows/WSL1 users where platform reports unexpected values, or any exotic container reporting an unusual uname machine.","solutions":["If on an Intel Mac, run under Rosetta or use a Linux-x86_64 box/container — or build PlotJuggler from source and point juggle.py at it.","Check what Python reports: python -c \"import platform; print(f'{platform.system()}-{platform.machine()}')\" to confirm the mismatch (e.g. armv7l vs aarch64 — switch to a 64-bit OS).","Build PlotJuggler from source for your platform and set it up so juggle skips its installer.","Try the advertised replacement: openpilot/tools/jotpluggler/jotpluggler, which the banner says is the future tool and may support your platform."],"exampleFix":"# before\n./openpilot/tools/plotjuggler/juggle.py route  # on Intel Mac -> Unsupported platform 'Darwin-x86_64'\n\n# after\n# use the supported replacement tool\n./openpilot/tools/jotpluggler/jotpluggler --demo --layout tuning","handlingStrategy":"type-guard","validationCode":"import platform\nm = f\"{platform.system()}-{platform.machine()}\"\nif m not in (\"Linux-x86_64\", \"Linux-aarch64\", \"Darwin-arm64\"):\n    raise SystemExit(f\"no PlotJuggler bundle for {m}; use jotpluggler or build from source\")","typeGuard":"def juggle_supported() -> bool:\n    import platform\n    return f\"{platform.system()}-{platform.machine()}\" in (\"Linux-x86_64\", \"Linux-aarch64\", \"Darwin-arm64\")","tryCatchPattern":"try:\n    import openpilot.tools.plotjuggler.juggle as juggle\n    juggle.install()\nexcept Exception as e:\n    if 'Unsupported platform' in str(e):\n        # fall back to the maintained tool\n        subprocess.run(['./openpilot/tools/jotpluggler/jotpluggler', route])\n    else:\n        raise","preventionTips":["Check platform before invoking juggle in cross-platform tooling.","Prefer jotpluggler, the advertised successor, on unusual platforms.","On 32-bit ARM boards, use a 64-bit userspace so platform.machine() reports aarch64."],"tags":["plotjuggler","platform-support","installation","openpilot"],"backgroundTag":null,"analyzedSha":"516ec1e68203439a73f340f1d0b3b91eabc626ee","analyzedAt":"2026-08-15T00:17:37.461Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}