Agent Skills: Add Feed to FreshRSS

Add an RSS feed to FreshRSS with auto-categorization. Use when user provides a feed URL and wants it added to FreshRSS, or says "add feed", "subscribe to", "add rss".

UncategorizedID: michaelvessia/nixos-config/add-feed

Install this agent skill to your local

pnpm dlx add-skill https://github.com/MichaelVessia/nixos-config/tree/HEAD/modules/programs/agents/shared/skills/add-feed

Skill Files

Browse the full folder contents for add-feed.

Download Skill

Loading file tree…

modules/programs/agents/shared/skills/add-feed/SKILL.md

Skill Metadata

Name
add-feed
Description
Add an RSS feed to FreshRSS with auto-categorization. Use when user provides a feed URL and wants it added to FreshRSS, or says "add feed", "subscribe to", "add rss".

Add Feed to FreshRSS

Given a feed URL, sample its content, infer the best category, and add it.

Environment

  • FRESHRSS_URL - Base URL of FreshRSS instance
  • FRESHRSS_API_USER - API username
  • FRESHRSS_API_PASSWORD - API password

Procedure

1. Authenticate

AUTH_TOKEN=$(curl -s -X POST "$FRESHRSS_URL/api/greader.php/accounts/ClientLogin" \
  -d "Email=$FRESHRSS_API_USER" \
  -d "Passwd=$FRESHRSS_API_PASSWORD" | grep -oP 'Auth=\K.*')

2. Fetch existing categories

CATEGORIES=$(curl -s "$FRESHRSS_URL/api/greader.php/reader/api/0/tag/list?output=json" \
  -H "Authorization: GoogleLogin auth=$AUTH_TOKEN" | jq -r '.tags[].id' | grep 'label/' | sed 's|user/-/label/||')

3. Sample the feed

Use WebFetch on the feed URL to read its title, description, and recent post titles/summaries. This content is the basis for category inference.

4. Infer category

Compare the feed's content against the existing categories from step 2. Pick the best match. Consider:

  • Feed title and description
  • Topics of recent posts
  • Existing category names

If no existing category fits well, propose a short, lowercase category name consistent with the existing naming style.

Present the chosen category to the user with AskUserQuestion, showing existing categories as options plus the inferred pick marked "(Recommended)". Only skip confirmation if the match is obvious (e.g., feed title contains the category name verbatim).

5. Add the feed with category

RESULT=$(curl -s -X POST "$FRESHRSS_URL/api/greader.php/reader/api/0/subscription/quickadd" \
  -H "Authorization: GoogleLogin auth=$AUTH_TOKEN" \
  -d "quickadd=FEED_URL")
FEED_ID=$(echo "$RESULT" | jq -r '.streamId')
curl -s -X POST "$FRESHRSS_URL/api/greader.php/reader/api/0/subscription/edit" \
  -H "Authorization: GoogleLogin auth=$AUTH_TOKEN" \
  -d "ac=edit" \
  -d "s=$FEED_ID" \
  -d "a=user/-/label/CATEGORY_NAME"

6. Confirm

Print the feed title, URL, and assigned category. Verify by listing subscriptions:

curl -s "$FRESHRSS_URL/api/greader.php/reader/api/0/subscription/list?output=json" \
  -H "Authorization: GoogleLogin auth=$AUTH_TOKEN" | jq ".subscriptions[] | select(.id == \"$FEED_ID\") | {title, id, categories: [.categories[].label]}"

Notes

  • Token is session-based, get a fresh one each invocation
  • Feed IDs use format feed/https://example.com/rss
  • Fever API (/api/fever.php) is read-only, always use GReader API