Budibase/budibase · error
Failed to retrieve skeleton metadata
Error message
Failed to retrieve skeleton metadata
What it means
getSkeletonUrl queries the GitHub API for the latest release of the budibase/budibase-skeleton repo. Any HTTP status >= 300 (rate limiting, network/proxy errors, repo unavailable) aborts with this error instead of returning a download URL.
Source
Thrown at packages/cli/src/plugins/skeleton.ts:17
import fetch from "node-fetch"
import fs from "fs"
import os from "os"
import { join } from "path"
import { processStringSync } from "@budibase/string-templates"
const download = require("download")
const tar = require("tar")
const HBS_FILES = ["package.json.hbs", "schema.json.hbs", "README.md.hbs"]
async function getSkeletonUrl(type: string) {
const resp = await fetch(
"https://api.github.com/repos/budibase/budibase-skeleton/releases/latest"
)
if (resp.status >= 300) {
throw new Error("Failed to retrieve skeleton metadata")
}
const json = (await resp.json()) as { assets: any[] }
for (let asset of json["assets"]) {
if (asset.name && asset.name.includes(type)) {
return asset["browser_download_url"]
}
}
throw new Error("No skeleton found in latest release.")
}
export async function getSkeleton(type: string, name: string) {
const url = await getSkeletonUrl(type)
const tarballFile = join(os.tmpdir(), "skeleton.tar.gz")
// download the full skeleton tarball
fs.writeFileSync(tarballFile, await download(url))
fs.mkdirSync(name)
// extract it and get what we needView on GitHub (pinned to a81a902e9a)
Solutions
- Wait for the GitHub API rate limit to reset (check the X-RateLimit-Reset header) or run from an IP with quota
- Set a GITHUB_TOKEN / use authenticated requests if your environment supports it, and re-run
- Verify network/proxy access: `curl -I https://api.github.com/repos/budibase/budibase-skeleton/releases/latest`
- Retry later during a GitHub incident (check githubstatus.com)
Example fix
// diagnose before retrying curl -I https://api.github.com/repos/budibase/budibase-skeleton/releases/latest // HTTP/1.1 403 ... "API rate limit exceeded" => wait or change network
Defensive patterns
Strategy: retry
Validate before calling
const resp = await fetch("https://api.github.com/repos/budibase/budibase-skeleton/releases/latest")
if (!resp.ok) {
const remaining = resp.headers.get("x-ratelimit-remaining")
if (remaining === "0") throw new Error("GitHub API rate limited; retry later or authenticate")
} Try / catch
try {
const url = await getSkeletonUrl(type)
} catch (err) {
if ((err as Error).message === "Failed to retrieve skeleton metadata") {
await new Promise(r => setTimeout(r, 5000))
// retry once, or instruct user about rate limits/proxy
} else throw err
} Prevention
- Avoid running skeleton downloads from rate-limited shared CI IPs
- Check api.github.com reachability behind corporate proxies
- Monitor GitHub status during incidents before retrying
When it happens
Trigger: Running the plugin init command when the GET https://api.github.com/repos/budibase/budibase-skeleton/releases/latest request returns a non-2xx status (e.g. 403 rate limit, 404, 5xx, connection failure surfaced as a status).
Common situations: Unauthenticated GitHub API rate limiting (60 req/hr per IP) on CI or shared IPs; corporate proxy blocking api.github.com; GitHub outage; offline environment.
Related errors
- Error: ${err} - ${respErr}
- Unexpected response when fetching openid-configuration: ${re
- unexpected response ${response.statusText}
- Unexpected response ${response.statusText}
- Replication failed - ${JSON.stringify(err)}
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/42a851e0244a045b.
Report an issue: GitHub.