- Replace legacy Hugo static site generator and hugo-goa theme with a modern Vue 3 + Vite + TypeScript application - Implement Clean Enterprise design system using Tailwind CSS with light/dark mode support - Position website around Cloud Platform & Infrastructure Leadership (GCP & AWS central platforms, Kubernetes at scale, enterprise spin-off governance, and systems depth) without chronological resumes - Add 6 comprehensive capability dossiers and verified credential badges (CKA, PSM II, M.Sc.) - Implement interactive skill matrix with real-time text search and category filtering - Add engineering philosophy section, contact channels with one-click email copying, and Impressum modal - Configure multi-stage Dockerfile (Node builder to Nginx runtime) with custom gzip, caching, and security headers - Update build scripts (Makefile, build.sh), .gitignore, and AGENTS.md documentation across the monorepo
3.9 KiB
3.9 KiB
AGENTS.md — Moritz Graf Personal Website (moritzgrafde)
Note
Domain: Personal executive portfolio and capabilities showcase for Moritz Graf.
Live Production URL:https://moritzgraf.de
Kubernetes Manifest:k8s/web/moritzgrafde.yaml(Namespace:web)
Container Image:registry.haumdaucher.de/moritzgrafde:latest
Source Location:projects/moritzgrafde/
🏛️ Architecture & Tech Stack
-
Stack:
- Frontend Framework: Vue 3 (Composition API,
<script setup lang="ts">). - Build Tooling: Vite 6 + TypeScript (
vue-tsc). - Styling: Tailwind CSS v4 with Clean Enterprise / Executive design system (light/dark dual mode).
- Icons: Lucide Vue Next.
- Serving Runtime: Nginx (
nginx:alpine) configured with gzip compression, SPA history routing fallback, security headers, and asset caching.
- Frontend Framework: Vue 3 (Composition API,
-
Container Build & Architecture:
- Multi-stage Dockerfile (
node:22-alpinebuilder →nginx:alpineruntime). - Target architecture:
linux/amd64. - Build commands:
cd projects/moritzgrafde make compile # Local static bundle build to dist/ make build # Docker multi-stage build (linux/amd64) make push # Push to registry.haumdaucher.de make deploy # Rollout restart on Kubernetes
- Multi-stage Dockerfile (
-
Kubernetes Deployment:
- Deployed to the Kubernetes cluster in namespace
web(k8s/web/moritzgrafde.yaml). - Ingress controller: Traefik, Let's Encrypt SSL via
cert-manager. - Rollout restart:
kubectl rollout restart deployment/moritzgrafde -n web kubectl rollout status deployment/moritzgrafde -n web
- Deployed to the Kubernetes cluster in namespace
📁 Repository Structure
projects/moritzgrafde/
├── Dockerfile # Multi-stage container build (Node builder -> Nginx runtime)
├── Makefile # Standard make targets (compile, dev, build, push, deploy)
├── build.sh # Automated build, push, and Kubernetes redeploy script
├── nginx.conf # Nginx configuration (gzip, caching, security headers)
├── package.json # Dependencies and build scripts
├── vite.config.ts # Vite configuration with Vue and Tailwind v4 plugins
├── tsconfig.json # TypeScript configuration with @/* path aliases
├── index.html # HTML entrypoint with metadata and Google Fonts
├── public/
│ └── headshot.jpg # Portrait image (drop-in replaceable)
└── src/
├── main.ts # Vue app initialization
├── App.vue # Top-level application layout
├── style.css # Tailwind CSS v4 entrypoint & base styles
├── types.ts # TypeScript interfaces for portfolio data models
├── data/
│ └── portfolioData.ts # Single source of truth for capabilities, skills, and links
└── components/
├── Navbar.vue # Sticky header with navigation & dark mode switcher
├── Hero.vue # Executive hero with portrait, credentials & CTAs
├── ImpactStats.vue # Scale & impact metrics (Multi-Cloud, Spin-Off, K8s, 12+ Years)
├── CapabilityDossiers.vue # 6 deep capability pillars
├── SkillMatrix.vue # Interactive skill search & category filter
├── EngineeringPhilosophy.vue # Declarative Everything, Self-Service, Systems Thinking
├── ContactSection.vue # Direct email copy button & verified professional links
└── ImpressumModal.vue # Legal notice & privacy modal
🖼️ Updating the Portrait Image
To update the portrait image, simply replace projects/moritzgrafde/public/headshot.jpg with the new photo (JPEG/PNG) and run make compile && make build && make push && make deploy.