diff --git a/.gitignore b/.gitignore index d5c6f51..e462aa2 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,4 @@ ssh-key-command.txt # Volumes for local docker-compose .volumes/ .local/ +apps/landing/.astro diff --git a/apps/landing/astro.config.mjs b/apps/landing/astro.config.mjs new file mode 100644 index 0000000..5dee97a --- /dev/null +++ b/apps/landing/astro.config.mjs @@ -0,0 +1,12 @@ +import { defineConfig } from 'astro/config'; +import tailwind from '@astrojs/tailwind'; +import sitemap from '@astrojs/sitemap'; + +export default defineConfig({ + site: 'https://cardecky.mana.how', + integrations: [ + tailwind({ applyBaseStyles: false }), + sitemap(), + ], + output: 'static', +}); diff --git a/apps/landing/package.json b/apps/landing/package.json new file mode 100644 index 0000000..523bddd --- /dev/null +++ b/apps/landing/package.json @@ -0,0 +1,21 @@ +{ + "name": "@cards/landing", + "type": "module", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "astro dev --port 4380", + "build": "astro build", + "preview": "astro preview --port 4380", + "astro": "astro" + }, + "dependencies": { + "astro": "^5.8.0" + }, + "devDependencies": { + "@astrojs/tailwind": "^6.0.2", + "@astrojs/sitemap": "^3.4.1", + "tailwindcss": "^3.4.17", + "typescript": "^5.8.3" + } +} diff --git a/apps/landing/public/favicon.svg b/apps/landing/public/favicon.svg new file mode 100644 index 0000000..94699ba --- /dev/null +++ b/apps/landing/public/favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/landing/src/components/CTASection.astro b/apps/landing/src/components/CTASection.astro new file mode 100644 index 0000000..8aaa91c --- /dev/null +++ b/apps/landing/src/components/CTASection.astro @@ -0,0 +1,35 @@ +--- +const APP_URL = 'https://cardecky.mana.how'; +--- +
+
+

+ Bereit, das Lernen neu zu denken? +

+

+ Cardecky ist kostenlos. Keine Kreditkarte, keine versteckten Kosten. +

+ +
+
diff --git a/apps/landing/src/components/CardTypes.astro b/apps/landing/src/components/CardTypes.astro new file mode 100644 index 0000000..139dd85 --- /dev/null +++ b/apps/landing/src/components/CardTypes.astro @@ -0,0 +1,74 @@ +--- +const types = [ + { + name: 'Klassisch', + tag: 'basic', + icon: ``, + desc: 'Vorderseite und Rückseite. Der Klassiker — simpel, bewährt, effektiv für einfache Fakten.', + }, + { + name: 'Multiple Choice', + tag: 'multiple-choice', + icon: ``, + desc: 'Vier Antwortoptionen zur Auswahl. Fehlende Distractors generiert das System automatisch aus dem Deck.', + highlight: true, + }, + { + name: 'Lückentext', + tag: 'cloze', + icon: ``, + desc: 'Text mit {{c1::Lücken}} — jeder markierte Cluster wird als eigene Karte abgefragt.', + }, + { + name: 'Bild-Okklusion', + tag: 'image-occlusion', + icon: ``, + desc: 'Bereiche auf einem Bild ausblenden — ideal für Anatomie, Landkarten, Diagramme.', + }, + { + name: 'Tippen', + tag: 'typing', + icon: ``, + desc: 'Die Antwort eintippen statt nur aufzudecken. Fuzzy-Match verzeiht kleine Tippfehler.', + }, + { + name: 'Audio', + tag: 'audio-front', + icon: ``, + desc: 'Audioclip als Prompt — perfekt für Sprachlernen, Vokabeln und Aussprache-Training.', + }, +] as const; +--- +
+
+ +

Sechs Formate, ein System.

+

