{"record":{"id":"e3f17585c9baa538","repo":"charmbracelet/crush","slug":"crush-was-unable-to-fetch-an-updated-list-of-provi","errorCode":null,"errorMessage":"Crush was unable to fetch an updated list of providers from %s. Consider setting CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 to use the embedded providers bundled at the time of this Crush release. You can also update providers manually. For more info see crush update-providers --help.\n\nCause: %w","messagePattern":"Crush was unable to fetch an updated list of providers from (.+?)\\. Consider setting CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 to use the embedded providers bundled at the time of this Crush release\\. You can also update providers manually\\. For more info see crush update-providers --help\\.\n\nCause: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/config/provider.go","lineNumber":201,"sourceCode":"\t\tvar hyperProvider catwalk.Provider\n\n\t\twg.Go(func() {\n\t\t\tif customProvidersOnly {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcatwalkURL := cmp.Or(os.Getenv(\"CATWALK_URL\"), defaultCatwalkURL)\n\t\t\tclient := catwalk.NewWithURL(catwalkURL)\n\t\t\tpath := cachePathFor(\"providers\")\n\t\t\tcatwalkSyncer.Init(client, path, autoupdate)\n\n\t\t\t// A failure to refresh or cache the catalog is worth\n\t\t\t// reporting, but the syncer still hands back the cached or\n\t\t\t// embedded list. Dropping that would leave the user with no\n\t\t\t// providers at all over a transient disk or network problem.\n\t\t\titems, err := catwalkSyncer.Get(ctx)\n\t\t\tif err != nil {\n\t\t\t\tcatwalkURL := fmt.Sprintf(\"%s/v2/providers\", cmp.Or(os.Getenv(\"CATWALK_URL\"), defaultCatwalkURL))\n\t\t\t\tcatwalkErr = fmt.Errorf(\"Crush was unable to fetch an updated list of providers from %s. Consider setting CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 to use the embedded providers bundled at the time of this Crush release. You can also update providers manually. For more info see crush update-providers --help.\\n\\nCause: %w\", catwalkURL, err) //nolint:staticcheck\n\t\t\t}\n\t\t\tproviders.Append(items...)\n\t\t})\n\n\t\twg.Go(func() {\n\t\t\tif customProvidersOnly {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpath := cachePathFor(\"hyper\")\n\t\t\tcfgSnapshot := cfg\n\t\t\tvar refresher func(context.Context) error\n\t\t\tif len(opts) > 0 {\n\t\t\t\trefresher = opts[0]\n\t\t\t}\n\t\t\thyperSyncer.Init(realHyperClient{\n\t\t\t\tbaseURL:      hyper.BaseURL(),\n\t\t\t\tresolveKey:   func() string { return resolveHyperAPIKey(cfgSnapshot) },\n\t\t\t\trefreshToken: refresher,","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/config/provider.go#L183-L219","documentation":"This error is thrown when Crush fails to fetch an updated provider catalog from the catwalk endpoint (CATWALK_URL or the default URL) during provider sync. The syncer still returns the cached or embedded provider list, so Crush wraps the fetch error with actionable guidance instead of failing startup. It is a warning-style network error about refresh, not availability.","triggerScenarios":"catwalkSyncer.Get(ctx) returns an error during Init or provider refresh: the network is down, the catwalk server (default URL, overridable via CATWALK_URL) is unreachable, returns a non-2xx status, or TLS/DNS fails.","commonSituations":"Corporate firewalls or proxies blocking the catalog host; CATWALK_URL set to a typo'd or stale mirror; offline development; transient server outage.","solutions":["Check network connectivity to the providers endpoint printed in the message (curl it manually).","Set CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 to use the provider list embedded in the Crush release.","Run `crush update-providers` to refresh the catalog manually once connectivity is restored.","Verify CATWALK_URL points to a valid v2 catalog host if you have customized it.","Retry later if it is a transient server outage; cached providers are still usable."],"exampleFix":"// before (CI fails on network)\ncrush run ...\n// after (use bundled providers)\nexport CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1\ncrush run ...","handlingStrategy":"fallback","validationCode":"const url = (process.env.CATWALK_URL || 'https://api.catwalk.default') + '/v2/providers';\nawait fetch(url).then(r => { if (!r.ok) throw new Error('catwalk unreachable'); });","typeGuard":null,"tryCatchPattern":"items, err := syncer.Get(ctx)\nif err != nil {\n    log.Warn(err) // cached/embedded items still in `items`; continue\n}","preventionTips":["Set CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 in offline/CI environments","Verify CATWALK_URL reachability before running Crush","Use the cached catalog; only fail hard if it is also empty"],"tags":["network","providers","offline-fallback"],"backgroundTag":"provider-catalog-fetch-failed","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}