Here’s a situation most of us have been in: you’re trying to track down context for a project. You remember an email thread about it, a calendar invite with the meeting notes, and a blog post someone shared via RSS. But those three pieces of information live in three completely separate search interfaces. You end up tab-hopping, copy-pasting search terms, and reassembling the picture manually.
That workflow is broken by design. We set out to fix it.
The Silo Problem
Most email clients treat mail, feeds, and calendar as independent modules that happen to share a window. Search reinforces this — you search your inbox, or you search your calendar, or you scroll through your RSS reader. There’s no unified view of everything that happened around a particular topic or date.
This isn’t a small inconvenience. Context fragmentation is one of the biggest hidden costs of modern knowledge work. When you can’t search across all your information at once, you make decisions with incomplete context.
Universal Search: One Box, Three Content Types
The latest version of cji.email introduces Universal Search — a single search interface that queries your emails, RSS feed entries, and calendar events simultaneously.
Type a search term in the global search box and you get a unified, date-sorted result list that spans all three content types. The chronological ordering is intentional: it helps you see the relationship between things. That calendar meeting appears right next to the email thread that preceded it, and the RSS article that followed it up. The timeline tells a story that siloed search never could.
Instant Filtering, No Round-Trips
Once you have results, you might want to narrow down by content type. We’ve added filter tabs — All / Mail / Feeds / Calendar — that let you focus on one source at a time.
The key engineering decision here was to perform filtering entirely on the client side. When you click “Calendar,” we don’t fire off a new query to the Rust backend. We filter the already-fetched result set in memory, in the Svelte layer. The result: tab switching is genuinely instant — no spinner, no IPC round-trip, no latency.
For large result sets this matters enormously. It’s the difference between a filter that feels like a tool and one that feels like a page reload.
Deep Links That Go Exactly Where You Expect
Every result in Universal Search is a direct link into the relevant part of the app. Click an email result and you land in the thread view for that message. Click an RSS result and the feed entry opens. Click a calendar result and the event detail panel appears.
This sounds obvious, but it’s easy to get wrong. Search results that open a “search mode” or dump you at the top of a list are a dead end. We built the deep-link routing first, before we built the search UI, because getting navigation right is what makes search actually useful.
Resilience by Design
We also invested in making Universal Search robust to partial failures. Each of the three data sources — mail, feeds, calendar — operates and fails independently. If your RSS sync is mid-refresh or a feed throws an error, that doesn’t block or slow down your email search results. You’ll see whatever is available, clearly labeled by source.
This fault isolation is especially important for users with a large number of RSS subscriptions, where feed-level errors are a routine occurrence. Universal Search stays useful even when the data isn’t perfect.
The Bigger Picture
Universal Search is part of a broader vision for cji.email: that your email client should be the single place you go to make sense of your information, not just one silo among many. We’re building toward a future where you can search across everything — including notes, tasks, and contacts — from the same box.
We’re curious what you’d want to search for. Share your thoughts with us.