Skip to content

How it works

From feed to front page, showing its working.

Every step is local, inspectable and open source. The only step that leaves your computer is the one you choose: sending a few short excerpts to your AI provider.

The pipeline

  1. 1Feeds63 open sources
  2. 2Ingestionpolite, cached
  3. 3Storageheadline + 500 chars
  4. 4Clusteringsame event
  5. 5Rankingtopics, diversity
  6. 6Editionsnapshot + reasons
only the edition's stories, only if you added a provider
  1. 7Your AI providersanitised evidence in
  2. 8Cited statementsstructured JSON out
  3. 9Validatormechanical check
  4. 10Readeror discarded

01Collecting

Open feeds, fetched politely.

Fresh News reads 63 RSS and Atom feeds across geopolitics, technology, science, economics and positive developments. There is no news API and no account. Requests are conditional and cached, each feed is fetched at most every 30 minutes, and a block, a paywall or a rate limit is treated as a no.

Stored per report
headline, link, date, outlet, summary cut to 500 characters
Never stored
full article text
When a feed fails
shown in Settings > Sources, with retry or switch-off

02Grouping

One event, counted honestly.

Reports about the same event are clustered together. Each source belongs to an independence group, its syndication or ownership family, so twenty copies of one wire story count as one outlet, not twenty.

Counts
independent outlets, not articles
Needed to write a story
reports from at least two independent outlets
Good news on one outlet
allowed only if labelled Single source

03Ranking

A short list, with its reasons.

Your edition is ranked by importance, your topic weights, recency and diversity, then frozen as a snapshot. Every story gets a plain-language reason, so nothing is there for reasons you cannot see.

Signals
importance, topic weight, recency, diversity
You control
size, positive-news balance, hiding seen stories
Example reason
"Reported by 4 independent outlets"

04Writing

Evidence in, cited statements out.

Only the selected reports are sent to your provider: outlet, date, headline and short summary. Text that looks like instructions is withheld. The model never writes Markdown or links; it returns structured statements, each pointing at the reports it relies on, and the app renders them.

Sent
outlet, date, headline, summary of the chosen reports
Never sent
article text, URLs, your data, other stories
Shown with every story
sources, model, prompt version, check result

05Checking

Six checks on every statement. One repair. Then out.

Before a story reaches you, each statement is compared mechanically with the reports it cites. If anything fails, the model gets one chance to repair it. If it still fails, the story is discarded, not shown with a warning.

  1. check 01

    Numbers

    Every figure appears in a cited report.

  2. check 02

    Dates

    Days, months and years match the sources.

  3. check 03

    Names

    People, places and organisations are in the cited text.

  4. check 04

    Quotations

    Quotes are verbatim, short and attributed.

  5. check 05

    Support

    Each statement cites at least one real report.

  6. check 06

    Markup & language

    No links, HTML or instructions smuggled in.

What it catches

Invented numbers, dates, names and quotes; statements with no real source; links, HTML or instructions smuggled into the output.

What it cannot catch

A paraphrase that reverses a relationship. And it cannot prove a story is right: it can only show it is grounded in what the outlets said.

06Asking & cost

Answers from the archive, not the internet.

A question retrieves up to a dozen stored reports and sends them, with the last three turns of the thread, to your provider. The answer must cite them and is checked like a story. If the reports are not enough, it says so.

Quality over cost.

Only edition stories are written. Results are cached, and nothing regenerates unless the evidence or the model changes. Automatic and scheduled writing are off until you turn them on.

Under the hood

Rust at the core. Tested to the edges.

A Tauri 2 desktop shell over a set of Rust crates, a React 19 interface, and a SwiftUI iPhone app with its own testable core. Every design decision is recorded as an ADR in the repository.

290
Rust tests
236
Frontend tests
34
iOS core tests
  • crates/news-ingestionFeed fetching, parsing, source health
  • crates/story-engineClustering, ranking, editions, generation
  • crates/ai-coreProviders, prompts, validation
  • crates/storageSQLite, migrations, backups, search
  • crates/schedulerSchedule rules, DST, catch-up
  • crates/syncCross-device contracts and merge
  • crates/domainTypes, rules, text utilities
  • apps/desktopTauri 2 shell + React 19 UI
  • apps/iosSwiftUI companion + FreshNewsCore

Tomorrow morning

Read less. Understand more.

Set a time, pick your topics, and wake up to a short edition where every sentence shows its source.