Budibase/budibase · error · Error

Github release not found

Error message

Github release not found

What it means

After fetching repo details, githubUpload derives the latest-release endpoint from the repo's releases_url template. If the API response has no releases_url field, the repo metadata is unexpected/incomplete and this error is thrown.

Source

Thrown at packages/server/src/api/controllers/plugin/github.ts:63

  const githubApiUrl = githubUrl.replace(
    "https://github.com/",
    "https://api.github.com/repos/"
  )
  const headers: Record<string, string> = token
    ? { Authorization: `Bearer ${token}` }
    : {}
  const pluginDetails = await request(
    githubApiUrl,
    headers,
    "Repository not found"
  )
  const pluginName = pluginDetails.name || name
  const pluginLatestReleaseUrl = pluginDetails?.["releases_url"]
    ? pluginDetails?.["releases_url"].replace("{/id}", "/latest")
    : undefined
  if (!pluginLatestReleaseUrl) {
    throw new Error("Github release not found")
  }

  const pluginReleaseDetails = await request(
    pluginLatestReleaseUrl,
    headers,
    "Github latest release not found"
  )
  const pluginReleaseTarballAsset = pluginReleaseDetails?.assets?.find(
    (x: any) => x?.["content_type"] === "application/gzip"
  )
  const pluginLastReleaseTarballUrl =
    pluginReleaseTarballAsset?.["browser_download_url"]
  if (!pluginLastReleaseTarballUrl) {
    throw new Error("Github latest release url not found")
  }

  try {
    path = await downloadUnzipTarball(

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Confirm the repo URL resolves on api.github.com/repos/owner/repo and includes releases_url
  2. Retry with the canonical https://github.com/owner/repo URL
  3. Check any proxy/interceptor is not stripping GitHub API response fields
  4. Check Budibase version and update if GitHub API schema changed
Defensive patterns

Strategy: validation

Validate before calling

const res = await fetch(`https://api.github.com/repos/${owner}/${repo}`)
const details = await res.json()
if (!details.releases_url) throw new Error('Unexpected repo metadata: no releases_url')

Type guard

function hasReleasesUrl(d: unknown): d is { releases_url: string } {
  return typeof d === 'object' && d !== null && 'releases_url' in d && typeof (d as any).releases_url === 'string'
}

Try / catch

try {
  await installPlugin({ source: 'GITHUB', url })
} catch (err) {
  if (err.message === 'Github release not found') {
    console.error('GitHub API returned unexpected repo metadata — check proxy/API compatibility')
  }
}

Prevention

When it happens

Trigger: The GitHub /repos/{owner}/{repo} response lacks the releases_url key — typically because the request did not actually return repo details (e.g. an error/proxy response parsed as JSON) or an unusual API-compatible host was used.

Common situations: Behind a proxy or mirror that alters GitHub API responses; using a non-github.com URL that was accepted after .git stripping but returns incomplete JSON; API schema changes.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/04753920f988dc4e. Report an issue: GitHub.