bx-rss — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bx-rss (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
install-bx-module bx-rss
# CommandBox
box install bx-rssrss()// Fetch and parse a feed
feed = rss( "https://blog.example.com/feed.rss" )
// Access channel metadata
writeOutput( "Title: " & feed.channel.title )
writeOutput( "Link: " & feed.channel.link )
writeOutput( "Description: " & feed.channel.description )
// Access items (array)
for ( var item of feed.items ) {
writeOutput( item.title & " — " & item.publishedDate )
writeOutput( item.link )
writeOutput( item.description )
}bx:feed — Reading// Script syntax
bx:feed action="read" source="https://blog.example.com/feed.rss" result="feed" {
}
// Tag syntax
bx:feed action="read" source="https://blog.example.com/feed.rss" result="feed"
// With limit and filtering
bx:feed
action="read"
source="https://news.example.com/rss.xml"
result="feed"
maxItems=10
filter="boxlang"
// From local file
bx:feed action="read" source="/app/data/cached-feed.xml" result="feed"bx:feed — Creating// Create an RSS 2.0 feed
bx:feed action="create" result="feedXml" type="rss" {
// Channel metadata passed via attributes of bx:feed or as nested struct
}
// Programmatic creation
var feedDefinition = {
type : "rss",
version : "2.0",
title : "My Blog",
link : "https://blog.example.com",
description : "Latest posts from My Blog",
xmlUrl : "https://blog.example.com/feed.rss",
items : []
}
// Add items
for ( var post of posts ) {
arrayAppend( feedDefinition.items, {
title : post.title,
link : "https://blog.example.com/post/" & post.slug,
description : post.summary,
publishedDate : post.publishedAt,
author : post.authorEmail,
guid : "https://blog.example.com/post/" & post.slug,
categories : [ post.category ]
})
}
bx:feed action="create" result="feedXml" {
// Set structure via variables.feedDefinition
}
// Write to file
fileWrite( "/app/public/feed.rss", feedXml )
// Or stream to browser
content type="application/rss+xml"
writeOutput( feedXml )var feedDefinition = {
type : "atom",
version : "1.0",
title : "My Blog (Atom)",
link : "https://blog.example.com",
xmlUrl : "https://blog.example.com/atom.xml",
description : "Latest posts",
items : []
}var feedDefinition = {
type : "rss",
version : "2.0",
title : "My Podcast",
link : "https://mypodcast.com",
description : "Weekly tech discussions",
// iTunes-specific
itunes : {
author : "Jane Doe",
image : "https://mypodcast.com/cover.jpg",
category : "Technology",
explicit : "no",
owner : { name: "Jane Doe", email: "[email protected]" }
},
items : [
{
title : "Episode 42: BoxLang Deep Dive",
description : "We talk about BoxLang internals",
enclosure : {
url : "https://mypodcast.com/ep42.mp3",
type : "audio/mpeg",
length : 52428800
},
publishedDate : "2025-01-15",
guid : "podcast-ep-42",
itunes : {
duration : "54:22",
episode : 42
}
}
]
}function aggregateFeeds( feedUrls, maxPerFeed ) {
var allItems = []
for ( var url of feedUrls ) {
try {
bx:feed action="read" source=url result="feed" maxItems=maxPerFeed
for ( var item of feed.items ) {
item.source = feed.channel.title
arrayAppend( allItems, item )
}
} catch ( any e ) {
// Skip broken feeds
}
}
// Sort by date, newest first
allItems.sort( ( a, b ) -> {
return dateCompare( b.publishedDate, a.publishedDate )
})
return allItems
}// In a web handler (ColdBox or simple template)
function feed( event, rc, prc ) {
var posts = postService.getLatestPosts( 20 )
var feedData = {
channel : {
title : "My Blog",
link : event.getHTTPBasePath(),
description : "Latest posts"
},
items : posts.map( ( p ) => ({
title : p.title,
link : event.buildLink( "blog.post.#p.slug#" ),
description : p.excerpt,
publishedDate : p.publishedAt,
guid : p.id
}))
}
bx:feed action="create" result="prc.feedXml" feedProperties=feedData
event.renderData( type: "plain", data: prc.feedXml )
.setHTTPHeader( name: "Content-Type", value: "application/rss+xml; charset=utf-8" )
}publishedDate is always populated — some feeds omit itmaxItems to limit memory usage when parsing large feedsContent-Type: application/rss+xml when serving feeds to browsers/RSS readers~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.