+ Nicht jedes Wissen lässt sich gleich lernen. Cardecky hat für jeden Lerninhalt den richtigen + Kartentyp — alle im gleichen Deck, alle mit FSRS-Scheduling. +

+ +
+ {types.map((type) => ( +
+
+ +
+
+

{type.name}

+ {type.tag} +
+

{type.desc}

+
+ ))} +
+
+
diff --git a/apps/landing/src/components/Features.astro b/apps/landing/src/components/Features.astro new file mode 100644 index 0000000..9d2f405 --- /dev/null +++ b/apps/landing/src/components/Features.astro @@ -0,0 +1,57 @@ +--- +const features = [ + { + icon: ``, + title: 'Open Source', + body: 'Der gesamte Quellcode liegt offen auf Forgejo. Keine Blackbox, kein Vendor-Lock-in.', + }, + { + icon: ``, + title: 'Datensouveränität', + body: 'Deine Daten liegen auf mana-Infrastruktur in Europa. Kein Google, kein AWS, keine Datenhändler.', + }, + { + icon: ``, + title: 'FSRS-Algorithmus', + body: 'Free Spaced Repetition Scheduler — nachweislich effektiver als SM-2, das Herzstück von Anki.', + }, + { + icon: ``, + title: 'Anki-Import', + body: '.apkg-Dateien direkt importieren — Vorlagen werden automatisch auf Cardecky-Kartentypen gemappt.', + }, + { + icon: ``, + title: 'Öffentliche Bibliothek', + body: 'Kuratierte Decks zu Periodensystem, Geografie, Sprachen, Philosophie und mehr — ein Klick zum Start.', + }, + { + icon: ``, + title: 'Föderiert im mana-Ökosystem', + body: 'Cardecky teilt Identität und Credits mit den anderen mana-Apps — ein Login, eine Community.', + }, +] as const; +--- +
+
+ +

Gebaut für ernsthaftes Lernen.

+

+ Kein Feature-Bloat. Nur was du brauchst, um Wissen dauerhaft zu verankern. +

+ +
+ {features.map((f) => ( +
+
+ +
+
+

{f.title}

+

{f.body}

+
+
+ ))} +
+
+
diff --git a/apps/landing/src/components/Footer.astro b/apps/landing/src/components/Footer.astro new file mode 100644 index 0000000..6b15944 --- /dev/null +++ b/apps/landing/src/components/Footer.astro @@ -0,0 +1,40 @@ +--- +const year = new Date().getFullYear(); +--- + diff --git a/apps/landing/src/components/Hero.astro b/apps/landing/src/components/Hero.astro new file mode 100644 index 0000000..e754811 --- /dev/null +++ b/apps/landing/src/components/Hero.astro @@ -0,0 +1,43 @@ +--- +const APP_URL = 'https://cardecky.mana.how'; +--- +
+ + + +
+
+ + +

+ Lernkarten, die
+ tatsächlich wirken. +

+ +

+ Cardecky nutzt den FSRS-Algorithmus — den aktuellen Stand der Wissenschaft im Spaced + Repetition — um dir jede Karte genau dann zu zeigen, wenn du sie kurz vor dem Vergessen bist. + Keine Abos, keine Tracker, keine dark patterns. + Freie Software des mana e.V. +

+ + + +

+ Kein Account erforderlich für den ersten Blick · DSGVO-konform · Open Source +

