charmbracelet/crush · warning

Crush was unable to fetch an updated list of providers from

Error message

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.

Cause: %w

What it means

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.

Source

Thrown at internal/config/provider.go:201

		var hyperProvider catwalk.Provider

		wg.Go(func() {
			if customProvidersOnly {
				return
			}
			catwalkURL := cmp.Or(os.Getenv("CATWALK_URL"), defaultCatwalkURL)
			client := catwalk.NewWithURL(catwalkURL)
			path := cachePathFor("providers")
			catwalkSyncer.Init(client, path, autoupdate)

			// A failure to refresh or cache the catalog is worth
			// reporting, but the syncer still hands back the cached or
			// embedded list. Dropping that would leave the user with no
			// providers at all over a transient disk or network problem.
			items, err := catwalkSyncer.Get(ctx)
			if err != nil {
				catwalkURL := fmt.Sprintf("%s/v2/providers", cmp.Or(os.Getenv("CATWALK_URL"), defaultCatwalkURL))
				catwalkErr = 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
			}
			providers.Append(items...)
		})

		wg.Go(func() {
			if customProvidersOnly {
				return
			}
			path := cachePathFor("hyper")
			cfgSnapshot := cfg
			var refresher func(context.Context) error
			if len(opts) > 0 {
				refresher = opts[0]
			}
			hyperSyncer.Init(realHyperClient{
				baseURL:      hyper.BaseURL(),
				resolveKey:   func() string { return resolveHyperAPIKey(cfgSnapshot) },
				refreshToken: refresher,

View on GitHub (pinned to 7944b8e522)

Solutions

  1. Check network connectivity to the providers endpoint printed in the message (curl it manually).
  2. Set CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1 to use the provider list embedded in the Crush release.
  3. Run `crush update-providers` to refresh the catalog manually once connectivity is restored.
  4. Verify CATWALK_URL points to a valid v2 catalog host if you have customized it.
  5. Retry later if it is a transient server outage; cached providers are still usable.

Example fix

// before (CI fails on network)
crush run ...
// after (use bundled providers)
export CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1
crush run ...
Defensive patterns

Strategy: fallback

Validate before calling

const url = (process.env.CATWALK_URL || 'https://api.catwalk.default') + '/v2/providers';
await fetch(url).then(r => { if (!r.ok) throw new Error('catwalk unreachable'); });

Try / catch

items, err := syncer.Get(ctx)
if err != nil {
    log.Warn(err) // cached/embedded items still in `items`; continue
}

Prevention

When it happens

Trigger: 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.

Common situations: Corporate firewalls or proxies blocking the catalog host; CATWALK_URL set to a typo'd or stale mirror; offline development; transient server outage.

Related errors


AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29). Data as JSON: /api/errors/e3f17585c9baa538. Report an issue: GitHub.