diff --git a/artifacts/joachim-portfolio/src/components/bio.tsx b/artifacts/joachim-portfolio/src/components/bio.tsx index dcf817f..520cd29 100644 --- a/artifacts/joachim-portfolio/src/components/bio.tsx +++ b/artifacts/joachim-portfolio/src/components/bio.tsx @@ -1,29 +1,86 @@ import { motion } from "framer-motion"; +import { CheckCircle2 } from "lucide-react"; + +const highlights = [ + "30+ Jahre IT-Betrieb in Behörden & Konzernen", + "ITIL & BSI-Grundschutz Erfahrung", + "Web- & Middleware (Apache, Tomcat, JBoss, Websphere)", + "Docker, Ansible, Gitlab CI/CD", + "Technische Redaktion & Betriebshandbücher", + "KI-Automation seit 2023 (n8n, RAG, Pinecone)", + "Tech-Blogger mit 300+ Fachartikeln", +]; + +const clients = [ + "Landesamt für Statistik Bayern", + "Polizei Hessen", + "Justiz Baden-Württemberg", + "Amt des öff. Rechts Hamburg", + "Finanzdienstleister München (EZB-geprüft)", +]; export function Bio() { return ( -
+
-

- 04. Über Mich -

- -
-

- Joachim Hummel ist Senior IT-Consultant, IT-Systems Engineer und technischer Umsetzer mit rund 30 Jahren Erfahrung im IT-Betrieb. -

-

- Seine Schwerpunkte liegen auf Linux, Docker, On-Premise-Infrastrukturen, DSGVO-konformem Selfhosting, Mailservern, Monitoring, Automatisierung und KI-gestützter Softwareentwicklung. -

-

- Mit Vibe-Coding entwickelt er aus Ideen lauffähige Anwendungen, Automatisierungen und SaaS-Projekte. -

+
+
+

Über mich

+

+ IT-Experte mit Tiefe — und dem Blick nach vorne +

+
+

+ Mehr als 25 Jahre Erfahrung im Aufbau, Betrieb und Management von IT-Infrastrukturen in Konzernen, Behörden und kritischen Umgebungen. Ich verbinde klassische ITIL-Prozesse und technische Betriebserfahrung mit innovativen Automatisierungslösungen auf Basis von KI und modernen Tools. +

+

+ Mein Ansatz ist bodenständig: Technik muss funktionieren, nachvollziehbar sein und langfristig betrieben werden können. Mit Vibe-Coding bringe ich heute Ideen direkt in produktive Systeme — schnell, sauber, betreibbar. +

+
+ +
+

Ausgewählte Kunden & Projekte

+
+ {clients.map((client) => ( + + {client} + + ))} +
+
+
+ +
+
+

Auf einen Blick

+
    + {highlights.map((item, index) => ( + + + {item} + + ))} +
+
+
diff --git a/artifacts/joachim-portfolio/src/components/competencies.tsx b/artifacts/joachim-portfolio/src/components/competencies.tsx index c236ba9..98b90f7 100644 --- a/artifacts/joachim-portfolio/src/components/competencies.tsx +++ b/artifacts/joachim-portfolio/src/components/competencies.tsx @@ -1,79 +1,107 @@ import { motion } from "framer-motion"; -import { Server, Box, ShieldCheck, Activity, Cpu } from "lucide-react"; -import { SiDocker, SiLinux, SiGrafana, SiNginx, SiUbuntu } from "react-icons/si"; +import { Server, Box, ShieldCheck, Activity, Cpu, FileText } from "lucide-react"; +import { SiDocker, SiLinux, SiGrafana, SiNginx, SiUbuntu, SiAnsible, SiPrometheus } from "react-icons/si"; const skills = [ { icon: Server, - title: "Linux, Serverbetrieb & Infrastruktur", - desc: "Ubuntu, Debian, Proxmox, Systemd, Shell-Scripting, TLS, Reverse Proxy" + title: "Linux & Infrastruktur", + desc: "Ubuntu, Debian, AIX, Solaris, Proxmox, Systemd, TLS, Reverse Proxy, Shell-Scripting", + color: "bg-blue-50 text-blue-600 border-blue-100", }, { icon: Box, - title: "Docker & Container-Betrieb", - desc: "Docker Compose, Netzwerke, Volumes, Persistenz, Hetzner/Contabo" + title: "Docker & Container", + desc: "Docker Compose, Netzwerke, Volumes, Persistenz, Ansible, Deployment auf Hetzner & Contabo", + color: "bg-sky-50 text-sky-600 border-sky-100", }, { icon: ShieldCheck, - title: "On-Premise & DSGVO Selfhosting", - desc: "iRedMail/Mailcow, Nextcloud, SOGo, Authentik/OIDC, Zoraxy/Nginx" + title: "On-Premise & DSGVO", + desc: "iRedMail, Mailcow, Nextcloud, SOGo, Authentik / OIDC, ITIL, BSI-Grundschutz, Compliance", + color: "bg-green-50 text-green-600 border-green-100", }, { icon: Activity, - title: "Monitoring", - desc: "Grafana, Prometheus, Loki, Alloy" + title: "Monitoring & Betrieb", + desc: "Grafana, Prometheus, Loki, Alloy, Nagios, JMX-Monitoring, Metriken & Dashboards", + color: "bg-orange-50 text-orange-600 border-orange-100", }, { icon: Cpu, - title: "KI, Automatisierung & Vibe-Coding", - desc: "Claude Code, ChatGPT, n8n, RAG-Systeme, Pinecone" - } + title: "KI & Vibe-Coding", + desc: "n8n, Claude Code, ChatGPT, RAG-Systeme, Pinecone, OpenAI, Ollama, API-Automation", + color: "bg-violet-50 text-violet-600 border-violet-100", + }, + { + icon: FileText, + title: "Dokumentation & Service", + desc: "Betriebshandbücher, ITIL-Prozesse, BSI-Grundschutz, Confluence, Jira, draw.io", + color: "bg-rose-50 text-rose-600 border-rose-100", + }, +]; + +const techIcons = [ + { Icon: SiLinux, label: "Linux", color: "#000" }, + { Icon: SiUbuntu, label: "Ubuntu", color: "#E95420" }, + { Icon: SiDocker, label: "Docker", color: "#2496ED" }, + { Icon: SiGrafana, label: "Grafana", color: "#F46800" }, + { Icon: SiNginx, label: "Nginx", color: "#009639" }, + { Icon: SiAnsible, label: "Ansible", color: "#EE0000" }, + { Icon: SiPrometheus, label: "Prometheus", color: "#E6522C" }, ]; export function Competencies() { return ( -
+
-

- 01. Kernkompetenzen -

-

- Über 30 Jahre Erfahrung im IT-Betrieb, destilliert in hochspezialisierte Fähigkeiten. -

+
+

Kernkompetenzen

+

+ 30 Jahre Erfahrung — breit und tief +

+

+ Von klassischem Serverbetrieb bis zur KI-gestützten Automatisierung — praxisbewährt in Behörden, Konzernen und eigenen Projekten. +

+
-
+
{skills.map((skill, index) => ( -
- +
+
- -

{skill.title}

-

- {skill.desc} -

+

{skill.title}

+

{skill.desc}

))}
-
- - - - - +
+ {techIcons.map(({ Icon, label, color }) => ( +
+ { (e.currentTarget as SVGElement).style.color = color; }} + onMouseLeave={(e) => { (e.currentTarget as SVGElement).style.color = ""; }} + /> + {label} +
+ ))}
diff --git a/artifacts/joachim-portfolio/src/components/contact.tsx b/artifacts/joachim-portfolio/src/components/contact.tsx index 1c8fe18..3b30c87 100644 --- a/artifacts/joachim-portfolio/src/components/contact.tsx +++ b/artifacts/joachim-portfolio/src/components/contact.tsx @@ -1,40 +1,88 @@ import { motion } from "framer-motion"; -import { Mail, Github, Linkedin, Terminal } from "lucide-react"; +import { Mail, ExternalLink, ArrowRight } from "lucide-react"; + +const links = [ + { + label: "Tech-Blog", + url: "https://blog.unixweb.de", + desc: "300+ Fachartikel rund um Linux, Server & IT", + }, + { + label: "KI-Blog", + url: "https://ki-blog.unixweb.de", + desc: "KI, Automation, Vibe-Coding & n8n", + }, + { + label: "Website", + url: "https://joachimhummel.de", + desc: "joachimhummel.de", + }, +]; export function Contact() { return ( -
+
-
- - - -

Bereit für das nächste Projekt?

-

- Lassen Sie uns darüber sprechen, wie wir Ihre Infrastruktur modernisieren oder Ihre nächste Anwendung bauen können. -

- - - - Kontakt aufnehmen - +
+
+

Kontakt

+

+ Bereit für das nächste Projekt? +

+

+ Ob Infrastruktur-Modernisierung, KI-Automation oder technische Dokumentation — ich freue mich auf Ihre Anfrage. +

+
-
- - - - - - +
+ +
+ +
+
+

E-Mail schreiben

+

jh@unixweb.de

+
+ +
+ +
+ {links.map((link) => ( + +
+ +
+
+

{link.label}

+

{link.desc}

+
+ +
+ ))} +
+
+ +
+ Joachim Hummel — Senior IT-Consultant · München +
diff --git a/artifacts/joachim-portfolio/src/components/hero.tsx b/artifacts/joachim-portfolio/src/components/hero.tsx index 7ce49c2..58c7d17 100644 --- a/artifacts/joachim-portfolio/src/components/hero.tsx +++ b/artifacts/joachim-portfolio/src/components/hero.tsx @@ -1,61 +1,92 @@ import { motion } from "framer-motion"; -import { Terminal, ChevronDown } from "lucide-react"; +import { ArrowRight, ChevronDown } from "lucide-react"; + +const badges = [ + "30+ Jahre IT-Erfahrung", + "ITIL & BSI-Grundschutz", + "Vibe-Coding mit KI", + "On-Premise & DSGVO", +]; export function Hero() { return ( -
- -
- - System.init() -
+
+
+
-

- Joachim - Hummel + + + + Verfügbar für neue Projekte + + +

+ Joachim{" "} + Hummel

-
- Senior IT-Consultant · IT-Systems Engineer · Vibe-Coder -
- -

- Zwei Welten, eine Lösung: Tiefe, praxisbewährte Infrastruktur-Expertise - trifft auf moderne KI-gestützte Softwareentwicklung. Ich baue Systeme, die - in Produktion laufen – präzise, sicher und zukunftsfähig. +

+ Senior IT-Consultant · Service Manager · Technical Writer · Vibe-Coder

- ); } diff --git a/artifacts/joachim-portfolio/src/components/navbar.tsx b/artifacts/joachim-portfolio/src/components/navbar.tsx index 0ffcd65..9fc74f9 100644 --- a/artifacts/joachim-portfolio/src/components/navbar.tsx +++ b/artifacts/joachim-portfolio/src/components/navbar.tsx @@ -1,56 +1,104 @@ import { useState, useEffect } from "react"; import { motion, useScroll, useMotionValueEvent } from "framer-motion"; +import { Menu, X } from "lucide-react"; export function Navbar() { const [isScrolled, setIsScrolled] = useState(false); + const [mobileOpen, setMobileOpen] = useState(false); const { scrollY } = useScroll(); useMotionValueEvent(scrollY, "change", (latest) => { - setIsScrolled(latest > 50); + setIsScrolled(latest > 20); }); const navLinks = [ { name: "Kompetenzen", href: "#competencies" }, - { name: "3 Welten", href: "#strengths" }, + { name: "Stärken", href: "#strengths" }, { name: "Projekte", href: "#projects" }, + { name: "Über mich", href: "#bio" }, { name: "Kontakt", href: "#contact" }, ]; return ( -
- - JH. +
+ + + JH + + Joachim Hummel - -
+ +
+ + {mobileOpen && ( + + {navLinks.map((link) => ( + setMobileOpen(false)} + className="px-4 py-3 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-secondary rounded-lg transition-all" + > + {link.name} + + ))} + setMobileOpen(false)} + className="mt-2 px-4 py-3 bg-primary text-white text-sm font-semibold rounded-lg text-center" + > + Kontakt aufnehmen + + + )}
); } diff --git a/artifacts/joachim-portfolio/src/components/projects.tsx b/artifacts/joachim-portfolio/src/components/projects.tsx index 58bc3a0..78b67d9 100644 --- a/artifacts/joachim-portfolio/src/components/projects.tsx +++ b/artifacts/joachim-portfolio/src/components/projects.tsx @@ -1,74 +1,126 @@ import { motion } from "framer-motion"; -import { FolderGit2, ArrowRight } from "lucide-react"; +import { ArrowUpRight, Lock, Mail, Zap, Database, BarChart2, Server } from "lucide-react"; const projects = [ { + icon: Lock, + color: "from-blue-500 to-indigo-600", + iconBg: "bg-blue-100 text-blue-600", title: "SafeDocs Portal", - desc: "Sichere Upload-Plattform mit AES-256-GCM-Verschlüsselung, JWT-Auth, Passwort-Reset, Rate Limiting, Docker-Deployment", - tags: ["Docker", "Security", "AES-256"] + desc: "Sichere Upload-Plattform mit AES-256-GCM-Verschlüsselung, JWT-Auth, Passwort-Reset per E-Mail, Rate Limiting und Docker-Deployment.", + tags: ["AES-256-GCM", "JWT", "Docker", "Security"], + url: "https://safedocsportal.com", + type: "Vibe-Coding Projekt", }, { + icon: Mail, + color: "from-violet-500 to-purple-600", + iconBg: "bg-violet-100 text-violet-600", title: "zensend.email", - desc: "Newsletter & E-Mail-Marketing SaaS: Double-Opt-In, DSGVO, SPF/DKIM/DMARC, Zahlungsmodelle, Onboarding", - tags: ["SaaS", "Mail", "DSGVO"] + desc: "Newsletter & E-Mail-Marketing SaaS mit Double-Opt-In, DSGVO-Konformität, SPF/DKIM/DMARC, Zahlungsmodellen und Onboarding-Prozessen.", + tags: ["SaaS", "DSGVO", "SMTP", "Newsletter"], + url: "https://zensend.email", + type: "Vibe-Coding Projekt", }, { + icon: Zap, + color: "from-amber-500 to-orange-500", + iconBg: "bg-amber-100 text-amber-600", title: "KI-Automation mit n8n", - desc: "Automatisierte Bildgenerierung, Lead-Prozesse, KI-gestützte Bildprüfung, API/Webhook-Workflows", - tags: ["n8n", "AI", "API"] + desc: "Automatisierte Bildgenerierung, Lead-Prozesse, KI-gestützte Bildprüfung und API/Webhook-Workflows für echte Geschäftsprozesse.", + tags: ["n8n", "OpenAI", "Webhooks", "Automation"], + type: "KI-Projekt", }, { + icon: Database, + color: "from-emerald-500 to-teal-500", + iconBg: "bg-emerald-100 text-emerald-600", title: "Eigene KI- & RAG-Systeme", - desc: "PDF-Verarbeitung, Vektorisierung, Pinecone, eigene Wissensdatenbanken", - tags: ["RAG", "Pinecone", "LLMs"] + desc: "PDF-Verarbeitung, Vektorisierung eigener Dokumente, Pinecone-Integration und eigene Wissensdatenbanken für KI-gestützte Recherche.", + tags: ["RAG", "Pinecone", "Vektoren", "LLMs"], + type: "KI-Projekt", }, { + icon: BarChart2, + color: "from-orange-500 to-red-500", + iconBg: "bg-orange-100 text-orange-600", title: "On-Premise Monitoring", - desc: "Grafana, Prometheus, Loki, Alloy Stacks auf Docker-Basis", - tags: ["Grafana", "Prometheus", "Docker"] + desc: "Vollständige Monitoring-Stacks mit Grafana, Prometheus, Loki und Alloy auf Docker-Basis — transparent, nachvollziehbar, betreibbar.", + tags: ["Grafana", "Prometheus", "Loki", "Docker"], + type: "Infrastruktur", }, { + icon: Server, + color: "from-slate-500 to-gray-600", + iconBg: "bg-slate-100 text-slate-600", title: "Mailserver & Groupware", - desc: "iRedMail, Mailcow, SOGo, DNS, SPF, DKIM, DMARC, Zustellbarkeit", - tags: ["Mailcow", "DNS", "Security"] - } + desc: "Betrieb eigener Mailinfrastruktur mit iRedMail, Mailcow, SOGo inklusive vollständiger DNS-Konfiguration, SPF/DKIM/DMARC und Zustellbarkeitsanalyse.", + tags: ["Mailcow", "SPF/DKIM", "DNS", "IMAP"], + type: "Infrastruktur", + }, ]; export function Projects() { return ( -
+
-

- 03. Ausgewählte Projekte -

-

- Von der sicheren Infrastruktur bis zur modernen SaaS-Lösung – in der Praxis bewährt. -

+
+

Ausgewählte Projekte

+

+ Gebaut, deployed, betrieben +

+

+ Reale Systeme — von der sicheren Upload-Plattform bis zur Newsletter-SaaS und eigenen KI-Infrastruktur. +

+
-
+
{projects.map((project, index) => ( -
- - +
+
+
+ +
+ + {project.type} + +
+ {project.url && ( + + + + )}
-

{project.title}

-

{project.desc}

-
+ +

{project.title}

+

{project.desc}

+ +
{project.tags.map((tag, tIndex) => ( - + {tag} ))} diff --git a/artifacts/joachim-portfolio/src/components/strengths.tsx b/artifacts/joachim-portfolio/src/components/strengths.tsx index 5774f2a..78e5289 100644 --- a/artifacts/joachim-portfolio/src/components/strengths.tsx +++ b/artifacts/joachim-portfolio/src/components/strengths.tsx @@ -3,58 +3,70 @@ import { TerminalSquare, BrainCircuit, Wrench } from "lucide-react"; const strengths = [ { + number: "01", icon: TerminalSquare, title: "Klassischer IT-Betrieb", - desc: "Server, Netzwerke, Logs, Zertifikate, Mailserver aus 30 Jahren Praxis. Fundiertes Wissen, das die Basis für jedes zuverlässige System bildet." + desc: "Server, Netzwerke, Logs, Zertifikate, Mailserver — aus über 30 Jahren produktivem Betrieb in Konzernen und Behörden. Ein Fundament, das hält.", + highlight: "Behörden & Konzernprojekte", }, { + number: "02", icon: BrainCircuit, title: "KI-gestützte Entwicklung", - desc: "Vibe-Coding mit Claude Code & ChatGPT. Der direkte Weg von der Idee zur lauffähigen Anwendung, unterstützt durch modernste AI-Tools." + desc: "Vibe-Coding mit Claude Code & ChatGPT: Von der Idee zur lauffähigen Anwendung. KI als präzises Entwicklungswerkzeug — nicht als Buzzword.", + highlight: "Idee → Produktion", }, { + number: "03", icon: Wrench, title: "Praxisnahe Umsetzung", - desc: "Baut, testet, betreibt, dokumentiert und verbessert reale Systeme. Kein Elfenbeinturm-Engineering, sondern Lösungen, die in Produktion funktionieren." - } + desc: "Bauen, testen, betreiben, dokumentieren — und verbessern. Keine Konzepte ohne Ausführung. Kein Deployment ohne Betrieb.", + highlight: "Nachvollziehbar & betreibbar", + }, ]; export function Strengths() { return ( -
+
-

- 02. 3 Welten -

-

- Die besondere Stärke liegt in der Kombination aus klassischem Betrieb, moderner KI-Entwicklung und handfester Umsetzung. -

+
+

Besondere Stärke

+

+ Drei Welten — eine Person +

+

+ Die Kombination macht den Unterschied: klassisches IT-Handwerk trifft auf modernste KI-Werkzeuge und konsequente Umsetzungsstärke. +

+
-
+
{strengths.map((item, index) => ( -
- +
+
+ +
+ {item.number}
-

{item.title}

-

- {item.desc} -

- - {/* Decorative line */} -
+

{item.title}

+

{item.desc}

+ + {item.highlight} + ))}
diff --git a/artifacts/joachim-portfolio/src/index.css b/artifacts/joachim-portfolio/src/index.css index 7698dab..18b8075 100644 --- a/artifacts/joachim-portfolio/src/index.css +++ b/artifacts/joachim-portfolio/src/index.css @@ -1,3 +1,4 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); @import "tailwindcss"; @import "tw-animate-css"; @plugin "@tailwindcss/typography"; @@ -34,7 +35,7 @@ --color-destructive: hsl(var(--destructive)); --color-destructive-foreground: hsl(var(--destructive-foreground)); - --font-sans: 'Space Grotesk', 'Inter', sans-serif; + --font-sans: 'Inter', system-ui, sans-serif; --font-mono: 'JetBrains Mono', 'Menlo', monospace; --radius-sm: calc(var(--radius) - 4px); @@ -44,38 +45,37 @@ } :root { - /* Dark technical industrial theme as default */ - --background: 224 25% 6%; - --foreground: 210 40% 98%; + --background: 0 0% 100%; + --foreground: 222 47% 11%; - --card: 224 25% 8%; - --card-foreground: 210 40% 98%; - --card-border: 224 25% 12%; + --card: 0 0% 100%; + --card-foreground: 222 47% 11%; + --card-border: 220 13% 91%; - --popover: 224 25% 6%; - --popover-foreground: 210 40% 98%; - --popover-border: 224 25% 12%; + --popover: 0 0% 100%; + --popover-foreground: 222 47% 11%; + --popover-border: 220 13% 91%; - --primary: 186 100% 42%; /* Cyan */ - --primary-foreground: 224 25% 6%; + --primary: 234 89% 60%; + --primary-foreground: 0 0% 100%; - --secondary: 224 25% 12%; - --secondary-foreground: 210 40% 98%; + --secondary: 220 14% 96%; + --secondary-foreground: 222 47% 11%; - --muted: 224 25% 14%; - --muted-foreground: 215 20% 65%; + --muted: 220 14% 96%; + --muted-foreground: 220 9% 46%; - --accent: 224 25% 14%; - --accent-foreground: 210 40% 98%; + --accent: 234 89% 97%; + --accent-foreground: 234 89% 40%; --destructive: 0 84% 60%; - --destructive-foreground: 210 40% 98%; + --destructive-foreground: 0 0% 100%; - --border: 224 25% 15%; - --input: 224 25% 15%; - --ring: 186 100% 42%; + --border: 220 13% 91%; + --input: 220 13% 91%; + --ring: 234 89% 60%; - --radius: 0.25rem; + --radius: 0.625rem; } @layer base { @@ -83,23 +83,34 @@ @apply border-border; } + html { + scroll-behavior: smooth; + } + body { - @apply font-sans antialiased bg-background text-foreground selection:bg-primary/30; + @apply font-sans antialiased bg-background text-foreground; } } -.glow-text { - text-shadow: 0 0 20px hsl(var(--primary) / 0.5); +.section-number { + @apply text-sm font-semibold tracking-widest uppercase text-primary; } -.glow-box { - box-shadow: 0 0 30px hsl(var(--primary) / 0.1); +.hero-gradient { + background: radial-gradient(ellipse 80% 60% at 50% -10%, hsl(234 89% 60% / 0.12) 0%, transparent 70%); } -/* Grid background pattern */ -.bg-grid-pattern { - background-size: 40px 40px; - background-image: - linear-gradient(to right, hsl(var(--border) / 0.3) 1px, transparent 1px), - linear-gradient(to bottom, hsl(var(--border) / 0.3) 1px, transparent 1px); +.dot-pattern { + background-image: radial-gradient(circle, hsl(220 13% 91%) 1px, transparent 1px); + background-size: 28px 28px; +} + +.card-hover { + transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease; +} + +.card-hover:hover { + box-shadow: 0 8px 30px hsl(234 89% 60% / 0.1); + transform: translateY(-2px); + border-color: hsl(234 89% 60% / 0.3); } diff --git a/artifacts/joachim-portfolio/src/pages/home.tsx b/artifacts/joachim-portfolio/src/pages/home.tsx index 2a28457..fc6da50 100644 --- a/artifacts/joachim-portfolio/src/pages/home.tsx +++ b/artifacts/joachim-portfolio/src/pages/home.tsx @@ -1,4 +1,3 @@ -import { motion } from "framer-motion"; import { Hero } from "@/components/hero"; import { Competencies } from "@/components/competencies"; import { Projects } from "@/components/projects"; @@ -9,37 +8,31 @@ import { Navbar } from "@/components/navbar"; export default function Home() { return ( -
- {/* Background grid */} -
- - {/* Subtle ambient glow */} -
- +
-
+
-
+
-
+
-
+
-
+
-
+