k9n.dev

June 3, 2026 Β· View on GitHub

Personal website of Danny Koppenhagen β€” built with Angular v22, server-side rendering, static site generation, and build-time internationalization.

🌐 k9n.dev

Architecture

The application is an Angular v22 standalone-component app using signals, SSR/SSG prerendering, and @angular/localize for build-time i18n. Content is authored in Markdown and compiled into TypeScript manifests at build time.

Key Technologies

  • Angular v22 β€” Standalone components, signals, OnPush change detection
  • SSR / SSG β€” @angular/ssr with outputMode: "static" for full prerendering
  • i18n β€” @angular/localize with build-time locale bundles (/de/, /en/)
  • Content β€” Markdown with frontmatter, parsed via custom build scripts
  • Testing β€” Vitest for unit tests, AXE for accessibility auditing
  • Styling β€” CSS design tokens, mobile-first, dark/light mode

High-Level Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Build Pipeline                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Markdown Content  β†’  build-content.ts  β†’  TS Manifests β”‚
β”‚  Angular Source    β†’  ng build (i18n)   β†’  /de/ + /en/  β”‚
β”‚  Post-Build        β†’  post-build.ts     β†’  SEO + 404    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Runtime (per locale)                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Prerendered HTML  ←  Angular SSG                        β”‚
β”‚  Locale Detection  β†’  Redirect to /de/ or /en/           β”‚
β”‚  Language Switcher β†’  Full page navigation between buildsβ”‚
β”‚  Content Filter    β†’  Search + Tags + Language           β”‚
β”‚  MetaManager       β†’  SEO, hreflang, og:locale, JSON-LD β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

URL Structure

All routes are locale-prefixed:

LocaleBase URLExample
German (default)/de//de/blog/my-post
English/en//en/blog/my-post

Requests without a locale prefix are permanently redirected (HTTP 301) to the default locale. This ensures backward compatibility with previously indexed URLs (e.g., /blog/my-post β†’ /de/blog/my-post).

Content Model

Blog posts, talks, and projects are written in Markdown with YAML frontmatter. They are not translated β€” each item has a language field indicating its authored language (de or en). The UI adapts by setting appropriate lang attributes on content blocks.

Quick Start

npm install
npm run build:content
ng serve

Production Preview (lokal)

npm run preview

Baut die komplette Produktionsversion (beide Locales, SEO-Dateien, Legacy-Redirects) und startet einen lokalen Server auf http://localhost:4200 β€” identisch zum Deployment-Verhalten inkl. 301-Redirects fΓΌr alte URLs ohne Locale-Prefix.

Contributing

See CONTRIBUTING.md for detailed development setup, the i18n workflow (mark β†’ extract β†’ translate β†’ serve), testing, and build instructions.

Code Conventions

See AGENTS.md for comprehensive coding standards, Angular patterns, naming conventions, accessibility requirements, and i18n rules.

License

Private project β€” all rights reserved.