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,
OnPushchange detection - SSR / SSG β
@angular/ssrwithoutputMode: "static"for full prerendering - i18n β
@angular/localizewith 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:
| Locale | Base URL | Example |
|---|---|---|
| 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.