From 46c86447d16a38d8bd833d83e6b4e127f7ac73fa Mon Sep 17 00:00:00 2001 From: Antonio Ledebuhr Date: Tue, 25 Aug 2026 18:28:22 +0200 Subject: [PATCH] integration: add route metadata, JSON-LD and harden the public shell Ship prerendered SEO, crawl files and palette/map a11y so every locale route is indexable, honest and keyboard-usable without inventing claims. Co-authored-by: Cursor --- public/llms.txt | 51 ++++++ public/robots.txt | 4 + public/sitemap.xml | 147 +++++++++++++++ src/app/app.config.ts | 11 +- src/app/app.html | 27 +-- src/app/app.scss | 46 ++++- src/app/app.spec.ts | 33 +++- src/app/app.ts | 12 +- src/app/core/commands/command-ids.ts | 24 +++ src/app/core/content/content.contracts.ts | 11 ++ src/app/core/content/de/home.ts | 4 + src/app/core/content/de/site.ts | 6 + src/app/core/content/en/home.ts | 4 + src/app/core/content/en/site.ts | 6 + src/app/core/content/signature-copy.spec.ts | 12 +- src/app/core/content/signature-copy.ts | 5 +- src/app/core/content/site-config.ts | 2 + src/app/core/navigation/navigation.ts | 2 +- src/app/core/platform/browser.spec.ts | 2 + src/app/core/platform/browser.ts | 16 ++ src/app/core/seo/crawl-assets.spec.ts | 169 ++++++++++++++++++ src/app/core/seo/route-metadata.spec.ts | 69 +++++++ src/app/core/seo/route-metadata.ts | 61 +++++++ src/app/core/seo/seo-title.strategy.ts | 30 ++++ src/app/core/seo/seo.contracts.ts | 30 ++++ src/app/core/seo/seo.service.spec.ts | 61 +++++++ src/app/core/seo/seo.service.ts | 116 ++++++++++++ src/app/core/seo/structured-data.spec.ts | 111 ++++++++++++ src/app/core/seo/structured-data.ts | 149 +++++++++++++++ src/app/features/home/home.html | 9 +- src/app/features/home/home.scss | 5 + src/app/features/home/home.ts | 4 +- src/app/features/page-rendering.spec.ts | 27 +++ .../command-palette-trigger.html | 13 ++ .../command-palette-trigger.scss | 32 ++++ .../command-palette-trigger.ts | 55 ++++++ .../command-palette/command-palette.html | 14 -- .../command-palette/command-palette.scss | 26 +-- .../command-palette.service.ts | 115 ++++++++++++ .../command-palette/command-palette.spec.ts | 83 +++++++-- .../shared/command-palette/command-palette.ts | 109 +++-------- src/app/shared/command-palette/commands.ts | 26 +-- src/app/shared/systems-map/systems-map.html | 16 +- .../shared/systems-map/systems-map.model.ts | 17 +- src/app/shared/systems-map/systems-map.scss | 4 - .../shared/systems-map/systems-map.spec.ts | 15 ++ src/app/shared/systems-map/systems-map.ts | 11 ++ tsconfig.spec.json | 2 +- 48 files changed, 1597 insertions(+), 207 deletions(-) create mode 100644 public/llms.txt create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 src/app/core/commands/command-ids.ts create mode 100644 src/app/core/seo/crawl-assets.spec.ts create mode 100644 src/app/core/seo/route-metadata.spec.ts create mode 100644 src/app/core/seo/route-metadata.ts create mode 100644 src/app/core/seo/seo-title.strategy.ts create mode 100644 src/app/core/seo/seo.contracts.ts create mode 100644 src/app/core/seo/seo.service.spec.ts create mode 100644 src/app/core/seo/seo.service.ts create mode 100644 src/app/core/seo/structured-data.spec.ts create mode 100644 src/app/core/seo/structured-data.ts create mode 100644 src/app/shared/command-palette/command-palette-trigger/command-palette-trigger.html create mode 100644 src/app/shared/command-palette/command-palette-trigger/command-palette-trigger.scss create mode 100644 src/app/shared/command-palette/command-palette-trigger/command-palette-trigger.ts create mode 100644 src/app/shared/command-palette/command-palette.service.ts diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..811d219 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,51 @@ +# Antonio Ledebuhr + +Fullstack and DevOps engineer in Tangermünde. The public site documents a curated set of stations, four service areas, and a local mailto briefing. German is the default language; English is the full second version. + +## Profile + +- https://antoniolede.de/ +- https://antoniolede.de/en +- https://antoniolede.de/ueber-mich +- https://antoniolede.de/en/about + +## Services + +- https://antoniolede.de/leistungen +- https://antoniolede.de/en/services +- https://antoniolede.de/leistungen/software +- https://antoniolede.de/en/services/software +- https://antoniolede.de/leistungen/hardware-netzwerk +- https://antoniolede.de/en/services/hardware-network +- https://antoniolede.de/leistungen/cluster +- https://antoniolede.de/en/services/clusters +- https://antoniolede.de/leistungen/ai-integration +- https://antoniolede.de/en/services/ai-integration + +## Projects + +- https://antoniolede.de/projekte +- https://antoniolede.de/en/projects +- https://antoniolede.de/projekte#innofocus +- https://antoniolede.de/en/projects#innofocus +- https://antoniolede.de/projekte#roesterei +- https://antoniolede.de/en/projects#roesterei +- https://antoniolede.de/projekte#myspa +- https://antoniolede.de/en/projects#myspa +- https://antoniolede.de/projekte#hdi +- https://antoniolede.de/en/projects#hdi + +## Contact, stack and legal + +- https://antoniolede.de/kontakt +- https://antoniolede.de/en/contact +- https://antoniolede.de/stack +- https://antoniolede.de/en/stack +- https://antoniolede.de/impressum +- https://antoniolede.de/en/legal-notice +- https://antoniolede.de/datenschutz +- https://antoniolede.de/en/privacy + +## Languages + +German URLs are unprefixed. English URLs live under `/en`. Each public page exists in both locales. diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..f813705 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://antoniolede.de/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..d9beeed --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,147 @@ + + + + https://antoniolede.de/ + + + + + + https://antoniolede.de/leistungen + + + + + + https://antoniolede.de/leistungen/software + + + + + + https://antoniolede.de/leistungen/hardware-netzwerk + + + + + + https://antoniolede.de/leistungen/cluster + + + + + + https://antoniolede.de/leistungen/ai-integration + + + + + + https://antoniolede.de/projekte + + + + + + https://antoniolede.de/stack + + + + + + https://antoniolede.de/ueber-mich + + + + + + https://antoniolede.de/kontakt + + + + + + https://antoniolede.de/impressum + + + + + + https://antoniolede.de/datenschutz + + + + + + https://antoniolede.de/en + + + + + + https://antoniolede.de/en/services + + + + + + https://antoniolede.de/en/services/software + + + + + + https://antoniolede.de/en/services/hardware-network + + + + + + https://antoniolede.de/en/services/clusters + + + + + + https://antoniolede.de/en/services/ai-integration + + + + + + https://antoniolede.de/en/projects + + + + + + https://antoniolede.de/en/stack + + + + + + https://antoniolede.de/en/about + + + + + + https://antoniolede.de/en/contact + + + + + + https://antoniolede.de/en/legal-notice + + + + + + https://antoniolede.de/en/privacy + + + + + diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 1dd33b8..1a09aed 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,9 +1,15 @@ import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; -import { provideRouter, withComponentInputBinding, withInMemoryScrolling } from '@angular/router'; import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; +import { + provideRouter, + TitleStrategy, + withComponentInputBinding, + withInMemoryScrolling, +} from '@angular/router'; +import { routes } from './app.routes'; import { SITE_CONTENT } from './core/content/content.token'; import { SITE_CONTENT_DATA } from './core/content/site-content'; -import { routes } from './app.routes'; +import { SeoTitleStrategy } from './core/seo/seo-title.strategy'; export const appConfig: ApplicationConfig = { providers: [ @@ -18,5 +24,6 @@ export const appConfig: ApplicationConfig = { ), provideClientHydration(withEventReplay()), { provide: SITE_CONTENT, useValue: SITE_CONTENT_DATA }, + { provide: TitleStrategy, useClass: SeoTitleStrategy }, ], }; diff --git a/src/app/app.html b/src/app/app.html index a2f466b..ce3b096 100644 --- a/src/app/app.html +++ b/src/app/app.html @@ -1,21 +1,24 @@ -
+