"use client"; import { useState, useEffect } from "react"; import { motion, Variants } from "framer-motion"; import { Globe, Server, Wrench, Shield, Gamepad2, Code, Activity, Lightbulb } from "lucide-react"; const staggerContainer: Variants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.15, delayChildren: 0.2, }, }, }; const fadeInUp: Variants = { hidden: { opacity: 0, y: 30 }, visible: { opacity: 1, y: 0, transition: { duration: 1, ease: [0.25, 0.1, 0.25, 1], }, }, }; const About = () => { const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); 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" }, ]; if (!mounted) return null; return (
{/* Text Content */} About Me

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;