Die Plattform wird persönlich — eine Startseite, die mitlernt, ein Profil mit Bedeutung und ein Einblicks-Layer für Autor:innen
Foto: Unsplash
Die letzten Wochen hatten ein klares, großes Zentrum: aus einem 42-Geschichten-Flagship-Katalog wurde eine richtige Bibliothek mit Tausenden gemeinfreien Klassikern. Das war Infrastruktur — viel Bestand, gegen den die App von Anfang an gefüllt wirkt. Die letzten gut anderthalb Wochen drehten sich um die andere Hälfte derselben Idee: nicht mehr Geschichten, sondern die richtigen Geschichten für die richtige Leser:in. Anders gesagt — OutaStory wurde persönlich.
Das klingt nach einem Marketing-Satz, ist aber sehr konkret gemeint und betrifft fünf Schichten, die in dieser Zeit gebaut wurden und ineinandergreifen: eine Startseite, die mitlernt; ein Profil, das tatsächlich etwas bedeutet (Geburtstag, Adresse, Lieblingskategorien, frei gewählte Interessen); ein Einblicks-Layer für Autor:innen, der zeigt, wer ihre Geschichten wie liest; ein breiterer Genre-Baum mit frischen Beispielgeschichten, damit jede Ecke bestückt ist; und drei neu geschriebene Über-uns-Seiten plus eine Datenschutz-Inventur, die das alles transparent hält. Der Reihe nach.
Eine Startseite, die mitlernt — in drei Schichten gebaut
Bisher war die OutaStory-Startseite für alle gleich: oben ein Promo-Banner, dann eine feste Folge von Discovery-Reihen (Empfehlungen, Trending, Neuerscheinungen, Top-bewertet, Kategorie-Reihen, fremdsprachige Geschichten). Eine gute, aber statische Anordnung. Seit dieser Woche ist die mittlere Discovery-Region personalisiert — und zwar in drei sauber getrennten Ausbaustufen, jede mit eigenem Pull-Request und eigener Review-Schleife.
Stufe 1 — die Engine. Im Kern steht ein PersonalizedHomeBuilder, der pro Besucher:in ein „Interessen-Profil" zusammensetzt: welche Kategorien, welche Autor:innen und welche Geschichten-Längen jemand bevorzugt. Daraus generiert ein RailGenerators-Modul eine Reihe von Empfehlungs-Schienen — „Mehr aus Fantasy", „Trending in Science-Fiction", „Weil du gerne Kurzgeschichten liest", „Mehr von Autorin X". Die ersten Schienen werden serverseitig sofort befüllt; die unteren werden per signiertem Token erst beim Herunterscrollen nachgeladen, damit der erste Bildaufbau schlank bleibt. Das Ganze ist hinter einer Laufzeit-Feature-Flag (personalized-home-enabled), die in der geschlossenen Testphase standardmäßig an ist — wer mag, kann das auf /developer/feature-flags umschalten.
Stufe 2 — Web-Rendering und der anonyme Pfad. Die zweite Stufe brachte die tatsächliche Darstellung im Web — eine PersonalizedHome-Komponente, die die Schienen rendert, Lazy-Reihen über einen Intersection-Observer nachlädt und Skelett-Karten zeigt, solange eine Reihe noch lädt. Wichtig dabei: der personalisierte Feed funktioniert auch ohne Anmeldung. Anonyme Leser:innen bekommen über eine stabile, im Browser gehaltene Anon-ID einen idempotenten, gleichbleibenden Feed — keine Konto-Pflicht, kein Tracking über Geräte hinweg, nur ein lokaler Schlüssel, der das Verhalten dieser Session zu Empfehlungen verdichtet.
Stufe 3 — anonymes Mitlernen, Frisch-Signal-Overlay und „Leser:innen wie du". Die dritte Stufe ist die interessanteste. Hier lernt die Engine wirklich aus dem Verhalten — aus abgeschlossenen Lesevorgängen, aus dem, was gerade frisch gelesen wurde (ein „Recent-Signal-Overlay", das neue Signale über das nächtlich berechnete Basis-Profil legt, ohne auf den nächsten Batch zu warten) — und sie kann eine demografische „Leser:innen wie du"-Schiene anbieten: Geschichten, die bei Menschen mit ähnlichem Alters-, Geschlechts- und Länder-Profil gut ankommen. Diese demografische Schiene ist bewusst privatsphäre-gebunden: sie erscheint nur für erwachsene, angemeldete Nutzer:innen, und nur, wenn die Vergleichsgruppe groß genug ist (eine k-Anonymitäts-Schwelle von mindestens zehn Leser:innen) — sonst zeigt OutaStory die Schiene gar nicht erst an. Keine Empfehlung wird auf Basis einer zu kleinen, identifizierbaren Gruppe gebaut.
Was dabei wichtig war und ein eigener Aufwand: die Startseite darf nie leer wirken. Für eine brandneue Besucher:in ohne jede Historie gibt es noch nichts zu personalisieren — und in dem Fall fällt die Seite sauber auf die klassische Discovery-Anordnung zurück, statt eine leere personalisierte Region zu zeigen. Personalisierung ist eine Verbesserung über dem soliden Standard, kein Ersatz, der bei fehlenden Daten ins Nichts läuft.
Ein Profil, das etwas bedeutet
Foto: Unsplash
Personalisierung braucht etwas, woraus sie lernen kann. Deshalb lief parallel ein zweiter großer Strang: das OutaStory-Profil ist vom reinen Anzeigenamen-plus-Bio zu einem echten Profil gewachsen — in drei Ausbaustufen, die wir intern SP1, SP2 und SP3 genannt haben.
SP1 — Alter und Jugendschutz nach Art. 8. Die erste Stufe ist die heikelste und die, bei der wir am vorsichtigsten waren. OutaStory ist eine deutsche Plattform unter der DSGVO und bedient bewusst auch Minderjährige. Die neue Alters-Engine (AgeCalculator, MinorAccessDecision, eine ParentalConsent-Strecke mit E-Mail an die Erziehungsberechtigten) erlaubt es, einen Geburtstag zu erfassen, daraus das Alter zu berechnen und Konten unter 16 Jahren hinter eine verifizierbare elterliche Einwilligung zu stellen (Art. 8 DSGVO, deutsche Altersschwelle 16). Diese Engine ist vollständig gebaut, aber bewusst hinter einem standardmäßig ausgeschalteten Flag — sie geht erst live, wenn unsere Datenschutzbeauftragte die konkrete Verifikations-Methode freigegeben hat. Lieber dunkel ausliefern und sauber freischalten als unausgereift scharf stellen.
SP2 — die Kern-Profilfelder. Geburtstag, Geschlecht (frei wählbar, inklusive „divers" und „keine Angabe"), Adresse (Straße, PLZ, Stadt, Land) und Lieblingskategorien. Alles bearbeitbar über die Profilseite, alles optional in der Standard-Konfiguration. Diese Felder sind keine Selbstzweck-Datensammlung — sie sind genau die Achsen, entlang derer die demografische Empfehlungs-Schiene oben überhaupt erst funktioniert. Wer nichts angibt, bekommt eine etwas weniger spezifische Startseite; wer mag, bekommt eine genauere.
SP3 — frei gewählte Interessen: Beruf, Musik, Hobbys. Die dritte Stufe brachte drei kuratierte Interessen-Kataloge in das Profil: Berufsgruppen (an der europäischen ESCO-Klassifikation orientiert), Musikgenres und Hobby-Kategorien — jeweils als Mehrfach-Auswahl mit lokalisierten Namen. Und hier schließt sich der Kreis zur Startseite: jede dieser Achsen kann eine eigene Empfehlungs-Schiene speisen — „Beliebt bei Jazz-Fans", „Beliebt bei Leser:innen mit demselben Beruf". Pro Interessens-Typ erscheint höchstens eine Schiene, und es gilt dieselbe k-Anonymitäts-Schwelle und dasselbe 18+-Tor wie bei der demografischen Schiene. Interessen sind freiwillig, die Empfehlungen daraus sind ein angenehmer Nebeneffekt, kein Zwang.
Der eigene Avatar — endlich hochladbar
Ein kleiner, aber lang gewünschter Baustein: das Profilbild lässt sich jetzt selbst hochladen. Bisher kam der Avatar ausschließlich aus dem Anmelde-Anbieter; ein „Bild ändern"-Knopf war zwar da, tat aber nichts. Jetzt öffnet er einen Datei-Dialog, das Bild wird serverseitig auf Typ und Größe geprüft, läuft durch unsere bestehende Bild-Inhaltsprüfung (Azure Content Safety) — eine harte Sperre lässt ein unangemessenes Bild gar nicht erst in den Speicher — und landet in einem privaten Blob-Container, von wo es über einen eigenen Proxy ausgeliefert wird. Das hochgeladene Bild gewinnt danach überall gegen das Anbieter-Bild. Klein, aber es macht ein Profil sofort persönlicher.
Ein Einblicks-Layer für Autor:innen
Foto: Unsplash
Wenn Leser:innen eine persönlichere Startseite bekommen, sollten Autor:innen verstehen, wie ihre Geschichten gelesen werden. Deshalb entstand in dieser Zeit ein kompletter Analyse- und Einblicks-Layer — in zwei Hälften.
Die erste Hälfte ist ein Analytics-Bereich für die Plattform (/management/analytics), in fünf Ausbaustufen gebaut: eine Charting-Grundlage und ein Dashboard-Hub (P0), ein Lese-Dashboard mit Zeit-, Plattform- und Kategorie-Auswertung (P1a), eine Lesegeschwindigkeit in Wörtern pro Minute (P1b, inklusive Wortzähl-Erfassung), ein „Explorer" zum Hineinbohren von Kategorie → Geschichte → Kapitel → Seite (P1c) und schließlich Audio-, Geo-, Engagement- und Pro-Autor-Dashboards (P2–P5). Das alles speist sich aus den ohnehin erfassten, datensparsamen Lese-Ereignissen — keine zusätzliche Telemetrie, sondern eine bessere Auswertung dessen, was wir schon haben.
Die zweite Hälfte ist die für Autor:innen direkt sichtbare: eine Story-Insights-Seite (/profile/insights), die jeder angemeldeten Autor:in die eigenen Zahlen zeigt — Lesezugriffe, abgeschlossene Lesungen, Lesezeit, Lesegeschwindigkeit, „Weiterlesen"-Klicks, wann am Tag gelesen wird, auf welcher Plattform, ob gelesen oder gehört wird, woher die Leser:innen kommen, und — wo die Datenbasis groß genug ist — eine demografische Aufschlüsselung. Wer noch keine Geschichten veröffentlicht hat oder im gewählten Zeitraum noch keine Lesevorgänge sammelt, sieht keinen kryptischen Nullen-Wald, sondern einen klaren Hinweis: „Hier ist noch nichts — sobald jemand deine Geschichten liest, erscheinen die Zahlen."
Wichtig bei beidem: dieselbe k-Anonymitäts-Disziplin wie bei der Personalisierung. Eine demografische Aufschlüsselung erscheint nur, wenn dahinter genug Leser:innen stehen, dass keine Einzelperson erkennbar wird.
Mehr Genres, mehr Geschichten in jeder Ecke
Foto: Unsplash
Eine personalisierte Startseite ist nur so gut wie der Katalog, aus dem sie schöpft. Wenn jemand „Science-Fiction" mag, aber Science-Fiction nur ein einziger Knoten im Kategorie-Baum ist, bleibt die Empfehlung grob. Deshalb wurde der Fiktions-Teil der Taxonomie deutlich ausgebaut: Science-Fiction wuchs von vier auf einundzwanzig Unter-Genres, und ein eigener Western-Zweig kam dazu. Damit kann die Engine viel feiner unterscheiden — Cyberpunk ist nicht Space Opera, ein Cosy Mystery ist kein Thriller.
Ein neuer, leerer Genre-Knoten wirkt allerdings traurig. Deshalb entstand parallel eine ganze Welle frischer Beispielgeschichten — kurze, zweikapitelige, KI-getaggte Texte, jeweils auf Deutsch und Englisch, pro Genre: Fantasy, Romance, Mystery, Thriller, Horror, Adventure, Western und 36 Science-Fiction-Beispiele. Sie sind klein und klar als Beispiele gekennzeichnet, aber sie sorgen dafür, dass jede Ecke des Baums von Anfang an bestückt ist und sich anfühlt wie ein Ort, an dem etwas passiert — statt wie ein leeres Regal.
Über-uns, neu geschrieben — und für Mensch und Maschine auffindbar
Drei Seiten haben in dieser Zeit eine komplette Überarbeitung bekommen: /about/members, /about/writers und /about/publishers. Vorher waren das Stichpunkt-Listen mit einigen Versprechen, die es so noch nicht gab. Jetzt sind es längere, zusammenhängende Texte, die ehrlich beschreiben, was die Plattform tatsächlich leistet — für Leser:innen (Lesen und Hören, personalisierte Startseite, Hunderte Kategorien, Jugendschutz, Apps auf allen Plattformen), für Autor:innen (Schreib-Werkstatt, KI-Produktionswerkzeuge für Cover/Beschreibung/Vertonung — ausdrücklich nicht fürs Schreiben selbst —, Einnahmen-Beteiligung, Wettbewerbe, die neuen Insights) und für Verlage (eine Plattform, kein konkurrierender Verlag; die Rechte bleiben bei den Autor:innen). Bei den Verlagen war besonders wichtig, ehrlich zu bleiben: kein erfundenes Produkt, sondern eine klare Einladung zum Gespräch.
Technisch bekamen alle drei Seiten vollständige Suchmaschinen- und Social-Media-Metadaten plus strukturierte JSON-LD-Daten (Schema.org AboutPage mit Brotkrumen-Navigation), damit nicht nur Menschen, sondern auch Suchmaschinen und KI-Antwortsysteme verstehen, worum es auf der Seite geht. Das fügt sich in eine breitere SEO/AEO-Welle ein: die kanonische Domain ist jetzt überall www.outastory.com, die Inhalte sind serverseitig als crawlbare Prosa gerendert, und die Story-, Autor- und Kategorie-Seiten tragen reichere strukturierte Daten. Jede Seite bekam außerdem eine eigene, schlichte Illustration im Haus-Stil als Vorschaubild.
Datenschutz, sichtbar gemacht
Mit all diesen neuen Datenfeldern — Geburtstag, Adresse, Interessen, demografische Vergleichsgruppen — wäre es leicht gewesen, die Datenschutz-Seite hinterherhinken zu lassen. Genau das wollten wir vermeiden. Deshalb entstand in dieser Zeit eine vollständige Datenschutz-Inventur: ein code-abgeleitetes Dokument, das jede Kategorie personenbezogener Daten auflistet, die OutaStory erhebt, speichert und teilt — pflicht versus optional, an welche Auftragsverarbeiter sie gehen, wie lange sie aufbewahrt werden und auf welcher Rechtsgrundlage. Aus dieser Inventur wurden acht konkrete Entscheidungen abgeleitet und in verbindliche Regeln übersetzt, darunter:
- Jeder nicht-essenzielle Tracker ist standardmäßig blockiert und feuert erst nach passender Einwilligung — das gilt auch für die Session-Replay-Funktion von Sentry und alle Werbe-Netzwerk-Loader.
- Erstanbieter-Analyse-Daten tragen ein 14-Monats-Aufbewahrungsfenster; Moderations-/Missbrauchs-IPs ein 12-Monats-Fenster — beides mit dokumentierter Rechtsgrundlage und automatischem Löschpfad.
- Datensparsamkeit by default: IP-Adressen werden gesalzen gehasht statt im Klartext gespeichert; geräteübergreifende Erkennung bleibt auf grobe Signale mit täglich rotierendem Salt beschränkt und ist offengelegt.
- Jedes neue personenbezogene Feld muss in drei Stellen gleichzeitig gepflegt werden — den maschinenlesbaren Datenauskunfts-Export, die Inventur und die nutzerseitige Datenschutzerklärung — damit die drei nie auseinanderlaufen.
Das ist keine glamouröse Arbeit, aber sie ist genau die Art von Fundament, die eine Plattform für Leser:innen jeden Alters tragen muss. Und sie passt zur Grundhaltung des Projekts: persönlicher werden, ohne gierig zu werden.
Zahlen zum Stand
- Pull-Requests: rund 55 in den gut anderthalb Wochen seit dem letzten Blog-Post.
- Hauptthemen: personalisierte Startseite (3 Ausbaustufen), erweitertes Profil (SP1 Alter/Art. 8, SP2 Kernfelder, SP3 Interessen), Profil-Attribut-Empfehlungen, Avatar-Upload, Analytics-Bereich (P0–P5) plus Story-Insights für Autor:innen, Kategorie-Ausbau plus genreweise Beispielgeschichten, drei neu geschriebene Über-uns-Seiten plus SEO/AEO-Welle, Datenschutz-Inventur plus abgeleitete Regeln.
- Katalog: der rohtext-Klassiker-Bestand der Vorwochen ist inzwischen live, der Genre-Baum im Fiktions-Teil deutlich feiner, jede Ecke mit Beispielgeschichten bestückt.
- Tests: weiterhin im hohen Drei-Tausender-Bereich an grünen Unit-Tests, Coverage-Gate weiter im Report-Mode.
Was als nächstes
- Personalisierung schärfen — mehr Signal-Quellen, bessere Schienen-Reihenfolge, und die Beobachtung, wie sich der Feed für reale Tester:innen anfühlt, sobald genug Lese-Historie da ist.
- Jugendschutz scharf stellen — die Art.-8-Engine ist gebaut und wartet auf die DPO-Ratifizierung der Verifikations-Methode, bevor das Flag in Produktion angeht.
- Beispielgeschichten kuratieren — die KI-Tags sind gut, aber nicht perfekt; eine Triage-Welle pro Woche schärft die Kategorien und Altersfreigaben.
- App.Shared-Razor-Pages-Tests — der letzte rote Coverage-Eintrag, weiterhin in mehreren Wochen-Wellen.
- Meta-App-Review für Instagram — die Berechtigung zum automatischen Posten steht weiter offen.
Wenn du beim Stöbern auf der Startseite eine Empfehlung siehst, die überhaupt nicht zu dir passt — oder eine, die verblüffend gut passt — sag mir Bescheid. Genau dieses Gefühl, ob der Feed „dich kennt" oder danebenliegt, ist das wertvollste Signal in dieser Phase, und es lässt sich aus keinem Dashboard ablesen.
