A link-focused Mastodon news reader for iOS and macOS. Fedi Reader filters your home timeline to show only posts containing external links, making it easy to discover articles and content shared by people you follow.
- Automatically filters your home timeline to posts with external links
- Excludes quote posts and reblogs-with-comment to focus on original link shares
- Displays rich link cards with images, titles, and descriptions
- Filter by domain to focus on specific sources
- Checks linked articles for author information via HEAD requests
- Supports multiple attribution sources:
- Link headers with
rel="author" - HTML meta tags (
<meta name="author">) - Open Graph tags (
og:article:author) - JSON-LD structured data
- Twitter cards (
twitter:creator)
- Link headers with
- Connect multiple Mastodon accounts
- Quick account switcher
- Secure credential storage in Keychain
Save articles to your favorite read-later service:
- Instapaper
- Omnivore
- Readwise Reader
- Raindrop.io
- β Favorite/Star posts
- π Boost/Reblog
- π¬ Reply to posts
- π Quote boost (on supporting instances)
- π Bookmark
- π€ Share via native share sheet
- Trending links on your instance
- Trending posts
- Trending hashtags
- Dedicated tab for mentions and direct messages
- Quick reply functionality
- In-app article reading
- Persistent action toolbar for Mastodon interactions
- Quick save to read-later services
- Back/forward navigation
- iOS 26.0+ / macOS 26.0+
- Xcode 26.0+
- Swift 6.2+ toolchain (Swift 5 language mode)
The app uses the current Swift toolchain (Swift 6.2+, Xcode 26+) in Swift 5 language mode (SWIFT_VERSION = 5.0), with MainActor as the default actor isolation and targeted strict concurrency. This keeps the project building with the latest Xcode without requiring a full Swift 6 concurrency migration.
- Clone the repository:
git clone https://github.com/fedi-reader/fedi-reader.git
cd fedi-reader- Open in Xcode:
open fedi-reader.xcodeproj- Build and run on your device or simulator.
Fedi Reader uses Apple's modern @Observable pattern with service classes, avoiding traditional MVVM in favor of a flat, service-oriented structure where Views directly consume Observable services.
fedi-reader/
βββ App/ # App entry point
βββ Models/ # SwiftData models & API types
βββ Services/ # @Observable service classes
β βββ ReadLater/ # Read-later integrations
βββ Views/ # SwiftUI views
β βββ Actions/ # Post actions & composer
β βββ Auth/ # Login views
β βββ Feed/ # Timeline views
β βββ Profile/ # Profile & account views
β βββ Root/ # Main container
β βββ Settings/ # Settings views
β βββ Web/ # Article web viewer
βββ Utilities/ # Helpers & constants
| Service | Purpose |
|---|---|
MastodonClient |
Core API client with OAuth 2.0 |
AuthService |
Authentication flow management |
TimelineService |
Timeline fetching & pagination |
LinkFilterService |
Filters posts to links only |
AttributionChecker |
Author metadata extraction |
ReadLaterManager |
Unified read-later interface |
Each read-later service requires authentication:
| Service | Authentication |
|---|---|
| Consumer key + OAuth | |
| Instapaper | Username/password (xAuth) |
| Omnivore | API key |
| Readwise | Access token |
| Raindrop | OAuth or API token |
Configure services in Settings β Read Later Services.
Fedi Reader registers the fedi-reader:// URL scheme for OAuth callbacks.
The project includes comprehensive tests using Swift Testing:
# Run all tests
xcodebuild test -scheme fedi-reader -destination 'platform=iOS Simulator,name=iPhone 17'See WARP.md for more build/test commands (single-suite, UI-only, clean, etc.).
LinkFilterServiceTests- Link filtering logicHTMLParserTests- HTML parsing and entity decodingAttributionCheckerTests- Author attributionMastodonTypesTests- API type encoding/decoding
Fedi Reader follows ActivityPub and Mastodon API best practices:
- Respects
Cache-Controlheaders - Honors rate limits (
X-RateLimit-*headers) - Uses appropriate
Acceptheaders for ActivityPub - Handles federation delays gracefully
- Displays content warnings appropriately
- Proper User-Agent identification
- Credentials are stored securely in the system Keychain
- No analytics or tracking
- No data shared with third parties
- All API communication uses HTTPS
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with SwiftUI and SwiftData
- Uses the Mastodon API
- Inspired by the Fediverse community
Made with β€οΈ for the Fediverse