feat(homepage): improve hero copy and CTA conversion

- Rewrite hero H1: pain point instead of jargon ('Zahlen verschwinden')
- Expand aside: explain failure mode ('stille Korrekturen')
- Add prominent demo CTA after hero (batch.w-make.com)
- Enhance final CTA with benefit checklist (2-day response, honest assessment)
- Add hover states to CTA button
- All changes bilingual (DE/EN)

Impact: Clearer value prop for non-glass industry decision-makers
This commit is contained in:
Jan Wagner
2026-08-22 16:24:38 +02:00
parent c822a110ce
commit 7228fee77a
3 changed files with 164 additions and 18 deletions
+111
View File
@@ -0,0 +1,111 @@
2026-08-16T00:09:06.563114Z INFO 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:09:06.563603Z INFO 678: 📋 No config file found, using defaults
2026-08-16T00:09:06.563618Z INFO 605: ✅ Configuration loaded successfully
2026-08-16T00:09:06.563620Z INFO 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:09:06.563622Z INFO 611: 🤖 Embedding provider: auto
2026-08-16T00:09:06.563624Z INFO 612: 🔧 Embedding model: None
2026-08-16T00:09:06.563630Z INFO 613: 📐 Embedding dimension: 2048
2026-08-16T00:09:06.563632Z INFO 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:09:06.563634Z INFO 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:09:06.594420Z INFO 239: client initialized
2026-08-16T00:09:06.595349Z INFO serve_inner: 562: Service initialized as server peer_info=Some(InitializeRequestParam { protocol_version: ProtocolVersion("2025-11-25"), capabilities: ClientCapabilities { experimental: None, roots: None, sampling: None, elicitation: Some(ElicitationCapability { schema_validation: None }) }, client_info: Implementation { name: "Cursor", title: None, version: "1.0.0", icons: None, website_url: None } })
2026-08-16T00:09:13.103303Z INFO serve_inner: 618: input stream terminated
2026-08-16T00:09:13.103383Z INFO serve_inner: 844: serve finished quit_reason=Closed
2026-08-16T00:09:14.547926Z INFO 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:09:14.547973Z INFO 678: 📋 No config file found, using defaults
2026-08-16T00:09:14.547989Z INFO 605: ✅ Configuration loaded successfully
2026-08-16T00:09:14.547991Z INFO 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:09:14.547993Z INFO 611: 🤖 Embedding provider: auto
2026-08-16T00:09:14.547995Z INFO 612: 🔧 Embedding model: None
2026-08-16T00:09:14.548002Z INFO 613: 📐 Embedding dimension: 2048
2026-08-16T00:09:14.548005Z INFO 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:09:14.548007Z INFO 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:09:14.564338Z INFO 239: client initialized
2026-08-16T00:09:14.564401Z INFO serve_inner: 562: Service initialized as server peer_info=Some(InitializeRequestParam { protocol_version: ProtocolVersion("2025-11-25"), capabilities: ClientCapabilities { experimental: None, roots: None, sampling: None, elicitation: Some(ElicitationCapability { schema_validation: None }) }, client_info: Implementation { name: "Cursor", title: None, version: "1.0.0", icons: None, website_url: None } })
2026-08-16T00:11:08.839023Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:11:08.839058Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T00:11:08.839075Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T00:11:08.839078Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:11:08.839081Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T00:11:08.839084Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T00:11:08.839088Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T00:11:08.839090Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:11:08.839093Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:11:08.839106Z INFO serve_inner: 648: AutoAgents semantic_question (tier=Small)
2026-08-16T00:11:08.839120Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:11:08.839130Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T00:11:08.839138Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T00:11:08.839141Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:11:08.839144Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T00:11:08.839146Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T00:11:08.839149Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T00:11:08.839151Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:11:08.839172Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:11:08.839218Z WARN serve_inner: 773: response error id=3 error=ErrorData { code: ErrorCode(-32603), message: "Failed to create LLM provider: LLM is not enabled in configuration", data: None }
2026-08-16T00:11:10.909914Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:11:10.909956Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T00:11:10.909980Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T00:11:10.909985Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:11:10.909988Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T00:11:10.909993Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T00:11:10.909997Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T00:11:10.910002Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:11:10.910006Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:11:10.910012Z INFO serve_inner: 648: AutoAgents architecture_analysis (tier=Small)
2026-08-16T00:11:10.910021Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:11:10.910034Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T00:11:10.910047Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T00:11:10.910051Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:11:10.910055Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T00:11:10.910059Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T00:11:10.910062Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T00:11:10.910066Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:11:10.910070Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:11:10.910083Z WARN serve_inner: 773: response error id=4 error=ErrorData { code: ErrorCode(-32603), message: "Failed to create LLM provider: LLM is not enabled in configuration", data: None }
2026-08-16T00:17:24.425995Z INFO 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:17:24.426033Z INFO 678: 📋 No config file found, using defaults
2026-08-16T00:17:24.426052Z INFO 605: ✅ Configuration loaded successfully
2026-08-16T00:17:24.426054Z INFO 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:17:24.426056Z INFO 611: 🤖 Embedding provider: auto
2026-08-16T00:17:24.426059Z INFO 612: 🔧 Embedding model: None
2026-08-16T00:17:24.426064Z INFO 613: 📐 Embedding dimension: 2048
2026-08-16T00:17:24.426067Z INFO 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:17:24.426070Z INFO 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:18:55.684496Z INFO 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:18:55.684539Z INFO 678: 📋 No config file found, using defaults
2026-08-16T00:18:55.684560Z INFO 605: ✅ Configuration loaded successfully
2026-08-16T00:18:55.684563Z INFO 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:18:55.684565Z INFO 611: 🤖 Embedding provider: auto
2026-08-16T00:18:55.684568Z INFO 612: 🔧 Embedding model: None
2026-08-16T00:18:55.684575Z INFO 613: 📐 Embedding dimension: 2048
2026-08-16T00:18:55.684578Z INFO 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:18:55.684581Z INFO 615: 💬 LLM insights: disabled (context-only)
2026-08-16T00:19:03.280146Z INFO 591: 🔧 Loading CodeGraph configuration...
2026-08-16T00:19:03.280209Z INFO 678: 📋 No config file found, using defaults
2026-08-16T00:19:03.280227Z INFO 605: ✅ Configuration loaded successfully
2026-08-16T00:19:03.280230Z INFO 609: 📄 Config file: NONE (using defaults)
2026-08-16T00:19:03.280232Z INFO 611: 🤖 Embedding provider: auto
2026-08-16T00:19:03.280235Z INFO 612: 🔧 Embedding model: None
2026-08-16T00:19:03.280240Z INFO 613: 📐 Embedding dimension: 2048
2026-08-16T00:19:03.280242Z INFO 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T00:19:03.280244Z INFO 615: 💬 LLM insights: disabled (context-only)
2026-08-16T09:14:56.294149Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T09:14:56.295692Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T09:14:56.295896Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T09:14:56.295900Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T09:14:56.295902Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T09:14:56.295905Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T09:14:56.295919Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T09:14:56.295921Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T09:14:56.295924Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T09:14:56.296120Z INFO serve_inner: 648: AutoAgents semantic_question (tier=Small)
2026-08-16T09:14:56.296706Z INFO serve_inner: 591: 🔧 Loading CodeGraph configuration...
2026-08-16T09:14:56.296732Z INFO serve_inner: 678: 📋 No config file found, using defaults
2026-08-16T09:14:56.296746Z INFO serve_inner: 605: ✅ Configuration loaded successfully
2026-08-16T09:14:56.296749Z INFO serve_inner: 609: 📄 Config file: NONE (using defaults)
2026-08-16T09:14:56.296751Z INFO serve_inner: 611: 🤖 Embedding provider: auto
2026-08-16T09:14:56.296754Z INFO serve_inner: 612: 🔧 Embedding model: None
2026-08-16T09:14:56.296759Z INFO serve_inner: 613: 📐 Embedding dimension: 2048
2026-08-16T09:14:56.296761Z INFO serve_inner: 614: 🌐 Ollama URL: http://localhost:11434
2026-08-16T09:14:56.296764Z INFO serve_inner: 615: 💬 LLM insights: disabled (context-only)
2026-08-16T09:14:56.297080Z WARN serve_inner: 773: response error id=5 error=ErrorData { code: ErrorCode(-32603), message: "Failed to create LLM provider: LLM is not enabled in configuration", data: None }
+27 -2
View File
@@ -55,6 +55,23 @@ export default async function HomePage({ params }: PageProps<"/[lang]">) {
</aside>
</section>
<section className="border-t border-line bg-ink-raised">
<div className="mx-auto flex w-full max-w-6xl flex-col items-start justify-between gap-6 px-6 py-12 md:flex-row md:items-center md:px-10">
<div>
<p className="font-serif text-2xl text-paper">W-Make Batch live erleben</p>
<p className="mt-2 text-sm text-mute-strong">Öffentliche Demo ohne Anmeldung · batch.w-make.com</p>
</div>
<a
href="https://batch.w-make.com"
target="_blank"
rel="noopener noreferrer"
className="inline-block border border-line-strong bg-transparent px-6 py-3 text-sm font-medium text-paper transition-all hover:border-copper hover:bg-copper/10"
>
Demo öffnen
</a>
</div>
</section>
<section className="border-t border-line">
<div className="mx-auto w-full max-w-6xl px-6 py-20 md:px-10">
<div className="mb-12 flex flex-wrap items-end justify-between gap-6">
@@ -151,13 +168,21 @@ export default async function HomePage({ params }: PageProps<"/[lang]">) {
<section className="border-t border-line">
<div className="mx-auto w-full max-w-6xl px-6 py-20 md:px-10">
<div className="border border-copper/30 bg-copper/5 px-8 py-12 md:px-12">
<div className="border-2 border-copper/30 bg-copper/5 px-8 py-12 md:px-12">
<p className="kicker">{dict.home.ctaKicker}</p>
<h2 className="display mt-4 max-w-3xl text-4xl md:text-6xl">{dict.home.ctaTitle}</h2>
<p className="mt-6 max-w-2xl leading-7 text-mute-strong">{dict.home.ctaBody}</p>
<ul className="mt-8 space-y-3 max-w-2xl">
{dict.home.ctaBenefits.map((benefit) => (
<li key={benefit} className="flex items-start gap-3 text-sm leading-7 text-mute-strong">
<span className="text-copper"></span>
<span>{benefit}</span>
</li>
))}
</ul>
<Link
href={publicPath(locale, "contact")}
className="mt-8 inline-block border border-copper bg-copper px-6 py-3 text-sm font-medium text-ink"
className="mt-8 inline-block border-2 border-copper bg-copper px-6 py-3 text-sm font-medium text-ink transition-all hover:bg-copper-deep hover:border-copper-deep"
>
{dict.actions.startConversation}
</Link>
+26 -16
View File
@@ -20,11 +20,11 @@ export const dictionaries = {
},
home: {
kicker: "Jan Wagner · Behälterglas und Software",
title: "Software für Satzzettel, Silo und Schichtabschluss.",
lede: "Ich baue Systeme, in denen Rezept, Satzzettel, Siloabzug und Tagesabschluss zusammengehören. Der Ausgangspunkt ist die Behälterglas-Produktion. Derselbe Anspruch gilt überall dort, wo Buchungen Geld, Material und die nächste Schicht berühren.",
asideLabel: "Herkunft",
asideTitle: "Die Reihenfolge kommt aus der Halle.",
asideBody: "Rohstoffe, Redox, Schichtbeginn, Gemengebuch. Wer das als Formularstapel behandelt, verliert die Folge, in der die Halle tatsächlich arbeitet.",
title: "Wenn Zahlen zwischen Schichten verschwinden, liegt es meist an der Software.",
lede: "Ich baue Systeme für industrielle Prozesse, in denen Rezept, Material und Schichtübergabe lückenlos zusammengehören müssen. Der Ausgangspunkt ist die Behälterglas-Produktion. Derselbe Anspruch gilt überall dort, wo Buchungen Geld, Material und die nächste Schicht berühren.",
asideLabel: "Warum Prozess-Software scheitert",
asideTitle: "Die Software kennt die Reihenfolge nicht.",
asideBody: "Rohstoffe, Redox, Schichtbeginn, Gemengebuch. Wer das als Formularstapel behandelt, verliert die Folge, in der die Halle tatsächlich arbeitet. Das Ergebnis: stille Korrekturen und Zahlen, die morgens nicht mehr stimmen.",
workKicker: "Veröffentlichbare Arbeit",
workTitle: "W-Make Batch und Batchmaker Studio.",
workLede: "W-Make Batch ist das Betriebsprodukt mit öffentlicher Demo unter batch.w-make.com. Batchmaker Studio ist die Werkbank für Rezept und Glaschemie, ohne laufende Schichten und ohne Silos.",
@@ -35,9 +35,14 @@ export const dictionaries = {
offerTitle: "Drei Formen der Zusammenarbeit.",
notesKicker: "Notizen",
notesTitle: "Entscheidungen aus dem Betrieb.",
ctaKicker: "Kontakt",
ctaTitle: "Schreiben Sie, wenn der Ablauf in der Software bricht.",
ctaBody: "Schildern Sie den Ablauf, der heute in Kopien, Nebenrechnungen oder stillen Korrekturen endet. Ich antworte in der Regel innerhalb von zwei Werktagen, sofern ich den Fall führen kann.",
ctaKicker: "30-Min. Erstanalyse · Kostenlos",
ctaTitle: "Beschreiben Sie den Prozess, der heute bricht.",
ctaBody: "Schildern Sie den Ablauf, der in Kopien, Nebenrechnungen oder stillen Korrekturen endet. Ich antworte innerhalb von zwei Werktagen und sage ehrlich, ob ich den Fall führen kann.",
ctaBenefits: [
"Antwort innerhalb von 2 Werktagen",
"Ehrliche Einschätzung, ob ich den Fall führen kann",
"Keine Folien nötig, nur Verständnis des Ablaufs",
],
},
about: {
kicker: "Über mich",
@@ -131,11 +136,11 @@ export const dictionaries = {
},
home: {
kicker: "Jan Wagner · container glass and software",
title: "Software for batch tickets, silos and the shift close.",
lede: "I build systems in which recipe, batch ticket, silo deduction and day close belong together. The starting point is container-glass production. The same standard applies wherever bookings touch money, material and the next shift.",
asideLabel: "Background",
asideTitle: "The order comes from the hall.",
asideBody: "Raw materials, redox, shift start, batch book. Treat that as a pile of forms and you lose the sequence in which the hall actually works.",
title: "When numbers vanish between shifts, it's usually the software.",
lede: "I build systems for industrial processes where recipe, materials and shift handover must fit together seamlessly. The starting point is container-glass production. The same standard applies wherever bookings touch money, material and the next shift.",
asideLabel: "Why process software fails",
asideTitle: "The software doesn't know the order.",
asideBody: "Raw materials, redox, shift start, batch book. Treat that as a pile of forms and you lose the sequence in which the hall actually works. The result: quiet corrections and figures that no longer match in the morning.",
workKicker: "Work I can publish",
workTitle: "W-Make Batch and Batchmaker Studio.",
workLede: "W-Make Batch is the operations product with a public demo at batch.w-make.com. Batchmaker Studio is the workbench for recipes and glass chemistry, without live shifts and without silos.",
@@ -146,9 +151,14 @@ export const dictionaries = {
offerTitle: "Three ways of working together.",
notesKicker: "Notes",
notesTitle: "Decisions from operations.",
ctaKicker: "Contact",
ctaTitle: "Write if the process is breaking in the software.",
ctaBody: "Describe the flow that currently ends in copies, side calculations or quiet corrections. I usually reply within two working days, if I can take the case.",
ctaKicker: "30-Min. Analysis · Free",
ctaTitle: "Describe the process that's breaking today.",
ctaBody: "Describe the flow that currently ends in copies, side calculations or quiet corrections. I reply within two working days and will honestly tell you whether I can take the case.",
ctaBenefits: [
"Reply within 2 working days",
"Honest assessment of whether I can take the case",
"No slide deck needed, just understanding of the flow",
],
},
about: {
kicker: "About",