glanceapp/glance · warning · errPartialContent
: missing 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.
Solutions
- Check Glance logs for the exact failing URL and cause ('Failed to get RSS feed')
- Update or remove dead feed URLs from the widget config
- Verify the feed URL with curl -L and follow redirects to the current feed location
- 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
- Audit feed URLs when sites redesign
- Follow permanent redirects to new feed locations
- Accept partial rendering — only total failure empties the widget
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
- unexpected status code
- : could not fetch data for market(s)
- could not fetch some hacker news posts
- : could not get commits
- : could not get releases
AI-assisted analysis of glanceapp/glance@91324e8de7 (2026-08-15).
Data as JSON: /api/errors/01d7fc0a52280f3a.
Report an issue: GitHub.
Appendix: 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)