feat: search metadata, structured data and indexing rules

Only the production deployment may be indexed; testing and preview builds
answer with noindex and a closed robots file. The homepage now describes the
person, the services and the FAQ as structured data, and title, description
and the 404 page are written for what people search for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 13:07:03 +02:00
co-authored by Claude Opus 5.5
parent 390936856c
commit e9f05b02fc
18 changed files with 563 additions and 89 deletions
+5 -10
View File
@@ -1,9 +1,8 @@
export const metadata = {
title: "404 - Seite nicht gefunden | Marc Mintel",
description: "Diese Seite konnte leider nicht gefunden werden.",
title: "Page not found",
description: "This page does not exist.",
};
import Link from "next/link";
import { Button } from "@/src/components/Button";
export default function NotFound() {
@@ -14,19 +13,15 @@ export default function NotFound() {
Error 404
</span>
<h1 className="text-5xl md:text-7xl font-black text-slate-900 tracking-tighter">
System-Anomalie.
Page not found.
</h1>
<p className="text-xl md:text-2xl text-slate-500 font-serif italic max-w-xl mx-auto leading-relaxed">
Die angeforderte URL existiert nicht in dieser Zeitleiste.
Möglicherweise wurde die Seite verschoben oder gelöscht.
This address does not exist. The page may have been moved or removed.
</p>
<div className="pt-8 flex flex-col sm:flex-row items-center justify-center gap-4">
<Button href="/" variant="primary">
Zurück zur Basis
</Button>
<Button href="/blog" variant="outline">
Aktuelle Artikel lesen
Back to the homepage
</Button>
</div>
+1 -1
View File
@@ -1 +1 @@
Web apps and websites. Marc Mintel, freelance developer with 15 years of experience.
Web apps and websites. Marc Mintel, freelance web developer with 15 years of experience.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 185 KiB

+7 -10
View File
@@ -1,14 +1,11 @@
import type { MetadataRoute } from "next";
import { SITE_URL } from "@/src/content/site";
/** The site is a single page. */
/**
* The site is a single page; the legal pages are not meant for search results.
* No modification date: it would have to be the date the content last changed,
* and a date that moves with every build teaches search engines to ignore it.
*/
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://mintel.me";
return [
{
url: baseUrl,
lastModified: new Date(),
changeFrequency: "monthly",
priority: 1,
},
];
return [{ url: `${SITE_URL}/` }];
}
+1 -1
View File
@@ -1 +1 @@
Web apps and websites. Marc Mintel, freelance developer with 15 years of experience.
Web apps and websites. Marc Mintel, freelance web developer with 15 years of experience.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 185 KiB

+17
View File
@@ -0,0 +1,17 @@
import type { MetadataRoute } from "next";
import { INDEXING, SITE_URL } from "@/src/content/site";
import { robotsFile } from "@/src/domain/indexing";
export default function robots(): MetadataRoute.Robots {
const { rules, sitemap } = robotsFile(INDEXING, SITE_URL);
return {
rules: {
...rules,
disallow:
typeof rules.disallow === "string"
? rules.disallow
: [...rules.disallow],
},
sitemap,
};
}