Most RSS readers are built like email. New items pile up. The unread count climbs. You feel pressure to clear it — or guilt when you can’t. Six months later you have an inbox of 4,000 articles you’ll never read.
Jorvik Daily News is built like a newspaper instead. Each morning’s edition is what your feeds published today. The ones from yesterday rotated off the front page. The ones from last week are gone. There is no backlog, because newspapers don’t backlog.
It’s an opinionated reader, and the opinion is this: read what catches your eye, and let the rest go.
Today’s paper, not today’s inbox
The app publishes one edition a day. Articles dated within the local calendar day flow into the paper; items older than midnight don’t appear, however unread they are.
Through the day, feeds re-fetch on each clock-hour boundary — 09:00, 10:00, 11:00 — and new same-day items accumulate into the running edition. The fetch timer re-arms after wake-from-sleep so updates don’t miss during long computer sleeps.
The front page leads with a single dominant story (image-preferring, recency-weighted), and a three-column masonry grid of secondary stories flows below. Sections beyond the front page get their own pages, navigable with commandleft and commandright or with the floating page indicator at the bottom of the viewport.
Sections that learn
Every feed belongs to a section: News, Tech, Culture, Business, Sport — or any custom section you create. Each section becomes a page in the edition.
Behind the scenes, an in-app classifier learns from the moves you make. Right-click any article, choose Move to…, pick a section, and two things happen: that article is pinned to that section permanently, and the classifier trains on the move. After three sections each accumulate three or more training documents, the classifier starts predicting sections for new articles automatically. Until then, articles fall back to their feed’s declared section.
The classifier is heuristic, not magical — a naive Bayes implementation with Laplace smoothing, English stopword filtering, and a length filter on tokens. It’s wrong sometimes. When it is, you correct it once and it learns. The model is yours; nothing leaves your Mac.
A reader, not a redirect
Click a headline and the paper makes way for a clean reading view — not a modal, not a popup, just the article. Mozilla’s Readability extracts the main content from the source page; a serif stylesheet renders it at a fixed 680 pixel column width, dark-mode aware.
No ads. No trackers. No pop-ups. JavaScript is disabled in the reader pane, so nothing on the page can run — not even the keychain prompts some sites push for “WebCrypto Master Key” access. The reader uses ephemeral WebKit sessions, so no cookies, local storage, or site data persist across sessions.
If Readability can’t parse the page (paywalled sites, JavaScript-rendered SPAs, strange CMSes), the reader falls back to the feed’s summary plus an Open in Browser button. You always have a way through to the original article.
Feeds without anxiety
Feed management is its own pane. You can:
- Add a feed by URL — either the feed’s direct URL or just the website’s homepage. The app discovers feeds via
<link rel="alternate">tags, with fallback probing for common paths (/feed,/rss,/atom.xml, etc.). If a stored feed URL stops working, the app re-runs discovery automatically and updates the URL if it finds a working one. - Pause a feed instead of deleting it. Pausing hides its items immediately and stops the fetcher; un-pausing brings it back. Useful for noisy sources you want to silence for a while without losing the subscription.
- Move feeds between sections, including to brand-new sections you create on the fly.
- Search the list by title, URL, or section in real time.
- Bulk import via OPML and export the same way. Import is dedup-safe both within the file and against your existing feeds, so an OPML that lists the same feed under three categories adds it once.
Each feed shows a health pill next to its name — green if its most recent fetch succeeded, amber if it’s currently failing but succeeded within the last 30 days, red if it’s been failing for longer or has never succeeded. The pill makes a 300-feed collection actually manageable: at a glance you can see which sources have gone dark.
Quietly good plumbing
Things you don’t notice unless they’re absent:
- Dual format support. RSS 2.0 and Atom 1.0 from a single parser.
- Flexible date parsing. ISO8601 (with or without fractional seconds), RFC822 in all its dialect variants, and a date-only fallback. Undated items rank last on the front page rather than masquerading as “newest”.
- Aggregator target resolution. When a feed item points at a Hacker News, Reddit, Lobste.rs, or Slashdot discussion, the reader extracts the underlying article URL and shows that instead. The discussion is still one click away via Open in Browser.
- Image enrichment. Items without a feed-supplied image get an
og:image/twitter:imagelookup against the article URL. Bounded to the top stories per refresh so it stays fast. - Smart image selection. When feeds ship multiple image sizes (looking at you, Guardian), the largest declared size wins if it’s 400 px or wider. Sub-48-pixel images (tracking pixels, broken CDN placeholders) are rejected.
- Cross-feed deduplication. The same article appearing in two feeds (very common in tech) is collapsed by canonical link before it reaches the page.
- Round-robin feed ordering. After dedup, items distribute across feeds so no single source dominates the front page.
- HTML entity decoding. No more
’in your headlines.
What it doesn’t do
- No cloud, no account, no sync. Everything lives under
~/Library/Application Support/JorvikDailyNews/—feeds.json, daily edition archives, read-state, classifier state. All JSON, all on-device. - No telemetry, no analytics, no crash reporters. The app does not phone home. Nothing about your reading habits ever leaves your Mac.
- No JavaScript execution in the reader. Sites you read can’t track you, can’t mine cryptocurrency in the background, can’t prompt for keychain access.
- No unread counters or notification badges. Nothing nags you. Nothing judges you.
- No subscription. It’s free. The source is on GitHub.
Keyboard shortcuts
| Shortcut | Action |
|---|---|
| commandN | Add a feed |
| commandR | Refresh now |
| shiftcommandF | Manage feeds |
| shiftcommandO | Import OPML |
| shiftcommandE | Export OPML |
| command1 | Front page |
| commandleft / commandright | Previous / next page in the edition |
| esc | Back to the paper from the reader |
Auto-update
Updates are handled by Sparkle. The app checks for new versions automatically once a day in the background and surfaces them as a non-modal alert. You can also trigger a check from Jorvik Daily News → Check for Updates… at any time.
Requirements
macOS 14 (Sonoma) or later. Universal binary (Apple Silicon and Intel).
Installation
The recommended path is the installer — it bypasses macOS’s download quarantine and App Translocation, so the first launch is clean.
- Download JorvikDailyNews.pkg and double-click to install
- Launch Jorvik Daily News from your Applications folder
- Add a feed (commandN) or import an OPML file (shiftcommandO) to begin
If you prefer the .zip: download JorvikDailyNews.zip, unzip, and drag Jorvik Daily News.app to Applications. Subsequent updates flow through Sparkle either way.
Building from source
Jorvik Daily News builds via the shared Jorvik release.mk. With the jorvik-release sibling repo cloned alongside it and GNU Make 4 installed:
- Clone the repo:
git clone https://github.com/PerpetualBeta/JorvikDailyNews.git - Run
gmake release - The signed, notarised, stapled
.pkgand.zipland in.build/