feat(web): /privacy + /help Stubs für App-Store-Submission
Some checks are pending
CI / validate (push) Waiting to run
Some checks are pending
CI / validate (push) Waiting to run
Apple verlangt für jede App-Store-Submission verlinkte Privacy-Policy und Support-Page. Beide jetzt als SvelteKit-Routes mit Verein-Content. /privacy: - Was wir speichern (Account/Inhalte/Reviews/Server-Logs) - Was wir NICHT machen (kein Ad-Tracking, kein SaaS-Crashreporter) - Welche Dienste (Cloudflare-Tunnel, Eigenhosting) - DSGVO-Rechte (Export, Löschung) - Native-App-Spezifika (SwiftData-Cache, Keychain) /help: - Kontakt kontakt@mana-ev.ch - FAQ (FSRS, Anki-Import, Offline, Marketplace, Mitmachen) - Bug-Report-Anleitung Beide nutzen die 12-Token-CSS-Vars (--color-foreground etc.) für Theme-Konsistenz. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
abf493aeec
commit
c6488c0b83
2 changed files with 232 additions and 0 deletions
99
apps/web/src/routes/help/+page.svelte
Normal file
99
apps/web/src/routes/help/+page.svelte
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
<svelte:head>
|
||||
<title>Hilfe — Cardecky</title>
|
||||
<meta name="description" content="Hilfe und Support für Cardecky." />
|
||||
</svelte:head>
|
||||
|
||||
<main class="page">
|
||||
<h1>Hilfe & Support</h1>
|
||||
|
||||
<p class="lead">
|
||||
Cardecky wird vom Verein <strong>mana e.V.</strong> (i. G.) betrieben.
|
||||
Bei Fragen oder Problemen melde dich direkt bei uns — wir antworten meist innerhalb
|
||||
eines Tages.
|
||||
</p>
|
||||
|
||||
<h2>Kontakt</h2>
|
||||
<p>
|
||||
Email: <a href="mailto:kontakt@mana-ev.ch">kontakt@mana-ev.ch</a><br />
|
||||
Verein: <a href="https://mana-ev.ch">mana-ev.ch</a>
|
||||
</p>
|
||||
|
||||
<h2>Häufige Fragen</h2>
|
||||
|
||||
<h3>Wie funktioniert das Lern-Schema?</h3>
|
||||
<p>
|
||||
Cardecky nutzt <a href="https://github.com/open-spaced-repetition/fsrs4anki">FSRS</a>
|
||||
(Free Spaced Repetition Scheduler), den genauesten offenen Algorithmus für
|
||||
Karteikarten. Karten kommen wieder, wenn deine Erinnerung sie braucht — und nicht
|
||||
nach starren Intervallen.
|
||||
</p>
|
||||
|
||||
<h3>Kann ich Anki-Decks importieren?</h3>
|
||||
<p>
|
||||
Ja. Im Web unter <a href="/import">Import</a>: .apkg-Datei hochladen, alle
|
||||
Notes werden konvertiert, Tags bleiben erhalten, Bilder + Audio werden mitgenommen.
|
||||
</p>
|
||||
|
||||
<h3>Funktioniert das offline?</h3>
|
||||
<p>
|
||||
Die Web-App braucht eine Verbindung. Die native iOS-App <strong>Cards</strong>
|
||||
cached deine Karten lokal und lässt dich offline lernen — die Reviews werden gequeued
|
||||
und beim nächsten Online-Moment synchronisiert.
|
||||
</p>
|
||||
|
||||
<h3>Was ist mit dem Marketplace (Cardecky)?</h3>
|
||||
<p>
|
||||
Der Marketplace unter <a href="/explore">Entdecken</a> ist die offene
|
||||
Sammlung freigegebener Decks. Subscriben heißt: das Deck wird in deine eigene
|
||||
Bibliothek geforkt, du kannst es nach Belieben anpassen.
|
||||
</p>
|
||||
|
||||
<h3>Wie kann ich helfen?</h3>
|
||||
<p>
|
||||
Mit einem öffentlichen Deck zur Community, einer Spende
|
||||
(<a href="https://mana-ev.ch/spende">mana-ev.ch/spende</a>) oder einem Pull-Request
|
||||
gegen unseren Code-Stand (<a href="https://git.mana.how">git.mana.how</a>).
|
||||
</p>
|
||||
|
||||
<h2>Bug melden</h2>
|
||||
<p>
|
||||
Beschreibe so genau wie möglich was passiert ist, auf welchem Gerät, welcher Browser
|
||||
oder iOS-Version. Screenshots helfen. Email an
|
||||
<a href="mailto:kontakt@mana-ev.ch">kontakt@mana-ev.ch</a> mit Betreff "Cards Bug:".
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="/">← Zurück zur Startseite</a>
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
.page {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem 1.5rem 4rem;
|
||||
color: hsl(var(--color-foreground));
|
||||
line-height: 1.55;
|
||||
}
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.25rem;
|
||||
margin-top: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1rem;
|
||||
margin-top: 1.5rem;
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
.lead {
|
||||
font-size: 1.05rem;
|
||||
color: hsl(var(--color-muted-foreground));
|
||||
}
|
||||
a {
|
||||
color: hsl(var(--color-primary));
|
||||
}
|
||||
</style>
|
||||
133
apps/web/src/routes/privacy/+page.svelte
Normal file
133
apps/web/src/routes/privacy/+page.svelte
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
<svelte:head>
|
||||
<title>Datenschutz — Cardecky</title>
|
||||
<meta name="description" content="Datenschutzerklärung für Cardecky, die Karteikarten-App des Vereins mana e.V." />
|
||||
</svelte:head>
|
||||
|
||||
<main class="page">
|
||||
<h1>Datenschutz</h1>
|
||||
|
||||
<p class="lead">
|
||||
Cardecky ist die Karteikarten-App des Vereins <strong>mana e.V.</strong> (in Gründung,
|
||||
Sitz Schweiz). Wir hosten die Daten selbst, sammeln nur was wir für den Betrieb brauchen, und
|
||||
geben nichts an Dritte weiter, die nicht in dieser Erklärung genannt sind.
|
||||
</p>
|
||||
|
||||
<h2>Verantwortlich</h2>
|
||||
<p>
|
||||
mana e.V. (i. G.), Kontakt: <a href="mailto:kontakt@mana-ev.ch">kontakt@mana-ev.ch</a><br />
|
||||
Postanschrift folgt nach Eintragung — siehe <a href="https://mana-ev.ch">mana-ev.ch</a>.
|
||||
</p>
|
||||
|
||||
<h2>Welche Daten wir speichern</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Account</strong>: Email-Adresse (Login), Passwort (gehasht via Argon2id),
|
||||
Login-Zeitpunkte. Über <code>auth.mana.how</code> (mana-auth-Service).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Inhalte</strong>: Decks, Karten, Tags, Hashtags, Bilder/Audio, die du selbst
|
||||
erstellst.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Lernfortschritt</strong>: FSRS-Zustand pro Karte (next-due, stability,
|
||||
difficulty, lapses, reps). Wir nutzen das für den Spaced-Repetition-Scheduler.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Server-Logs</strong>: HTTP-Methode, Pfad, Statuscode, anonymisierte
|
||||
IP-Präfixe für 7 Tage. Keine Cookies-für-Werbung, kein Cross-Site-Tracking.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Was wir NICHT machen</h2>
|
||||
<ul>
|
||||
<li>Kein Werbe-Tracking, kein Re-Targeting, keine Google/Facebook/Meta-Pixels.</li>
|
||||
<li>Kein Crash-Reporting-SaaS (Sentry/Firebase/Crashlytics).</li>
|
||||
<li>Keine Weitergabe an Dritte zu Marketing- oder Analyse-Zwecken.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Welche Dienste wir nutzen</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Cloudflare</strong> als Tunnel + CDN für <code>cardecky.mana.how</code> und
|
||||
<code>cardecky-api.mana.how</code>. Cloudflare kann Verbindungs-Metadaten sehen, die
|
||||
Inhalte sind HTTPS-verschlüsselt.
|
||||
</li>
|
||||
<li>
|
||||
<strong>mana e.V.-Eigenhosting</strong> (Mac Mini in der Schweiz) für Application-
|
||||
Server, Postgres-DB und MinIO-Object-Storage. Niemand außer dem Vorstand hat Zugang.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Deine Rechte (Art. 15 ff. DSGVO)</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<strong>Auskunft + Export</strong>: Im Account-Bereich →
|
||||
<em>Daten exportieren</em>. Du bekommst alle deine Daten als JSON.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Löschung</strong>: Im Account-Bereich → <em>Account löschen</em>.
|
||||
Alles wird sofort entfernt (Decks, Karten, Reviews, Auth-Eintrag).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Widerruf</strong>: Email an
|
||||
<a href="mailto:kontakt@mana-ev.ch">kontakt@mana-ev.ch</a>.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Native Apps</h2>
|
||||
<p>
|
||||
Die iOS-App <strong>Cards</strong> (Bundle <code>ev.mana.cardecky</code>) speichert
|
||||
zusätzlich lokal auf deinem Gerät: gecachte Decks (SwiftData),
|
||||
Offline-Grade-Queue, Auth-Token im iOS-Keychain. Beim Logout werden alle lokalen Daten
|
||||
gelöscht. Keine Telemetrie an uns oder Apple, keine Push-Server.
|
||||
</p>
|
||||
|
||||
<h2>Änderungen</h2>
|
||||
<p>
|
||||
Wir aktualisieren diese Erklärung wenn sich Praxis oder Dienste ändern. Größere
|
||||
Änderungen kündigen wir per Email an. Stand: 2026-05-13.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="/">← Zurück zur Startseite</a>
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
.page {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem 1.5rem 4rem;
|
||||
color: hsl(var(--color-foreground));
|
||||
line-height: 1.55;
|
||||
}
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.25rem;
|
||||
margin-top: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.lead {
|
||||
font-size: 1.05rem;
|
||||
color: hsl(var(--color-muted-foreground));
|
||||
}
|
||||
ul {
|
||||
padding-left: 1.25rem;
|
||||
}
|
||||
li {
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
a {
|
||||
color: hsl(var(--color-primary));
|
||||
}
|
||||
code {
|
||||
font-family: ui-monospace, SFMono-Regular, monospace;
|
||||
font-size: 0.9em;
|
||||
background: hsl(var(--color-muted));
|
||||
padding: 0.1em 0.3em;
|
||||
border-radius: 3px;
|
||||
}
|
||||
</style>
|
||||
Loading…
Add table
Add a link
Reference in a new issue