diff --git a/.gitignore b/.gitignore index f696656..22fbe61 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,4 @@ apps/landing/.astro # NPM Auth — Verdaccio-Token soll nie in git .npmrc +.astro diff --git a/apps/landing/Dockerfile b/apps/landing/Dockerfile new file mode 100644 index 0000000..174a7c9 --- /dev/null +++ b/apps/landing/Dockerfile @@ -0,0 +1,31 @@ +# Multi-stage build for the wordeck-landing Astro surface. +# +# Build context is the repo root (set in +# infrastructure/macmini/docker-compose.landing.yml as `../..`). +# +# NPM_AUTH_TOKEN is required at build time (BuildKit secret) so pnpm +# can fetch @mana/marketing-kit from npm.mana.how (Verdaccio). + +FROM node:20-alpine AS builder +WORKDIR /repo +RUN corepack enable && corepack prepare pnpm@9.15.9 --activate + +# Workspace shell first (cache-friendly). +COPY package.json pnpm-workspace.yaml pnpm-lock.yaml .npmrc ./ +COPY apps/landing/package.json ./apps/landing/ + +RUN --mount=type=secret,id=npm_token,env=NPM_AUTH_TOKEN \ + pnpm install --filter @wordeck/landing --frozen-lockfile 2>/dev/null \ + || pnpm install --filter @wordeck/landing + +COPY apps/landing ./apps/landing + +WORKDIR /repo/apps/landing +RUN pnpm build + +FROM nginx:1.27-alpine AS production +COPY --from=builder /repo/apps/landing/dist /usr/share/nginx/html +COPY apps/landing/infrastructure/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ + CMD wget -qO- http://127.0.0.1/ >/dev/null 2>&1 || exit 1 diff --git a/apps/landing/astro.config.mjs b/apps/landing/astro.config.mjs new file mode 100644 index 0000000..3493dbe --- /dev/null +++ b/apps/landing/astro.config.mjs @@ -0,0 +1,14 @@ +import { defineConfig } from 'astro/config' + +// wordeck-Marketing-Landing. +// +// Statisch, prerendered. Apex `wordeck.com` serviert das Build-Output; +// `app.wordeck.com` läuft separat (SvelteKit-App in `apps/web/`). +export default defineConfig({ + site: 'https://wordeck.com', + output: 'static', + trailingSlash: 'never', + build: { + format: 'file', + }, +}) diff --git a/apps/landing/infrastructure/macmini/docker-compose.landing.yml b/apps/landing/infrastructure/macmini/docker-compose.landing.yml new file mode 100644 index 0000000..8cf9851 --- /dev/null +++ b/apps/landing/infrastructure/macmini/docker-compose.landing.yml @@ -0,0 +1,30 @@ +# wordeck-landing — Marketing-Astro auf wordeck.com. +# +# Eigenständiger Compose-Stack neben dem App-Stack +# (apps/api + apps/web). Nutzt das gleiche `wordeck`-COMPOSE_PROJECT_NAME, +# damit die Container-Namen im selben Namespace landen. +# +# Cutover-Plan: mana/docs/playbooks/LANDING_CUTOVER.md +# Port: 3202 (siehe mana/docs/PORTS.md → Marketing-Landings) +# +# Cloudflared-Tunnel (in ~/projects/managarten/cloudflared-config.yml): +# wordeck.com → http://localhost:3202 (NEU, nach Cutover) +# www.wordeck.com → http://localhost:3202 (NEU, nach Cutover) +# app.wordeck.com → http://localhost:5181 (NEU — App-Subdomain) +# api.wordeck.com → http://localhost:3191 (unverändert) + +services: + wordeck-landing: + build: + context: ../../../.. + dockerfile: apps/landing/Dockerfile + secrets: [npm_token] + image: wordeck-landing:latest + container_name: wordeck-landing + restart: unless-stopped + ports: + - '3202:80' + +secrets: + npm_token: + file: ~/.npm_token diff --git a/apps/landing/infrastructure/nginx.conf b/apps/landing/infrastructure/nginx.conf new file mode 100644 index 0000000..b6d4e5c --- /dev/null +++ b/apps/landing/infrastructure/nginx.conf @@ -0,0 +1,41 @@ +# nginx config für wordeck-landing — Astro statisch, no SPA fallback. +# +# Astro baut mit format='file' und trailingSlash='never', d.h. +# /anki-import → /anki-import.html. try_files-Kette deckt das ab. + +server { + listen 80 default_server; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # Plain-Text-Endpoints (Astro-API-Routes wurden als .txt/.xml gebaut). + location = /robots.txt { + default_type "text/plain; charset=utf-8"; + try_files $uri =404; + } + location = /llms.txt { + default_type "text/plain; charset=utf-8"; + try_files $uri =404; + } + location = /sitemap.xml { + default_type "application/xml; charset=utf-8"; + try_files $uri =404; + } + + # Canonical paths → .html siblings; unknown paths 404. + location / { + try_files $uri $uri.html $uri/ =404; + } + + # Astro asset bundles → long-cache. + location /_astro/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # Standard MIME-Optimierungen. + gzip on; + gzip_types text/plain text/css text/javascript application/javascript application/json application/xml application/manifest+json image/svg+xml; + gzip_min_length 1024; +} diff --git a/apps/landing/package.json b/apps/landing/package.json new file mode 100644 index 0000000..cd56d8f --- /dev/null +++ b/apps/landing/package.json @@ -0,0 +1,20 @@ +{ + "name": "@wordeck/landing", + "private": true, + "version": "0.1.0", + "type": "module", + "description": "Marketing-Landing für wordeck.com — Astro, statisch, SEO/LLM-optimiert. App selbst läuft auf app.wordeck.com.", + "scripts": { + "dev": "astro dev --port 4325", + "build": "astro build", + "preview": "astro preview --port 4326", + "check": "astro check" + }, + "dependencies": { + "@mana/marketing-kit": "^0.1.0", + "astro": "^4.16.0" + }, + "devDependencies": { + "typescript": "^5.9.3" + } +} diff --git a/apps/landing/public/icon.png b/apps/landing/public/icon.png new file mode 100644 index 0000000..76f939e Binary files /dev/null and b/apps/landing/public/icon.png differ diff --git a/apps/landing/src/env.d.ts b/apps/landing/src/env.d.ts new file mode 100644 index 0000000..9bc5cb4 --- /dev/null +++ b/apps/landing/src/env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/apps/landing/src/lib/app.ts b/apps/landing/src/lib/app.ts new file mode 100644 index 0000000..ae6fbf5 --- /dev/null +++ b/apps/landing/src/lib/app.ts @@ -0,0 +1,87 @@ +import type { AppMeta, FaqItem, Feature, Stat } from '@mana/marketing-kit' + +/** + * Single Source of Truth für wordeck-Marketing-Daten. + * + * Hook ist „Anki ohne Akrobatik" — Anki-Migration als Akquise-Anker, + * analog zu pageta + Pocket-Import. Wordeck ist Welle-1-Position-2: + * höchste Ship-Reife, niedrigstes Compliance-Risiko der Welle. + */ +export const app: AppMeta = { + slug: 'wordeck', + domain: 'wordeck.com', + appDomain: 'app.wordeck.com', + hook: 'Anki ohne Akrobatik. Karten lernen in 30 Sekunden installiert.', + tagline: + 'Spaced-Repetition-Karteikarten mit FSRS. Anki-Import inklusive Cloze. Web + iOS, vereinsgetragen.', + description: + 'Wordeck ist die Karteikarten-App von mana e.V. — FSRS-Scheduler, .apkg-Anki-Import mit Cloze-Erkennung, drei Marketplace-Decks zum Start.', + theme: 'neutral', +} + +export const stats: Stat[] = [ + { value: '.apkg', label: 'Anki-Import', hint: 'Inkl. Cloze' }, + { value: 'FSRS', label: 'Scheduler', hint: 'Nachfolger von SM-2' }, + { value: 648, label: 'Karten im Marketplace', hint: '3 Decks zum Start' }, + { value: 0, label: 'Tracker', hint: 'Versprochen' }, +] + +export const features: Feature[] = [ + { + icon: '📦', + title: 'Anki-Import', + body: 'Deine .apkg-Decks aus Anki einlesen — Cloze-Karten werden als first-class behandelt, Duplikate dedupliziert per content-hash.', + }, + { + icon: '🧠', + title: 'FSRS-Scheduler', + body: 'Free Spaced Repetition Scheduler — der wissenschaftlich nachgewiesene Nachfolger von Ankis SM-2. Weniger Wiederholungen bei gleichem Retention-Ziel.', + }, + { + icon: '🛒', + title: 'Marketplace-Decks', + body: 'Drei kuratierte Decks (648 Karten) unter CC0/CC-BY-4.0 ready-to-import. Eigene Decks lassen sich teilen — kein Lock-in.', + }, + { + icon: '✍️', + title: 'Cloze first-class', + body: 'Lückentext-Karten („Albert Einstein lebte von {{c1::1879}} bis {{c2::1955}}") sind nicht eine Notlösung, sondern erste Klasse.', + }, + { + icon: '🌐', + title: 'Web + iOS', + body: 'Im Browser lernen, auf dem iPhone offline weiterlernen. Native-App auf TestFlight; Android über die PWA-Installation.', + }, + { + icon: '🔓', + title: 'Export jederzeit', + body: 'Deine Decks bleiben deine Decks — Export zurück nach Anki-kompatiblem Format ist nicht „Premium-Feature", sondern Default.', + }, +] + +export const faq: FaqItem[] = [ + { + q: 'Was unterscheidet Wordeck von Anki?', + a: 'Anki ist mächtig, aber die Mobile-Apps kosten 25€ einmalig und die UI ist 20 Jahre alt. Wordeck ist Web + Native, FSRS statt SM-2, ohne Werbung, ohne Tracker. Anki-Decks importierst du in 30 Sekunden.', + }, + { + q: 'Was ist FSRS und warum ist das wichtig?', + a: 'Free Spaced Repetition Scheduler — Open-Source-Algorithmus, der empirisch belegt weniger Wiederholungen bei gleichem Lernerfolg braucht als SM-2 (Ankis Default). Anki selbst hat FSRS seit 2024 als Opt-in; Wordeck ist FSRS-only.', + }, + { + q: 'Was passiert mit meinen Decks, wenn Wordeck verschwindet?', + a: 'Export als JSON oder Anki-.apkg ist jederzeit verfügbar. Wordeck ist vereinsgetragen, kein Exit-Risiko — aber die Export-Garantie steht davon unabhängig.', + }, + { + q: 'Kostet Wordeck etwas?', + a: 'Die Basis-App und alle Marketplace-Decks sind kostenlos. Optionale KI-Funktionen (z.B. „Karten aus Text generieren") laufen über Mana-Credits zum Selbstkostenpreis — sichtbar pro Aktion, abschaltbar.', + }, + { + q: 'Funktioniert Wordeck ohne Login?', + a: 'Marketplace-Decks ansehen und Demo-Lernen geht ohne Account. Eigene Decks anlegen und Sync zwischen Geräten brauchen einen Login.', + }, + { + q: 'Welche Sprachen sind unterstützt?', + a: 'UI heute DE/EN. Karten selbst sind sprach-agnostisch — du lernst Latein, Japanisch, Code, Botanik oder was auch immer.', + }, +] diff --git a/apps/landing/src/pages/anki-import.astro b/apps/landing/src/pages/anki-import.astro new file mode 100644 index 0000000..e1056e7 --- /dev/null +++ b/apps/landing/src/pages/anki-import.astro @@ -0,0 +1,108 @@ +--- +import AppLanding from '@mana/marketing-kit/layouts/AppLanding.astro' +import Hero from '@mana/marketing-kit/components/Hero.astro' +import StorySection from '@mana/marketing-kit/components/StorySection.astro' +import FAQ from '@mana/marketing-kit/components/FAQ.astro' +import CTABanner from '@mana/marketing-kit/components/CTABanner.astro' +import { buildSeo, faqJsonLd } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +/** + * Long-Tail-Page für „anki alternative", „anki deck import", + * „anki ios kostenlos", „fsrs scheduler". Eigene canonical, + * eigene FAQ. Höchste Akquise-Konversion der Welle nach pageta/ + * pocket-import. + */ + +const seo = buildSeo(app, { + path: '/anki-import', + title: 'Anki-Deck in Wordeck importieren — .apkg, Cloze, FSRS', + description: + 'Schritt-für-Schritt: bestehende Anki-Decks samt Cloze-Karten und Tags nach Wordeck migrieren. FSRS statt SM-2, ohne 25€-iOS-Gebühr.', +}) + +const ankiFaq = [ + { + q: 'Welche Anki-Versionen kann ich importieren?', + a: 'Wordeck liest .apkg-Dateien aus Anki 2.x (Desktop, AnkiDroid, AnkiMobile). Karten, Decks, Tags und Cloze-Notes werden übernommen. Add-on-spezifische Felder werden ignoriert, der Karten-Text bleibt unverändert.', + }, + { + q: 'Was passiert mit meinen FSRS-Parametern aus Anki?', + a: 'FSRS-Optimizer-Parameter aus Anki werden bei Import übernommen, sofern im Deck enthalten. Wenn dein Anki-Deck noch auf SM-2 läuft, startest du in Wordeck mit den FSRS-Defaults — der erste Optimizer-Lauf nach ~1000 Reviews tuned das automatisch.', + }, + { + q: 'Was ist mit meiner Lernhistorie?', + a: 'Reviews-Historie wird bei Import-Standard übernommen, damit FSRS daraus lernen kann. Du kannst optional „Frische Liste" wählen, wenn du das Deck neu starten willst.', + }, + { + q: 'Sind Cloze-Karten unterstützt?', + a: 'Ja, first-class. Cloze-Marker ({{c1::...}}) werden korrekt erkannt und als eine Notiz mit mehreren Karten behandelt — wie in Anki.', + }, + { + q: 'Was passiert mit Duplikaten?', + a: 'Dedupliziert per content-hash. Wenn du das gleiche Deck zweimal importierst, werden bereits importierte Karten übersprungen (Skip-Counter im Erfolgs-Report).', + }, + { + q: 'Kann ich später zurück zu Anki?', + a: 'Ja. Wordeck exportiert .apkg-kompatibel jederzeit — inklusive Reviews-Historie, sofern du die behalten hast. Kein „Premium-Feature", kein „nach 30 Tagen weg".', + }, +] + +const jsonLd = [faqJsonLd(ankiFaq)] +--- + + + + + +

