SEO: Canonicals/OG auf allen Seiten, WebP, Caching, www-Redirect
Deploy / build-and-deploy (push) Successful in 24s

- alle Unterseiten: Canonical-Tags; techday/gamejam zusaetzlich Open Graph
- techday: Event-JSON-LD (27. Mai 2026, HubWerk01 Bruchsal)
- mITapp-Screenshots als WebP (1,6 MB -> 65 KB) mit width/height/lazy
- dediziertes OG-Bild 1200x630 (Logo + Tagline) fuer Start & GameJam
- server.js: 301 www -> non-www, /index.html -> /, statische Assets
  1 Jahr immutable cachen (HTML weiter no-cache), .webp MIME
- CSS/JS ueberall versioniert (?v=20260610)
- sitemap: lastmod ergaenzt, noindex-Seiten (Impressum/Datenschutz) entfernt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
ToolCTRLandClaude Opus 4.8 committed 2026-06-10 19:56:50 +02:00
1 parent 41bdd52be8
commit 9f832bcec7
11 files changed
+85 -21

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

+2 -1
View File
@@ -6,8 +6,9 @@
<title>Datenschutzerklärung: ToolCTRL</title>
<meta name="description" content="Datenschutzerklärung von ToolCTRL: Informationen zur Verarbeitung personenbezogener Daten auf dieser Website." />
<meta name="robots" content="noindex" />
<link rel="canonical" href="https://tool-ctrl.de/datenschutz.html" />
<link rel="icon" type="image/png" href="/assets/favicon.png" />
<link rel="stylesheet" href="/styles.css" />
<link rel="stylesheet" href="/styles.css?v=20260610" />
</head>
<body>
+9
View File
@@ -5,6 +5,15 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI GameJam: Human in the Loop, TechDay Bruchsal 2026</title>
<meta name="description" content="AI GameJam von ToolCTRL beim TechDay Bruchsal 2026: In wenigen Stunden mit KI ein spielbares Game bauen. Human in the Loop, im HubWerk01 Bruchsal.">
<link rel="canonical" href="https://tool-ctrl.de/gamejam.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="ToolCTRL">
<meta property="og:locale" content="de_DE">
<meta property="og:url" content="https://tool-ctrl.de/gamejam.html">
<meta property="og:title" content="AI GameJam: Human in the Loop, TechDay Bruchsal 2026">
<meta property="og:description" content="AI GameJam von ToolCTRL beim TechDay Bruchsal 2026: In wenigen Stunden mit KI ein spielbares Game bauen. Human in the Loop, im HubWerk01 Bruchsal.">
<meta property="og:image" content="https://tool-ctrl.de/assets/og-image.png">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" type="image/png" href="/assets/favicon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+2 -1
View File
@@ -6,8 +6,9 @@
<title>Impressum: ToolCTRL</title>
<meta name="description" content="Impressum und Anbieterkennzeichnung von ToolCTRL." />
<meta name="robots" content="noindex" />
<link rel="canonical" href="https://tool-ctrl.de/impressum.html" />
<link rel="icon" type="image/png" href="/assets/favicon.png" />
<link rel="stylesheet" href="/styles.css" />
<link rel="stylesheet" href="/styles.css?v=20260610" />
</head>
<body>
+4 -4
View File
@@ -15,13 +15,13 @@
<meta property="og:url" content="https://tool-ctrl.de/" />
<meta property="og:title" content="ToolCTRL: Moderne All-in-One-Software für eure Branche" />
<meta property="og:description" content="ToolCTRL baut moderne All-in-One-Software für Branchen, die zu lange mit veralteten Insellösungen arbeiten mussten. Fokus auf Bedienung und Gestaltung." />
<meta property="og:image" content="https://tool-ctrl.de/assets/logo-a.png" />
<meta property="og:image" content="https://tool-ctrl.de/assets/og-image.png" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="ToolCTRL: Moderne All-in-One-Software für eure Branche" />
<meta name="twitter:description" content="ToolCTRL baut moderne All-in-One-Software für Branchen, die zu lange mit veralteten Insellösungen arbeiten mussten. Fokus auf Bedienung und Gestaltung." />
<meta name="twitter:image" content="https://tool-ctrl.de/assets/logo-a.png" />
<meta name="twitter:image" content="https://tool-ctrl.de/assets/og-image.png" />
<!-- Structured Data -->
<script type="application/ld+json">
@@ -37,7 +37,7 @@
</script>
<link rel="icon" type="image/png" href="/assets/favicon.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="/styles.css?v=20260604" />
<link rel="stylesheet" href="/styles.css?v=20260610" />
</head>
<body>
@@ -504,6 +504,6 @@
</div>
</footer>
<script src="/script.js"></script>
<script src="/script.js?v=20260610"></script>
</body>
</html>
+3 -8
View File
@@ -2,22 +2,17 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://tool-ctrl.de/</loc>
<lastmod>2026-06-10</lastmod>
<priority>1.0</priority>
</url>
<url>
<loc>https://tool-ctrl.de/techday.html</loc>
<lastmod>2026-06-10</lastmod>
<priority>0.8</priority>
</url>
<url>
<loc>https://tool-ctrl.de/gamejam.html</loc>
<lastmod>2026-06-10</lastmod>
<priority>0.6</priority>
</url>
<url>
<loc>https://tool-ctrl.de/impressum.html</loc>
<priority>0.2</priority>
</url>
<url>
<loc>https://tool-ctrl.de/datenschutz.html</loc>
<priority>0.2</priority>
</url>
</urlset>
+45 -6
View File
@@ -5,8 +5,47 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>TechDay Bruchsal 2026: ToolCTRL</title>
<meta name="description" content="ToolCTRL beim Bruchsaler TechDay 2026: Vortrag, AI GameJam und die mITapp. Am 27. Mai 2026 im HubWerk01 Bruchsal." />
<link rel="canonical" href="https://tool-ctrl.de/techday.html" />
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:site_name" content="ToolCTRL" />
<meta property="og:locale" content="de_DE" />
<meta property="og:url" content="https://tool-ctrl.de/techday.html" />
<meta property="og:title" content="TechDay Bruchsal 2026: ToolCTRL" />
<meta property="og:description" content="ToolCTRL beim Bruchsaler TechDay 2026: Vortrag, AI GameJam und die mITapp. Am 27. Mai 2026 im HubWerk01 Bruchsal." />
<meta property="og:image" content="https://tool-ctrl.de/assets/techday-event.png" />
<meta name="twitter:card" content="summary_large_image" />
<!-- Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "TechDay Bruchsal 2026",
"startDate": "2026-05-27",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "HubWerk01",
"address": {
"@type": "PostalAddress",
"addressLocality": "Bruchsal",
"addressCountry": "DE"
}
},
"image": "https://tool-ctrl.de/assets/techday-event.png",
"description": "ToolCTRL beim Bruchsaler TechDay 2026: Vortrag, AI GameJam und die mITapp. Am 27. Mai 2026 im HubWerk01 Bruchsal.",
"organizer": {
"@type": "Organization",
"name": "ToolCTRL",
"url": "https://tool-ctrl.de"
}
}
</script>
<link rel="icon" type="image/png" href="/assets/favicon.png" />
<link rel="stylesheet" href="/styles.css" />
<link rel="stylesheet" href="/styles.css?v=20260610" />
</head>
<body>
@@ -120,7 +159,7 @@
<aside class="speaker-card">
<div class="sp-label">Speaker</div>
<div class="sp-head">
<img class="sp-photo" src="/assets/speaker-david.jpg" alt="David Bertram" />
<img class="sp-photo" src="/assets/speaker-david.jpg" alt="David Bertram" width="320" height="320" loading="lazy" decoding="async" />
<div>
<div class="sp-name">David Bertram</div>
<div class="sp-role">Co-Founder &amp; Head of Product, ToolCTRL</div>
@@ -153,15 +192,15 @@
<div class="mitapp-shots">
<figure class="shot">
<img src="/assets/mitapp-dashboard.png" alt="mITapp Dashboard-Ansicht" />
<img src="/assets/mitapp-dashboard.webp" alt="mITapp Dashboard-Ansicht" width="1100" height="825" loading="lazy" decoding="async" />
<figcaption>Dashboard</figcaption>
</figure>
<figure class="shot">
<img src="/assets/mitapp-roadmap.png" alt="mITapp Event-Roadmap" />
<img src="/assets/mitapp-roadmap.webp" alt="mITapp Event-Roadmap" width="1100" height="825" loading="lazy" decoding="async" />
<figcaption>Event-Roadmap</figcaption>
</figure>
<figure class="shot">
<img src="/assets/mitapp-qr.png" alt="mITapp Networking per QR-Code" />
<img src="/assets/mitapp-qr.webp" alt="mITapp Networking per QR-Code" width="1100" height="825" loading="lazy" decoding="async" />
<figcaption>Networking per QR-Code</figcaption>
</figure>
</div>
@@ -267,6 +306,6 @@
</div>
</footer>
<script src="/script.js"></script>
<script src="/script.js?v=20260610"></script>
</body>
</html>
+20 -1
View File
@@ -112,6 +112,7 @@ const MIME = {
".png": "image/png",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".webp": "image/webp",
".ico": "image/x-icon",
".json": "application/json; charset=utf-8",
".woff2": "font/woff2",
@@ -174,6 +175,20 @@ function saveLead(lead) {
/* ---------- Statische Dateien ---------- */
function serveStatic(req, res) {
let urlPath = decodeURIComponent(req.url.split("?")[0]);
/* SEO: kanonischer Host (www -> non-www) und /index.html -> / */
const host = (req.headers.host || "").toLowerCase();
if (host === "www.tool-ctrl.de") {
res.writeHead(301, { Location: "https://tool-ctrl.de" + req.url });
res.end();
return;
}
if (urlPath === "/index.html") {
res.writeHead(301, { Location: "/" });
res.end();
return;
}
if (urlPath === "/") urlPath = "/index.html";
/* Path-Traversal verhindern */
@@ -195,9 +210,13 @@ function serveStatic(req, res) {
return;
}
const ext = path.extname(filePath).toLowerCase();
/* HTML immer frisch, statische Assets lange cachen (Versionierung via ?v=) */
const cacheControl = ext === ".html"
? "no-cache"
: "public, max-age=31536000, immutable";
res.writeHead(200, {
"Content-Type": MIME[ext] || "application/octet-stream",
"Cache-Control": "no-cache"
"Cache-Control": cacheControl
});
fs.createReadStream(filePath).pipe(res);
});