Skip to content

Feed hosted on GitHub infra only persists 4 entries (document order); nginx feeds fine #5073

Closed

Description

@xlicz

Bug: Every feed hosted on GitHub infra only persists 4 entries; nginx-hosted feeds work fine

Platform: macOS Desktop (also reproduced on folo.is web, same account)

Describe the bug

For feeds hosted on GitHub infrastructure (GitHub Pages, raw.githubusercontent.com, gist.githubusercontent.com), a newly subscribed feed only ever shows exactly 4 entries — specifically the first 4 <item> elements in document order — regardless of feed content, size, item count, or XML structure. A control feed hosted on plain nginx (news.ycombinator.com/rss) shows all ~30 entries normally.

Repro feeds (all show 4 entries):

URL item count notes
https://xlicz.github.io/podcast-rss/feed.xml 176 Chinese content, 1.9MB, content:encoded full text
https://xlicz.github.io/podcast-rss/feed-lite.xml 176 no content:encoded, 76KB, date-desc
https://xlicz.github.io/podcast-rss/feed-mini.xml 50 no content:encoded, 24KB
https://xlicz.github.io/podcast-rss/feed-t3-ascii.xml 20 100% ASCII, standard channel, +0000 dates, 5.5KB
https://xlicz.github.io/podcast-rss/feed-t4-times.xml 20 ASCII, distinct per-item timestamps
https://xlicz.github.io/podcast-rss/feed-t7-three.xml 3 still shows 4
https://gist.githubusercontent.com/xlicz/47d26652fdab176723ac95fbb5306987/raw/feed-t3-ascii.xml 20 same bytes as t3, gist origin
https://raw.githubusercontent.com/xlicz/podcast-rss/main/feed.xml 176 raw origin

Eliminated hypotheses (each tested with a dedicated feed variant):

  • feed size / partial transfer (24KB mini feed also shows 4; cold Pages fetch measured 1.1-1.4s total)
  • robots.txt (deleted site robots.txt, still 4)
  • content:encoded full-text HTML (stripped in lite/mini)
  • single-line serialization (pretty-printed variants)
  • guid isPermaLink="false" (removed in t2)
  • non-ASCII titles/links (t3 is 100% ASCII)
  • identical pubDates (t4 has distinct timestamps)
  • channel meta order / language element / lastBuildDate (rebuilt channels)
  • XML declaration style

Control that works: https://news.ycombinator.com/rss (nginx, ASCII, +0000) — shows all ~30 entries in the same account.

Key observation: the 4 displayed entries are always the first 4 in document order. A 3-item feed (t7) still displays 4. All failing feeds share: (a) GitHub CDN hosting, (b) same channel <link> value https://xlicz.github.io/podcast-rss.

Could this be related to GitHub-family URL detection (github.io / githubusercontent) in the server's fetch pipeline, or an entry-store preview limit where the async full-fetch job fails only for GitHub-hosted URLs?

Any server-side guidance (or a way to see why the async fetch fails) would be appreciated — the feeds themselves parse fine with ElementTree, feedparser, and r.jina.ai's reader.

Activity

  1. xlicz commented on Aug 14, 2026

    @xlicz
    Author

    Update with decisive evidence from the public API (GET https://api.folo.is/feeds?url=...&entriesLimit=N). Server-side ingestion truncates at document order, confirmed:

    1. Reproducible via anonymous API: any feed imported via /feeds?url= stores only the first N entries in DOCUMENT ORDER, N is unstable (4-16) and the import silently stops. /feeds preview endpoint defaults to 4 entries, max entriesLimit=12 (13+ -> 422).
    2. Concretely: our feed-t8 variant has 20 items, no duplicate guids, all valid. 24h after subscription the server still has exactly 4 entries = the first 4 items in document order (a16z, 50人名单, 张小珺, Money Stuff). readCount=7, entries returned=4.
    3. Main feed (186 items): fresh anonymous import ingested 16 entries (readCount 0->16 in ~5 min, then stopped forever) = document order items chore: add packageManager #2..chore: update API type #17 (first item with pubDate 2026-08-14 was skipped). The 16 include 07-31 items, so this is NOT a date-window backfill - it is document-order truncation.
    4. Refreshes are incremental only: the main feed record subscribed 08-12 grew 4 -> 14 purely from newly-published entries (08-13 batch), no backfill ever happens.
    5. Unrelated observations: HN/BBC/Verge also return exactly 4 entries from the anonymous preview endpoint (endpoint design, not storage); POST /entries and GET /feeds/refresh require auth (401).

    Hypothesis: initial import has a per-run time/processing budget and aborts silently mid-feed (varies with server load: 4, 7, 14, 16). Would appreciate confirmation of the intended backfill behavior - a feed with 186 items should not permanently show 4.

  2. DIYgod commented on Sep 27, 2026

    @DIYgod
    Member

    Thanks for the detailed investigation. When a feed was first previewed, only its first few entries were parsed, but the ETag and Last-Modified of the response were saved with them. GitHub then answered the next refresh with 304 Not Modified, so the rest of the feed was never ingested until the document changed. Previews no longer save these validators, so the first refresh fetches the whole feed. Feeds that were already affected will catch up the next time their document changes. The fix will be included in the next release.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions