koala73 / koala73/worldmonitor
Configure News Feeds - like you can configure TV Channels
- Dominant language
- TypeScript
- Stars
- 86.6k
- Forks
- 13.1k
- Avg merge
- 8h 4m
- Merged PRs (30d)
- 825
Description
## Problem
Users can toggle curated feeds on/off, but cannot **add** a feed the way they add TV channels. Data (feed URLs) is still coupled to `src/config/feeds.ts`.
## What already exists
- Canonical packs: `src/config/feeds.ts` (`CANONICAL_FEEDS` / `Feed` in `src/types/index.ts`)
- Enable/disable persistence: `STORAGE_KEYS.disabledFeeds` in `src/App.ts` (regional-rollout reconcile)
- Settings UI: UnifiedSettings / news panel filters (`src/app/panel-layout.ts` `newsPanelKeyForCategory`)
- TV-channel add pattern: LiveNewsPanel channel manager (the analogue to copy)
- **Open PR #700** (`feat(feeds): add configurable custom RSS feeds`) — collaborator noted it was clean and waiting on global restrictions from @koala73 (2026-03-30). Do not start a third implementation.
## Scope
Land user-added RSS feeds, with restrictions, on top of #700 (or revive it).
**In scope**
- Add / remove a custom RSS URL in settings, persisted (localStorage is fine for v1; cloud prefs are a later issue)
- Fetch + render those items in the news panels alongside curated feeds
- Global restrictions: max count, http(s) only, SSRF-safe (no private/loopback), timeout, size cap, no replacing the curated pack
- Provenance: custom feeds are not silently treated as tier-1 corroboration (#6430 / #6419)
**Out of scope**
- Replacing `feeds.ts` curated packs
- User-defined Telegram channels (#1994, PR #2262)
- Arbitrary HTML scrape sources
- Server-side shared custom feeds across devices
## Acceptance
- [ ] User can add an https RSS URL, see items, remove it, and have it survive reload
- [ ] Cap + SSRF/scheme restrictions enforced with tests
- [ ] Curated packs unchanged; disable-feed toggles still work
- [ ] Custom items are labelled so they cannot fake publisher corroboration
- [ ] PR #700 is the starting point (rebase or close-as-superseded with a pointer), not a parallel feature
Effort: M (~2d) if #700 rebases; more if it is abandoned.
Related: #1994, #6427, #6430.
Contributor guide
Research direction
Start by reviewing PR #700 and the existing feed and settings paths: src/config/feeds.ts, src/types/index.ts, src/App.ts, src/app/panel-layout.ts, and LiveNewsPanel. Preserve curated-feed toggles while adding persisted custom feeds, then verify the acceptance criteria with tests for restrictions, fetching, rendering, persistence, and provenance labels.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend, frontend, security
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100