glanceapp/glance · warning · errPartialContent

%w: missing %d RSS feeds

Error message

%w: missing %d RSS feeds

What it means

Returned by rssWidget.fetchItemsFromFeeds (internal/glance/widget-rss.go:186) when at least one but not all feeds failed (failed > 0 && failed < len(requests)). Entries from the healthy feeds are still returned with errPartialContent; each failing feed is logged ('Failed to get RSS feed' with URL and error) and skipped. Only when every feed fails does it return bare errNoContent instead.

Source

Thrown at internal/glance/widget-rss.go:186

			slog.Error("Failed to get RSS feed", "url", requests[i].URL, "error", errs[i])
			continue
		}

		for _, item := range feeds[i] {
			if _, exists := seen[item.Link]; exists {
				continue
			}
			entries = append(entries, item)
			seen[item.Link] = struct{}{}
		}
	}

	if failed == len(requests) {
		return nil, errNoContent
	}

	if failed > 0 {
		return entries, fmt.Errorf("%w: missing %d RSS feeds", errPartialContent, failed)
	}

	return entries, nil
}

func (widget *rssWidget) fetchItemsFromFeedTask(request rssFeedRequest) ([]rssFeedItem, error) {
	req, err := http.NewRequest("GET", request.URL, nil)
	if err != nil {
		return nil, err
	}

	req.Header.Add("User-Agent", glanceUserAgentString)

	widget.cachedFeedsMutex.Lock()
	cache, isCached := widget.cachedFeeds[request.URL]
	if isCached {
		if cache.etag != "" {
			req.Header.Add("If-None-Match", cache.etag)

View on GitHub (pinned to 91324e8de7)

Solutions

  1. Check Glance logs for the exact failing URL and cause ('Failed to get RSS feed')
  2. Update or remove dead feed URLs from the widget config
  3. Verify the feed URL with curl -L and follow redirects to the current feed location
  4. For transient failures, rely on the next refresh — partial content still renders
Defensive patterns

Strategy: fallback

Try / catch

items, err := widget.fetchItemsFromFeeds()
if err != nil && errors.Is(err, errPartialContent) {
    // render `items` from healthy feeds; check logs for failing URLs
}

Prevention

When it happens

Trigger: A subset of feed URLs erroring: 404/Gone after a site moved its feed path, DNS failure for one domain, TLS certificate expiry, a 403 from a feed behind Cloudflare, or a feed that changed to a format gofeed cannot parse — while at least one other feed in the widget still works.

Common situations: Aggregator widgets listing many feeds where one site redesigned; expired certs on small blogs; feeds that now require user-agent headers; transient network blips on refresh.

Related errors


AI-assisted analysis of glanceapp/glance@91324e8de7 (2026-08-15). Data as JSON: /api/errors/01d7fc0a52280f3a. Report an issue: GitHub.