Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read, search and triage the user's Papr RSS subscriptions from the shell via the `papr` CLI. Use when the user wants to catch up on their feeds, find or summarize articles they've subscribed to, check what's unread, star/save articles, subscribe to a new feed, or pull new posts. Triggers on: "what's in my feeds", "any unread RSS", "summarize this feed", "search my subscriptions for X", "mark these read", "subscribe to <url>", "refresh my feeds".
.claude/skills/l0ng-ai-papr-rss/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 143% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 272% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 26% | 0% |
papr is a token-efficient, agent-facing CLI over the user's local Papr RSS database. It emits TOON on stdout (≈40% cheaper than JSON, via the official toon-format encoder), keeps diagnostics on stderr, and returns structured errors with exit codes (0 success/no-op, 1 runtime, 2 usage). Reads are token-minimal by default; long article bodies are truncated with a --full escape hatch.
Run papr with no arguments first — it prints the unread dashboard plus the most useful next commands, so you can orient without reading a manual.
shpapr # home: unread/starred counts + recent unread + next steps papr feeds # subscriptions grouped by folder, with unread counts papr list --feed <id> # articles in a feed (defaults to unread; --all for read too) papr list --starred # smart views: --starred / --later / --tag <id> / --folder <id> papr list --fields author,url # add columns: author,url,snippet,type,feed_id,published papr read <id> [<id>...] # plain-text body, truncated; pass several ids to batch papr read --feed <id> --unread --limit 5 # read a feed's latest unread in one call papr read <id> --full # the complete body when truncation hid something papr search "<query>" # FTS5 full-text search across every article
shpapr mark read <id> [<id>...] # state: read|unread|star|unstar|later|unlater (idempotent) papr mark-all --feed <id> # mark a whole view read papr subscribe <url> # auto-discovers the feed, inserts it, fetches it papr refresh [--feed <id>] # fetch new articles over the network (RSS + newsletters) papr extract <id> # fetch & store the cleaned full text of an article
shpapr tags | papr tag add <tag_id> <article_id> | papr tag create "<name>" papr folders | papr folder create "<name>" | papr feed move <id> --folder <id> papr rules | papr rule create "<name>" "<keywords>" --action star papr highlights [--article <id>] | papr highlight create <article_id> "<quote>" papr newsletters | papr newsletter add --title .. --host .. --user .. --password .. papr opml import <file> | papr opml export papr settings get <key> | papr settings set <key> <value> papr stats
shpapr sync status | papr sync run # reconcile read/starred + subscriptions with FreshRSS/Miniflux
There are no summarize/ask/digest/translate commands: you are the language model, so read the text with papr read <id> (or gather candidates with papr search) and summarize, answer or translate it yourself — no second AI provider is involved.
Destructive verbs require --yes; without it they fail with exit 2 and tell you the exact command to re-run:
shpapr unsubscribe <id> --yes # delete a feed and its articles papr admin cleanup <days> --yes # also: admin vacuum / admin reset papr folder delete <id> --yes # likewise tag/rule/highlight delete, newsletter remove
--db <path> (or the PAPR_DB env var) if the databaseis not in the desktop app's default location.
(count: N of M unread) so you never need to paginate just to learn the size.
answer, not a reason to retry with different flags.
papr setup) so the unread dashboard isalready in context at the start of a conversation; this skill is the lower-overhead alternative that loads only when a feed task comes up.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 5,130 | 1,736 | -66% | 1 | 1 | 0% | 928 | 1,222 | +32% | 0 | 0 | — |
case-02 | fail→pass | 6,644 | 3,254 | -51% | 1 | 1 | 0% | 476 | 1,156 | +143% | 0 | 0 | — |
case-03 | fail→fail | 4,701 | 6,729 | +43% | 1 | 1 | 0% | 715 | 1,127 | +58% | 0 | 0 | — |
case-04 | fail→pass | 3,389 | 4,715 | +39% | 1 | 1 | 0% | 452 | 1,682 | +272% | 0 | 0 | — |
case-05 | fail→fail | 6,785 | 4,927 | -27% | 1 | 1 | 0% | 1,013 | 1,221 | +21% | 0 | 0 | — |
case-06 | fail→fail | 3,627 | 5,656 | +56% | 1 | 1 | 0% | 504 | 1,256 | +149% | 0 | 0 | — |
case-07 | pass→pass | 6,090 | 1,444 | -76% | 1 | 1 | 0% | 1,000 | 1,169 | +17% | 0 | 0 | — |
case-08 | fail→pass | 9,718 | 2,013 | -79% | 1 | 1 | 0% | 1,551 | 1,267 | -18% | 0 | 0 | — |
case-09 | fail→pass | 5,655 | 1,449 | -74% | 1 | 1 | 0% | 932 | 1,176 | +26% | 0 | 0 | — |
case-10 | pass→pass | 9,854 | 2,269 | -77% | 1 | 1 | 0% | 1,576 | 1,277 | -19% | 0 | 0 | — |
case-11 | fail→pass | 7,672 | 2,277 | -70% | 1 | 1 | 0% | 1,240 | 1,328 | +7% | 0 | 0 | — |
case-12 | fail→pass | 6,058 | 1,264 | -79% | 1 | 1 | 0% | 877 | 1,143 | +30% | 0 | 0 | — |
case-13 | fail→pass | 3,025 | 1,484 | -51% | 1 | 1 | 0% | 447 | 1,129 | +153% | 0 | 0 | — |
case-14 | pass→pass | 4,674 | 1,643 | -65% | 1 | 1 | 0% | 699 | 1,124 | +61% | 0 | 0 | — |
case-15 | fail→pass | 7,560 | 1,630 | -78% | 1 | 1 | 0% | 1,238 | 1,173 | -5% | 0 | 0 | — |
case-16 | fail→pass | 9,860 | 1,987 | -80% | 1 | 1 | 0% | 1,736 | 1,167 | -33% | 0 | 0 | — |
case-17 | fail→pass | 4,678 | 1,959 | -58% | 1 | 1 | 0% | 732 | 1,173 | +60% | 0 | 0 | — |
case-18 | fail→pass | 7,676 | 1,227 | -84% | 1 | 1 | 0% | 1,273 | 1,124 | -12% | 0 | 0 | — |
case-19 | fail→pass | 13,244 | 4,374 | -67% | 1 | 1 | 0% | 2,039 | 1,637 | -20% | 0 | 0 | — |
case-20 | fail→pass | 6,494 | 2,409 | -63% | 1 | 1 | 0% | 1,047 | 1,115 | +6% | 0 | 0 | — |
case-21 | fail→pass | 5,823 | 2,558 | -56% | 1 | 1 | 0% | 985 | 1,452 | +47% | 0 | 0 | — |
case-22 | fail→pass | 4,827 | 3,132 | -35% | 1 | 1 | 0% | 659 | 1,379 | +109% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +73 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.