A deep cleanup of ProxyFeed
I realized that while improving ProxyFeed I overloaded it so much that its original purpose began to suffer: providing a stable address for a feed. So I removed almost all feed modifications. Almost, because feeds have self-tags, and those must be rewritten so the feed reader has no doubts about the canonical source of the proxy feed.
There is something interesting here: the less you interfere with someone else’s feed, the cleaner the architecture becomes. You remove one piece of logic, and immediately you see that another one is unnecessary. Then another. And step by step the system returns to its natural form. Without trying to “improve” what should not be improved.
It turns out ProxyFeed should be a stable bridge between the original feed and the platforms. That is its only strength. Everything else is noise that gets in the way.
Once I removed almost all modifications, it became clear that the true value of ProxyFeed is its reliability. That it does not break the feed. That it does not disappear. That once a stable address is created, it lives and makes it possible to change the original feed URL or even the original feed type without pain.
And here is the fascinating part: the simpler the system becomes, the clearer the real work becomes. You need to correctly identify the feed type. You need to guarantee no duplicates. You need a cache system that does not fail. You need to ensure that self-tags always point to the proxy feed. You need proper support for JSON, Atom, and whatever comes next.
Here is what was actually done:
- fully removed all feed content modifications, no element edits and no attempts to "improve" the original feed;
- implemented feed type detection (RSS, Atom, JSON Feed) before parsing;
- kept only the essential rewriting of self-tags (rss/atom/json) so feed readers treat the proxy feed as canonical;
- added a strict check preventing the same original feed from being connected twice;
- added validation ensuring publicUrl is unique and never conflicts;
- added proper handling of JSON Feed without trying to mimic XML;
- improved XML normalization: remove BOM, add declaration only when missing;
- removed
itunes:new-feed-urlso no player can redirect subscribers back to the original; - rewritten caching logic: correct handling of hash, unchanged, partial and ok states;
- added atomic guarantees for cache and backup creation;
- moved the whole project closer to the “as-is” principle: minimal interference, maximum stability.
I’m self-taught dev, and I have to learn from my own experience from trying to improve things that, as it turns out, didn’t need to be touched. That’s okay. ProxyFeed grows together with me. And every time I simplify it, I understand the architecture, the responsibility, and the path itself a little better. I want this service to live a long life, and for the people who choose it to be able to rely on it with confidence.
Published on November 14, 2025