#Predicate

2025-11-17

Today 1.4.0: Reddit Meets RSS in Your Privacy-First Reader

I’m excited to announce Today 1.4.0, the biggest update yet to our privacy-first RSS reader. This release brings native Reddit support alongside traditional RSS feeds, letting you follow subreddits without the tracking, ads, or algorithmic manipulation of the official Reddit app.

Why Reddit in an RSS Reader?

Reddit has been moving toward a more closed ecosystem, but it still has open data endpoints that anyone can access. While Reddit has supported basic RSS feeds for years, I wanted to go deeper—pulling in the rich media, comments, and metadata that make Reddit posts engaging.

With Today 1.4.0, you can:

  • Follow subreddits alongside your RSS feeds in one unified timeline
  • Read Reddit posts with GIFs, videos, and image galleries
  • Browse comments without leaving the app
  • Keep your reading habits private—no tracking, no data collection

All of this happens locally on your device. We don’t know what you read, and we like it that way.

What’s New in 1.4.0

🎉 Reddit RSS Support

Adding a Reddit feed is dead simple: tap the “+” button, select “Reddit,” and type the subreddit name. That’s it. No need to fiddle with URLs or RSS endpoints.

What works:

  • Animated GIFs and videos play automatically with smooth looping
  • Multi-image galleries let you swipe through photos with pinch-to-zoom and pan gestures
  • Comments load with proper threading when you tap the comments button
  • Rich media displays beautifully, whether it’s images, videos, or text posts
  • Author attribution shows who posted instead of just the feed name

Reddit posts integrate seamlessly with the rest of Today:

  • They appear in your daily timeline alongside RSS articles
  • AI-generated newsletters can include Reddit posts
  • Previous/Next navigation works across all content types
  • Mark as read/unread, just like any article

📱 Better Feed Navigation

You can now tap any feed to see its articles. This was one of the most requested features, and it makes auditing individual feeds much easier.

Each feed now shows:

  • Unread count badges so you know what’s new at a glance
  • Swipe-to-edit for quick access to feed settings
  • Mark all as read button in the feed view
  • Show/hide read articles toggle for more control

🏷️ Smarter Categories

Category filters got a polish pass:

  • Categories now display in title case (General, Work, Tech) for better readability
  • Empty categories hide automatically—no more clutter from unused categories
  • Custom category names preserve your exact capitalization
  • A one-time migration updated existing feeds (completely automatic)

The Philosophy: Privacy-First, Always

Every feature in Today is built around a core principle: your reading habits are yours alone.

Unlike social media apps that track every article you open, every link you click, and every moment you spend reading:

  • Today stores all data locally using SwiftData
  • AI summaries run on-device using Apple Intelligence
  • There’s no cloud sync that could leak your reading history
  • We don’t use analytics, tracking pixels, or data collection

Reddit support follows the same philosophy. When you read a subreddit through Today:

  • Reddit doesn’t know you’re reading
  • We don’t know you’re reading
  • Your reading list stays on your device

You can export your feeds anytime via OPML. Your data is portable, private, and under your control.

Technical Deep Dive

For those interested in how this works under the hood:

Reddit Integration: From RSS to JSON

Here’s a fun fact: Reddit has supported RSS feeds for years. When I first started testing Today, I was following subreddits like r/UtahInfluenceDrama and r/SonyAlpha using their native RSS feeds (just append .rss to any subreddit URL). It worked perfectly for basic article reading.

But here’s the thing: Reddit’s RSS feeds are pretty bare-bones. You get titles, links, and basic text—but that’s about it. No author information, no media URLs, no gallery support, and definitely no comment access.

We all know you go to Reddit for the comments.

So I made the switch to Reddit’s JSON API (via .json endpoints), and suddenly everything got better:

What JSON gives us that RSS doesn’t:

  • Author attribution – See who posted, not just the subreddit
  • Rich media URLs – Direct links to GIFs, videos, and gallery images
  • Post metadata – Awards, post type, media information
  • Comment data – Full comment threads with proper nesting
  • Gallery posts – Multiple images with proper ordering
  • Video support – Reddit-hosted videos with fallback URLs
  • More reliable parsing – Structured data instead of HTML scraping

The integration now handles:

  • Text posts, link posts, image posts, and video posts
  • Gallery posts with multiple images and zoom/pan gestures
  • Animated GIFs (via direct MP4 URLs that auto-play and loop)
  • Reddit videos (via fallback URLs when available)
  • Comment threads with proper threading and formatting

Reddit’s RSS feeds are still great for basic reading, but the JSON API unlocks the full Reddit experience—rich media, comments, and all the metadata that makes Reddit posts interesting—while keeping everything private and ad-free.

What’s Next

This release sets the foundation for more feed source integrations. Some ideas on the roadmap:

  • Hacker News integration
  • Newsletter-to-RSS bridging
  • YouTube channel feeds

I’m also exploring:

  • iPad-optimized layouts
  • Deeper AI integrations (topic clustering, reading recommendations)
  • Podcast RSS support with playback
  • Cross-device sync (end-to-end encrypted, opt-in)

A Note on RSS in 2025

People keep declaring RSS dead, but it’s more alive than ever. Why?

RSS is the antidote to algorithmic feeds. You choose what you want to read. No one decides for you what’s “relevant” or “engaging.”

RSS is private by default. No one tracks what feeds you subscribe to or which articles you read.

RSS is portable. You can move your subscriptions between readers anytime with OPML export.

RSS is open. It doesn’t require accounts, logins, or platform lock-in.

Today brings RSS into 2025 with modern features—AI summaries, background sync, rich media support—while keeping the core values intact: privacy, control, and the open web.

Try It Today

Today 1.4.0 is available now on the App Store for iOS 18+.

Download: Today on the App Store

It’s free, with no ads, no tracking, and no subscriptions. Your data stays on your device, and your reading habits stay private.

Feedback Welcome

This update represents months of work, and I’d love to hear what you think:

Special thanks to all the beta testers who provided feedback during development. Your input made this release significantly better.

Changelog

New Features:

  • Reddit RSS support with simplified feed picker
  • Rich media playback (animated GIFs, videos, image galleries)
  • Reddit comments view with threading
  • Tap feeds to view their articles
  • Unread count badges on feed list
  • Swipe gestures for feed editing
  • Mark all as read functionality

Improvements:

  • Category buttons now display in title case
  • Empty categories hide automatically
  • Better feed navigation with Previous/Next buttons
  • Improved newsletter generation with Reddit posts
  • Enhanced visual consistency across the app

Technical:

  • One-time category migration system
  • Reddit JSON API integration
  • SwiftData query optimizations
  • Background sync improvements

Privacy:

  • All data remains on-device
  • No tracking of reading habits
  • No analytics or data collection
  • OPML export for data portability

Download Today and take control of your reading.

Built with ❤️ by Jake Spurlock

#predicate

David Cardeñadavidcafor
2025-11-11

Trying to fetch a SwiftData model filtered by an enum (BookStatus) using or Predicate(\.status, equals:) fails every time:
Key path cannot refer to enum case / Cannot infer key path type.
Anyone found a clean way to filter enums in SwiftData?

2025-09-02

Техническая внутренняя кухня StarRocks: оптимизация JOIN — от логики до распределённого выполнения

Как StarRocks добивается высокой производительности JOIN-запросов в аналитических нагрузках. В материале — практическая кухня оптимизатора: какие типы JOIN эффективнее и когда их стоит конвертировать (например, CROSS→INNER, OUTER→INNER при NULL‑отвергающих предикатах), как работает predicate pushdown, извлечение предикатов из OR, вывод эквивалентностей и pushdown LIMIT. Разбираем Join Reorder для многотабличных запросов (Left‑Deep, Exhaustive, Greedy, DPsub), модель стоимости (CPU*(Row(L)+Row(R))+Memory*Row(R)) и выбор лучшего плана. На уровне распределённого исполнения — MPP‑архитектура, свойства распределения (Distribution Property) и узлы Exchange; пять базовых планов: Shuffle, Broadcast, Bucket Shuffle, Colocate и экспериментальный Replicate Join. Плюс Global Runtime Filter (Min/Max, IN, Bloom) для ранней фильтрации на Scan. Даем практические принципы: используйте более быстрые типы JOIN, стройте хеш по малой таблице, в многоJOINовых запросах сперва выполняйте высокоселективные соединения, сокращайте объём данных и сетевой трафик. Материал для инженеров данных, DBA, разработчиков OLAP и всех, кто проектирует производительные SQL‑планы.

habr.com/ru/articles/943050/

#starrocks #join #оптимизация_запросов #mpp #распределенный #predicate #olapкубы

2025-08-01

It’s not possible to use the Swift #Predicate macro with a CoreData NSFetchRequest (which needs NSPredicate), right?

Or am I missing something?

Rosyna Kellerrosyna
2025-07-11

@tba Not a feedback yet, but I was getting the following error below when using this predicate)

let impAssociation = <ObjcMethod> {
// This will catch Foundation and CoreFoundation
showUnassociatedImps || $0.impPath.localizedStandardContains($0.path) || $0.impPath.localizedStandardContains("CoreFoundation.framework") || $0.impPath.localizedStandardContains("/Foundation.framework")
}