+ In Anki: Datei → Exportieren wählen, Deck auswählen, Format + „Anki Deck Package (.apkg)" — mit oder ohne Lernfortschritt, ganz wie + du magst. Funktioniert auch in AnkiDroid und AnkiMobile. +

+
+ + +

+ Auf app.wordeck.com mit E-Mail + registrieren. Email-Verifikation, kein Telefon-Theater, keine + Social-OAuth-Pflicht. Account ist in unter zwei Minuten fertig. +

+
+ + +

+ In Wordeck: Decks → „Importieren" → .apkg-Datei auswählen. Wordeck + parst das Paket, dedupliziert, übernimmt Tags und Cloze-Karten, + zeigt eine Live-Statistik (importiert / übersprungen / Fehler). +

+
+ + +
    +
  • Deck — alle Karten, Tags, Cloze-Notes
  • +
  • FSRS-Scheduler aktiviert, mit deinen Anki-Parametern (falls vorhanden)
  • +
  • Reviews-Historie übernommen (optional)
  • +
  • Web + iOS — sofort auf beiden Plattformen lernbar
  • +
  • Export jederzeit zurück nach .apkg verfügbar
  • +
+
+ + + + +
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro new file mode 100644 index 0000000..6bed990 --- /dev/null +++ b/apps/landing/src/pages/index.astro @@ -0,0 +1,88 @@ +--- +import AppLanding from '@mana/marketing-kit/layouts/AppLanding.astro' +import Hero from '@mana/marketing-kit/components/Hero.astro' +import StorySection from '@mana/marketing-kit/components/StorySection.astro' +import StatsRow from '@mana/marketing-kit/components/StatsRow.astro' +import FeatureGrid from '@mana/marketing-kit/components/FeatureGrid.astro' +import FAQ from '@mana/marketing-kit/components/FAQ.astro' +import CTABanner from '@mana/marketing-kit/components/CTABanner.astro' +import { buildSeo, faqJsonLd } from '@mana/marketing-kit' + +import { app, stats, features, faq } from '../lib/app.js' + +const seo = buildSeo(app, { + path: '/', + title: `wordeck — ${app.hook}`, + description: app.tagline, +}) + +const jsonLd = [faqJsonLd(faq)] +--- + + + + + + + +

