{"record":{"id":"fdfa03ec7779d00e","repo":"CloakHQ/CloakBrowser","slug":"cloakbrowser-binary-path-set-to-local-override","errorCode":null,"errorMessage":"CLOAKBROWSER_BINARY_PATH set to '{local_override}' but file does not exist","messagePattern":"CLOAKBROWSER_BINARY_PATH set to '(.+?)' but file does not exist","errorType":"exception","errorClass":"FileNotFoundError","httpStatus":null,"severity":"error","filePath":"cloakbrowser/download.py","lineNumber":187,"sourceCode":"    release_channel: str | None = None,\n) -> str:\n    \"\"\"Ensure the stealth Chromium binary is available. Download if needed.\n\n    Returns the path to the chrome executable as a string.\n\n    Args:\n        license_key: Pro license key. Also reads from CLOAKBROWSER_LICENSE_KEY env var.\n        browser_version: Exact Chromium version pin. Also reads from CLOAKBROWSER_VERSION.\n        release_channel: Stable (default) or Preview binary channel.\n\n    Set CLOAKBROWSER_BINARY_PATH to skip download and use a local build.\n    \"\"\"\n    # Check for local override first\n    local_override = get_local_binary_override()\n    if local_override:\n        path = Path(local_override)\n        if not path.exists():\n            raise FileNotFoundError(\n                f\"CLOAKBROWSER_BINARY_PATH set to '{local_override}' but file does not exist\"\n            )\n        logger.info(\"Using local binary override: %s\", local_override)\n        return str(path)\n\n    requested_version = normalize_requested_version(browser_version)\n\n    # Pro license key check (custom download URL overrides Pro path)\n    from .license import (\n        CloakBrowserLicenseError,\n        resolve_license_key,\n        validate_license,\n    )\n\n    key = resolve_license_key(license_key)\n    if os.environ.get(\"CLOAKBROWSER_DOWNLOAD_URL\"):\n        key = None\n","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/CloakHQ/CloakBrowser/blob/d6bad5de261bedf025280ace1d14e800aee13923/cloakbrowser/download.py#L169-L205","documentation":"ensure_binary honors the CLOAKBROWSER_BINARY_PATH override first; if the env var is set but the path does not exist on disk, it raises FileNotFoundError immediately rather than falling back to downloading.","triggerScenarios":"Setting CLOAKBROWSER_BINARY_PATH to a stale, moved, or typo'd path, then calling ensure_binary/launch/cmd_install.","commonSituations":"Binary was deleted or the project moved; container rebuild lost the file; typo or wrong home dir in the path; CI env var carried over from another machine.","solutions":["Fix the path to point at an existing executable","Unset CLOAKBROWSER_BINARY_PATH to let cloakbrowser download/manage the binary","Verify with ls -l \"$CLOAKBROWSER_BINARY_PATH\""],"exampleFix":"# before\nCLOAKBROWSER_BINARY_PATH=/opt/old/chrome ./run.sh\n# after\nunset CLOAKBROWSER_BINARY_PATH && ./run.sh","handlingStrategy":"validation","validationCode":"import os\nfrom pathlib import Path\n\ndef binary_override_ok() -> bool:\n    p = os.environ.get(\"CLOAKBROWSER_BINARY_PATH\")\n    return p is None or (Path(p).exists() and os.access(p, os.X_OK))","typeGuard":"def env_binary_valid() -> bool:\n    import os\n    p = os.environ.get(\"CLOAKBROWSER_BINARY_PATH\", \"\")\n    return p == \"\" or os.path.isfile(p)","tryCatchPattern":"try:\n    ensure_binary()\nexcept FileNotFoundError as e:\n    if \"CLOAKBROWSER_BINARY_PATH\" in str(e):\n        os.environ.pop(\"CLOAKBROWSER_BINARY_PATH\", None)\n        ensure_binary()\n    else:\n        raise","preventionTips":["Add startup asserts that env-var-pointed files exist","Recreate/provision the binary in Dockerfiles rather than relying on host paths"],"tags":["env-var","file-not-found","binary-path"],"backgroundTag":"missing-env-var-target","analyzedSha":"d6bad5de261bedf025280ace1d14e800aee13923","analyzedAt":"2026-08-28T14:13:12.918Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}