BASELINE NowYouCanUse.com
XML Feeds and Syndication

Feeds and XML API

Public compatibility data is published via standard RSS 2.0 (.xml), Atom 1.0 (.atom), and single-feature XML documents (/features--:id.xml). Feeds can be added directly to RSS readers or queried from scripts without custom client libraries.

Feed Catalog
Scope RSS 2.0 (.xml) Atom 1.0 (.atom)
Newly Available RSS 2.0: /feed.xml Atom 1.0: /feed.atom
Widely Available RSS 2.0: /feed--widely.xml Atom 1.0: /feed--widely.atom
Limited Availability RSS 2.0: /feed--limited.xml Atom 1.0: /feed--limited.atom
CSS Features RSS 2.0: /feed--category--css.xml Atom 1.0: /feed--category--css.atom
JavaScript Features and APIs RSS 2.0: /feed--category--javascript.xml Atom 1.0: /feed--category--javascript.atom
HTML Features RSS 2.0: /feed--category--html.xml Atom 1.0: /feed--category--html.atom
Baseline Year: 2024 RSS 2.0: /feed--year--2024.xml Atom 1.0: /feed--year--2024.atom
Baseline Year: 2023 RSS 2.0: /feed--year--2023.xml Atom 1.0: /feed--year--2023.atom
Compound: Newly Available CSS in 2024 RSS 2.0: /feed--newly--category--css--year--2024.xml Atom 1.0: /feed--newly--category--css--year--2024.atom
Compound: Widely Available JS in 2023 RSS 2.0: /feed--widely--category--javascript--year--2023.xml Atom 1.0: /feed--widely--category--javascript--year--2023.atom
Feeds support conditional requests via If-None-Match (ETag), returning 304 Not Modified when unchanged. Content-Encoding supports gzip and br.
Feed URL Parameters

Feed routes follow a flat double-dash (--) parameter hierarchy:

/feed--[status]--category--[group]--year--[year].xml
/feed--[status]--category--[group]--year--[year].atom
Segment Values Description
Segment: [status] Values: newly, widely, limited Filter by Baseline availability tier. Optional.
Segment: category--[group] Values: css, javascript, html, etc. Filter by feature category group. Optional.
Segment: year--[year] Values: 20182026 Filter by 4-digit Baseline year. Optional.
Note: Parameters must follow the exact order above (status → category → year). Out-of-order permutations and slash-separated paths return 404.
Feature XML

Every feature page has a standalone XML document at:

GET /features--:id.xml

Examples: /features--popover.xml/features--subgrid.xml/features--progress-function.xml/features--nesting.xml

Document Structure:
<?xml version="1.0" encoding="UTF-8"?>
<feature id="popover">
  <name>Popover API</name>
  <description>A mechanism for displaying popover elements...</description>
  <group>html</group>
  <group_name>HTML</group_name>
  <baseline>
    <status>widely</status>
    <low_date>2024-04-16</low_date>
    <high_date>2026-10-16</high_date>
  </baseline>
  <support>
    <browser name="chrome" version="114" supported="true" />
    <browser name="firefox" version="125" supported="true" />
    <browser name="safari" version="17" supported="true" />
    <browser name="edge" version="114" supported="true" />
    <browser name="chrome_android" version="114" supported="true" />
    <browser name="firefox_android" version="125" supported="true" />
    <browser name="safari_ios" version="17" supported="true" />
  </support>
  <specifications>
    <spec>https://html.spec.whatwg.org/multipage/popover.html</spec>
  </specifications>
  <compat_features>
    <key>html.global_attributes.popover</key>
    <key>api.HTMLElement.showPopover</key>
  </compat_features>
  <canonical_url>https://nowyoucanuse.com/features--popover.html</canonical_url>
</feature>
Command Line Examples
cURL and xmllint:
# Fetch latest newly available feature titles
curl -s -H "Accept-Encoding: gzip" https://nowyoucanuse.com/feed.xml | gunzip | xmllint --xpath "//item/title/text()" -

# Query browser support for a feature
curl -s -H "Accept-Encoding: gzip" https://nowyoucanuse.com/features--popover.xml | gunzip | xmllint --xpath "//browser[@supported='true']/@name" -
Python 3:
import urllib.request, xml.etree.ElementTree as ET, gzip

req = urllib.request.Request("https://nowyoucanuse.com/feed.xml", headers={"Accept-Encoding": "gzip"})
with urllib.request.urlopen(req) as resp:
    raw = gzip.decompress(resp.read()) if resp.info().get("Content-Encoding") == "gzip" else resp.read()
    tree = ET.fromstring(raw)
    for item in tree.findall(".//item")[:5]:
        print(f"{item.find('title').text} -> {item.find('link').text}")