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
+14 -2
View File
@@ -1,13 +1,25 @@
import { parseEmailParts, type EmailParts } from "@/src/domain/email";
import { indexingFor } from "@/src/domain/indexing";
export const SITE_NAME = "Marc Mintel";
export const SITE_URL = "https://mintel.me";
/** One wording for the browser title, search results and link previews. */
export const SITE_TITLE =
"Marc Mintel — Freelance developer for web apps and websites";
"Freelance web developer for web apps & websites | Marc Mintel";
export const SITE_DESCRIPTION =
"Freelance developer with 15 years of experience. I build web apps, interfaces and websites, and automate processes between your systems.";
"Freelance web developer with 15 years of experience. I build web apps, interfaces and websites with React, Next.js and TypeScript, and automate processes.";
export const SITE_LANGUAGE = "en";
export const JOB_TITLE = "Freelance web developer";
/**
* Public profiles of the owner (LinkedIn, GitHub, ...). Search engines use them to
* connect this site with the same person elsewhere. Only add profiles the owner confirmed.
*/
export const PROFILES: readonly string[] = [];
/** Only the production deployment may appear in search results. Set by the build. */
export const INDEXING = indexingFor(process.env.NEXT_PUBLIC_TARGET);
// The contact address, kept in parts on purpose: the complete address must never
// appear as one string in the page source (see src/components/EmailLink.tsx).