SEO: Canonicals/OG auf allen Seiten, WebP, Caching, www-Redirect
Deploy / build-and-deploy (push) Successful in 24s
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:
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 |
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 & 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>
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user