Install
openclaw skills install rss-generator-skillGenerate valid RSS 2.0 or Atom 1.0 feeds from web pages that contain post lists but lack a native feed. Triggers on phrases like "generate a feed for", "create an RSS feed from", "make an Atom feed for", "this page has no RSS", or any request to produce a feed URL or feed XML from a blog/news/post-list page. The skill fetches the page, extracts post metadata, and outputs well-formed feed XML plus a self-hostable HTML wrapper with an embedded feed discovery link tag.
openclaw skills install rss-generator-skillGenerates valid RSS 2.0 or Atom 1.0 XML feeds from any web page that lists posts, articles, or news items but does not publish its own feed.
| Parameter | Default value |
|---|---|
| Preferred format | RSS 2.0 (Atom 1.0 on request) |
| Max items | 20 (most-recent first) |
| Date fallback | Page scrape date (ISO 8601, UTC) |
| Description | First 280 chars of post excerpt/lede |
| Encoding | UTF-8 |
| Output modes | Raw XML · HTML page · Both |
| Interaction style | Friendly and professional |
| # | User says … | Action |
|---|---|---|
| T1 | "Generate an RSS/Atom feed for {url}" | Fetch page → detect posts → emit XML |
| T2 | "This page has no feed: {url}" | Same as T1 |
| T3 | "Create a feed from {url}" | Same as T1 |
| T4 | "Convert {url} posts to RSS" | Same as T1 |
| T5 | "Make a self-hostable feed for {url}" | Emit XML + HTML wrapper |
| T6 | "Update / refresh the feed for {url}" | Re-scrape and re-emit |
WEB_FETCH function
(defined in https://linkeddata.uriburner.com/chat/functions/openapi.yaml,
endpoint /WEB_FETCH). Use whichever available protocol applies — REST, MCP,
OPAL, or curl. Required parameter: url. Optional: headers, max_redirects,
timeout_seconds. WEB_FETCH retrieves the page just like a web browser and
returns the full page content for subsequent processing. See
protocol-routing.md for exact invocation
patterns per protocol.<link rel="alternate"> tags. If a feed already
exists, report it and stop (offer to proxy/mirror instead).references/extraction-rules.md
to identify post entries (title, URL, date, author, summary).references/feed-templates.md. Validate structure against the checklist
in references/validation-checklist.md.references/html-wrapper-template.md..xml file to /mnt/user-data/outputs/ and
present it with present_files.<article>, <li>, or <div> blocks with consistent class names
(e.g., post, entry, article, blog-post, card)<h1>/<h2>/<h3> headings inside each block → item title<a href> on or near the heading → item link (resolve relative URLs)<time datetime="…"> or text matching date patterns → pubDate<p> inside the block (≤280 chars) → description / summary<span class="author"> or byline text → author| Situation | Strategy |
|---|---|
<time datetime="…"> | Use ISO value directly |
| Human-readable date text | Parse with locale awareness; emit RFC 822 |
| No date found | Use today's date (UTC) with a <!-- estimated --> comment |
| Relative ("3 days ago") | Calculate from scrape time |
All item <link> values must be absolute. Resolve against the page's
<base href> if present, otherwise against the origin of the page URL.
<rss version="2.0">
<channel>
<title>, <link>, <description> ← required channel fields
<item>
<title>, <link>, <guid> ← required per item
<pubDate> ← RFC 822 (e.g. Mon, 01 Jan 2024 00:00:00 +0000)
<description> ← plain text or CDATA-wrapped HTML
<feed xmlns="http://www.w3.org/2005/Atom">
<title>, <id>, <updated> ← required feed fields
<entry>
<title>, <id>, <updated> ← required per entry
<link href="…" rel="alternate"/> ← post URL
<summary> or <content> ← excerpt or full body
Full templates → references/feed-templates.md
| Mode | Description |
|---|---|
xml | Raw feed XML in a fenced code block |
file | Save to /mnt/user-data/outputs/<slug>-feed.xml and present link |
html | HTML discovery page with <link rel="alternate"> + embedded XML |
both | file + html wrapper saved as <slug>-feed-page.html |
Default: file (saves XML and presents download link).
| Problem | Response |
|---|---|
| Page returns non-200 | Report HTTP status; suggest checking URL or auth |
| No repeating post structure found | Show raw HTML skeleton; ask user to identify the pattern |
| Feed already exists | Report the existing feed URL; offer to mirror/augment |
| Dates unparseable | Use today's date; flag items with <!-- date-estimated --> |
| Relative URLs unresolvable | Ask user for the site's base URL |
| Command | Description |
|---|---|
/help | Usage guidance for this skill |
| `/format [rss | atom]` |
/limit [n] | Set maximum number of feed items |
/fulltext | Attempt to embed full post body (fetches each post URL) |
/validate | Run checklist from references/validation-checklist.md |
/preview | Show first 3 items as formatted Markdown before XML |
&, <, > in text nodes; use CDATA for HTML description bodies.<guid> / Atom <id> values must be the canonical post URL.pubDate DESC).<generator> tag).robots.txt — do not scrape pages that disallow crawlers.