modules/programs/agents/shared/skills/organize-feeds/SKILL.md
Categorize uncategorized FreshRSS feeds by sampling content and inferring the best category. Use when user says "organize feeds", "categorize feeds", or wants to clean up uncategorized subscriptions.
npx skillsauth add MichaelVessia/nixos-config organize-feedsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Go through all feeds in the Uncategorized folder, sample their content, and assign each to the best-fitting category.
FRESHRSS_URL - Base URL of FreshRSS instanceFRESHRSS_API_USER - API usernameFRESHRSS_API_PASSWORD - API passwordAUTH_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.*')
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/||'
Keep this list for matching. Note the naming style (title case, short names).
curl -s "$FRESHRSS_URL/api/greader.php/reader/api/0/subscription/list?output=json" \
-H "Authorization: GoogleLogin auth=$AUTH_TOKEN" | jq '[.subscriptions[] | select(.categories | length == 0 or (.categories | all(.label == "Uncategorized")))] | .[] | {id, title, url: .htmlUrl}'
If there are no uncategorized feeds, inform the user and stop.
For each uncategorized feed:
Sample the feed using WebFetch on the feed's htmlUrl (or its RSS URL if
htmlUrl is missing). Read the title, description, and a few recent post
titles to understand its topic.
Infer the best category. Compare the feed content against existing categories. Prefer existing categories. Only propose a new category if nothing fits, keeping the name short and consistent with existing style.
Collect a proposal with: feed title, inferred category, and brief rationale (a few words).
Show a summary table of all feeds and their proposed categories. Use AskUserQuestion to confirm the batch. Include:
Let the user approve all, reject all, or provide specific overrides. If the user provides overrides, apply those instead.
For each approved feed:
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" \
-d "r=user/-/label/Uncategorized"
Use r=user/-/label/Uncategorized to remove the old label if present.
Print a summary of what was done:
feed/https://... or feed/NUMBER.development
Restate the last message in plain human language, with no jargon.
testing
Fan out a batch of work items into one PR each via isolated worktree agents, review every PR before it opens, then babysit all PRs through green CI and review feedback. Use when the user wants to fan out PRs, dispatch parallel PR agents over a list of items, or run a batch of independent changes as separate PRs.
development
Dispatch user-visible coding or research agents through Herdr with Codex-Desktop-like thread ergonomics. Use when the user asks to use Herdr to spawn, dispatch, fan out, inspect, follow up with, or monitor agent workspaces/threads.
development
Generate self-contained HTML visualizations with Plannotator theming. Use for implementation plans, PR explainers, architecture diagrams, data tables, slide decks, and any visual explanation of technical concepts. Plans and PR explainers follow Plannotator's prescriptive approach; all other visual content delegates to nicobailon/visual-explainer.