Skip to content

szarbartosz/rss-inbox

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RSS Inbox — a status-bar RSS reader for macOS

macOS Swift License

A quiet RSS reader that lives in your menu bar.
No accounts. No sync. No subscriptions. Just feeds.

Features

  • 🗞️ Menu bar resident - no Dock icon, no windows in your way
  • 📬 The mailbox tells you - the menu bar emoji flips when there's something new to read
  • 📥 Skim-friendly popover - feed tabs, per-feed unread counts, full-row article links
  • 🔄 Background polling - every 5, 15, 30, or 60 minutes
  • 📂 OPML in & out - bring your feeds with you
  • 🚀 Sensible defaults - launch at login, retention pruning, local-first SwiftData persistence

Screenshots

RSS Inbox popover — light mode    RSS Inbox popover — dark mode

Install

⬇ Download the latest DMG — requires macOS 15+.

Or build from source

Requires Xcode 16.

xcodegen generate
open RSSInbox.xcodeproj   # ⌘R to run
Architecture & design notes
RSSInbox/
├── AppDelegate.swift          NSPanel-backed status bar UI
├── RSSInboxApp.swift          SwiftUI App entry point
├── Core/
│   ├── FeedParser.swift       RSS 2.0 + Atom → ParsedFeed
│   ├── OPMLParser.swift       OPML import / export
│   ├── FeedPoller.swift       @Observable @MainActor polling loop
│   └── BadgeController.swift  Unread-count → status-bar icon
├── Models/
│   ├── Feed.swift             @Model — title, url, lastFetched, fetchError
│   └── Article.swift          @Model — guid, title, summary, link, isRead
└── Views/
    ├── PopoverView.swift      Menu-bar popover
    ├── ArticleRowView.swift   Full-row clickable article cell
    ├── ReaderView.swift       In-app reader (optional)
    └── PreferencesView.swift  Feeds + General tabs
  • NSPanel instead of NSPopover — borderless, non-activating, manually positioned so the popover anchors to the status item across multi-monitor setups.
  • maskImage for rounded cornersNSVisualEffectView ignores layer.cornerRadius during certain compositing passes; a 9-part stretchable mask image survives the redraws.
  • One ModelContext per logical owner — the poller creates its own context per run; views use the SwiftUI environment context. SwiftData merges via the shared ModelContainer.

Configuration

Key Type Default Description
pollIntervalMinutes Int 15 Background polling interval
retentionLimit Int 100 Max articles kept per feed

Tests

xcodebuild test -scheme RSSInbox -destination 'platform=macOS' \
  CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

Covers OPML parsing, feed parsing (RSS 2.0 + Atom), the badge controller, and feed-poller integration (dedup, retention, network failure surfacing).

License

MIT © Bartosz Szar

About

Quiet RSS feed reader that lives in your status bar.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors