slimcore-website/CLAUDE.md

825 lines
47 KiB
Markdown
Raw Normal View History

# SlimCore Marketing Site — Implementation Brief
> **Stand:** 2026-05-04 · **Autor:** Pascal Oelmann (mit Claude Chat) · **Adressat:** Claude Code
> **Aufgabe:** Implementierung der Marketing-/Landing-Webseite für SlimCore unter `slimcore.io`.
> Diese Datei ist die Steuerungsquelle für alle Entscheidungen. Bei Konflikten gewinnt diese Datei gegenüber Default-Annahmen oder Lovable-Vorlagen.
---
## 0. TL;DR für Claude Code
- **Stack:** Astro 5 (Static Site, SEO-first) + Tailwind v4 + selektive React-Islands für interaktive Komponenten + shadcn/ui-Primitives + TypeScript strict.
- **Domain:** `slimcore.io` = Marketing. `app.slimcore.io` = SaaS-App (separates Repo, nicht Teil dieses Briefs).
- **Positionierung:** Primärgruppe sind Solo-Selbstständige und kleine Teams (110). Sekundär wachsende KMU bis ~30. Tertiär eCommerce-Händler. Hero-Linie: **„Schlank starten. Grenzenlos wachsen."**
- **Familienzugehörigkeit:** SlimCore ist eine eigenständige Produktmarke unter dem digiFORMER-Dach (Adobe-Modell, nicht Atlassian-Modell). Familien-Anker sind Typografie + nummerierte Sektionen + Status-Glyphen — NICHT die Farbe. Jede Marke hat genau eine eigene Akzentfarbe.
- **Akzentfarbe SlimCore:** Electric Persimmon `#FF6B2C` (`oklch(0.71 0.22 38)`). Definiert im familienweiten Markensystem (siehe `digiformer-brand-system.md`). Text-on-Accent ist `#2A0F02` (dunkles Persimmon-Schwarz), nicht Weiß — Kontrast-Grund.
- **Nicht verhandelbar:** Eine Akzentfarbe (kein Theme-Switcher). Umlaute. Sentence case. Keine US-Marketing-Klischees. Vision-Features als Vision benennen, nicht als verfügbar verkaufen.
- **Inhaltlicher Master:** `produktbeschreibung.pdf` (im Repo unter `/docs/produktbeschreibung.pdf`). Diese CLAUDE.md übersetzt das in Code-Anweisungen — nicht alle Inhalte werden hier wiederholt.
- **Markensystem-Master:** `digiformer-brand-system.md` regelt Farben, Typografie, Status-Glyphen und Markenarchitektur. **§7 ist die verbindliche Vendor- und Stack-Politik** (DE/CH/AT/EU-Headquarter + EU-Rechenzentren, Whitelist/Greylist/Blacklist). Bei Konflikten zwischen CLAUDE.md und Brand-System gewinnt das Brand-System. Bei Default-Empfehlungen wie „nimm Vercel" oder „nimm Stripe" prüft Claude Code immer zuerst Brand-System §7.4 — diese Vendors sind ausgeschlossen.
---
## 1. Mission
SlimCore ist die schlanke, modulare Geschäftssoftware für Solo-Selbstständige und kleine Teams — souverän in Europa gehostet, ohne Abhängigkeit von US-Konzernen, ohne Vendor-Lock-in. Die Marketing-Site muss drei Aufgaben erfüllen:
1. **Tester gewinnen.** Primärer Conversion-Funnel ist die Tester-Anmeldung. Phase 1 läuft jetzt.
2. **Glaubwürdigkeit aufbauen.** Souveränitäts-Versprechen ist Differenzierung — muss visuell und sprachlich substantiell wirken, nicht wie Marketing-Geschwurbel.
3. **Produkt verständlich machen.** 16 Module in 4 Säulen, mit klaren Status-Markierungen. Solo-Selbstständige und kleine Teams sollen in unter 30 Sekunden erkennen, ob SlimCore zu ihrer Situation passt — und ob es mit ihnen wachsen kann.
**Zentrales Versprechen:** „Schlank starten. Grenzenlos wachsen." — der Wachstums-Aspekt ist neuer Kern-USP gegenüber bisheriger Positionierung.
**Sekundär:** SEO-Sichtbarkeit für Suchanfragen wie „CRM für Solo-Selbstständige", „Geschäftssoftware Solo", „ERP Alternative DSGVO", „Odoo zu komplex", „CRM Made in Germany", „SaaS Hetzner Hosting".
---
## 2. Architektur-Entscheidung
### 2.1 Warum Astro statt Next.js / Vite-SPA
Die SlimCore-Web-App selbst läuft auf Vite + React + TanStack. Für die **Marketing-Site** sind die Anforderungen aber andere:
| Anforderung | Gewinner |
|---|---|
| SEO (statisches HTML, schnelles First Paint) | Astro (SSG by default) |
| Geringe Bundle-Größe für Marketing | Astro (ships zero JS by default) |
| MDX für späteren Blog/Notizen | Astro (eingebaut) |
| React-Komponenten wo nötig (Forms, Roadmap-Toggle) | Astro Islands (`client:load`, `client:visible`) |
| Tailwind v4 Kompatibilität | Astro (offizieller Adapter) |
| Tooling-Vertrautheit | beide ok |
Astro ist die richtige Wahl, weil 90 % der Site statisch ausgeliefert werden können. Interaktive Inseln (Tester-Formular, Roadmap-Filter, Modul-Tabelle mit Filter) werden als React-Islands punktuell hydriert.
### 2.2 Domains
- `slimcore.io` — Marketing-Site (dieses Repo)
- `app.slimcore.io` — SaaS-App (anderes Repo, existiert)
- `slimcore.io/login` → 301 Redirect auf `app.slimcore.io/login`
- `slimcore.io/app` → 301 Redirect auf `app.slimcore.io`
### 2.3 Hosting
Statisches Build-Output wird auf einem **Hetzner-VPS** ausgeliefert, mit **Coolify** als Deployment-Layer. Build- und Deploy-Pipeline läuft über Forgejo Actions (oder GitHub Actions als Übergangs-Realität, siehe Brand-System §7.5).
Vercel, Netlify, Cloudflare Pages und alle anderen US-gehosteten Static-Site-Plattformen sind **nicht zulässig** — siehe Brand-System §7.4. Die Marketing-Site einer Marke, deren Kernversprechen Souveränität ist, kann nicht auf US-Infrastruktur stehen, ohne sich beim ersten DNS-Lookup einer technisch versierten Tester-Person selbst zu widerlegen.
Alternativ-Host: **OVHcloud** (FR) als zweite Option, falls Hetzner-Kapazitäten ausgeschöpft oder Pascal aus anderen Gründen wechseln möchte.
**Default-Annahme für SlimCore-Marketing:** Hetzner-VPS in Falkenstein (Konsistenz mit der App-Hosting-Region), Coolify als Deployment-Orchestrator, Caddy oder nginx als Reverse-Proxy mit Auto-TLS via Let's Encrypt. Statisches Astro-Build-Output direkt aus dem Build-Container deployt.
### 2.4 Form-Handling
Tester-Anmeldungen gehen **direkt an die SlimCore-App-API**, nicht an einen externen Form-Service:
- **Primär (festgelegt):** POST an `https://app.slimcore.io/api/public/leads` (siehe `slimcore-go-to-market.md` §3 für die Spezifikation). Lead landet sofort im digiFORMER-Mandanten als CRM-Eintrag, dem Operator-Tenant für SlimCore.
- **Brevo** wird nur als Transactional-Mail-Provider für die Double-Opt-In-Bestätigung verwendet — nicht als Lead-Speicher. Brevo bekommt keine Lead-Daten zur Verwaltung; die SlimCore-App rendert die DOI-Mail und versendet sie über Brevo SMTP.
- **Kein Supabase**, kein Formspree, kein HubSpot, kein Typeform — Souveränitäts-Konsistenz mit dem Rest des Stacks.
Bot-Schutz: **Altcha** (Open Source, self-hosted Proof-of-Work-Challenge, keine Drittpartei). Plus Honeypot-Feld. Cloudflare Turnstile, reCAPTCHA und hCaptcha sind ausgeschlossen — siehe Brand-System §7.4.
---
## 3. Repo-Struktur
```
slimcore-marketing/
├── CLAUDE.md ← diese Datei (Implementierungs-Brief)
├── README.md
├── docs/
│ ├── digiformer-brand-system.md ← Marken-System (Mirror — Master später als npm-Paket)
│ ├── produktbeschreibung.md ← Inhalt-Master in Markdown (für Re-Builds)
│ ├── produktbeschreibung.pdf ← Inhalt-Master als PDF (für Lesefluss)
│ └── design-tokens-rationale.md ← optionale Notizen zu Designentscheidungen
├── astro.config.mjs
├── tailwind.config.ts ← falls Tailwind-Config-Datei nötig (v4 nutzt @theme, Datei evtl. minimal)
├── tsconfig.json
├── package.json
├── public/
│ ├── favicon.svg
│ ├── og-default.png ← 1200×630 OG-Bild, generiert
│ └── fonts/ ← self-hosted (DSGVO!)
│ ├── source-serif-4-variable.woff2
│ ├── inter-variable.woff2
│ └── jetbrains-mono-variable.woff2
├── src/
│ ├── styles/
│ │ └── global.css ← Tailwind v4 @theme + Reset
│ ├── content/
│ │ ├── module.ts ← Modul-Liste als typed data
│ │ └── notizen/ ← MDX für späteren Blog
│ ├── components/
│ │ ├── primitives/ ← shadcn/ui (Button, Input, Dialog)
│ │ ├── marketing/
│ │ │ ├── NavBar.astro
│ │ │ ├── Footer.astro
│ │ │ ├── Eyebrow.astro
│ │ │ ├── SectionHeading.astro
│ │ │ ├── NumberedItem.astro
│ │ │ ├── ModuleCard.astro
│ │ │ ├── ModuleGrid.astro
│ │ │ ├── StatusDot.astro
│ │ │ ├── TechStrip.astro
│ │ │ ├── SovereigntyBlock.astro
│ │ │ ├── RoadmapTimeline.astro
│ │ │ ├── ObjectionAnswer.astro
│ │ │ └── CTABlock.astro
│ │ └── islands/ ← React, hydriert
│ │ ├── TesterForm.tsx
│ │ ├── ModuleFilter.tsx ← optional
│ │ └── ContactForm.tsx
│ ├── layouts/
│ │ └── BaseLayout.astro ← <head>, NavBar, Footer
│ └── pages/
│ ├── index.astro ← Home
│ ├── module.astro
│ ├── souveraenitaet.astro
│ ├── tester.astro
│ ├── roadmap.astro
│ ├── kontakt.astro
│ ├── impressum.astro
│ ├── datenschutz.astro
│ └── danke.astro ← Tester-Formular Submit-Ziel
└── e2e/
└── nav.spec.ts ← Playwright smoke tests
```
---
## 4. Tech-Stack-Details
### 4.1 Astro
- Astro 5.x, Output-Mode `static`.
- `@astrojs/react` für React-Islands.
- `@astrojs/sitemap` für `sitemap-index.xml`.
- `@astrojs/mdx` für `/content/notizen` (Phase 2).
### 4.2 Tailwind v4
Pascal nutzt Tailwind v4 in der App. Hier auch. Das bedeutet:
- Konfiguration über `@theme` in `global.css`, nicht via `tailwind.config.ts` (falls möglich; minimaler Config nur wenn Plugins gebraucht werden).
- Custom-Properties als Single Source of Truth — diese werden später vom App-Repo geteilt (Phase 2: design-tokens als monorepo package).
### 4.3 React-Islands
Nur dort React laden, wo Interaktivität nötig ist:
- `TesterForm``client:load` (oberhalb der Falte)
- `ContactForm``client:visible`
- `ModuleFilter``client:visible`, optional
Die Roadmap-Timeline ist statisches Astro-Markup, keine Hydration nötig.
### 4.4 shadcn/ui
shadcn/ui ist komponentenweise — wir installieren NUR was wir brauchen:
- `button`
- `input`
- `textarea`
- `label`
- `dialog` (für Tester-Modal von der NavBar aus)
Kein Card-Component, kein Accordion, kein Carousel. Marketing-Cards bauen wir selbst minimal mit Tailwind.
### 4.5 TypeScript
`strict: true`, `noUncheckedIndexedAccess: true`. Module-Daten in `src/content/module.ts` als `as const`-Tupel mit explizitem Type-Export.
### 4.6 Schriftarten — self-hosted (DSGVO!)
Keine Google Fonts CDN. Alle Fonts liegen in `public/fonts/` und werden über `@font-face` mit `font-display: swap` geladen.
- **Serif:** Source Serif 4 Variable (SIL OFL, kostenlos)
- **Sans:** Inter Variable (SIL OFL, kostenlos)
- **Mono:** JetBrains Mono Variable (SIL OFL, kostenlos)
Alternativen falls Pascal anderen Charakter wünscht: Newsreader (Serif, leicht editorial-warm), Geist Sans/Mono (modern-technisch), GT Sectra (Paid, premium).
---
## 5. Design System
### 5.1 Markenhaltung — Familienzugehörigkeit zu digiFORMER
`digiformer.eu` ist Beratungsmarke, ruhig-editorial. SlimCore ist Produktmarke — gleiche Haltung, mehr „Werkzeugkasten-Anmutung":
| Aspekt | digiFORMER | SlimCore | Gemeinsam |
|---|---|---|---|
| Tonalität | „Erst verstehen. Dann umsetzen." | „Schlank. Souverän." | Knapp, sachlich, kein Hype |
| Hauptvisual | Lange Editorial-Fließtexte | Modul-Raster (4×16) | Nummerierte Sektionen 0104 |
| Akzentfarbe | dezent | EINE definierte | Beide nutzen genau eine |
| Mono-Font-Einsatz | wenig | viel (Stack, Status, Eyebrows) | Mono ist Familien-Marker |
| Sprache | Deutsch primär | Deutsch primär, EN Phase 2 | DE-first |
### 5.2 Farben
> **Quelle der Wahrheit:** Alle Marken-Farbtoken stehen in `digiformer-brand-system.md`. Diese Sektion zeigt nur die SlimCore-relevanten Werte als Code-Snippet. Bei Konflikt: Brand-System gewinnt.
**SlimCore-Akzent:** Electric Persimmon `#FF6B2C` — festgelegt im Markensystem (`digiformer-brand-system.md` §3.2). Lightness 0.71 / Chroma 0.22 / Hue 38° in OKLCH. Perceptiv auf gleicher Helligkeitsstufe wie digiFORMER-Cyan und SlimSafe-Lime.
**Familien-Logik:** Mutterbrand digiFORMER trägt Electric Cyan (`#06D8FF`), SlimCore als Produktmarke trägt Electric Persimmon. Die Familien-Anker sind nicht die Farbe, sondern Typografie + Status-Glyphen + nummerierte Sektionen. Adobe-Modell, nicht Atlassian-Modell.
```css
/* SlimCore Akzent — siehe digiformer-brand-system.md §3.2 */
--brand-slimcore: oklch(0.71 0.22 38); /* #FF6B2C */
--brand-slimcore-hover: oklch(0.62 0.23 38); /* #E04F0F */
--brand-slimcore-soft: oklch(0.71 0.22 38 / 0.12); /* tint */
/* Konvenienz-Aliasse innerhalb dieses Repos */
--color-accent: var(--brand-slimcore);
--color-accent-hover: var(--brand-slimcore-hover);
--color-accent-soft: var(--brand-slimcore-soft);
/* Text-on-Accent (siehe Brand-System §3.7) */
/* WICHTIG: NICHT #FFFFFF — Kontrast unter WCAG-AA bei diesem Orange */
--color-text-on-accent: #2A0F02;
```
**Restliche Tokens — Light Mode (Default), familienweit identisch:**
```css
@theme inline {
/* Surfaces */
--color-bg-base: oklch(0.99 0.005 90); /* ~#FBFAF7 — warm offwhite */
--color-bg-surface: oklch(1.00 0 0); /* pure white für Karten */
--color-bg-inverse: oklch(0.18 0.01 270); /* ~#1A1B22 — fast schwarz, leicht kühl */
/* Text */
--color-text-primary: oklch(0.20 0.01 270); /* ~#1F2128 */
--color-text-secondary: oklch(0.45 0.01 270); /* ~#5C5F6B */
--color-text-tertiary: oklch(0.60 0.01 270); /* ~#8B8E97 */
/* Borders */
--color-border: oklch(0.90 0.005 90); /* ~#E2E0DA */
--color-border-strong: oklch(0.80 0.005 90);
/* Status-Glyphen — monochrom, NICHT in Akzentfarbe (siehe Brand-System §5) */
--color-status-available: var(--color-text-primary); /* ● = filled */
--color-status-developing: oklch(0.20 0.01 270 / 0.45);/* ◐ = halftone */
--color-status-planned: transparent; /* ○ = outlined */
--color-status-vision: transparent; /* ◌ = dashed */
}
```
**Dark Mode (`:root[data-theme="dark"]`)** — invertierte Surface-/Text-Tokens, Marken-Token bleiben unverändert (sie funktionieren in beiden Modi). Detail-Werte beim Implementieren ableiten.
**Wichtig — Akzent-Verwendungs-Regeln (siehe Brand-System §3.5):**
- Akzent NUR für: primären CTA, Hover-States, Focus-Rings, 12 hervorgehobene Worte in der Hero-Headline, aktive Nav-Indikatoren, „aktuelle Phase"-Pille auf der Roadmap
- Akzent NICHT für: Modul-Karten-Hintergründe, Status-Dots (die sind monochrom), Hero-Backgrounds, Border auf Karten, Body-Text-Farbe
- Die Akzentfarbe lebt von Knappheit. Wenn auf einer Sektion zwei Worte in Persimmon stehen, ist das viel. Drei sind zu viel.
### 5.3 Typografie
```css
/* Font-Stacks */
--font-serif: "Source Serif 4", Georgia, serif;
--font-sans: "Inter", system-ui, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
/* Type-Scale */
--text-eyebrow: 0.6875rem; /* 11px, mono, uppercase, letter-spacing 0.08em */
--text-body-sm: 0.8125rem; /* 13px */
--text-body: 1rem; /* 16px, line-height 1.65 */
--text-body-lg: 1.0625rem; /* 17px Hero-Lead */
--text-h3: 1.25rem; /* 20px */
--text-h2: 1.5rem; /* 24px (mobile) → 1.875rem 30px (desktop) */
--text-h1: 2rem; /* 32px (mobile) → 3rem 48px (desktop) → 3.5rem 56px (xl) */
--text-display: 3rem; /* 48px Eyecatcher (Souveränität-Block) */
```
**Regeln:**
- Headlines (`h1`, `h2`): Serif, weight 500 (NICHT 600 oder 700), `letter-spacing: -0.015em` für Display-Größen, `line-height: 1.11.2`.
- Body: Sans, weight 400, `line-height: 1.65`.
- Eyebrows: Mono, 11px, uppercase, `letter-spacing: 0.08em`, Tertiärfarbe.
- Status-Dots, Section-Numbern (`01``04`), Tech-Stack-Marker: Mono.
- Sentence case überall. Niemals Title Case. Niemals ALL CAPS außer Mono-Eyebrows.
- Maximale Textbreite für Fließtext: 6070 Zeichen (`max-w-[65ch]`).
### 5.4 Spacing & Grid
- Container: `max-w-[1100px] mx-auto px-6 md:px-10 xl:px-12`.
- Section-Padding vertikal: `py-20 md:py-28 xl:py-32`.
- Zwischen Hero und erster Sektion: `pt-12 md:pt-20`.
- Modul-Grid: 1 Spalte mobil, 2 Spalten tablet, 4 Spalten desktop. `gap-3 md:gap-4`.
- Numbered-Items (4er-Reihen): 1/2/4-Spalten responsive.
### 5.5 Status-Glyphen (zentrales visuelles Vokabular)
Diese 4 Glyphen ziehen sich durch die ganze Site und sind das wichtigste sekundäre Marken-Asset:
| Status | Glyph (CSS) | Bedeutung |
|---|---|---|
| Verfügbar | ● — gefüllter Kreis, primary-text | heute produktiv |
| In Entwicklung | ◐ — halbgefüllt (`opacity: 0.45` filled) | aktiv im Bau |
| Geplant | ○ — solider Outline-Kreis | feste Roadmap, noch nicht gestartet |
| Vision | ◌ — gestrichelter Outline-Kreis | Richtung, nicht Versprechen |
Implementiert als `<StatusDot status="...">`-Astro-Komponente. NICHT mit Emoji oder SVG-Icons aus Bibliotheken — eigene CSS-Lösung mit `border` und `background`.
### 5.6 Komponenten-Inventar
Custom-Komponenten (alle in `src/components/marketing/`):
- **`Eyebrow`** — Mono-Caption über Headlines. Slot: text. Optional: status (Pill-Style: „IN ENTWICKLUNG").
- **`SectionHeading`** — `h2` mit optionalem Eyebrow. Slot: subtitle.
- **`NumberedItem`** — Nummeriertes Item für Methoden/Säulen-Listen. Props: `number` (`"01"`), `title`, slot für body. Mono-Nummer in Tertiärfarbe links oben oder über dem Title.
- **`ModuleCard`** — eine der 4 Säulen-Karten mit Status-Liste. Props: `pillarNumber`, `pillarTitle`, `modules: { name: string; status: ModuleStatus }[]`.
- **`ModuleGrid`** — Wrapper, der 4 ModuleCards in Grid layoutet.
- **`StatusDot`** — atomar.
- **`TechStrip`** — horizontale Mono-Leiste mit Stack-Komponenten, Trennzeichen `·`.
- **`SovereigntyBlock`** — 2-Spalten-Layout (links Headline, rechts 4 Argumente mit Border-Left-Akzent).
- **`RoadmapTimeline`** — vertikale Linie mit 4 Phasen (Heute / Q3-Q4 2026 / 2027 / Vision). Jede Phase = Card mit Liste der Items.
- **`ObjectionAnswer`** — Frage als Serif-Quote, Antwort als Body-Text. 4 davon im Grid.
- **`CTABlock`** — Schluss-Sektion mit Headline + zwei Buttons + E-Mail-Link.
- **`NavBar`** — sticky-on-scroll mit minimaler Mode-Reduktion (kein Background-Wechsel-Schauspiel).
- **`Footer`** — 4-Spalten, dezente Border-Top, Akzent nur bei Hover-Links.
### 5.7 Buttons
```
Primary: bg-text-primary text-bg-base, hover: bg-accent
Secondary: border-text-primary, transparent bg, hover: bg-text-primary/5
Ghost-Link: underline-offset-4, hover: text-accent
```
Keine `rounded-full`-Mega-Pills. `rounded-md` (68px) reicht. Padding: `px-5 py-2.5 text-sm` für CTAs, `px-3 py-1.5 text-xs` für Sekundär.
### 5.8 Was es im Design NICHT gibt
- Keine Drop-Shadows (außer 1px-Border auf Karten). Keine Glow-Effekte. Keine Glassmorphism.
- Keine Farbverläufe/Gradients — nirgends.
- Keine animierten Hintergründe, keine Particles, keine Floating-Blobs.
- Kein Theme-Switcher zwischen Akzentfarben.
- Keine 3D-Render von Software-Mockups (auch wenn AI das schnell macht).
- Keine Stock-Fotos von „glücklichen Geschäftsleuten am Laptop".
- Keine Emoji als Icons.
- Keine bunten Icon-Badges (Material/Heroicons-Buntheit). Wenn Icons: einfarbig, Lucide-Strichstärke 1.5px, Größe 1620px, Farbe `--color-text-secondary`.
---
## 6. Information Architecture
### 6.1 Sitemap
```
/ Home
/module Alle Module mit Status, filterbar
/souveraenitaet Long-form über Hosting, Open Source, Egress
/tester Tester-Programm + Anmeldeformular
/roadmap Detail-Roadmap (verlinkt von Home-Roadmap-Section)
/kontakt Kontaktformular + Adresse + E-Mail
/notizen (Phase 2) Blog/Notizen, MDX-basiert
/notizen/[slug] (Phase 2) Einzelner Notiz-Beitrag
/impressum Pflicht
/datenschutz Pflicht
/danke Tester-Form-Submit-Ziel
```
### 6.2 Navigation
**Top-Nav (Desktop):**
```
[slimcore] Module · Souveränität · Roadmap · Tester DE | EN [Tester werden →]
```
- Logo links: nur Wortmarke "slimcore" in Mono, weight 500. Kein Icon-Logo (Phase 2 evtl.).
- Sprache: Mono, klein. Phase 1 nur DE aktiv, EN ausgegraut. `<a hreflang="...">` korrekt.
- CTA rechts: Primary-Button.
**Mobile:** Hamburger → Drawer (Dialog von rechts). Link-Liste, gleiche Struktur.
**Sticky-Verhalten:** NavBar bleibt sticky on scroll, aber subtil — `border-b` erscheint nur wenn `scrollY > 8px`, kein Background-Wechsel.
### 6.3 Footer
4 Spalten:
1. Marken-Block: Logo + 1-Zeiler + Newsletter-Hinweis (führt zu `/kontakt#newsletter` — Phase 2).
2. Produkt: Module / Souveränität / Roadmap / Tester
3. Stack: PostgreSQL / PostgREST / Docker / Hetzner DE
4. Kontakt: hallo@slimcore.io / Termin → / digiFORMER GmbH-Adresse
Bottom-Bar: `© 2026 SlimCore — ein Produkt der digiFORMER GmbH · Impressum · Datenschutz · AGB`
---
## 7. Seiten-Spezifikation
### 7.1 `/` (Home) — der Reihe nach
**1. Hero**
- Eyebrow (Mono): „GESCHÄFTSSOFTWARE FÜR SOLO-SELBSTSTÄNDIGE UND KLEINE TEAMS"
- H1 (Serif, Display): „Schlank starten.<br>Grenzenlos wachsen."
- „Grenzenlos" optional in Persimmon-Akzent als hervorgehobenes Wort (siehe §5.2 Akzent-Verwendungs-Regeln — sparsam!)
- Alternativ-Varianten für späteren A/B-Test: „Klein und schlank. Auch wenn Sie wachsen." / „Eine Plattform für alles, was nicht Buchhaltung ist."
- Lead (17px, Sans, secondary): „SlimCore ist die schlanke Geschäftssoftware für Solo-Selbstständige und kleine Teams. Sie aktivieren am Anfang nur, was Sie heute brauchen — meistens CRM, Belege und Aufgaben. Wenn aus Ihnen drei werden, dann fünfzehn, schalten Sie weitere Module zu, ohne zu wechseln."
- CTAs: `[Tester werden →]` (primary) `[Module ansehen →]` (secondary)
**2. Tech-Strip** (direkt unter Hero, voll Container-Breite, `border-y`)
- Mono, 11px: `STACK · PostgreSQL · PostgREST · Docker · Traefik · Hetzner Falkenstein / Nürnberg · DSGVO · ZUGFeRD 2.0 · DATEV`
**3. Modul-Landschaft (Hero-Visual)**
- Eyebrow: `VIER SÄULEN · 16 MODULE`
- H2: „Aktivieren Sie nur, was Sie heute brauchen."
- Lead (1 Satz): „Jedes Modul ist einzeln aktivierbar. Heute starten Sie mit CRM, Belegen und Aufgaben — morgen schalten Sie Versand und Team-E-Mail dazu, ohne Migration, ohne Wechsel."
- Legende mit 4 Status-Glyphen
- 4-Spalten-Grid mit `<ModuleCard>` für jede Säule (siehe Quelltext der Modul-Liste in §11 / Appendix A)
- Footer-Link: `Alle Module & Status ansehen →` führt zu `/module`
**4. Was uns trennt — drei Differenzierungen**
- Eyebrow: `WAS UNS TRENNT`
- H2: „Best-Practices der großen Tools. Bedienbar wie ein modernes SaaS."
- 3 NumberedItems (01/02/03):
- 01 · **Schlank von Tag 1** — „Sie aktivieren das, was Sie heute brauchen — meistens CRM, Belege und Aufgaben. Kein Onboarding-Marathon, keine 27-Module-Suite, die Sie nie ausschöpfen."
- 02 · **Wächst mit** — „Wenn aus Ihnen drei werden, dann fünfzehn, bleiben Sie in derselben Software. Team-Postfach, Lager, Versand, Workflow schalten Sie zu, wenn Sie sie wirklich brauchen — ohne Migration."
- 03 · **Souverän** — „In Deutschland gehostet, Open-Source-Stack, Datenexport jederzeit. Keine US-Cloud, kein Vendor-Lock-in, keine Lizenzbedingungen, die nächstes Jahr neu geschrieben werden."
**5. Souveränität (das große Versprechen)**
- Eyebrow: `DAS GROSSE VERSPRECHEN`
- H2 (Display, 2-spaltig): links „Ihre Daten.<br>Ihr Land.<br>Ihre Kontrolle." | rechts: Lead + 2×2-Grid mit Border-Left-Items für Hosting / Stack / Export / Egress
- Footer-Link: `Mehr zur Souveränität →` führt zu `/souveraenitaet`
**6. Roadmap-Snapshot**
- Eyebrow: `ROADMAP`
- H2: „Heute. Bald. Vision."
- Vertikale 4-Phasen-Timeline (Heute / Q3-Q4 2026 / 2027 / Vision) mit jeweils Modul-Liste
- Footer-Link: `Detail-Roadmap →` führt zu `/roadmap`
**7. Schnell-Argumentarium (5 Einwände)**
- Eyebrow: `FÜNF EINWÄNDE, FÜNF SÄTZE`
- H2: „Antworten, die Sie sonst erst im dritten Call bekommen."
- Grid mit `<ObjectionAnswer>` (auf Mobile gestapelt, auf Desktop 2-spaltig mit ungerader letzter Zeile):
1. „Wir sind nur zwei. Lohnt sich das?" → Genau für Sie gebaut. Drei Module zum Start, Module wachsen mit
2. „Was, wenn wir wachsen?" → Skaliert von 1 bis ~50, dieselbe Software, mehr aktivierte Module
3. „Wir nutzen schon HubSpot." → Lücke zwischen Pipeline und Belegen schließen, ohne HubSpot abzulösen
4. „Odoo war zu komplex." → 80 % von Odoo, ohne Implementierungs-Overhead
5. „Was, wenn ihr verschwindet?" → Voller Export, offenes Schema, jeder PG-Hoster führt's weiter
- (Wortlaute aus PDF §13 — leicht angepasst, NICHT 1:1 wenn das den Lesefluss bricht.)
**8. Tester-Programm-Teaser**
- Eyebrow: `TESTER-PROGRAMM · PHASE 1`
- H2: „Sie kennen die Lücken besser als jeder Berater."
- Body: „Helfen Sie uns, die Geschäftssoftware zu bauen, die Sie hoffentlich die nächsten zehn Jahre nutzen wollen. Im Gegenzug: früher Einfluss, vergünstigte oder kostenfreie Nutzung — und ein direkter Draht ins Team."
- CTAs: `[Tester werden →]` `[hallo@slimcore.io]`
**9. Final-CTA**
- Schlanker Closer: „30 Minuten, kostenlos, unverbindlich. Sie schildern, wo Sie stehen — wir sagen ehrlich, ob SlimCore zu Ihrer Situation passt."
- Buttons: `[Tester werden →]` `[Termin vereinbaren →]`
### 7.2 `/module`
- Hero-light: Eyebrow + H1 „Module" + Lead „Was Sie aktivieren können — und in welcher Reife."
- Filter-Bar (React-Island, `client:visible`): Status-Filter (Alle / Verfügbar / In Entw. / Geplant / Vision) + Säulen-Filter (Alle / 01 / 02 / 03 / 04). Reine Client-Filterung, kein State im URL für Phase 1.
- Tabelle/Liste: pro Modul → Name, Säule, Status, 1-Satz-Beschreibung, ggf. Voraussetzungen.
- Datenquelle: `src/content/module.ts` als Single Source of Truth (siehe Appendix A).
### 7.3 `/souveraenitaet`
Long-form, MDX-fähig. Sektionen:
1. **Warum das jetzt zählt** — CLOUD Act, Schrems II, geopolitische Unsicherheit (Pascal-Tonalität: nüchtern, nicht alarmistisch)
2. **Hosting** — Hetzner, deutsches Recht, DSGVO
3. **Open-Source-Stack** — PostgreSQL, PostgREST, Traefik, Docker, React. Tabellen: Komponente → Lizenz → Anbieter
4. **Keine US-Abhängigkeiten** — Auth-Layer auf PostgreSQL-Basis (Zitadel als perspektivisches Ziel), Brevo (FR), Adress-Adapter (austauschbar), Garage Object Storage (selbst gehostet)
5. **Kein Vendor-Lock-in** — Export-Formate, offenes Schema, BuHa-API-Kompatibilität
6. **Optionaler Compliance-Layer** — Egress-Audit, Egress-Proxy
Visuelle Sprache wie auf Home: nummerierte Sektionen 0106, viel Mono in Caption, Border-Left-Items für Listen.
### 7.4 `/tester`
- Hero: H1 „Tester-Programm · Phase 1", Lead: „Wir suchen Solo-Selbstständige und kleine Teams aus diversen Branchen — und auch ein paar wachsende KMU. Ein bewusst breites Spektrum, weil wir verschiedene Nutzungsmuster sehen wollen, bevor wir verengen."
- Sektion „Wer wird gesucht" — Liste aus PDF §10.1 (Solos/Mikroteams primär, KMU sekundär, eCommerce „willkommen, kein Muss")
- Sektion „Was Tester bekommen" — Liste aus §10.2
- Sektion „Was Tester geben" — Liste aus §10.3
- Sektion „Worauf einstellen" — Liste aus §10.4 (kursiv, ehrlicher Disclaimer)
- **Anmeldeformular** (`<TesterForm>` React-Island):
- Felder: Firma* (mit Hint „auch Einzelunternehmen — geben Sie einfach Ihren Namen an"), Name*, E-Mail*, Telefon (optional)
- Branche: Free-Text statt Select (kein Genre-Korsett für die Primärgruppe)
- Team-Größe: Range-Slider 150, Default 3
- „Was nutzen Sie heute?" (Textarea, kurz) — wertvoller Diagnose-Input für Pascal
- „Was wäre die größte Lücke?" (Textarea)*
- Honeypot-Feld + Altcha (self-hosted Proof-of-Work-Challenge, kein Drittanbieter). Verifikation serverseitig.
- Doppel-Opt-in via Brevo
- Submit → `/danke`
- Footer-Block mit Pascal-Tonalitäts-Zitat aus PDF §10.5
### 7.5 `/roadmap`
Detail-Version der Home-Timeline. Pro Phase: alle Module mit aktuellem Status und 1-Satz-Erläuterung. Klare visuelle Trennung „heute funktioniert" vs. „kommt vs. „Vision".
### 7.6 `/kontakt`
- Adresse digiFORMER GmbH, hallo@slimcore.io
- **Termin-Buchung:** Calendly-Link `https://calendly.com/digiformer/quick-call` — als externer Link in einem neuen Tab, NICHT als Inline-Embed. Damit kein Calendly-JavaScript / keine Cookies in der SlimCore-Domain landen — vermeidet Cookie-Consent-Pflicht.
- Kein Kontaktformular auf dieser Seite (Tester-Form ist primärer Funnel).
- **Übergangs-Hinweis:** Calendly ist Übergangslösung. Ein SlimCore-natives Termin-Buchungs-Modul ist Pascal-Roadmap-Item; sobald verfügbar, wird der Link durch dieses Modul ersetzt. Bis dahin akzeptierter Souveränitäts-Trade-off, weil Calendly nur als externer Link verwendet wird (keine Daten-Verarbeitung auf slimcore.io selbst).
- **Datenschutzerklärung:** Calendly als Datenverarbeiter erwähnen (US-Anbieter, Cookies bei Klick auf den Link), Hetzner und Brevo ebenfalls — siehe §7.7. Kein Cloudflare-Turnstile / reCAPTCHA, weil nicht im Stack.
### 7.7 `/impressum` & `/datenschutz`
- Impressum nach §5 TMG, vorbefüllen mit digiFORMER-GmbH-Daten als Platzhalter — Pascal final freigeben.
- Datenschutzerklärung: Brevo (FR), Hetzner (DE) als Auftragsverarbeiter, Calendly (US, Übergangs-Realität bis SlimCore-natives Termin-Modul). Altcha ist self-hosted und damit nicht zu nennen. Keine Analytics in Phase 1.
---
## 8. Inhaltliche Regeln & Wording
Quelle: PDF §11 + Pascal-Memory.
### 8.1 Wording-Konventionen
- **„Mandant"** statt „Tenant" oder „Workspace"
- **„Belegfluss"** statt „Document Flow"
- Umlaute schreiben — IMMER `ä/ö/ü/ß`, niemals `ae/oe/ue`
- **„KMU"** für die Zielgruppe (nicht „SMB", nicht „Mittelständler" überall)
- **„Setup-Service"** statt „Onboarding-Paket"
- **„DSGVO-konform"** ist Mindestanforderung — nicht als Verkaufsargument für sich allein
- **„SlimCore"** — nicht „Cockpit", nicht „digiFORMER Cockpit"
- **„digiFORMER GmbH"** — bei Markenangaben mit Camel-Case
- **Kein Verweis auf Personen außerhalb von Pascal Oelmann** als Kontaktperson, solange das Team nicht explizit sichtbar ist
### 8.2 Tonalitäts-Verbote
- Keine US-Marketing-Klischees: kein „supercharge", „rocket", „game-changer", „revolutionize", „reimagine"
- Keine Versprechen für Vision-Features. Vision = `<StatusDot status="vision">`. Vision wird benannt, nicht verkauft.
- Keine echten Kundennamen ohne Freigabe (Phase 1: keine Kunden-Logos auf der Site)
- Keine Vergleiche per Markenname ohne juristische Vorprüfung — bei den Einwänden im Schnell-Argumentarium ist HubSpot/Odoo OK (sind Eigenzitate aus typischen Verkaufsgesprächen, kein Vergleichsclaim)
- Kein Superlativ ohne Beleg
### 8.3 Tonalitäts-Gebote
- Klar, nicht großspurig
- Selbstbewusst, nicht arrogant
- Pragmatisch, nicht idealistisch (Souveränität ist Nutzen, kein moralisches Argument)
- Deutsch zuerst — EN folgt in Phase 2
---
## 9. Implementierungs-Phasen
Claude Code arbeitet diese Phasen sequenziell ab. Jede Phase endet mit einer Pause für Pascal-Review.
### Phase 0 — Setup (1 Session)
1. Astro-Projekt initialisieren (`pnpm create astro@latest`, Template: minimal)
2. `@astrojs/react`, `@astrojs/sitemap`, `@astrojs/mdx` installieren
3. Tailwind v4 einrichten (via Vite-Plugin, nicht via PostCSS)
4. `global.css` mit `@theme` und allen Token-Variablen anlegen (siehe §5.2/5.3)
5. Self-hosted Fonts in `public/fonts/` ablegen, `@font-face` in `global.css`
6. shadcn/ui-Setup für Astro: Button, Input, Textarea, Label, Dialog
7. `BaseLayout.astro` mit `<head>`, OG-Tags, NavBar, Footer
8. NavBar + Footer minimal funktionsfähig
9. **Pause:** Pascal überprüft Look der Layout-Hülle.
### Phase 1 — Komponenten-Bibliothek (1 Session)
10. `Eyebrow`, `SectionHeading`, `NumberedItem` — primitive Layout-Bausteine
11. `StatusDot`, `ModuleCard`, `ModuleGrid`
12. `TechStrip`, `SovereigntyBlock`, `RoadmapTimeline`
13. `ObjectionAnswer`, `CTABlock`
14. Storybook-light: `/dev/components.astro` — eine interne Seite, die alle Bausteine in allen Varianten zeigt (für visuelle Regression)
15. **Pause:** Pascal überprüft Komponenten einzeln.
### Phase 2 — Home (1 Session)
16. `index.astro` mit allen 9 Sektionen
17. Modul-Daten aus `src/content/module.ts` (Appendix A)
18. SEO-Tags, OG-Image (statisches PNG zunächst)
19. **Pause:** Pascal Review.
### Phase 3 — Module + Tester (12 Sessions)
20. `/module` mit Filter-Island
21. `/tester` mit Form-Island
22. App-API-Anbindung an `app.slimcore.io/api/public/leads` (siehe `slimcore-go-to-market.md` §3 für die Spezifikation). Brevo nur als Transactional-Mail-Provider für die DOI-Bestätigung.
23. Altcha-Integration (self-hosted PoW-Challenge): NPM-Paket `altcha-lib` server-seitig, `altcha`-Web-Component clientseitig. Challenge-Endpoint im Astro-Server oder direkt in der App-API. Honeypot-Feld zusätzlich.
24. `/danke` Bestätigungsseite
25. **Pause:** End-to-End-Test der Tester-Anmeldung.
### Phase 4 — Restliche Seiten (1 Session)
26. `/souveraenitaet`, `/roadmap`, `/kontakt`
27. `/impressum`, `/datenschutz` (Templates)
28. **Pause:** Inhalts-Review mit Pascal.
### Phase 5 — Polish & Deploy (1 Session)
29. Lighthouse-Run, alle Scores ≥ 95 (Performance/SEO/A11y/Best-Practices)
30. Sitemap + robots.txt
31. Open-Graph-Bild dynamisch (Satori als self-hosted Render-Library, KEIN Vercel-OG-Library-Endpoint), optional. Phase 1 reicht statisches PNG.
32. Hetzner-VPS-Deployment via Coolify, Domain-Anbindung, Caddy/nginx mit Let's Encrypt
33. Playwright-Smoke-Tests für alle Seiten
34. **Launch.**
### Phase 6 — Phase-2-Backlog (später, NICHT Teil des Initial-Builds)
- `/notizen` Blog mit MDX
- EN-Variante mit `astro-i18n` oder Manual-Routing
- Newsletter-Doppel-Opt-in über Brevo
- Status-Page-Banner („System operational")
- Pascal-„Über uns"-Mini-Sektion auf Home
---
## 10. Was Claude Code NICHT tun soll
- ❌ Ein Theme-Switcher zwischen Akzentfarben einbauen (auch nicht als Easter-Egg)
- ❌ Komplexe Animationen mit Framer-Motion / GSAP / Lottie
- ❌ Card-Hover-Effekte mit `transform` und Schatten
- ❌ shadcn-Card-Komponente nutzen — wir bauen eigene minimale Cards
- ❌ Stock-Fotos einbauen — keine Bilder von Menschen außer (Phase 2) Pascal-Portrait
- ❌ Generierte 3D-Mockups der Software (auch wenn beeindruckend)
- ❌ Google Fonts via CDN
- ❌ Google Analytics, Hotjar, Meta Pixel — Tracking-Setup ist Phase-2-Diskussion mit Pascal
- ❌ HubSpot/Pipedrive/Salesforce-Integrationen — Souveränitäts-Widerspruch
- ❌ Cookie-Banner für nicht-existente Cookies. Altcha ist self-hosted (keine Drittpartei), Brevo läuft nur als Mail-Versender (keine Cookies auf slimcore.io), keine Analytics in Phase 1 — kein Banner nötig.
- ❌ Vision-Features als verfügbar darstellen
- ❌ Erfundene Kundenstimmen oder Logo-Walls
---
## 11. Module-Daten (Single Source of Truth)
Datei: `src/content/module.ts`
```typescript
export type ModuleStatus = 'available' | 'developing' | 'planned' | 'vision';
export type Pillar = '01' | '02' | '03' | '04';
export interface Module {
id: string;
name: string;
pillar: Pillar;
pillarTitle: string;
status: ModuleStatus;
description: string;
}
export const modules: readonly Module[] = [
// Pillar 01 — Kunden & Kommunikation
{ id: 'crm', name: 'CRM', pillar: '01', pillarTitle: 'Kunden & Kommunikation', status: 'available', description: 'Zentrale Kontaktverwaltung mit Firmen/Personen, Interaktions-Timeline, Vertriebs-Pipeline (Kanban), Tags, Custom Fields, Massenaktionen.' },
{ id: 'team-email', name: 'Team-E-Mail', pillar: '01', pillarTitle: 'Kunden & Kommunikation', status: 'developing', description: 'Geteilte Postfächer über MS365 angebunden. Drei-Spalten-UI, automatische CRM-Zuordnung, Inbox-Übersicht.' },
{ id: 'helpdesk', name: 'Helpdesk', pillar: '01', pillarTitle: 'Kunden & Kommunikation', status: 'planned', description: 'Aus E-Mails werden Tickets. Zuweisung, Status-Workflow, SLA-Tracking. Kein Portal-Konto nötig.' },
{ id: 'phone', name: 'Telefonie', pillar: '01', pillarTitle: 'Kunden & Kommunikation', status: 'planned', description: 'Yeastar P520-Anbindung. Echtzeit-Erfassung, CRM-Zuordnung, verpasste Anrufe als Widget.' },
{ id: 'whatsapp', name: 'WhatsApp', pillar: '01', pillarTitle: 'Kunden & Kommunikation', status: 'planned', description: 'WhatsApp Business API als Eingangskanal. Automatisches CRM-Matching, Timeline-Eintrag.' },
// Pillar 02 — Handel & Logistik
{ id: 'items', name: 'Artikel', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'developing', description: 'Stammdaten mit Varianten, Stücklisten/Bundles, Chargen-/MHD-/Seriennummern, Preislisten, EU-LMIV-Felder.' },
{ id: 'inventory', name: 'Lager', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'available', description: 'Lagerorte, Bestandsführung, Wareneingänge, FIFO/FEFO, MHD-Tracking, Seriennummern, mehrere Lager.' },
{ id: 'orders', name: 'Bestellungen', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'available', description: 'Alle Kanäle konsolidiert. Positionsverwaltung, Status-Workflow, Bezahlstatus-Tracking.' },
{ id: 'channels', name: 'Verkaufskanäle', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'developing', description: 'WooCommerce bidirektional, Amazon SP-API kurz davor, Shopify/Kaufland/Etsy später.' },
{ id: 'shipping', name: 'Versand', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'developing', description: 'Multi-Carrier: DHL zuerst, DPD/GLS/Hermes folgen. Label, Tracking, Shiptastic-Integration.' },
{ id: 'purchasing', name: 'Einkauf', pillar: '02', pillarTitle: 'Handel & Logistik', status: 'planned', description: 'Lieferanten als CRM-Kontakte, Einkaufsbestellungen, Wareneingang mit Bestandsbuchung.' },
// Pillar 03 — Belege & Finanzen
{ id: 'documents', name: 'Belege', pillar: '03', pillarTitle: 'Belege & Finanzen', status: 'available', description: 'Konfigurierbarer Belegfluss: Angebot → AB → Lieferschein → Rechnung → Gutschrift → Mahnung. PDF-Erzeugung, Vorlagen pro Mandant.' },
{ id: 'invoices', name: 'Rechnungen', pillar: '03', pillarTitle: 'Belege & Finanzen', status: 'developing', description: 'Aus Bestellungen, Zeiterfassung oder manuell. ZUGFeRD 2.0 und XRechnung.' },
{ id: 'payments', name: 'Zahlungen', pillar: '03', pillarTitle: 'Belege & Finanzen', status: 'available', description: 'Offene-Posten, Zahlungseingänge, Teilzahlungen, vierstufiges Mahnwesen, Liquiditäts-Widget.' },
{ id: 'accounting', name: 'BuHa-Export', pillar: '03', pillarTitle: 'Belege & Finanzen', status: 'available', description: 'DATEV-CSV produktiv, sevDesk-API und Lexware-API in Vorbereitung.' },
// Pillar 04 — Team & Organisation
{ id: 'tasks', name: 'Aufgaben', pillar: '04', pillarTitle: 'Team & Organisation', status: 'developing', description: 'Kanban oder Liste. Zuweisung, Fälligkeiten, Kommentare, Verknüpfung mit Kontakten/Bestellungen/Belegen.' },
{ id: 'projects', name: 'Projekte', pillar: '04', pillarTitle: 'Team & Organisation', status: 'planned', description: 'Klammer um Aufgaben mit Meilensteinen und Budget-Tracking.' },
{ id: 'time', name: 'Zeiterfassung', pillar: '04', pillarTitle: 'Team & Organisation', status: 'planned', description: 'Stempeluhr + Projektzeiten. Erfasste Zeiten werden auf Wunsch zu Rechnungspositionen.' },
{ id: 'hr', name: 'Personal', pillar: '04', pillarTitle: 'Team & Organisation', status: 'planned', description: 'Stammdaten, Arbeitsverträge, Urlaubsanträge mit Genehmigungs-Workflow, Abwesenheitskalender.' },
] as const;
```
---
## 12. SEO & Meta
### 12.1 Globale Meta-Tags (in `BaseLayout.astro`)
```html
<title>{title} — SlimCore</title>
<meta name="description" content="{description}" />
<meta property="og:title" content="{title}" />
<meta property="og:description" content="{description}" />
<meta property="og:image" content="{ogImage ?? '/og-default.png'}" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="de_DE" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="canonical" href="{canonicalUrl}" />
<link rel="alternate" hreflang="de" href="{deUrl}" />
<!-- hreflang en kommt in Phase 2 -->
```
### 12.2 Default-Texte
- Site-Title: `SlimCore — Schlanke Geschäftssoftware für Solo-Selbstständige und kleine Teams`
- Site-Description: `Modulare SaaS-Plattform für CRM, Belege, Aufgaben und Workflow. Schlank starten, grenzenlos wachsen — in Deutschland gehostet, Open-Source-Stack, kein Vendor-Lock-in.`
### 12.3 Pro-Seite-Meta (Beispiele)
```ts
export const meta = {
'/': { title: 'Schlank starten. Grenzenlos wachsen.', description: 'Schlanke Geschäftssoftware für Solo-Selbstständige und kleine Teams. CRM, Belege, Aufgaben — modular, in Deutschland gehostet, Open Source, kein Vendor-Lock-in.' },
'/module': { title: 'Module — Was Sie aktivieren können', description: '16 Module in 4 Säulen. Was heute produktiv ist, was im Aufbau ist, was in der Roadmap steht. Aktivieren Sie heute drei, schalten Sie morgen das vierte zu.' },
'/souveraenitaet':{ title: 'Digitale Souveränität — wie SlimCore das löst', description: 'Hetzner-Rechenzentren, Open-Source-Stack, kein US-Anbieter im Datenfluss, voller Datenexport in offenen Formaten.' },
'/tester': { title: 'Tester-Programm — Phase 1', description: 'Wir suchen Solo-Selbstständige und kleine Teams für die Tester-Phase. Früher Einfluss, vergünstigte Nutzung, direkter Draht ins Team.' },
'/roadmap': { title: 'Roadmap — Heute, bald, Vision', description: 'Was heute produktiv ist, was Q3/Q4 2026 kommt, was 2027 ansteht, und wohin wir wollen.' },
};
```
### 12.4 Strukturierte Daten
`schema.org/SoftwareApplication` auf der Home als JSON-LD:
```json
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "SlimCore",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"offers": { "@type": "Offer", "priceCurrency": "EUR" },
"publisher": {
"@type": "Organization",
"name": "digiFORMER GmbH",
"url": "https://digiformer.eu"
}
}
```
---
## 13. Performance-Budget
| Metrik | Ziel |
|---|---|
| LCP | < 1.5 s |
| CLS | < 0.05 |
| Total JS Bundle (Home) | < 50 KB nach gzip |
| Total Page Weight (Home) | < 200 KB ohne Fonts |
| Fonts | self-hosted, woff2, `font-display: swap`, subset Latin-Ext |
Astro liefert das mit Bordmitteln, solange wir keine Bilder ohne Optimierung einbauen. Alle eingebundenen Bilder über Astro's `<Image>` mit AVIF-Output.
---
## 14. Accessibility
- Alle interaktiven Elemente keyboard-erreichbar
- Focus-Ring sichtbar (2px solid var(--color-accent), offset 2px)
- Color-Contrast ≥ 4.5:1 für Body-Text, ≥ 3:1 für Large Text
- `prefers-reduced-motion` respektieren — keine Auto-Scroll-Animationen
- Form-Labels immer sichtbar (kein Placeholder-as-Label)
- `aria-describedby` für Form-Hilfetexte
- Sprache-Switcher: `<a hreflang>` korrekt gesetzt
- Heading-Hierarchie strikt: ein H1 pro Seite, dann H2 → H3, keine Sprünge
---
## 15. Referenz-URLs
- **digiFORMER (Familien-Anker):** https://digiformer.lovable.app — Tonalität, nummerierte Sektionen, Editorial-Haltung
- **Lovable-Entwurf SlimCore (Counter-Example):** https://slimcore-sparkle-design.lovable.app — was zu vermeiden ist (Theme-Switcher, zu bunt, fehlendes Modul-Visual)
- **Produktbeschreibung (Master-Quelle):** `/docs/produktbeschreibung.pdf` und `/docs/produktbeschreibung.md`
- **Markensystem (familienweit):** `/docs/digiformer-brand-system.md` — Farben, Typografie, Status-Glyphen
- **Go-to-Market-Dokument:** lebt im SlimCore-App-Repo unter `/docs/slimcore-go-to-market.md` — dort sind API-Spezifikation für `/api/public/leads`, die drei Phasen, Workflow-Templates und Payment-Provider-Strategie dokumentiert. Marketing-Site referenziert dieses Dokument für die Form-Submission-Spec.
Claude Code soll die digiFORMER-Site EINMAL pro Session als visuelle Referenz fetchen, NICHT 1:1 nachbauen — sondern die typografische Haltung übernehmen und die Modul-zentrische Eigenständigkeit von SlimCore drauflegen.
---
## 16. Glossar
| Begriff | Bedeutung |
|---|---|
| Mandant | ein Kunde von SlimCore (= Tenant) |
| Säule | eine der 4 Modul-Gruppen |
| Modul | eine funktionale Einheit (CRM, Lager, ...) |
| Belegfluss | Angebot → AB → Lieferschein → Rechnung → Gutschrift → Mahnung |
| BuHa | Buchhaltung |
| KMU | Kleine und Mittlere Unternehmen |
| Setup-Service | Bezahlte Einrichtung/Datenmigration/Schulung |
| Tester-Phase 1 | Aktuelle Programm-Stufe für Early Adopters |
---
## 17. Offene Entscheidungen (für Pascal)
Diese Punkte sind nicht final — Claude Code soll bei dem genannten Default starten und Pascal explizit auf die Stelle hinweisen, an der die Entscheidung steht.
1. **Akzentfarbe SlimCore — ✓ ENTSCHIEDEN:** Persimmon `#EC5C29`, Teil des familienweiten Markensystems. Siehe `digiformer-brand-system.md`.
2. **Hosting — ✓ ENTSCHIEDEN:** Hetzner-VPS (DE) mit Coolify als Deployment-Layer. OVHcloud (FR) als zweite Option. Vercel/Netlify/Cloudflare-Pages ausgeschlossen — siehe Brand-System §7.4.
3. **Form-Backend — ✓ ENTSCHIEDEN:** App-API (`app.slimcore.io/api/public/leads`) als primärer Endpoint. Brevo nur für Transactional-Mail. Spezifikation siehe `slimcore-go-to-market.md` §3.
4. **Termin-Buchung — ✓ ENTSCHIEDEN:** Calendly `https://calendly.com/digiformer/quick-call`, als externer Link (kein Embed). Übergangslösung bis zum SlimCore-eigenen Buchungs-Modul. Datenschutzerklärung muss Calendly nennen.
5. **OG-Image** — Phase 1: statisches PNG. Phase 2: dynamische Generierung via Satori.
6. **Cookie-Consent** — abhängig von finalem Tracking-Setup. Default Phase 1: kein Banner, weil keine Cookies, die Consent benötigen.
7. **Tokens-Paket** — Heute: Werte aus `digiformer-brand-system.md` kopieren. Später: `@digiformer/design-tokens` npm-Paket aufsetzen, wenn der dritte Marken-Build ansteht (Phase 2).
8. **Bot-Schutz — ✓ ENTSCHIEDEN:** Altcha (Open Source, self-hosted). Keine Drittpartei zwischen Tester und SlimCore — das ist die souveränitäts-konsistenteste Option. Implementiert als kleiner Server-Endpoint (Proof-of-Work-Challenge), der lokal vom Astro-Backend oder direkt von der App-API ausgeliefert wird. Plus Honeypot-Feld. Friendly Captcha bleibt Backup, falls Altcha-PoW gegen Bot-Volumen nicht reicht.
9. **Analytics — ✓ ENTSCHIEDEN:** Keine in Phase 1. Datenschutz-Premium und ein zusätzlicher konsistenter Souveränitäts-Punkt („Wir tracken Sie nicht" als Marken-Argument). Pirsch (DE) oder Plausible (EE) bleiben als Option für Phase 2, wenn Conversion-Optimierung relevant wird.
10. **Code-Hosting — ✓ ENTSCHIEDEN:** GitHub für den Start (Übergangs-Realität, siehe Brand-System §7.5). Forgejo selbst gehostet auf Hetzner als mittel-fristiges Ziel. Migration vor erstem Production-Secret-Rollout. Bis dahin: keine sensiblen Secrets in GitHub-Issues, keine privaten Kunden-Daten in Repo-Files.
---
**Ende des Briefs.** Claude Code soll diese Datei in jeder Session zuerst lesen und bei Implementierungs-Entscheidungen explizit auf Sektionen verweisen.