FreshPorts has new RSS and Atom feeds

FreshPorts has new newsfeeds, in RSS 2.0 and Atom 1.0, at /--/feeds/. The old feeds under /backend/ still work, and nothing changes for you today. Later, the old URLs will be redirected to the new ones. If you subscribe to a FreshPorts feed, now is a good time to switch.

The new feeds

The commits feed takes the same optional parameters as before:

  • format=atom: Atom 1.0 instead of RSS 2.0.
  • flavor=new, flavor=broken, flavor=vuln: only new, broken, or vulnerable ports.
  • branch=2026Q4: only commits on that branch. The default is head.

Both formats pass the W3C feed validator. Feed readers that look for a feed in a page’s <link rel="alternate"> now find the new one on FreshPorts pages.

Why

The feeds have been built with UniversalFeedCreator for many years. Its design comes from the mid-2000s FeedCreator class, and its last release was in February 2024. Making the old feeds valid, in 2.16.20, took several workarounds: its RSS 2.0 is RSS 0.91 with a different version number, it cannot give a feed its own URL, and it puts the wrong things in Content-Type. I patched its output after it was written. Atom 0.3 and PIE 0.1 can never validate at all, because the validator rejects their namespaces.

The new feeds are written by laminas-feed, which is actively maintained and writes RSS 2.0 and Atom 1.0 from the same feed. I made new FreeBSD ports for it and its two dependencies, laminas-escaper and laminas-stdlib. None of these ports are in the FreeBSD tree yet. I wanted to test with it for a while.

Details are in issue #721.

Which old feeds are used

Before choosing what to keep, I counted what is actually fetched. These are the /backend/ feeds on www.freshports.org, over the 14 days of nginx logs kept (to 1 November 2026). Clients are distinct IP addresses. A watch-list feed without a format= parameter is RSS 0.91.

Feed Hits Clients
rss2.0.php 53,991 3,027
watch-list.php (no format) 34,361 334
rss0.91.php 7,719 86
news.php 7,282 191
atom0.3.php 3,382 58
watch-list.php format=rss2 2,546 1
html.php 2,316 30
watch-list.php format=rss2.0 1,550 47
rss1.0.php 33 33
js.php 19 19
mbox.php 19 18
pie0.1.php 18 18
opml.php 15 15

This is the command that produced it:

sudo sh -c 'cat /var/log/nginx/freshports.org-access.log*' | awk '
$7 ~ /^\/backend\/[^?]*\.php/ {
	split($7, u, "?")
	feed = u[1]
	if (feed == "/backend/watch-list.php") {
		fmt = "rss0.91"
		if (match(u[2], /(^|&)format=[^&]*/)) {
			fmt = substr(u[2], RSTART, RLENGTH); sub(/^&?format=/, "", fmt)
		}
		feed = feed " format=" tolower(fmt)
	}
	hits[feed]++
	if (!((feed, $1) in seen)) { seen[feed, $1] = 1; clients[feed]++ }
}
END { for (f in hits) printf "%8d %6d  %s\n", hits[f], clients[f], f }' | sort -rn

The last five each get about one hit per client: crawlers following the links on the feeds page, not subscribers. RSS 0.91 and Atom 0.3 do have real subscribers, but a feed reader does not care which version of RSS or Atom a URL serves, so those URLs can move to RSS 2.0 and Atom 1.0.

What happens next

For now, both sets of feeds run side by side. The feeds page and the /backend/ page mark the old ones as deprecated. After a while, I will look at the logs again, and then redirect the old URLs:

Old New
rss2.0.php, rss0.91.php, news.php, rss1.0.php /--/feeds/commits.php (RSS 2.0)
atom0.3.php, pie0.1.php /--/feeds/commits.php?format=atom
watch-list.php?id=… /--/feeds/watch-list.php?id=…
js.php, mbox.php, opml.php gone (410)

The redirects will be permanent (301), and most feed readers update a subscription when they see one. html.php has 30 users, so it will stay, written by FreshPorts itself rather than a feed library.

If you use a feed in a way not covered here, please comment on #721 before the redirects go in.

That redirect will be weeks away (from today), not days.

Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive

Leave a Comment

Scroll to Top