"use client"; import { motion, Variants } from "framer-motion"; import { Globe, Server, Wrench, Shield, Gamepad2, Code, Activity, Lightbulb } from "lucide-react"; import { useEffect, useState } from "react"; import { useLocale } from "next-intl"; import type { JSONContent } from "@tiptap/react"; import RichTextClient from "./RichTextClient"; const staggerContainer: Variants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.15, delayChildren: 0.2, }, }, }; const fadeInUp: Variants = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.25, 0.1, 0.25, 1], }, }, }; const About = () => { const locale = useLocale(); const [cmsDoc, setCmsDoc] = useState(null); useEffect(() => { (async () => { try { const res = await fetch( `/api/content/page?key=${encodeURIComponent("home-about")}&locale=${encodeURIComponent(locale)}`, ); const data = await res.json(); if (data?.content?.content) { setCmsDoc(data.content.content as JSONContent); } } catch { // ignore; fallback to static } })(); }, [locale]); const techStack = [ { category: "Frontend & Mobile", icon: Globe, items: ["Next.js", "Tailwind CSS", "Flutter"], }, { category: "Backend & DevOps", icon: Server, items: ["Docker Swarm", "Traefik", "Nginx Proxy Manager", "Redis"], }, { category: "Tools & Automation", icon: Wrench, items: ["Git", "CI/CD", "n8n", "Self-hosted Services"], }, { category: "Security & Admin", icon: Shield, items: ["CrowdSec", "Suricata", "Mailcow"], }, ]; const hobbies: Array<{ icon: typeof Code; text: string }> = [ { icon: Code, text: "Self-Hosting & DevOps" }, { icon: Gamepad2, text: "Gaming" }, { icon: Server, text: "Setting up Game Servers" }, { icon: Activity, text: "Jogging to clear my mind and stay active" }, ]; return (
{/* Text Content */} About Me {cmsDoc ? ( ) : ( <>

Hi, I'm Dennis – a student and passionate self-hoster based in Osnabrück, Germany.

I love building full-stack web applications with{" "} Next.js and mobile apps with{" "} Flutter. But what really excites me is{" "} DevOps: I run my own infrastructure on{" "} IONOS and OVHcloud, managing everything with Docker Swarm,{" "} Traefik, and automated CI/CD pipelines with my own runners.

When I'm not coding or tinkering with servers, you'll find me gaming, jogging, or experimenting with new tech like game servers or automation workflows with n8n.

)}

Fun Fact

Even though I automate a lot, I still use pen and paper for my calendar and notes – it helps me clear my head and stay focused.

{/* Tech Stack & Hobbies */}
My Tech Stack
{techStack.map((stack, idx) => (

{stack.category}

{stack.items.map((item, itemIdx) => ( {item} ))}
))}
{/* Hobbies */}
When I'm Not Coding
{hobbies.map((hobby, idx) => ( {hobby.text} ))}
); }; export default About;