{"adoption": {"forks": 1258, "observed_at": "2026-08-28T04:11:14.237260+00:00", "stars": 15849}, "canonical_url": "https://ross.abutalabs.com/products/freshrss", "card": {"archived": false, "artifact_type": "application", "description": "A free, self-hostable news aggregator…", "domain": ["self-hosted", "web-development", "media", "developer-tools"], "enriched": true, "function": ["http-server", "web-scraping", "search-engine", "cli", "plugin-system"], "health_score": 99, "homepage": "https://freshrss.org", "language": "PHP", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "stable", "member_repos": ["FreshRSS/FreshRSS"], "name": "FreshRSS/FreshRSS", "platform": ["self-hosted", "php", "cli"], "pushed_at": "2026-08-26T10:20:17+00:00", "repo": "FreshRSS/FreshRSS", "stars": 15849, "tags": ["rss-aggregator", "feed-reader", "atom", "opml", "websub", "multi-user", "news-aggregator", "automation", "web-server", "linux", "docker"], "topics": ["freshrss", "php", "feed", "rss", "rss-aggregator", "news-aggregator", "self-hosted", "rss-reader", "websub"], "urls": [], "use_cases": ["self-host an RSS reader to follow news sites and blogs", "aggregate podcasts and video channels in one place", "generate RSS feeds for websites that don't offer one via web scraping", "receive instant feed updates through WebSub push notifications", "share curated article selections as HTML, RSS, or OPML", "manage feeds for multiple users or an anonymous public reading instance", "read feeds on mobile via third-party apps using the FreshRSS API"], "what_it_is": "FreshRSS is a free, self-hosted RSS and Atom feed aggregator written in PHP, supporting multiple users, an anonymous reading mode, and a mobile-client API. It offers WebSub real-time push updates, XPath-based web scraping to generate feeds for sites without RSS, OPML import/export, and a themable, extensible interface.", "when_to_avoid": ["you prefer a hosted, zero-maintenance feed service", "you need a desktop-only reader without a server", "your stack cannot run PHP", "you only need a single-user minimal reader with no server setup"], "when_to_choose": ["you want full control over your feed data on your own server", "you need a multi-user or publicly accessible feed reader", "you need to scrape sites lacking RSS/Atom feeds", "you want a lightweight reader that scales to 1M+ articles and 50k+ feeds", "you want extensibility via themes and extensions"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/freshrss", "repo": "FreshRSS/FreshRSS", "role": "main", "score": 90}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:11:14.237260+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:05:21.122826+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "66c263bef1bb5055ac940764a466f2ea48ea14eafed256bd11ecea12d782bfe6", "fetched_at": "2026-08-28T04:11:14.237260+00:00", "kind": "readme", "missing": false, "url": "https://github.com/FreshRSS/FreshRSS"}, {"content_hash": "2fcb6262746ac5fdd47f6953e191df3440cc07e9e2f7d9a2f3891b07ae942abc", "fetched_at": "2026-08-29T08:03:19.046741+00:00", "kind": "homepage", "missing": false, "url": "https://freshrss.org"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 72}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 5064, "days_push": 7, "days_rel": 105, "gap_med": 50, "n_releases_24m": 12}, "score": 90, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}