+ Spaced Repetition funktioniert — das ist seit Jahrzehnten unstrittig. + Anki ist die offene Referenz-Implementierung, und sie ist großartig. + Aber: die iOS-App kostet einmalig 25€, das Web-UI ist optisch in der + Mitte der 2000er stehen geblieben, und die FSRS-Umstellung ist + optional und versteckt. +

+

+ Wordeck nimmt dieselben Konzepte (Cards, Decks, Cloze, SRS), schreibt + die UI von 2026 her, setzt FSRS als Default — und importiert deine + bestehenden Anki-Decks in 30 Sekunden. +

+
+ + + + +
    +
  • Keine Streak-Manipulation. Kein „du hast deine 47-Tage-Serie gebrochen"-Schmerz-Theater.
  • +
  • Kein Algorithmus-Feed. Keine „Empfohlene Decks"-Endlos-Liste.
  • +
  • Keine Werbung, kein Tracker. Auch nicht „nativ", auch nicht „kuratiert".
  • +
  • Kein Lock-in. Export nach Anki-Format jederzeit.
  • +
  • Kein Exit-Risiko. Wordeck gehört dem Verein — kein Käufer kann es abschalten.
  • +
+
+ + +

+ Wordeck ist ein Projekt von mana e.V. — + Schweizer Verein in Gründung. Wir bauen 16 gemeinnützige Software-Werkzeuge + (Lesen, Lernen, Aufschreiben, Pflanzen, Spuren). Finanziert über + Mitgliedsbeiträge und einen + Selbstkostenpreis-Tarif für optionale + KI-Funktionen. +

+

+ Wordeck-Basis ist und bleibt kostenlos. Marketplace-Decks sind unter + freien Lizenzen (CC0, CC-BY-4.0) — du darfst kopieren, in deinen + Unterricht einbauen, weiterverwenden. +

+
+ + + + +
diff --git a/apps/landing/src/pages/llms.txt.ts b/apps/landing/src/pages/llms.txt.ts new file mode 100644 index 0000000..cf75c39 --- /dev/null +++ b/apps/landing/src/pages/llms.txt.ts @@ -0,0 +1,42 @@ +import type { APIRoute } from 'astro' +import { llmsTxt } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +// llms.txt für wordeck. Ziel: wenn jemand „Anki-Alternative" oder +// „karteikarten app open source" fragt, soll der AI-Assistent +// Wordeck finden — samt Anki-Import-Pfad und FSRS-Hinweis. +export const GET: APIRoute = () => { + const body = llmsTxt({ + app, + what: + 'Spaced-Repetition-Karteikarten-App mit FSRS-Scheduler. Anki-Deck-Import (.apkg) inkl. Cloze. Vereinsgetragen, Web + iOS, kostenlos.', + allmende: [ + '3 Marketplace-Decks (648 Karten) unter CC0 / CC-BY-4.0', + 'Anki-Import: .apkg-Pakete inkl. Cloze-Notes, Tags, optional Reviews-Historie', + 'Export zurück nach Anki-kompatiblem Format jederzeit (kein Lock-in)', + 'Source-Code auf https://git.mana.how/till/wordeck', + ], + additionalSections: [ + { + title: 'Wichtige Marketing-Seiten', + items: [ + { label: 'Anki-Import (Schritt-für-Schritt)', href: 'https://wordeck.com/anki-import' }, + { label: 'Über Wordeck (FSRS + Verein)', href: 'https://wordeck.com/ueber' }, + { label: 'Mitwirken', href: 'https://wordeck.com/mitwirken' }, + ], + }, + { + title: 'App', + items: [ + { label: 'App öffnen', href: `https://${app.appDomain}/` }, + { label: 'Marketplace', href: `https://${app.appDomain}/marketplace` }, + { label: 'Anki-Import (direkt)', href: `https://${app.appDomain}/import` }, + ], + }, + ], + }) + + return new Response(body, { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }) +} diff --git a/apps/landing/src/pages/mitwirken.astro b/apps/landing/src/pages/mitwirken.astro new file mode 100644 index 0000000..65d686e --- /dev/null +++ b/apps/landing/src/pages/mitwirken.astro @@ -0,0 +1,62 @@ +--- +import AppLanding from '@mana/marketing-kit/layouts/AppLanding.astro' +import StorySection from '@mana/marketing-kit/components/StorySection.astro' +import CTABanner from '@mana/marketing-kit/components/CTABanner.astro' +import { buildSeo } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +const seo = buildSeo(app, { + path: '/mitwirken', + title: 'Mitwirken bei Wordeck — Decks veröffentlichen, Code, Verein', + description: + 'Drei Wege: eigene Decks im Marketplace veröffentlichen, Code-Beiträge auf git.mana.how, Vereinsmitgliedschaft.', +}) +--- + + + +

