Skip to content

project.config.ts

Die zentrale Projektkonfiguration. Alles hier ist öffentlich und wird versioniert — Geheimnisse gehören nicht in diese Datei.

ts
import { defineProject } from './src/lib/config';

export default defineProject({
  site: {/* … */},
  company: {/* … */},
  localization: {/* … */},
  navigation: {/* … */},
  features: {/* … */},
  seo: {/* … */},
  tracking: {/* … */},
  consent: {/* … */},
  forms: {/* … */},
  deployment: {/* … */},
});

site

FeldPflichtRegel
namejanicht leer
urljavollständige URL, https://, ohne abschließenden Schrägstrich
localejaSprachkennzeichen wie de-DE
titleTemplatejamuss den Platzhalter %s enthalten
descriptionjanicht leer

company

Quelle für die Schemata Organization und LocalBusiness.

FeldPflichtRegel
legalNamejanicht leer
addressbedingterforderlich, wenn seo.schemas.localBusiness aktiv ist
emailneingültige E-Mail-Adresse
phonenein
sameAsneinListe von URLs, Vorgabe []

localization

FeldPflichtRegel
defaultLocalejamuss in locales enthalten sein
localesjamindestens ein Eintrag

Bei mehr als einer Sprache muss site.locale dem defaultLocale entsprechen.

Mehrere Sprachen erzeugen für sich genommen kein hreflang: Alternates entstehen erst, wenn eine Seite ihre Übersetzungen selbst nennt — siehe Metadaten.

Quelle für Kopf- und Fußnavigation. Ein Eintrag besteht aus label und href.

FeldPflichtRegel
mainneinHauptnavigation im Kopf; Vorgabe [], keine doppelten Ziele
legal.imprintjaImpressumslink
legal.privacyjaDatenschutzlink
legal.additionalneinweitere Rechtslinks wie AGB; Vorgabe []

href muss ein absoluter Pfad (/kontakt) oder eine absolute https-URL sein. Relative Pfade sind ausgeschlossen: Sie hingen davon ab, auf welcher Seite die Navigation gerade gerendert wird, und ergeben in einem global eingebundenen Kopf keinen verlässlichen Sinn.

Impressum und Datenschutz sind Pflichtfelder

Beide sind für geschäftsmäßige Websites in Deutschland vorgeschrieben und müssen von jeder Seite aus erreichbar sein. Sie stehen deshalb als Pflichtfelder im Schema und nicht als zwei Einträge in einer Liste — fehlt eines, ist das ein Typfehler im Editor und nicht erst ein Build-Abbruch.

Externe Ziele erkennt die Navigation an der https-URL und ergänzt für Screenreader den Hinweis „(externe Website)". Ein target="_blank" setzt sie bewusst nicht: Ein erzwungener Tabwechsel nimmt der bedienenden Person eine Entscheidung ab, die ihr zusteht.

features

Alle Werte sind boolesch.

FlagVorgabeWirkung
sitemaptrueerzeugt sitemap.xml und den Verweis in robots.txt
structuredDatatrueHauptschalter der JSON-LD-Ausgabe
cookieConsenttrueConsent-Schicht (M5)
vuefalseVue als Astro Island; verlangt installiertes @astrojs/vue
webMcpfalseexperimentell; verlangt zusätzlich das Objekt webMcp

seo

FeldPflichtRegel
defaultOgImageneinSchlüssel im Asset-Manifest, kein freier Pfad
logoneinSchlüssel im Asset-Manifest; JSON-LD-Logo
twitterSiteneinmuss mit @ beginnen
schemas.organizationjaboolesch
schemas.localBusinessjaboolesch; verlangt company.address
schemas.websitejaboolesch

defaultOgImage und logo verweisen absichtlich auf Manifest-Schlüssel statt auf Pfade. Im Referenzprojekt zeigten OG-Bild-Angaben auf Dateien, die nie existierten; ein unbekannter Schlüssel bricht dagegen den Build ab.

schemas.localBusiness ersetzt den Typ des Organisationsknotens, es entsteht kein zweiter Knoten. Details unter Structured Data.

tracking

FeldVorgabeRegel
enabledfalseverlangt features.cookieConsent: true
provider'gtm'derzeit nur GTM
containerIdFormat GTM-XXXXXXX; Pflicht, wenn enabled
gtmServerUrloptionaler First-Party-Endpunkt für serverseitiges GTM
consentMode'basic'basic lädt GTM erst nach der Entscheidung
ga4falseverlangt Consent-Kategorie analytics
googleAdsfalseverlangt Consent-Kategorie marketing

ga4 und googleAds bauen keinen Code ein

Beide Flags dokumentieren, was im GTM-Container konfiguriert sein soll, und steuern Consent-Kategorien sowie Tests. Ein direkter Einbau von GA4 oder Google Ads neben GTM findet nicht statt und ist ausdrücklich unerwünscht.

FeldRegel
categoriesmindestens ein Eintrag, muss necessary enthalten
revisionganze Zahl ab 1; Erhöhen fragt bestehende Zustimmungen erneut ab

forms

FeldVorgabeRegel
provider'none'none, standalone-php oder joomla
endpointPflicht, sobald ein Provider gewählt ist
captcha'none'none oder turnstile

Der Endpunkt muss zum Provider passen: standalone-php verlangt einen same-origin Pfad beginnend mit /, joomla eine absolute https-URL des Backends.

deployment

FeldRegel
targetmittwald-static oder github-pages
apache.canonicalHostoptional; nur für Apache-Ziele relevant
apache.redirectsListe aus from (absoluter Pfad), to, status (301 oder 302)

webMcp und meta

webMcp ist optional und erzwingt mit acknowledgeExperimental: true eine bewusste Aktivierung. meta.starterVersion wird ab M9 von starter:init gesetzt und dient als Ankerpunkt für spätere Starter-Upgrades.