Userliste
Banliste
Konten mit gesperrtem Login (is_banned).
Shadowbans
Konten, deren Inhalte für andere unsichtbar bleiben (is_shadowbanned).
🚩 Verdachtsprotokoll
Automatisch erkannte verdächtige Inhalte (Drohungen, Beleidigungen, Betrug …) aus DMs, Kommentaren, Live-Chat, Melde-/Verwarnungs-/Bangründen und Anmeldenamen. DM-Texte sind verschlüsselt gespeichert – hier erscheint nur der geflaggte Snapshot im Klartext.
📝 Wortfilter verwalten (beleidigung-Kategorie)
Wörter, die die automatische Erkennung als „Beleidigung" flaggen. „Treffer" zählt, wie oft das Wort in den letzten 90 Tagen tatsächlich geflaggt wurde.
Massenimport (ein Wort pro Zeile)
🎥 Vision-KI-Moderation (Live-Streams)
YOLO-Worker erkennt Objekte in Live-Stream-Frames (Waffen, Alkohol, …) und meldet sie hier. Aktionen (log/warn/mute/end) laufen automatisch nach den Regeln unten — diese Liste ist die menschliche Nachkontrolle.
⚙️ Regeln je Klasse (Schwellenwert/Aktion)
Ab welcher Konfidenz (0.0–1.0) welche Aktion automatisch ausgeführt wird. „Aufeinanderfolgend" = so viele Treffer der Klasse in Folge nötig, bevor die Aktion greift (verhindert Fehlalarme durch Einzelframes).
🛡 Compliance-Audit-Trail
Manipulationssicheres Protokoll geld-, moderations- und sicherheitsrelevanter Aktionen (append-only, Hash-Kette).
⬇ Export (Behörde/Prüfer)
Exportiert gefilterte Audit-Einträge als CSV oder JSON (inkl. Hash-Kette).
Nutzt die Kategorie aus dem Filter oben; optional Zeitraum + User (Akteur ODER Ziel).
Jeder Export wird selbst auditiert (compliance.export).
⚖️ Legal Holds (Löschsperren)
Ein aktiver Hold schützt die betroffenen Audit-Einträge (Scope: Account und/oder Kategorie) vor Retention-Löschung und -Anonymisierung — z. B. solange eine Behörden-Anfrage läuft. Anlegen und Aufheben wird selbst auditiert.
🗄 Retention-Status
Aufbewahrung je Kategorie (Tage, per audit_retention_days_* in den
Settings pflegbar). Der tägliche Lauf anonymisiert IP/User-Agent nach Frist und löscht nur
ein verifiziertes Ketten-Präfix — der letzte gelöschte Eintrag bleibt als Hash-Anker
erhalten, die Ketten-Prüfung rechnet ab dem Anker weiter. Legal-Hold-Einträge werden nie gelöscht.
🔎 Sessions / IP-Herkunft
Usergebundene Login-Historie: IP, Standort (GeoIP) und Provider (ASN/ISP). Per userId → „welche IPs/Geräte nutzte Account X?", per IP → Reverse-Lookup „wer war unter dieser IP?".
🕵 Multiaccount-Erkennung
Verknüpft Konten über geteilte Geräte-ID (SSAID / identifierForVendor), geteilten FCM-Token (= selbe App-Installation), geteilte IP und ähnliche Benutzernamen (Trigram). Score gewichtet, max pro Kategorie: Gerät +100 · Token +60 · IP +3…20 (nach Seltenheit/ASN – öffentliches WLAN/CGNAT zählt kaum) · Name +12…30. Markiert nur – kein Auto-Ban: geteiltes WG-/Familien-WLAN ist der Normalfall, die Entscheidung trifft ein Mensch.
🔗 Verknüpfte Konten zu einem User
📌 Cluster-Übersicht (geteilte Geräte / Tokens)
Alle Geräte/Installationen, auf denen sich ≥2 verschiedene Accounts angemeldet haben.
📝 Namensänderungen
Protokoll aller Änderungen von Anzeigename und Anmeldename. Anzeigename ist alle 7 Tage änderbar, Anmeldename alle 14 Tage.
🎟 Beta-Einladungen
Wer hat wen per Selbstbedienung (Code oder Username) zum Beta-Zugang eingeladen — getrennt von den admin-erzeugten Zugängen unter „📌 Pop-up-Banner".
Meldungen
Zusammengeführt aus Video-, Nachrichten- und Profil-Meldungen.
🛡 Brigading-Vorfälle (Anti-Mobbing)
Automatisch erkannte Angriffs-Wellen auf EIN Ziel: ungewöhnlich viele Nicht-Follower-Kommentare, Meldungen, Wort-Filter-Treffer und Verdachts-Flags in kurzem Zeitfenster. Bei Opt-in des Opfers wurde zusätzlich das Auto-Schutzschild aktiviert (Kommentare vorübergehend nur für Follower).
Trusted Domains
Externe Domains, die in der App ohne „Du verlässt Synora"-Warnung direkt geöffnet werden (Links in Profilen, Chats, Kommentaren).
🏦 Auszahlung — Guthaben aufs Bankkonto
So kommt das über Stripe eingenommene Guthaben (Coin-Käufe, Split-Anteile) auf ein eigenes Bankkonto. Stripe zahlt ausschliesslich auf ein Bankkonto aus — nicht direkt an PayPal, Wallets o. Ä.
- Bankkonto in Stripe hinterlegen. Stripe-Dashboard → Einstellungen → Geschäftsdaten → Auszahlungen (Bankkonten & Zahlungsplanung). IBAN auf den Namen des Stripe-Kontoinhabers (Firma/Person) — muss übereinstimmen, sonst weist die Bank die Überweisung zurück.
- Auszahlungsrhythmus wählen. Automatisch (täglich/wöchentlich/monatlich, „Rolling") oder manuell per Klick. Steht ebenfalls unter Auszahlungen.
- Auszahlung erfolgt aufs Bankkonto (SEPA, i. d. R. 1–2 Bankarbeitstage). Das Stripe-Balance-Guthaben wandert 1:1 dorthin.
- Optional weiter zu PayPal: vom Bankkonto aus dein PayPal-Konto per Bankverknüpfung aufladen. Es gibt keinen direkten Stripe→PayPal-Weg.
Direktlink: Stripe-Dashboard → Auszahlungen · Balance-Übersicht
Pop-up-Banner
Zeigt allen Nutzern beim App-Start einen mittigen Hinweis (Titel + Nachricht). Jeder Nutzer sieht ein Banner nur einmal pro Inhalt – Text ändern blendet es erneut ein.
🚀 Launch-Countdown (Web-Lockdown)
Sperrt den kompletten Web-Client: nicht schliessbares Countdown-Overlay, alles andere grau & eingefroren. Nach Ablauf: Feuerwerk 🎆 + „Jetzt registrieren".
Beta-Tester-Zugänge
Bestehende Nutzer bekommen automatisch Zugang, sobald sie sich einloggen — kein Link, nichts zum Weitergeben. Für Personen ohne Account: Link generieren — bindet sich beim ersten Öffnen fest ans jeweilige Gerät.
Namensreservierungen
Auf der Countdown-Seite reservierte Anmeldenamen (gelten 4 Wochen). „Eingelöst" heisst: Es wurde ein Konto mit dieser E-Mail registriert. Löschen gibt den Namen sofort wieder frei.
News
Beiträge erscheinen öffentlich unter synora.tv/news (ohne Login). Inhalt wird als BBCode gespeichert ([b][i][u][s][code][quote][color=][size=][center][url][img][list][*]) und bei jedem Aufruf zu HTML gerendert. Solange „Veröffentlicht" nicht gesetzt ist, ist der Beitrag nur hier im Panel sichtbar.
Neuer Beitrag
📅 Event-Kalender
Geplante Livestream-Termine (stream_events). Beim Live-Start
wird automatisch das passende „upcoming"-Event des Hosts (±2h um den Termin) verlinkt
und auf „live" gesetzt — öffentlich sichtbar über GET /api/streams/events
(dort nur upcoming/live, hier alle Status inkl. beendet/abgesagt).
Gutscheine
Codes, die User in der App über „Code einlösen" gegen Coins, Diamonds,
Premium-Tage oder ein Store-Badge eintauschen (POST /api/vouchers/redeem,
je User nur bis zum „Max. pro User"-Limit).
Einzelcode anlegen
Für Kampagnen mit einem festen Code, der von mehreren Usern eingelöst werden kann.
Batch generieren
Erzeugt N zufällige Einmal-Codes (je 1× pro User einlösbar) — für Give-aways/Gewinnspiele.
Einlösungs-Historie
Rabatt-Codes
Rabatt-Codes reduzieren beim Coin-Kauf den Preis (nicht wie Gutscheine, die Coins verschenken). Pro Code wählbar: Prozent (z. B. 20 % günstiger) oder Fixbetrag in CHF (wird in die Landeswährung des Käufers umgerechnet). Einlösbar im Checkout (Web & App).
Store-Items
Badges, Rahmen, Emotes, Sounds und Name-Effekte verwalten. Deaktivierte Items sind für User unsichtbar. Kauf-Limit: nur N User können das Item je erwerben (0 = unbegrenzt). Laufzeit: Item verfällt nach 7/30/365 Tagen (dauerhaft = bleibt für immer).
🪙 Coins-Preiskurve
Umschaltbare Preis-Staffel für alle Coinspakete. Die aktive Kurve gilt sofort für App & Zahlungen (Basiswährung CHF).
Lade…
Neues Item anlegen
🧰 Drop-Pool
Items, die diese Truhe ausschütten kann. Chance = Gewicht ÷ Summe aller Gewichte. Duplikate werden dem User automatisch in Coins erstattet (30 % des Item-Preises, min. 10). Limitierte Items fallen aus dem Pool, sobald ihr Limit erreicht ist.
Lade…
Item an User schenken
Live-Geschenke
Geschenke im Livestream (Geschenk-Sheet). Änderungen gelten sofort — die App lädt die Liste bei jedem Öffnen des Sheets. Animation (MP4/GIF, ideal < 5 s) wird ab dem Senden im Stream abgespielt, der Sound dazu gedämpft über dem Stream-Ton. Diamanten = was der Empfänger gutgeschrieben bekommt (meist = Preis; 0 bei Schatztruhen). Achtung: Prod und Beta haben getrennte Datenbanken — Änderungen dort separat pflegen.
Neues Geschenk
In-Feed-Ads
Anzeigen erscheinen wie bei TikTok als eigene Seite im Für-dich-Feed („Gesponsert"). Premium-User mit „Keine Werbung" sehen keine Anzeigen.
Neue Anzeige anlegen
Rangliste-Rewards
Coins-Belohnung je Tagesplatzierung. Jede Zahl = Coins für einen Platz, beginnend mit Platz 1 (kommagetrennt). Anzahl der Zahlen = Anzahl belohnter Plätze. Leer lassen = Standardwerte. Der nächtliche Lauf (00:05 Europe/Zurich) nutzt die gespeicherten Werte.
🏆 Top Creator (nach erhaltenen Diamanten)
💝 Top Supporter (nach ausgegebenen Coins)
💰 Geldtopf
Bei jedem Coinskauf fließt automatisch ein Prozentsatz des Kaufpreises in den Geldtopf. Aus diesem Topf werden Promo-/Diamant-Auszahlungen gespeist — jede Auszahlung bucht den Betrag wieder ab. Basiswährung CHF, Anzeige umrechenbar.
🔗 Stripe-Abgleich (live)
Einstellungen
Manuelle Korrektur
Offene Verbindlichkeiten pro User
Verdiente, aber noch nicht ausgezahlte Guthaben — die Summe ergibt „Reserviert".
Letzte Buchungen
↩️ Rückerstattungen
Rückerstattete Coinskäufe mit Live-Status von Stripe — pending = Geld noch unterwegs zum Kunden, succeeded = angekommen. Die Coins werden per Stripe-Webhook automatisch zurückgezogen.
🥘 Rezeptrunde-Topf
Bei jedem N-ten abgeschlossenen Coinskauf (plattformweit gezählt, Standard: jeder 3.) fließt ein Prozentsatz (Standard 5 %) des CHF-Basispreises dieses Kaufs in den Rezeptrunde-Topf. Entnahmen für eine Rezeptrunde als negative Korrektur buchen. Basiswährung CHF.
Rezeptrunde-Einstellungen
Manuelle Korrektur / Entnahme
Letzte Buchungen (Rezeptrunde)
🏷 Umsatz-Split (Marionnaud + Gewinn + Team-Anteil)
Je Coinskauf geht ein konfigurierbarer %-Anteil an Marionnaud, in den Gewinn-Topf und in den Team-Anteil-Topf. Alle drei haben ein eigenes verbundenes Stripe-Konto und werden per „Jetzt abrechnen" (bzw. Auto-Abrechnung) via Stripe ans jeweilige Konto transferiert. Basiswährung CHF; Anzeige in CHF/EUR/USD.
Kaufbetrag (CHF) eingeben oder Paket wählen — zeigt, was pro Topf gebucht wird, inkl. Rappen-Rundung. Nutzt die aktuell gespeicherten Prozentsätze.
Umsatz-Split-Einstellungen
Letzte Split-Buchungen
Abrechnungen
👥 Team-Ausschüttung
Am festgelegten Monatstag bekommt jedes aktive Teammitglied einen nach Gewicht bemessenen Anteil aus dem Team-Anteil-Topf. Auszahlung via Stripe-Transfer ans eigene Konto des Mitglieds. Der ausschüttbare Pool = %-Satz (Default 100 %) × noch nicht team-verteilte Team-Anteil-Einnahmen − bereits ausgezahlt. Der Team-Anteil-Topf ist vom Gewinn-Topf getrennt — keine Reserve-Rechnung, keine Doppelauszahlung.
Teammitglieder & Gewichte
Jeder Moderator (Rang 7) wird automatisch als Teammitglied geführt (täglicher Auto-Sync); bei Rang-Verlust wird die Zeile wieder deaktiviert.
Mitglied hinzufügen
Einstellungen
Letzte Ausschüttungen
📒 Buchhaltung
Einheitliches Journal — konsolidiert alle Geldbewegungen (Coins-/Shop-Umsatz, Umsatz-Split-Transfers, Team-/Creator-/Mod-Wallet-Auszahlungen) aus den bestehenden Ledgern. Read-only. Beträge in CHF; Fremdwährung zum aktuellen Kurs genähert (⁓). Test/Mock-Zeilen standardmässig ausgeblendet. Kein Ersatz für zertifizierte Buchhaltung/Treuhänder.
CSV (Semikolon, UTF-8) — öffnet in Excel; Format mit Treuhänder abstimmen. Echtes .xlsx auf Wunsch.
Kassenzufluss (Fiat, Modell A)
Erfolgsrechnung — Umsatzrealisierung bei Einlösung (Modell B)
Coin-Käufe zählen erst als Umsatz, wenn Coins eingelöst werden (für Gifts). Bewertung zum gewichteten Ø-Kaufpreis je Coin, gedeckelt aufs tatsächlich erhaltene Bargeld — verdiente Bonus-Coins erzeugen keinen Umsatz. Pragmatisches Modell ohne Coin-Herkunfts-Ledger; mit Treuhänder abstimmen.
MwSt / Steuer-Report
Preise gelten als brutto (inkl. MwSt) → MwSt wird herausgerechnet. Gruppierung nach Währung (Käuferland wird nicht gespeichert → grober Regions-Proxy). Kein Ersatz für Steuerberatung: Ort der Leistung, Kleinunternehmer-Schwelle, Gutschein-Behandlung (SPV/MPV) und EU-OSS mit dem Treuhänder klären.
Journal
🎖 Stars der Woche
Wöchentliche Awards. Der automatische Lauf wertet jeden Montag um 00:05 (Europe/Zurich)
die abgeschlossene Woche aus und vergibt je Kategorie an die Top-Plätze Coins + Diamanten + ein
zeitlich begrenztes Award-Badge (7 Tage). Staffeln kommagetrennt, eine Zahl je Platz
(z. B. 1000,500,300 = Platz 1/2/3). Feld leeren = Standardwerte.
▶️ Woche manuell auswerten / nachholen
Der scharfe Lauf ist idempotent — bereits vergebene Awards einer Woche werden nicht doppelt ausgezahlt. Dry-Run zeigt nur, wer gewinnen WÜRDE (inkl. Coins/Diamanten), ohne etwas zu vergeben. Datum leer lassen = zuletzt abgeschlossene Woche; sonst beliebiger Tag der gewünschten Woche.
🏅 Vergangene Wochen (vergebene Awards)
Eingefrorene Ergebnisse je Woche: Podium je Kategorie mit zuletzt vergebenen Coins/Diamanten/Badges.
🤖 Simulations-Modus
Aktiviert Bot-Accounts (simbot_*, is_bot), die im Intervall
echte Aktionen ausführen — Likes, Kommentare, Antworten und Follows — damit die App belebt
wirkt. Der An/Aus-Zustand übersteht Server-Neustarts. „Zurücksetzen" entfernt alle Bots samt ihrer Spuren.
Parameter
Intervall-Änderungen greifen sofort, wenn die Simulation läuft. Eine erhöhte Account-Anzahl wird beim nächsten Start angelegt.
Mailboxen (Team)
Nur Admins/Mods können eine @mail.synora.tv-Mailbox haben.
Aktivieren schaltet Empfang + Login (Synora-Passwort = Mail-Passwort) frei.
Posteingang
📑 HTML-Vorlagen
Vorlagen, die Team-Mitglieder beim Verfassen im Mailclient einsetzen können (Versand als HTML).
🧩 System-Mail-Template (Branding für ALLE Transaktionsmails)
Ein Wrapper für 2FA-Codes, Ticket-, Registrierungs-Mails usw. Muss den Platzhalter
{{content}} enthalten (dort wird der Mailtext eingesetzt); {{subject}} optional.
🔐 Code-Mails (Registrierung & 2FA-Login)
Inhalt der Bestätigungs-Mails. Platzhalter {{code}} (der Code) und
{{minutes}} (Gültigkeit in Minuten). Wird in das System-Template oben eingesetzt;
ist keine Vorlage aktiv, gilt der eingebaute Standard.
Push-Benachrichtigung senden
Sendet eine Daten-Push (kind=admin) an die gewählten Empfänger.
Die App zeigt sie als normale Benachrichtigung bzw. In-App-Banner. Nur Geräte mit
registriertem Token werden erreicht. Broadcast an alle ist mächtig — sorgfältig nutzen.
⚙️ App-Settings
🌐 synora.tv Web-Client
Gegen welches Backend die Website synora.tv läuft.
Prod = echte Daten (same-origin), Beta = beta.synora.tv (DB synora_beta).
Wirkt beim nächsten Laden der Seite; Web-Logins gelten pro Umgebung.
Alle Settings
Rohe app_settings-Tabelle. Secrets werden maskiert und nur überschrieben, wenn du einen neuen Wert eingibst. Vorsicht: manche Keys steuern Live-Verhalten.