+ Wordeck wächst, wenn Menschen Decks teilen und Code beitragen. Drei + Ebenen, keine zwingt zur anderen. +

+
+ + +

+ Wenn du ein gutes Deck gebaut hast (Vokabeln, Anatomie, Code-Snippets, + Botanik, was auch immer): teile es im Wordeck-Marketplace, mit + Lizenz-Wahl beim Publish (CC0, CC-BY-4.0 empfohlen). Reviewer-Stop + vorher — wir prüfen Atomicity, Source-Coverage, kein Spam. +

+
+ + +

+ Quellcode auf git.mana.how/till/wordeck. + SvelteKit-Frontend, Hono+Bun-API, Drizzle/Postgres, FSRS in pure-TS. + Konventionen im + CLAUDE.md. +

+

+ Besonders willkommen: FSRS-Optimizer-Verbesserungen, + Marketplace-Curation, i18n (heute DE/EN, FR/IT/ES für Vereins-Sprachen + ergänzen). +

+
+ + +

+ mana e.V. nimmt Fördermitglieder auf — der strukturellste Weg, + Wordeck plus die anderen 15 Apps zu tragen. + Mitgliedschafts-Infos. +

+
+ + +
diff --git a/apps/landing/src/pages/robots.txt.ts b/apps/landing/src/pages/robots.txt.ts new file mode 100644 index 0000000..129a256 --- /dev/null +++ b/apps/landing/src/pages/robots.txt.ts @@ -0,0 +1,8 @@ +import type { APIRoute } from 'astro' +import { robotsTxt } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +export const GET: APIRoute = () => + new Response(robotsTxt(app), { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }) diff --git a/apps/landing/src/pages/sitemap.xml.ts b/apps/landing/src/pages/sitemap.xml.ts new file mode 100644 index 0000000..f4a0352 --- /dev/null +++ b/apps/landing/src/pages/sitemap.xml.ts @@ -0,0 +1,19 @@ +import type { APIRoute } from 'astro' +import { sitemapXml } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +export const GET: APIRoute = () => { + const today = new Date().toISOString().slice(0, 10) + const body = sitemapXml(app, [ + { path: '/', lastmod: today, changefreq: 'weekly', priority: 1.0 }, + // anki-import bewusst hohe Priorität — Akquise-Page für + // „anki alternative" Long-Tail. + { path: '/anki-import', lastmod: today, changefreq: 'weekly', priority: 0.95 }, + { path: '/ueber', lastmod: today, changefreq: 'monthly', priority: 0.8 }, + { path: '/mitwirken', lastmod: today, changefreq: 'monthly', priority: 0.7 }, + ]) + + return new Response(body, { + headers: { 'Content-Type': 'application/xml; charset=utf-8' }, + }) +} diff --git a/apps/landing/src/pages/ueber.astro b/apps/landing/src/pages/ueber.astro new file mode 100644 index 0000000..3754289 --- /dev/null +++ b/apps/landing/src/pages/ueber.astro @@ -0,0 +1,82 @@ +--- +import AppLanding from '@mana/marketing-kit/layouts/AppLanding.astro' +import StorySection from '@mana/marketing-kit/components/StorySection.astro' +import CTABanner from '@mana/marketing-kit/components/CTABanner.astro' +import { buildSeo } from '@mana/marketing-kit' +import { app } from '../lib/app.js' + +const seo = buildSeo(app, { + path: '/ueber', + title: 'Über Wordeck — Verein, FSRS, Marketplace', + description: + 'Hintergrund: warum FSRS statt SM-2, was die Marketplace-Decks bedeuten, warum Wordeck vereinsgetragen ist.', +}) +--- + + + +

+ Spaced Repetition gibt es seit den 1970ern. Anki seit 2006. Die + Methode ist nicht das Problem — das Werkzeug ist es. Anki ist + mächtig, aber die Mobile-Variante kostet 25€ und die UI ist + zwei Jahrzehnte alt. Quizlet hat sich in eine SaaS-Falle + gepivotiert. Mochi und RemNote sind gut, aber Lock-in. +

+

+ Wordeck nimmt das, was an Anki gut ist (SRS, Decks, Cloze, .apkg + als de-facto-Format) und kombiniert es mit dem, was bei den anderen + gut ist (UI von 2026, Mobile-First, kostenlos). Plus: FSRS als + Default, weil der Algorithmus empirisch besser ist. +

+
+ + +

+ Anki hat FSRS seit 2024 als Opt-in. Die meisten User wissen davon + nicht und bleiben auf SM-2 (Default). Das ist eine UX-Wahl, kein + technischer Engpass. +

+

+ Wordeck ist FSRS-only — kein „du musst es in den Settings + aktivieren". Der Scheduler kalibriert sich nach ~1000 Reviews auf + deine persönliche Vergessens-Kurve. Bis dahin laufen sinnvolle + Defaults. +

+
+ + +

+ Wordeck startet nicht leer. Drei kuratierte Decks (648 Karten gesamt) + sind ab Tag-1 verfügbar — unter CC0 oder CC-BY-4.0, also frei + weiterverwendbar. Eigene Decks kannst du im Marketplace teilen, mit + Lizenz-Auswahl beim Publish. +

+

+ Wachstum kommt über Mitwirkende — der Marketplace ist Allmende, + nicht Plattform-Lock-in. +

+
+ + +

+ Hinter Wordeck steht mana e.V. Wir + bauen 16 gemeinnützige Software-Werkzeuge, finanziert über + Mitgliedsbeiträge und Selbstkostenpreis-Mana-Tarif für KI-Aktionen. + Wordeck-Basis ist und bleibt kostenlos; optionale KI-Funktionen + („Karten aus Text generieren") sind transparent bepreist. +

+

+ Mission und Werte · + Quartalsberichte · + Quellcode +

+
+ + +
diff --git a/apps/landing/tsconfig.json b/apps/landing/tsconfig.json new file mode 100644 index 0000000..895c62e --- /dev/null +++ b/apps/landing/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": ["src/**/*", "astro.config.mjs"] +}