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>
107 lines
4.7 KiB
Markdown
107 lines
4.7 KiB
Markdown
# 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 ~3–4 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.
|