Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/web/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ const AppContent = () => {
>
<Routes location={location}>
<Route path="/" element={<Index />} />
<Route path="/impressum" element={<Impressum />} />
<Route path="/datenschutz" element={<Datenschutz />} />
<Route path="/nutzungsbedingungen" element={<Nutzungsbedingungen />} />
<Route path="/license" element={<License />} />
<Route path="/legal/imprint" element={<Impressum />} />
<Route path="/legal/privacy" element={<Datenschutz />} />
<Route path="/legal/terms" element={<Nutzungsbedingungen />} />
<Route path="/legal/license" element={<License />} />
<Route path="/plugins" element={<PluginsPage />} />
<Route path="/status" element={<Status />} />
<Route path="*" element={<NotFound />} />
Expand Down
8 changes: 4 additions & 4 deletions src/web/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,19 +150,19 @@ export const Footer = memo(function Footer() {
className="flex flex-col gap-5 p-5 rounded-2xl hover:bg-white/5 transition-all"
>
<span className="text-[11px] font-black uppercase tracking-widest text-primary">Rechtliches</span>
<Link to="/datenschutz" className="text-sm text-muted-foreground hover:text-primary transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<Link to="/legal/privacy" className="text-sm text-muted-foreground hover:text-primary transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<Lock className="w-3.5 h-3.5 text-primary flex-shrink-0" />
<span className="group-hover:translate-x-1 transition-transform">Datenschutz</span>
</Link>
<Link to="/impressum" className="text-sm text-muted-foreground hover:text-accent transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<Link to="/legal/imprint" className="text-sm text-muted-foreground hover:text-accent transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<Info className="w-3.5 h-3.5 text-accent flex-shrink-0" />
<span className="group-hover:translate-x-1 transition-transform">Impressum</span>
</Link>
<Link to="/nutzungsbedingungen" className="text-sm text-muted-foreground hover:text-primary transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<Link to="/legal/terms" className="text-sm text-muted-foreground hover:text-primary transition-colors font-medium flex items-center justify-center md:justify-start gap-2 group">
<FileCheck className="w-3.5 h-3.5 text-primary flex-shrink-0" />
<span className="group-hover:translate-x-1 transition-transform">Nutzungsbedingungen</span>
</Link>
<Link to="/license" className="text-sm text-muted-foreground hover:text-accent font-medium flex items-center justify-center md:justify-start gap-2 group">
<Link to="/legal/license" className="text-sm text-muted-foreground hover:text-accent font-medium flex items-center justify-center md:justify-start gap-2 group">
<Code2 className="w-3.5 h-3.5 text-accent flex-shrink-0" />
<span className="group-hover:translate-x-1 transition-transform">Open Source</span>
</Link>
Expand Down
105 changes: 47 additions & 58 deletions src/web/pages/Datenschutz.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { memo } from "react";
import { Link } from "react-router-dom";
import { ArrowLeft, Shield, Mail, Lock, Database } from "lucide-react";
import { ArrowLeft, Shield, Mail, Lock, Database, Server } from "lucide-react";
import { Navbar } from "../components/Navbar";
import { Footer } from "../components/Footer";
import { motion } from "framer-motion";

export const Datenschutz = memo(function Datenschutz() {
const sections = [
Expand All @@ -29,8 +30,8 @@ export const Datenschutz = memo(function Datenschutz() {
<p>Bei Datenschutzfragen können Sie sich an:</p>
<p className="text-sm">
E-Mail:{" "}
<a href="mailto:datenschutz@oppro-network.de" className="text-primary hover:underline">
datenschutz@oppro-network.de
<a href="mailto:legal@oppro-network.de" className="text-primary hover:underline">
legal@oppro-network.de
</a>
</p>
</div>
Expand Down Expand Up @@ -90,20 +91,24 @@ export const Datenschutz = memo(function Datenschutz() {
),
},
{
title: "7. Empfänger der Daten",
title: "7. Hosting & Infrastruktur (Speicherort)",
content: (
<div className="space-y-2 text-sm">
<p>Eine Weitergabe der Daten erfolgt an folgende Partner:</p>
<ul className="list-disc list-inside space-y-1 text-muted-foreground ml-2">
<li><strong>Discord:</strong> Als API-Partner (Hostingpartner für Bot-Daten)</li>
<li><strong>GitHub Pages:</strong> Hosting der Website (Datenschutzerklärung: https://docs.github.com/en/github/site-policy/github-privacy-statement)</li>
<li><strong>GitHub Inc.:</strong> Hosting-Provider (Microsoft-Tochter, US-basiert, Standard Contractual Clauses)</li>
</ul>
<p className="mt-2">Weitere Datenübertragungen erfolgen nur wenn:</p>
<ul className="list-disc list-inside space-y-1 text-muted-foreground ml-2">
<li>Gesetzliche Verpflichtungen eine Herausgabe erfordern</li>
<li>Strafverfolgungsbehörden eine Anfrage stellen</li>
</ul>
<div className="space-y-4 text-sm">
<p>Wir legen Wert auf Datensparsamkeit und lokale Speicherung:</p>
<div className="p-4 rounded-xl bg-primary/5 border border-primary/10">
<p className="font-bold flex items-center gap-2 mb-1">
<Server className="w-4 h-4 text-primary" />
Bot-Infrastruktur & Datenbank
</p>
<p>Gehostet bei <strong>DeinServerHost (DSH)</strong> in Deutschland.</p>
<p className="text-xs text-muted-foreground mt-1">
Der Standort der Server ist <strong>Frankfurt am Main, Deutschland</strong>.
Dies stellt sicher, dass Nutzerdaten des Bots die EU nicht verlassen.
</p>
</div>
<p className="text-xs">
Weitere Empfänger: <strong>Discord</strong> (als API-Partner für die Funktionalität).
</p>
</div>
),
},
Expand All @@ -118,72 +123,58 @@ export const Datenschutz = memo(function Datenschutz() {
<li>Regelmäßige Backups</li>
<li>Begrenzte Zugriffe (nur authorisierte Administratoren)</li>
</ul>
<p className="mt-2">Vollständige Garantie auf Sicherheit kann nicht gegeben werden, da das Internet nicht vollständig sicher ist.</p>
</div>
),
},
{
title: "9. Ihre Rechte (Art. 15-22 DSGVO)",
content: (
<div className="space-y-2 text-sm">
<p>Sie haben das Recht auf:</p>
<ul className="list-disc list-inside space-y-1 text-muted-foreground ml-2">
<li><strong>Auskunft:</strong> Kostenlose Einsicht in Ihre verarbeiteten Daten</li>
<li><strong>Berichtigung:</strong> Korrektur fehlerhafter Daten</li>
<li><strong>Löschung (Recht auf Vergessenwerden):</strong> Löschung aller Daten (außer bei Speicherpflichten)</li>
<li><strong>Datenportabilität:</strong> Übermittlung in gängigem Format</li>
<li><strong>Widerspruch:</strong> Gegen die Verarbeitung Ihrer Daten</li>
</ul>
<p className="mt-2">Anfragen richten Sie bitte an: <a href="mailto:datenschutz@oppro-network.de" className="text-primary hover:underline">datenschutz@oppro-network.de</a></p>
<p>Sie haben das Recht auf Auskunft, Berichtigung, Löschung (Vergessenwerden), Datenportabilität und Widerspruch.</p>
<p className="mt-2">Anfragen richten Sie bitte an: <a href="mailto:legal@oppro-network.de" className="text-primary hover:underline">legal@oppro-network.de</a></p>
</div>
),
},
{
title: "10. Beschwderecht",
title: "10. Beschwerderecht",
content: (
<div className="space-y-2 text-sm">
<p>Sie haben das Recht, bei einer Datenschutzbehörde Beschwerde einzureichen, wenn Sie der Meinung sind, dass die Verarbeitung gegen die DSGVO verstößt.</p>
<p>Zuständige Behörde: Landesdatenschutzbehörde (je nach Bundesland)</p>
<p>Sie haben das Recht, bei einer Datenschutzbehörde (Landesdatenschutzbehörde Ihres Bundeslandes) Beschwerde einzureichen.</p>
</div>
),
},
{
title: "11. Automatisierte Entscheidungsfindung",
content: "ManagerX trifft keine vollautomatisierten Entscheidungen, die erhebliche Auswirkungen haben. Alle Moderationsmaßnahmen basieren auf manuellen Triggers oder Admin-Entscheidungen.",
content: "ManagerX trifft keine vollautomatisierten Entscheidungen, die erhebliche rechtliche Auswirkungen haben.",
},
{
title: "12. Cookies & Tracking",
content: "Die Website nutzt keine Cookies oder Tracking-Technologien. Die React-App speichert nur lokale Session-Daten im Browser.",
content: "Die Website nutzt keine Cookies oder Tracking-Technologien. Es werden nur technisch notwendige Session-Daten im Browser gespeichert.",
},
{
title: "13. GitHub Pages Hosting",
title: "13. Webseiten-Hosting (GitHub Pages)",
content: (
<div className="space-y-2 text-sm">
<p>Diese Website wird auf <strong>GitHub Pages</strong> gehostet.</p>
<p>Diese Webseite (Frontend) wird technisch auf <strong>GitHub Pages</strong> bereitgestellt.</p>
<ul className="list-disc list-inside space-y-1 text-muted-foreground ml-2">
<li><strong>Hostingpartner:</strong> GitHub Inc. (Microsoft-Tochter), San Francisco, USA</li>
<li><strong>Rechtliche Grundlage:</strong> Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse)</li>
<li><strong>Datenschutz:</strong> <a href="https://docs.github.com/en/github/site-policy/github-privacy-statement" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">GitHub Privacy Statement</a></li>
<li><strong>Datenübertragung in die USA:</strong> Erfolgt unter Standard Contractual Clauses (SCC)</li>
<li><strong>Protokollierte Daten:</strong> GitHub Pages protokolliert IP-Adressen und Zugriffsdaten für Sicherheit</li>
<li><strong>Anbieter:</strong> GitHub Inc., USA</li>
<li><strong>Rechtsgrundlage:</strong> Art. 6 Abs. 1 lit. f DSGVO (Berechtigtes Interesse am stabilen Webbetrieb)</li>
<li><strong>Sicherheit:</strong> Datenübertragung erfolgt unter Standardvertragsklauseln (SCC)</li>
</ul>
<p className="mt-2 italic">Siehe GitHub Privacy Statement für Details zur Datenverarbeitung.</p>
<p className="mt-2 italic text-xs">Hinweis: IP-Adressen werden von GitHub zur Abwehr von Angriffen kurzzeitig protokolliert.</p>
</div>
),
},
{
title: "14. Änderungen dieser Datenschutzerklärung",
content: "Wir können diese Datenschutzerklärung jederzeit aktualisieren. Änderungen werden auf dieser Seite veröffentlicht. Fortgesetzte Nutzung nach Änderungen bedeutet Zustimmung.",
title: "14. Änderungen dieser Erklärung",
content: "Änderungen werden auf dieser Seite veröffentlicht. Fortgesetzte Nutzung nach Änderungen bedeutet Zustimmung.",
},
{
title: "15. Kontakt",
content: (
<div className="space-y-2 text-sm">
<p>Für Datenschutzfragen kontaktieren Sie uns unter:</p>
<p>
<a href="mailto:datenschutz@oppro-network.de" className="text-primary hover:underline">
datenschutz@oppro-network.de
</a>
E-Mail: <a href="mailto:legal@oppro-network.de" className="text-primary hover:underline">legal@oppro-network.de</a>
</p>
<p className="text-xs text-muted-foreground/60">Letzte Aktualisierung: Januar 2026</p>
</div>
Expand All @@ -192,23 +183,21 @@ export const Datenschutz = memo(function Datenschutz() {
];

return (
<div
className="min-h-screen bg-background flex flex-col"
>
<div className="min-h-screen bg-background flex flex-col">
<Navbar />

<main className="flex-grow container relative z-10 px-4 pt-32 pb-24">
<div className="max-w-3xl mx-auto">
{/* Back Link */}
<div initial={{ opacity: 0, x: -10 }} animate={{ opacity: 1, x: 0 }}>
{/* Back Link - Korrigiert zu motion.div */}
<motion.div initial={{ opacity: 0, x: -10 }} animate={{ opacity: 1, x: 0 }}>
<Link
to="/"
className="inline-flex items-center gap-2 text-muted-foreground hover:text-primary transition-colors mb-12 group text-sm font-medium"
>
<ArrowLeft className="w-4 h-4 group-hover:-translate-x-1 transition-transform" />
Zurück zur Startseite
</Link>
</div>
</motion.div>

<header className="mb-16">
<div className="flex items-center gap-5 mb-6">
Expand All @@ -222,7 +211,7 @@ export const Datenschutz = memo(function Datenschutz() {
<div className="flex gap-3 mt-2 opacity-40">
<span className="text-[10px] font-mono uppercase tracking-widest">DSGVO Konform</span>
<span className="text-[10px] font-mono uppercase tracking-widest">•</span>
<span className="text-[10px] font-mono uppercase tracking-widest">SQLite Secure</span>
<span className="text-[10px] font-mono uppercase tracking-widest">Frankfurt Hosted</span>
</div>
</div>
</div>
Expand Down Expand Up @@ -257,19 +246,19 @@ export const Datenschutz = memo(function Datenschutz() {
<div className="w-12 h-12 rounded-full bg-background flex items-center justify-center border border-primary/20 mb-2">
<Shield className="w-6 h-6 text-primary" />
</div>
<h3 className="font-bold text-xl">Ihre Datenschutzrechte</h3>
<h3 className="font-bold text-xl text-foreground">Datenschutz-Anfrage</h3>
<p className="text-sm text-muted-foreground max-w-md">
Möchten Sie Ihre Daten einsehen, korrigieren, löschen oder exportieren?
Möchten Sie Auskunft über Ihre Daten oder deren Löschung beantragen?
</p>
<div className="flex flex-col gap-2 mt-2 w-full">
<a
href="mailto:datenschutz@oppro-network.de?subject=DSGVO-Anfrage"
className="inline-flex items-center justify-center gap-2 px-6 py-2 bg-primary text-primary-foreground rounded-xl font-bold text-sm hover:opacity-90 transition-opacity"
href="mailto:legal@oppro-network.de?subject=DSGVO-Anfrage"
className="inline-flex items-center justify-center gap-2 px-6 py-3 bg-primary text-primary-foreground rounded-xl font-bold text-sm hover:opacity-90 transition-opacity"
>
<Mail className="w-4 h-4" />
Datenschutz-Anfrage
Anfrage per E-Mail
</a>
<p className="text-xs text-muted-foreground/60">Antwortzeit: innerhalb von 30 Tagen nach DSGVO</p>
<p className="text-xs text-muted-foreground/60">Bearbeitungszeit: i.d.R. weniger als 30 Tage</p>
</div>
</motion.div>
</div>
Expand Down
1 change: 1 addition & 0 deletions src/web/pages/Impressum.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Link } from "react-router-dom";
import { ArrowLeft, Mail, MapPin, User, ShieldCheck } from "lucide-react";
import { Navbar } from "../components/Navbar";
import { Footer } from "../components/Footer";
import { motion } from "framer-motion";

export const Impressum = memo(function Impressum() {
return (
Expand Down
2 changes: 1 addition & 1 deletion src/web/pages/Nutzungsbedingungen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Link } from "react-router-dom";
import { ArrowLeft, FileText, Mail, Github, Shield } from "lucide-react";
import { Navbar } from "../components/Navbar";
import { Footer } from "../components/Footer";

import { motion } from "framer-motion";
const legalSections = [
{
title: "1. Geltungsbereich",
Expand Down
2 changes: 1 addition & 1 deletion src/web/pages/PluginsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
} from "lucide-react";
import { Navbar } from "../components/Navbar";
import { Footer } from "../components/Footer";

import { motion } from "framer-motion";
const corePlugins = [
{
title: "AI Entertainment",
Expand Down
2 changes: 1 addition & 1 deletion src/web/pages/Status.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
} from "lucide-react";
import { Navbar } from "../components/Navbar";
import { Footer } from "../components/Footer";

import { motion } from "framer-motion";
const Status = memo(function Status() {
// State für die Live-Daten vom Bot
const [data, setData] = useState({
Expand Down