“$0.impPath.localizedStandardContains($0.path)” was the culprit.

mastodon.social/@rosyna/114829

2025-05-04

Woof - implementing the generic App Entity queries for SwiftData entities really highlights all of the shortcomings of the #Predicate macro. This is soooooo much harder than it should be.

Florian Albrechtflorianalbrecht
2024-12-19

@marcel Should be possible with something like this (untested):

Query(filter: <Object> { object in
object.date > dateA && object.date < dateB
})

2024-11-19

Starting a new project for Day 57, so don’t have much to show so far. We’re learning how to edit SwiftData objects with SwiftUI and filter data using #Predicate. #100DaysOfSwiftUI

The iOS Simulator displays a list titled Users, showing names Ed Sheeran, Johnny English, Rosa Diaz, and Roy Kent. Each name is in a row with a right-facing arrow, and a plus icon is at the top right for adding users.
Xavi Mollxmollv
2024-10-13

I'm toying with SwiftData and the stuff seems really bad? A predicate that references an enum doesn't seem to be able to compile: "Member access without an explicit base is not supported in this predicate".

I can get it to work if before building the predicate I map the enum to it's rawValue (String in this case) and then inside the predicate I hardcode the rawValue's strings. That's horrible and it'll break in no time...

Am I missing something?

2024-05-15

That was fun, one Swift file was taking 92 seconds to compile, then I figured out I was using a SwiftData filter #Predicate wrong. Fixed, it now it takes 0.7 seconds 🎉

2024-04-28

Today's #SwiftData puzzle: using a #Predicate is not possible with enum fields for comparison

developer.apple.com/forums/thr

2024-04-12

Near the end of part 3 of his Prolegomena to any Future Metaphysics, Immanuel Kant compares his systematic deduction of the categories against Aristotle's "rhapsody" account

soundcloud.com/gregorybsadler/
#Podcast #Kant #Aristotle #Categories #Metaphysics #Philosophy #Predicate

Sandro Pennisisandropennisi
2024-03-30

@ifarouk @fatbobman i havent used the predicate macro myself so far but i think it needs to know of which type it is. So it should be something like <Place> {…} i think 🤔

Jeremy Schonfeldjmschonfeld@sfba.social
2024-03-21

@JetForMe #Predicate was added to the Foundation framework rather than the Swift Standard Library, so it didn’t have the same formal review process at the time as other pitches you might’ve seen for the language or stdlib itself. With the new swift-foundation package we’ve started formalizing a new process adjacent to Swift Evolution for changes to Foundation - you can find more details at github.com/apple/swift-foundat as the process evolves over time!

Was there an accepted Swift Evolution proposal for #Predicate? There was a [pitch](forums.swift.org/t/pitch-swift), but i can't find where it was accepted into the language.

#Swift

2024-02-02

#572 - Querying data with the @Query Macro
In this episode we will provide a searchable interface using the @Query and #Predicate macros. We'll discuss how to use localizedStandardCompare instead of...
nsscreencast.com/episodes/572-

2024-01-23

@natpanferova this is great! I just learnt about this today in fact, in the context of the new #predicate macro.

Helge Heßhelge
2024-01-12

@ddribeiro I'm not sure how far the enum support is, but if you have a small sample project, I'd have a look. I don't think you'd want to use the `return true` in a ``, but rather just use `searchString.isEmpty && filter == .all`. (the predicate content closure is not actual Swift code that is executed, it is rather translated into NSPredicate's for CoreData to execute by the macro).

2024-01-05

Asking here so as to not lone wolf it and then returning to reading bigmountainstudio.com/swiftdat (affiliate link). How to get the matching user?

```
ForEach(user.friends, id: \.self) { friend in
            @Query(filter: #Predicate<User> { user in user.id == friend.id }) var matchedUser: User
            NavigationLink(destination: DetailView(user: matchedUser)) {
              Text(friend.name)
            }
          }
```

right now, Xcode tells me "Cannot reference invalid declaration 'friend'"

Andy Finnellandyfinnell
2023-12-29

Using generics to create SwiftData Predicates leads to crashy times. I tried to write something like:

```Swift
func fetch<T>(
by idString: String,
as type: T.Type
) throws -> [T] where T: PersistentModel, T: ObjectStringIdentifiable {
try modelContext.fetch(FetchDescriptor<T>(predicate: { $0.idString == idString }))
}
```

The Predicate macro assumes `idString` is a computed property and crashes at runtime.

Client Info

Server: https://mastodon.social
Version: 2025.07
Repository: https://github.com/cyevgeniy/lmst