FeedReader icon

FeedReader

A native iOS RSS feed reader with offline caching, bookmarks, search, and a Swift Package for embedding in your own apps.

Platform Swift CI License Release
View on GitHub Get Started โ†’

Features

Everything you need in a feed reader โ€” plus a Swift Package to bring RSS parsing to your own iOS apps.

๐Ÿ“ฐ

RSS Feed Parsing

Native XMLParser-based RSS reader with concurrent multi-feed loading and automatic deduplication.

๐Ÿ’พ

Offline Caching

Stories persisted via NSCoding. Read without internet. Smart cache invalidation on refresh.

๐Ÿ“ก

Multi-Feed Support

Add, remove, toggle, and reorder feeds. 10 built-in presets plus custom URL support.

๐Ÿ”–

Bookmarks

Save stories for later. Swipe-to-bookmark, dedicated bookmarks screen, persistent storage.

๐Ÿ”

Search & Filter

Real-time search across story titles and descriptions. Find what you're looking for instantly.

๐Ÿ–ผ๏ธ

Async Image Loading

Story thumbnails load asynchronously with NSCache-backed in-memory caching for smooth scrolling.

๐ŸŒ

Network Detection

Uses SCNetworkReachability to detect connectivity and gracefully switch between online and cached modes.

๐Ÿ“ฆ

Swift Package

Core RSS parsing available as FeedReaderCore SPM package. Embed in your own iOS apps with zero UI dependency.

๐Ÿ›ก๏ธ

URL Validation

All URLs validated against allowed schemes. Rejects javascript:, file:, data: and other injection vectors.

Quick Start

Clone, open, and run in under 30 seconds.

# Clone the repository git clone https://github.com/sauravbhattacharya001/FeedReader.git # Open in Xcode cd FeedReader open FeedReader.xcodeproj # Build and run Press โŒ˜R to build and run on an iPhone simulator # Run tests Press โŒ˜U to run all tests

Swift Package

Use FeedReaderCore in your own iOS apps โ€” RSS parsing without the UI.

// Package.swift dependencies: [ .package(url: "https://github.com/sauravbhattacharya001/FeedReader.git", from: "2.0.0") ] // In your Swift file import FeedReaderCore let parser = RSSParser() let stories = parser.parseData(xmlData) // [RSSStory] for story in stories { print(story.title) print(story.body) // HTML-stripped print(story.link) print(story.imagePath) // Optional thumbnail }

Full API Reference โ†’

Built With

๐ŸŽ Swift ๐Ÿ“ฑ UIKit ๐Ÿ“ฆ Swift Package Manager ๐Ÿ”— XMLParser ๐Ÿ“ก URLSession ๐Ÿ’พ NSCoding ๐Ÿ–ผ๏ธ NSCache ๐ŸŒ SystemConfiguration โš™๏ธ GitHub Actions CI

Documentation

Everything you need to use, extend, and contribute to FeedReader.