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
- Confirm the repo URL resolves on api.github.com/repos/owner/repo and includes releases_url
- Retry with the canonical https://github.com/owner/repo URL
- Check any proxy/interceptor is not stripping GitHub API response fields
- 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
- Use the canonical https://github.com/owner/repo URL so api.github.com responses are unmodified
- Check proxies/enterprise gateways that rewrite api.github.com responses
- Keep Budibase updated against GitHub API schema changes
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
- No skeleton found in latest release.
- Github latest release url not found
- Unknown plugin type - check schema.json: ${schema.type}
- Please run in a plugin directory - must contain package.json
- Please run in a plugin directory - must contain schema.json
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/04753920f988dc4e.
Report an issue: GitHub.