Repository navigation
Releases
Right Time, Right Place
Version 1.4.0 gives every feed date a time-zone-aware companion, keeps your last feed on screen when a poll fails, and tightens how links and local files are handled.
Dates with a time zone
- Every date now has an ISO 8601 companion. Dates left the integration only as text in your
date_format, and the default format has no time zone, so a card had to guess.published,updated,createdandexpired, in entries and inchannel, now come withpublished_isoand so on, for example2026-11-13T19:12:37+00:00. The formatted value anddate_formatstay as they were. The companion follows its source key throughinclusions, can be dropped on its own throughexclusions, and is never shortened bymax_text_length. - rss-accordion uses the new fields. The card now prefers the
_isovalues, so times are correct across time zones and a custom format such as%d.%m.%Yno longer breaks them. It still works with feeds from before this version.
A feed that survives a failed poll
- The sensor keeps the last feed when a poll fails. Before, a failed poll made the sensor unavailable and the whole
entrieslist vanished from cards. Now the sensor stays available, keeps the last good feed and setsstale: trueuntil the next poll succeeds. A feed that never loaded is still unavailable. If an automation usesunavailableas an outage signal, use thestaleattribute instead.
Links and local files
- Relative links in the text are resolved too. Relative
hrefandsrcvalues in the summary, content and subtitle HTML used to point at your Home Assistant host. They are now joined with the feed URL, aslinkandlinks[].hrefare. URLs such asjavascript:are still removed. - Relative entry links are resolved. A relative
linkorlinks[].hrefis now joined with the feed URL even when the feed library supplies it. file://feeds are limited to allowed folders. Before, any file the Home Assistant user could read could be used as a feed. Now only the config directory and folders inallowlist_external_dirswork. Anything else is refused with an error that says how to allow the folder. The README lists whichfile://feeds are allowed.
Smaller history, quieter log
- Entries and channel stay out of the recorder. They were written to the history on every change. They are now left out, so the database stays small. The live state is unchanged and
feed_urlis still recorded. - The size warning measures what is recorded. It claimed the history would lose its attributes even for verbose feeds. It now only appears for an absurdly long feed URL, and says so.
- Repeated problems are logged once. "No entries found" and "Unable to parse date" were warnings on every poll. The first occurrence per feed is still a warning, repeats go to debug.
Fixes and upkeep
- README corrections. The example used
descriptionunderinclusionswhere the key issummary, thedate_formatdefault was missing%Y, andscan_intervalis a time period with a default of one hour, not hours. - Marketplace category. The integration is now filed under news and social media in Home Assistant 2026.11's Marketplace.
- Home Assistant 2026.11 typing. The device info is built in a way that works on both older and newer Home Assistant.
Requirements
Unchanged: Home Assistant 2026.9.3 or newer.
Upgrading
Nothing to do after updating. New _iso attributes appear on the next poll. If you read local file:// feeds from outside the config directory, add that folder to allowlist_external_dirs. If an automation treats unavailable as a failed poll, switch it to the stale attribute.
Ready for 2026.11
Version 1.3.1 prepares the integration for Home Assistant 2026.11. Your feeds look and behave exactly as before.
Upkeep
- The feed library follows Home Assistant. The integration asked for exactly the version of the feed library that Home Assistant's own Feed Reader ships. Once Home Assistant moves to a newer one, that exact request would no longer match. It now asks for that version or newer, so it keeps using the copy Home Assistant already has.
- Installing from the Marketplace. Home Assistant 2026.11 replaces HACS with the built-in Marketplace. The README now explains how to add this integration there as a custom repository, and in HACS on earlier versions.
Under the hood, the setup and options dialogs now use Home Assistant's current validation library directly.
Requirements
Unchanged: Home Assistant 2026.9.3 or newer.
No Longer Turned Away
Version 1.3.0 gets feeds past servers that refused them, and when a feed still can't be added, the setup dialog tells you why.
Feeds that said no
- Feeds that blocked the integration load again. [#7] Some servers refused the integration's requests, so feeds like aidoende.nl couldn't be added at all. The integration now asks in a way those servers accept, both when you add a feed and on every update.
- Clear error messages. [#7] Every failure used to say "Failed to connect". The setup dialog now tells you whether the server refused access, needs a login, or has no feed at that address. The same messages appear when you move a feed to a new URL with Reconfigure.
Devices and parsing
- A feed shows up as a service. Home Assistant now lists each feed under the integration's services instead of its devices. It's the same device, with the same name and area.
- More robust parsing. The feed library is updated to the version Home Assistant's own Feed Reader uses. It fixes a crash on badly formed feeds, and Home Assistant doesn't need to install a second version of it.
If you already have feeds
Nothing to do. Entity IDs, names and history stay as they are. Worth knowing:
- Feed devices move to the services list after the first start. They keep their name and area.
- Templates that read the feed's icon from its attributes get nothing back now. The icon looks the same in the UI; only the
iconattribute is gone, unless you set an icon yourself. - Home Assistant 2026.9.3 or newer is required. HACS doesn't offer the update to older versions.
Safer Feeds, Smaller Sensors
Version 1.2.0 takes what a feed publishes seriously: markup is cleaned before it ever reaches a card, and a feed can no longer fill its sensor with more than Home Assistant is willing to store. Feeds also stop being write-once — one can be pointed at a new address without being rebuilt, and every sensor now says which feed it polls.
What a feed can put on your dashboard
- Feed content is cleaned before it leaves the integration. Scripts, style blocks, event handlers such as
onerrorandjavascript:links are removed from every value the sensor exposes — summaries, content, titles, authors and the feed level values. A feed could previously put a script into a dashboard through any card that renders its HTML. Feed markup is still publisher content and deserves the same caution as before, but it no longer arrives live. - Link, image and audio URLs are checked too. They end up as an
hrefor asrc, so ajavascript:ordata:URL is dropped rather than handed to a card.
A history the recorder actually keeps
- Fewer entries are kept, by default. Feeds added through the UI used to keep up to 9999 entries with the full article text, which pushed the sensor past the recorder's 16 KiB limit — so its history was stored without any attributes at all. The new default is the newest 5, and you can raise
show_topnagain whenever you like. - Long text is shortened to 250 characters. The new
max_text_lengthoption controls it; set it to0to keep the full article text. Text is cut at a tag boundary and any open markup is closed again, so a shortened summary never ends inside a tag. Links, images, audio URLs and ids are never shortened. - Download diagnostics. The config entry now offers a diagnostics download: the settings in effect, whether the last poll worked, how many entries and which fields came out of it, and how close the sensor is to that 16 KiB limit. Entry texts are left out and the feed URL is reported redacted, so the file is safe to attach to an issue.
Feeds you can find, read and move
- A feed can be pointed at a new URL. [#5] Use Reconfigure on the integration entry to change the address a feed is polled from — a new domain, a reverse proxy in front of a self hosted feed, a changed subscription token. The sensor keeps its entity id, its history, its name and its area, so the cards, templates and automations that use it keep working. Until now the only way was to delete the feed and add it again, which left all of that behind.
- Each sensor shows which feed it polls. [#5] A
feed_urlattribute carries the address, on UI and YAML feeds alike, sostate_attr('sensor.my_feed', 'feed_url')or Developer tools > States answers it without opening the feed's configuration. - Every feed gets its own device. A feed added through the UI appears as a device named after the feed, linking to the feed URL, with its sensor attached. Sensors keep the names and entity ids they had.
- YAML feeds appear in the entity registry. They can be renamed, hidden or assigned to an area like any other entity. As long as you leave
nameandfeed_urlalone, the sensor keeps its entity id and everything you set on it.
Setting one up
- An address has to actually serve a feed. Adding a feed now checks that the URL returns RSS or Atom. An ordinary web page is rejected with a clear message instead of becoming an entry whose sensor sits at 0 forever. The same check runs when you change a feed's URL.
- Inclusions and Exclusions are pickers. Instead of typing a comma separated list, you pick field names from a dropdown and can still type your own. Feeds configured the old way are converted on upgrade and keep filtering exactly as before.
- German translations. The setup, reconfigure and options forms are all available in German.
Fixes
- Dates that cannot be read are left out. A date the parsers did not understand used to be replaced with the current time, so the entry looked freshly published and moved on every poll. It now simply has no date, and the log names the value that could not be read.
- Two awkward feed dates no longer take the poll down. A malformed date could raise out of the parser and leave the whole feed unfetched rather than costing that one entry its timestamp.
- An entry with nothing left in it is skipped. Inclusions narrow enough to empty an entry used to leave a blank item in the list.
Good to know
Upgrading changes two settings on feeds you already have, and only where nobody chose them. A UI feed still carrying 9999 entries — the old form's own default, not a choice — is moved to 5, as is any stored value below 1, which showed nothing at all. A number you picked yourself is left alone. YAML feeds are not capped: they keep every entry unless you set show_topn yourself, because their state is the number of entries and capping it would rewrite what their recorder history means.
Changing name or feed_url on a YAML feed — or removing it from configuration.yaml — still creates a new entity and leaves the old one behind as unavailable; delete it under Settings > Devices & Services > Entities. If you want a rename to keep the sensor's identity, use a UI entry, which is identified by its config entry rather than by its name.
Your Feeds, Your Schedule
New Feature: Set the update interval per feed, right in the UI.
Every feed now has its own Update interval (minutes) field — both when you add it and later under Configure. Anything from 1 minute to a full week. A Gitea feed you want checked every couple of minutes and a news feed that only changes a few times a day no longer have to share one schedule.
Requested in #3.
Why it matters:
Until now the interval was only reachable from YAML. Worse, UI-configured feeds ignored the intended one-hour default entirely and polled every 30 seconds — Home Assistant's platform default — which meant every feed you added through the UI was being fetched 120× more often than intended.
scan_interval keeps working unchanged.
Under the hood:
Fetching and parsing moved behind a DataUpdateCoordinator, the pattern Home Assistant recommends for polling integrations.
- Feeds are now fetched with
aiohttpthrough Home Assistant's shared client session; therequestsandrequests-filedependencies are gone. - Fetching (
api.py), parsing (parser.py) and polling (coordinator.py) are separate modules, so the sensor holds no I/O logic. - A feed that fails temporarily now recovers on its own at the next poll, and a feed that is unreachable at startup retries with backoff instead of failing silently.
No configuration changes are required. Existing feeds, YAML and UI alike, keep working.
Year-Proofing RSS Dates
Bug Fix: Added explicit year (%Y) to the default date format.
Why it matters:
Omitting the year in previous versions caused frontend Lovelace cards (like the RSS Accordion) to occasionally guess the wrong year. By enforcing an explicit year from the backend, your dashboard will now parse and render the correct timestamp every time.
No 500 when modifying
What's Changed
- Fix Configuration Error 500 when modifying Integration Options Flow (#2)
- Updates deprecations related to the newer Home Assistant Architecture configurations
Smarter Parsing, Robust Images, and Better Compatibility
Enhancements
- Nested Attribute Support [#1]: Parses complex, duplicate XML tags natively. Lists and dicts from feeds are now directly exposed as Home Assistant sensor attributes instead of being ignored.
- Improved Image URLs: Automatically resolves relative image links into absolute URLs, fixing broken thumbnails for feeds like Telegraaf.nl.
Bug Fixes
- Enhanced Feed Reliability: Relaxed restrictive HTTP Accept headers. This prevents servers like FD.nl from confusing the parser by serving internal XSLT/backend XML layouts instead of standard RSS feeds.
Add Brand logo
Add brand assets, bump version, improve entity naming, and refactor config flow initialization
Seamless Feed Access
This release focuses on improving connection reliability and bypassing common security filters encountered with certain RSS feed providers.
Improvements
- Enhanced Cloudflare Bypass [#1]: Implemented a comprehensive set of browser-like headers and a realistic User-Agent to prevent "403 Forbidden" errors when fetching feeds protected by Cloudflare or similar services.
- Improved Validation: The configuration flow now uses the same robust connection logic to ensure feeds are correctly validated during setup.
- Version Alignment: Synced internal versioning across manifest, project metadata, and sensor code for consistency.