+
+
+
diff --git a/apps/landing/src/components/HowItWorks.astro b/apps/landing/src/components/HowItWorks.astro new file mode 100644 index 0000000..0d601b1 --- /dev/null +++ b/apps/landing/src/components/HowItWorks.astro @@ -0,0 +1,35 @@ +--- +const steps = [ + { + n: '01', + title: 'Deck erstellen oder importieren', + body: 'Leg ein neues Deck an und füge Karten über das Web-Interface hinzu — oder importiere deine bestehenden Anki-Decks direkt als .apkg-Datei. Decks aus der Bibliothek mit einem Klick übernehmen.', + }, + { + n: '02', + title: 'Karten anlegen', + body: 'Wähle den passenden Kartentyp und füll die Felder aus. Für Multiple-Choice-Karten zieht das System automatisch passende Distractors aus dem restlichen Deck — du gibst nur die richtige Antwort vor.', + }, + { + n: '03', + title: 'Täglich kurz lernen', + body: 'Der FSRS-Algorithmus berechnet für jede Karte den optimalen Wiederholungszeitpunkt. Du bewertest dich selbst (Nochmal / Schwer / Gut / Leicht) — damit kalibriert sich das System auf deinen persönlichen Vergessenskurve.', + }, +] as const; +--- +
+
+ +

In drei Schritten zur täglichen Praxis.

+ +
+ {steps.map((s) => ( +
+ {s.n} +

{s.title}

+

{s.body}

+
+ ))} +
+
+
diff --git a/apps/landing/src/components/ManaSection.astro b/apps/landing/src/components/ManaSection.astro new file mode 100644 index 0000000..67aba52 --- /dev/null +++ b/apps/landing/src/components/ManaSection.astro @@ -0,0 +1,46 @@ +--- +--- +
+
+
+
+ +

+ Software als Gemeingut. +

+

+ Cardecky ist ein Projekt des mana e.V. — einem Schweizer Verein, + der digitale Infrastruktur als Gemeingut begreift. Keine Investoren, keine Werbung, + kein Daten-Harvesting. Finanziert durch freiwillige Mitgliedsbeiträge. +

+

+ 80 % der Einnahmen fließen direkt in den Betrieb der Apps. 10 % in Langlebigkeit + und Nachhaltigkeit. 10 % in den Vereinsbetrieb. Transparenz ist kein Marketing — + wir veröffentlichen jeden Quartal einen Transparenzbericht. +

+ +
+ +
+ {[ + { label: 'Open Source', desc: 'Quellcode liegt offen auf git.mana.how' }, + { label: 'Kein Tracking', desc: 'Keine Werbung, keine externen Dienste' }, + { label: 'Europa', desc: 'Daten auf Infrastruktur in Europa' }, + { label: 'Transparent', desc: 'Quartalsbericht zu Finanzen & Betrieb' }, + ].map((item) => ( +
+

{item.label}

+

{item.desc}

+
+ ))} +
+
+
+
diff --git a/apps/landing/src/components/Nav.astro b/apps/landing/src/components/Nav.astro new file mode 100644 index 0000000..cc4b747 --- /dev/null +++ b/apps/landing/src/components/Nav.astro @@ -0,0 +1,24 @@ +--- +const APP_URL = 'https://cardecky.mana.how'; +--- +
+
+ + + Cardecky + + + + + + Zur App → + +
+
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro new file mode 100644 index 0000000..b3f4a8c --- /dev/null +++ b/apps/landing/src/layouts/Layout.astro @@ -0,0 +1,37 @@ +--- +interface Props { + title: string; + description: string; + ogImage?: string; +} +const { title, description, ogImage = '/og.png' } = Astro.props; +const canonical = new URL(Astro.url.pathname, Astro.site); +--- + + + + + + + + + {title} + + + + + + + + + + + + + + + + + + + diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro new file mode 100644 index 0000000..40b901d --- /dev/null +++ b/apps/landing/src/pages/index.astro @@ -0,0 +1,27 @@ +--- +import Layout from '../layouts/Layout.astro'; +import Nav from '../components/Nav.astro'; +import Hero from '../components/Hero.astro'; +import CardTypes from '../components/CardTypes.astro'; +import HowItWorks from '../components/HowItWorks.astro'; +import Features from '../components/Features.astro'; +import ManaSection from '../components/ManaSection.astro'; +import CTASection from '../components/CTASection.astro'; +import Footer from '../components/Footer.astro'; +import '../styles/base.css'; +--- + +