{"record":{"id":"6095592a0207cbf7","repo":"remix-run/react-router","slug":"there-was-a-problem-fetching-the-file-from-github-609559","errorCode":null,"errorMessage":"There was a problem fetching the file from GitHub. No asset was found at that url. Please try again later.","messagePattern":"There was a problem fetching the file from GitHub\\. No asset was found at that url\\. Please try again later\\.","errorType":"exception","errorClass":"CopyTemplateError","httpStatus":null,"severity":"error","filePath":"packages/create-react-router/copy-template.ts","lineNumber":244,"sourceCode":"        : `https://api.github.com/repos/${info.owner}/${info.name}/releases/tags/${info.tag}`;\n\n    let response = await fetch(releaseUrl, { headers });\n\n    if (response.status !== 200) {\n      throw new CopyTemplateError(\n        \"There was a problem fetching the file from GitHub. The request \" +\n          `responded with a ${response.status} status. Please try again later.`,\n      );\n    }\n\n    let body = (await response.json()) as { assets: GitHubApiReleaseAsset[] };\n    if (\n      !body ||\n      typeof body !== \"object\" ||\n      !body.assets ||\n      !Array.isArray(body.assets)\n    ) {\n      throw new CopyTemplateError(\n        \"There was a problem fetching the file from GitHub. No asset was \" +\n          \"found at that url. Please try again later.\",\n      );\n    }\n\n    let assetId = body.assets.find((asset) => {\n      // If the release is \"latest\", the url won't match the download url\n      return info.tag === \"latest\"\n        ? asset?.browser_download_url?.includes(info.asset)\n        : asset?.browser_download_url === tarballUrl;\n    })?.id;\n    if (assetId == null) {\n      throw new CopyTemplateError(\n        \"There was a problem fetching the file from GitHub. No asset was \" +\n          \"found at that url. Please try again later.\",\n      );\n    }\n    resourceUrl = `https://api.github.com/repos/${info.owner}/${info.name}/releases/assets/${assetId}`;","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/remix-run/react-router/blob/6beaca39526d5716c3c112ebb0782765baa5a9ce/packages/create-react-router/copy-template.ts#L226-L262","documentation":"The GitHub releases API call for a release-asset template returned 200, but the parsed JSON body did not contain an assets array (body missing, not an object, or assets absent/not an array). This is a defensive shape check against unexpected API responses and is almost never caused by user input.","triggerScenarios":"A proxy, firewall, or captive portal returning an error payload with HTTP 200; a GitHub API schema change or upstream incident producing an unexpected body.","commonSituations":"Corporate MITM proxies rewriting responses; rare GitHub API incidents; environment-specific interception of api.github.com.","solutions":["Retry the command later","Check for interfering proxies: curl -i the release URL and inspect the raw response","If it reproduces consistently with a clean network, report it to the react-router repo"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await createReactRouter(args);\n} catch (e) {\n  const msg = e instanceof Error ? e.message : String(e);\n  if (/No asset was found at that url/.test(msg)) {\n    // Shape errors from the GitHub API are almost always transient or proxy-related\n    console.error(\"Unexpected GitHub API response — check proxies and retry\");\n    process.exit(1);\n  }\n  throw e;\n}","preventionTips":["Bypass corporate MITM proxies for api.github.com where policy allows","Keep template URLs pinned to exact tags so a single retry is meaningful","Capture the raw API response (curl -i) when this recurs to identify interceptors"],"tags":["network","github-api","proxy"],"backgroundTag":"unexpected-api-response","analyzedSha":"6beaca39526d5716c3c112ebb0782765baa5a9ce","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}