moonD4rk/HackBrowserData · critical

all retrievers failed: %w

Error message

all retrievers failed: %w

What it means

The aggregate failure returned when every retriever in the chain failed to produce a non-empty key. It wraps the errors.Join of all per-retriever errors, so the full failure list is available via errors.Unwrap/As. This is the terminal error of the multi-retriever RetrieveKey.

Source

Thrown at masterkey/retriever.go:48

}

func NewChain(retrievers ...Retriever) Retriever {
	return &ChainRetriever{retrievers: retrievers}
}

func (c *ChainRetriever) RetrieveKey(hints Hints) ([]byte, error) {
	var errs []error
	for _, r := range c.retrievers {
		key, err := r.RetrieveKey(hints)
		if err == nil && len(key) > 0 {
			return key, nil
		}
		if err != nil {
			log.Debugf("retriever %T failed: %v", r, err)
			errs = append(errs, fmt.Errorf("%T: %w", r, err))
		}
	}
	return nil, fmt.Errorf("all retrievers failed: %w", errors.Join(errs...))
}

View on GitHub (pinned to 0503d04d7a)

Solutions

  1. Unwrap the joined errors (errors.Unwrap returns []error) and fix each underlying cause
  2. Verify at least one retriever is valid for the current OS/browser and correctly configured
  3. Confirm the key source exists (keychain unlocked, key file present, credentials set)
  4. Add a working retriever for the environment or skip key extraction gracefully

Example fix

// before
key, err := retriever.RetrieveKey(hints)
if err != nil { return nil, err }
// after
key, err := retriever.RetrieveKey(hints)
if err != nil {
	if joined, ok := err.(interface{ Unwrap() []error }); ok {
		for _, e := range joined.Unwrap() {
			log.Printf("cause: %v", e)
		}
	}
	return nil, fmt.Errorf("no master key available: %w", err)
}
Defensive patterns

Strategy: fallback

Validate before calling

if !keychainAvailable() && !credentialsSet() {
	return errors.New("no key source available on this machine")
}

Type guard

func allRetrieversFailed(err error) bool {
	return err != nil && strings.HasPrefix(err.Error(), "all retrievers failed")
}

Try / catch

key, err := multiRetriever.RetrieveKey(hints)
if err != nil {
	var joined interface{ Unwrap() []error }
	if errors.As(err, &joined) {
		for _, cause := range joined.Unwrap() {
			log.Printf("all-retrievers cause: %v", cause)
		}
	}
}

Prevention

When it happens

Trigger: Calling RetrieveKey when all configured retrievers either return an error or an empty key slice; errs is non-empty and no earlier retriever succeeded.

Common situations: Running on a machine without the target browser's key material, wrong keychain password on macOS, missing credentials on Windows/Linux, or all retrievers misconfigured.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of moonD4rk/HackBrowserData@0503d04d7a (2026-09-06). Data as JSON: /api/errors/b6e70bbd92d61dc0. Report an issue: GitHub.