diff --git a/README.md b/README.md index bdb211c..5886d25 100644 --- a/README.md +++ b/README.md @@ -6,29 +6,32 @@ or write a daily briefing. It's meant to replace the n8n → Discord workflow. ## Features (prototype) -- **Today**: all articles from the enabled sources in the last 12/24/48 h, newest - first. Filter by language or source, pull to refresh. -- **Learn**: articles from the enabled Learning sources (engineering blogs, - system design explainers, AI research write-ups) from the last 14 days, newest - first. Learning sources aren't part of the Briefing. +- **Today**: all articles from the enabled News sources in the last 12/24/48 h, + newest first. Filter by language or source, pull to refresh. +- **Learn**: two sections, newest first. **Learning** has posts from the enabled + Learning sources (engineering blogs, system design explainers, AI research + write-ups) from the last 14 days; **Fun** has comics, memes and IT horror + stories from the enabled Fun sources from the last 3 days. Neither is part of + the Briefing. - **Reading in the app**: tapping an article opens a clean **reader view** (text, headings, lists, quotes, images) without ads or cookie banners. The globe icon switches to the **original page** in an in-app WebView, for paywalls or sites that block reader view. **Summarize with AI** uses the same downloaded text, so the summary is based on the full article, not just the RSS teaser. Links in the briefing open the same way. -- **Briefing**: AI picks the 6–10 most important stories of the day, merges - coverage from different outlets, and links every topic to its sources. Every - briefing is saved on the device (`briefings.json` in the app's private - storage); the history button lists them by month, tap to read, swipe to delete - (with undo). +- **Briefing**: AI picks the 6–10 most important stories of the day from the + News sources, merges coverage from different outlets, and links every topic to + its articles. Every briefing is saved on the device (`briefings.json` in the + app's private storage); the history button lists them by month, tap to read, + swipe to delete (with undo). - **Paid articles and ads hidden**: heise+ and Golem `(g+)` are recognized by their title; SPIEGEL+ and t3n Pro by a marker in the article page, which the app checks once per new article in the background (it reads only until the marker, - and remembers results for 14 days). Paid-subscriber posts from Substack newsletters + and remembers results for 14 days). Paid-subscriber posts from Sources on Substack (Interconnects, Ahead of AI, …) are recognized in the feed itself, where Substack cuts them off with a "Read more" link. Sponsored posts (`Anzeige:`) are hidden too. - The feed header shows how many were hidden; both filters can be turned off. + The header of Today and of each Learn section shows how many were hidden; both + filters can be turned off. - **Ad and cookie-banner blocking** in the original-page view: requests to ~80 ad/tracker hosts and the common consent managers (Sourcepoint, OneTrust, consentmanager, Usercentrics, Didomi, Cookiebot, …) are blocked, and a @@ -38,16 +41,17 @@ or write a daily briefing. It's meant to replace the n8n → Discord workflow. same request as Golem's own "Zustimmen" button (`/abo/setconsentcookie.php`, valid for a day) and reuses the cookie for reader view and the in-app page. With it off, the app shows the teaser and an "Open website anyway" option. -- **Sources**: 23 curated feeds (13 German, 10 English), toggle each one, or add any - RSS/Atom feed as a News, Learning or Fun source (it's validated before being - added). The tab groups Sources by kind, then by language. +- **Sources**: 42 curated Sources (13 German, 29 English): 23 News, 16 Learning + and 3 Fun sources. Toggle each one, or add any RSS/Atom feed as a News, + Learning or Fun source (it's validated before being added). The tab groups + Sources by kind, then by language. - **Dark mode**: System / Light / Dark in Settings (applies instantly). The original-page view follows it too: when the phone is dark, sites use their own dark design or Android darkens them; when only the app is dark, the app inverts the page colours and keeps photos and videos as they are. - **Settings**: AI provider (off / Claude API / n8n webhook), model, summary - language (German/English, whatever the source language), time window, paid/ad - filters, ad and cookie-banner blocking. + language (German/English, whatever the source language), time window for News, + paid/ad filters, ad and cookie-banner blocking. ## Running @@ -236,8 +240,8 @@ Reddit blocks reader view, so a meme shows the picture from the feed. ``` lib/ main.dart App entry, theme - data/default_sources.dart Curated feed list - models/ Article, Source, DailyBriefing, AppSettings + data/default_sources.dart Curated Source catalog (News, Learning, Fun) + models/ Article, Source and its kind, DailyBriefing, AppSettings services/ feed_parser.dart RSS 2.0 / RSS 1.0 / Atom parser, date parsing feed_service.dart Parallel fetching, dedupe, time window @@ -246,9 +250,17 @@ lib/ claude_summarizer.dart Claude Messages API over HTTP n8n_summarizer.dart n8n webhook bridge storage.dart Settings, sources, briefing persistence - paywall_service.dart Paid/sponsored detection (titles + page marker) + paywall_service.dart Paid/sponsored detection (titles, Substack cut-off, page marker) content_blocking.dart Ad/tracker/consent blocklists for the WebView consent_service.dart Accepts consent walls (Golem) and keeps the cookies state/app_state.dart ChangeNotifier holding app state - ui/ Screens (Today, Article, Briefing, Sources, Settings) + ui/ + home_shell.dart Tabs: Today, Briefing, Learn, Sources, Settings + feed_screen.dart Today: News articles with language/source filters + briefing_screen.dart Briefing (briefing_history_screen.dart: saved ones) + learn_screen.dart Learn: Learning and Fun sections + sources_screen.dart Sources by kind and language, adding a Source + settings_screen.dart Settings + article_screen.dart Reader view and original page + common.dart Shared helpers and widgets ```