pageta/docs/FEED.md
Till JS 05dc5d7c33 feat: Feed + Recherche dormant stellen, Landing entsprechend bereinigen
Der kuratierte Feed widerspricht Pagetas eigenem Versprechen (kein
Engagement-Feed) und war der commodity-Teil der App. Die Recherche pinnte
RSS-Feeds an, die nie gelesen wurden — feed.ts zog nur aus mana-news-pool,
customFeeds wurde nie gefetcht. Beide Flächen daher aus der Nav genommen,
Code/Endpoints bleiben dormant im Repo.

- web: Feed- + Recherche-Tab aus +layout.svelte raus (Routen bleiben)
- docs/FEED.md: Begründung + Revival-Bedingung (mana-discover-Andockung)
- CLAUDE.md: Use-Case-Liste ehrlich gemacht
- landing: Feed/RSS aus Copy (app.ts, index.astro, ueber.astro) — zentriert
  auf Lese-Liste + Markierungen + Pocket-Umzug; ueber.astro nennt den
  Feed-Rückbau transparent

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 13:53:57 +02:00

107 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FEED.md — Feed und Recherche sind geparkt
**Status:** dormant seit 2026-06-01. Weder Feed noch Recherche sind in der
Navigation (web + native). Code, Endpoint und Scoring-Engine bleiben im
Repo, werden aber nicht gebaut/gewartet, bis die Revival-Bedingung unten
erfüllt ist.
> Die Recherche ist mitgeparkt, weil sie ohne den Feed ins Leere lief —
> siehe Abschnitt „Recherche" unten.
## Was der Feed war
Ein kuratierter Nachrichten-Strom aus dem zentralen `mana-news-pool`,
personalisiert über eine transparente Regel-Engine:
```
score = max(recency, 0.05) × topicWeight × sourceWeight
```
7 feste Themen (tech, wissenschaft, weltgeschehen, wirtschaft, kultur,
gesundheit, politik) mit je ~34 kuratierten Quellen. Hard-Filter
(selectedTopics, blockedSources, Sprache, weggewischte Artikel) vor dem
Scoring, danach absteigend sortiert. Jede Reaktion („interessiert mich" /
„nicht") justierte die Gewichte in der `preferences`-Tabelle nach. Kein
ML, keine Black-Box — deterministisch und nachvollziehbar.
## Warum geparkt
Zwei Gründe, der erste wiegt schwerer:
1. **Werte-Spannung.** Pagetas ganzer Pitch (VISION.md): „du bestimmst,
was auftaucht, kein Engagement-Algorithmus." Ein kuratierter
Vorschlags-Strom *ist* aber genau die Sorte Feed, die die App
ablehnt — nur ein ehrlicher. Er fühlt sich fremd an, weil er es ist.
2. **Commodity-Charakter.** Lese-Liste (Pocket-Style) und Recherche
(RSS-Discovery) sind das Eigene, das sonst keiner so baut. Generische
Welt-News kann jeder RSS-Reader. Der Feed war der schwächste, am
wenigsten differenzierende Teil — Pflege-Aufwand für etwas, woran wir
nicht glauben.
Entscheidung: **ganz raus aus der Default-Nav, Code dormant, dieser
Doc.** Bewusst *kein* Settings-Opt-in-Flag — ein geflaggtes Feature muss
weiter mitlaufen (Endpoint, Scoring, web+native-Parität) und zahlt bei
jedem Refactoring Steuer. Dormanter Code zahlt nichts.
## Revival-Bedingung
Der Feed kommt zurück, **wenn er kein Welt-News-Aggregator mehr ist,
sondern Entdeckung im mana-Ökosystem** — angedockt an `mana-discover`
(Cross-Discovery-Katalog, Port 3127, siehe `mana/`-Spec). Also:
> „Was gibt's Neues bei mana" statt „was passiert auf der Welt."
Das wäre on-mission (eigene Inhalte, kein Engagement-Sog) und eigen statt
austauschbar. Bis dahin bleibt der Feed aus.
Ein simples „den alten generischen News-Feed wieder anschalten" ist
**kein** ausreichender Grund — das brächte die Werte-Spannung zurück.
## Recherche (mitgeparkt)
Die „Recherche" entdeckte RSS-Feeds zu einer Seite/einem Thema und ließ
dich sie anpinnen (`preferences.customFeeds`). **Diese angepinnten Feeds
wurden aber nie gelesen:** `apps/api/src/routes/feed.ts` zieht
ausschließlich aus `mana-news-pool` (Pool-Query nutzt `selectedTopics` /
`lang`, nicht `customFeeds`). Schon als der Feed live war, tauchten
angepinnte Feeds dort nicht auf — Recherche pinnte ins Leere.
Darum ist die Recherche mit dem Feed zusammen dormant gestellt: ohne
Lese-Ort ist „RSS-Feeds finden und abonnieren" ein halbes Versprechen.
Route `/recherche` + `apps/api/src/routes/research.ts` bleiben im Repo.
**Revival:** entweder einen echten Lese-Ort für angepinnte Feeds bauen
(dann ist „abonnieren und lesen" wahr), oder die Recherche zusammen mit
dem mana-discover-Feed neu denken.
## Was dormant im Repo liegt
| Teil | Pfad |
|------|------|
| Web-Route + UI | `apps/web/src/routes/feed/+page.svelte` |
| Web-API-Call | `apps/web/src/lib/api.ts``feed(limit)` |
| Backend-Endpoint | `apps/api/src/routes/feed.ts` (`GET /api/v1/feed`) |
| Scoring-Engine | `packages/pageta-domain/src/feed-engine.ts` |
| Topics + Quellen | `packages/pageta-domain/src/sources.ts` |
| User-Prefs | `apps/api/src/routes/preferences.ts` |
| Reactions | `apps/api/src/routes/reactions.ts` |
| Recherche-Route + UI | `apps/web/src/routes/recherche/+page.svelte` |
| Recherche-API | `apps/api/src/routes/research.ts` |
| Native View | `../pageta-native/Sources/Features/FeedTabView.swift` |
| Native Reader | `../pageta-native/Sources/Features/FeedItemReaderView.swift` |
| Native API-Call | `../pageta-native/Sources/Core/API/PagetaAPI.swift``fetchFeed` |
Nicht entfernt, nur abgehängt — siehe Kommentare in
`apps/web/src/routes/+layout.svelte` und
`../pageta-native/Sources/App/RootView.swift`.
## Wenn du den Feed reaktivierst
1. Revival-Bedingung erfüllt? (mana-discover-Andockung, nicht generische News)
2. Web: Tab-Eintrag in `apps/web/src/routes/+layout.svelte` wieder
einfügen (ICON.feed steht schon).
3. Native: `.feed` zurück in `iosTabs` (RootView, iOS) und `macSidebar`
(RootView, macOS); iOS-TabView-Block wieder ergänzen; Siri-Shortcut in
`AppShortcuts.swift` ggf. anpassen.
4. Diesen Doc auf den neuen Stand bringen.