- SourceKind carries whether it feeds the Briefing, its fixed time window
(Learning, Fun) and whether reading is picture-led (Fun); windowOf and
the reader read from it.
- AppState.briefingArticles is the one place that says only News sources
feed the Briefing; generateBriefing and the Briefing tab use it.
- articlesOf, hiddenCountOf and briefingArticles share one filter.
- FeedService.fetchAll takes windowOf: like AppState.windowOf.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The class and its file (lib/models/source.dart) follow the glossary term.
Persisted JSON keys are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every Source now has a kind: News, Learning or Fun. Curated Sources default
to News, and custom Sources persist their kind (ones saved before default
to News). Each kind has its own time window: News follows the 12/24/48 h
setting, Learning reaches back 14 days, Fun 3 days.
A new Learn tab between Briefing and Sources lists Learning articles with
the same paid/sponsored filters and reader view as Today. It is built from
a list of kinds so a Fun section can follow. Today and the Briefing only
use News. ByteByteGo is the first Learning source, on by default.
The home shell names its tabs instead of using hard-coded indexes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Flutter app that collects daily tech news from German and English RSS/Atom
feeds, with a reader view, AI article summaries and daily briefings (Claude
API or n8n webhook), paywall/sponsored filtering and ad/consent blocking.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>