commit 4ca8848d09493429f01e4ac581d1bb53dcde2a11 Author: Puechberty Arthur Date: Mon Mar 30 22:47:25 2026 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b5a55c4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# docker +docker-compose.override.yml + +# OS +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..01c2bd5 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# Portfolio Arthur P + +Portfolio personnel développé avec Next.js 16 (App Router), React 19 et TypeScript. + +Site en ligne: [portfolio.arthurp.fr](https://portfolio.arthurp.fr) + +## Aperçu + +Ce projet présente: + +- Une page d'accueil structurée en sections (Hero, About, Projects, Homelab, Sailing) +- Une page dédiée aux photos +- Une base SEO (robots/sitemap) + +## Stack technique + +- Next.js 16 +- React 19 +- TypeScript +- ESLint + +## Lancer le projet en local + +```bash +npm install +npm run dev +``` + +Application disponible sur `http://localhost:3000`. + +## Scripts utiles + +```bash +npm run dev # développement +npm run lint # vérification ESLint +npm run build # build production +npm run start # démarrage après build +``` + +## Déploiement + +Le projet peut être déployé sur un serveur Node.js ou une plateforme compatible Next.js. + +Exemple de flux: + +1. `npm ci` +2. `npm run build` +3. `npm run start` + +## Checklist avant push GitHub + +- Vérifier que les secrets ne sont pas commités (`.env*`, clés privées, tokens) +- Vérifier que les fichiers locaux IDE sont ignorés (`.vscode/`, `.idea/`) +- Vérifier que les dossiers de build/deps sont ignorés (`.next/`, `node_modules/`) + +## Backlink + +Projet officiel: [portfolio.arthurp.fr](https://portfolio.arthurp.fr) diff --git a/app/components/About.tsx b/app/components/About.tsx new file mode 100644 index 0000000..5b97062 --- /dev/null +++ b/app/components/About.tsx @@ -0,0 +1,85 @@ +import { Code2, Server, Network, Container } from "lucide-react"; + +const skills = [ + { + icon: , + title: "Développement", + desc: "Next.js, React, TypeScript, Python, Node.js", + }, + { + icon: , + title: "Virtualisation", + desc: "Proxmox, machines virtuelles, gestion de ressources", + }, + { + icon: , + title: "Conteneurisation", + desc: "Docker, déploiement automatisé, orchestration", + }, + { + icon: , + title: "Réseau", + desc: "VLAN, firewall, bridges, DNS, reverse proxy", + }, +]; + +export default function About() { + return ( +
+
+
+

+ À propos de moi +

+

+ Passionné par la programmation, l'infrastructure réseau, la + virtualisation et l'auto-hébergement. +

+
+ +
+ {/* Text */} +
+

+ J'aime concevoir des projets concrets, comprendre en + profondeur le fonctionnement des systèmes et créer mes propres + outils. Mon homelab basé sur Proxmox fonctionne + en continu et me sert d'environnement principal pour + héberger mes sites, gérer des machines virtuelles, déployer des + conteneurs Docker et expérimenter avec le réseau. +

+

+ Mon objectif à long terme est de créer des systèmes complets, + des plateformes et des projets ambitieux qui combinent{" "} + développement logiciel et{" "} + infrastructure. +

+

+ En parallèle, je suis{" "} + sportif de haut niveau en voile, + ce qui m'a appris la rigueur, la discipline et la + persévérance — des valeurs que j'applique aussi dans mes + projets techniques. +

+
+ + {/* Skills grid */} +
+ {skills.map((skill) => ( +
+
{skill.icon}
+

{skill.title}

+

+ {skill.desc} +

+
+ ))} +
+
+
+
+ ); +} diff --git a/app/components/Footer.tsx b/app/components/Footer.tsx new file mode 100644 index 0000000..3410c98 --- /dev/null +++ b/app/components/Footer.tsx @@ -0,0 +1,87 @@ +import { Github, Mail, Globe, Heart } from "lucide-react"; + +export default function Footer() { + return ( +
+
+
+ {/* Brand */} +
+

+ arthurp.fr +

+

+ Développeur passionné par l'auto-hébergement et navigateur + de haut niveau. +

+
+ + {/* Links */} +
+

Navigation

+
+ {[ + { href: "#accueil", label: "Accueil" }, + { href: "#projets", label: "Projets" }, + { href: "#homelab", label: "Homelab" }, + { href: "#voile", label: "Voile" }, + ].map((link) => ( + + {link.label} + + ))} +
+
+ + {/* Contact */} + +
+ +
+ +
+

+ © {new Date().getFullYear()} Arthur P. Tous droits réservés. +

+

+ Fait avec et + auto-hébergé sur Proxmox +

+
+
+
+ ); +} diff --git a/app/components/Hero.tsx b/app/components/Hero.tsx new file mode 100644 index 0000000..35c0b00 --- /dev/null +++ b/app/components/Hero.tsx @@ -0,0 +1,69 @@ +import { ArrowDown, Terminal, Sailboat } from "lucide-react"; + +export default function Hero() { + return ( +
+ {/* Background grid */} +
+ ); +} diff --git a/app/components/Homelab.tsx b/app/components/Homelab.tsx new file mode 100644 index 0000000..308a28a --- /dev/null +++ b/app/components/Homelab.tsx @@ -0,0 +1,135 @@ +import { + Server, + HardDrive, + Container, + Network, + Shield, + Image, + Tv, + Monitor, +} from "lucide-react"; + +const infra = [ + { + icon: , + title: "Proxmox VE", + desc: "Hyperviseur principal pour la virtualisation de toutes mes machines et conteneurs.", + }, + { + icon: , + title: "Docker", + desc: "Déploiement conteneurisé de l'ensemble de mes applications et services.", + }, + { + icon: , + title: "Machines virtuelles", + desc: "Isolation des environnements : production, test, développement.", + }, + { + icon: , + title: "Réseau avancé", + desc: "VLAN, bridges, DNS personnalisé, reverse proxy Nginx.", + }, + { + icon: , + title: "Sécurité", + desc: "Firewall, certificats SSL, accès sécurisés et segmentation réseau.", + }, + { + icon: , + title: "Déploiement automatisé", + desc: "CI/CD, scripts de déploiement, gestion via Git.", + }, +]; + +const personalServices = [ + { + icon: , + name: "Immich", + url: "immich.arthurp.fr", + desc: "Gestionnaire de photos auto-hébergé — alternative à Google Photos.", + }, + { + icon: , + name: "Jellyfin", + url: "jellyfin.arthurp.fr", + desc: "Serveur multimédia auto-hébergé — films, séries, musique.", + }, +]; + +export default function Homelab() { + return ( +
+
+
+

+ Mon Homelab +

+

+ Une infrastructure personnelle qui tourne 24/7 — mon terrain de + jeu pour l'auto-hébergement, la virtualisation et le réseau. +

+
+ + {/* Architecture diagram */} +
+
+
+ + Infrastructure en ligne + +
+ +
+ {infra.map((item) => ( +
+
+ {item.icon} +

{item.title}

+
+

+ {item.desc} +

+
+ ))} +
+
+ + {/* Personal services */} +
+

+ Exemples de services personnels hébergés +

+
+ {personalServices.map((svc) => ( +
+
+ {svc.icon} +
+

{svc.name}

+ + {svc.url} + +
+
+

+ {svc.desc} +

+
+ ))} +
+

+ Ces services tournent sur mon infrastructure Proxmox avec + virtualisation et conteneurs Docker — et bien d'autres encore. +

+
+
+
+ ); +} diff --git a/app/components/Navbar.tsx b/app/components/Navbar.tsx new file mode 100644 index 0000000..97fa049 --- /dev/null +++ b/app/components/Navbar.tsx @@ -0,0 +1,133 @@ +"use client"; + +import { useState, useEffect } from "react"; +import Link from "next/link"; +import { Menu, X, Sun, Moon } from "lucide-react"; +import { useTheme } from "./ThemeProvider"; + +const navLinks = [ + { href: "#accueil", label: "Accueil" }, + { href: "#a-propos", label: "À propos" }, + { href: "#projets", label: "Projets" }, + { href: "#homelab", label: "Homelab" }, + { href: "#voile", label: "Voile" }, + { href: "/photos", label: "Galerie" }, + { href: "#contact", label: "Contact" }, +]; + +export default function Navbar() { + const [scrolled, setScrolled] = useState(false); + const [mobileOpen, setMobileOpen] = useState(false); + const { theme, toggleTheme } = useTheme(); + + useEffect(() => { + const handleScroll = () => setScrolled(window.scrollY > 50); + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + return ( + + ); +} diff --git a/app/components/Projects.tsx b/app/components/Projects.tsx new file mode 100644 index 0000000..424eb60 --- /dev/null +++ b/app/components/Projects.tsx @@ -0,0 +1,147 @@ +import { ExternalLink, Timer, FileQuestion, Grid3X3, Video, QrCode, BookOpen, Link2, FileText, Bot, LinkIcon, Clock } from "lucide-react"; + +const projects = [ + { + name: "arthurp.fr", + url: "https://arthurp.fr", + desc: "Site principal qui centralise mon écosystème de projets et services.", + icon: , + tags: ["Site vitrine", "Hub"], + }, + { + name: "pomodoro.arthurp.fr", + url: "https://pomodoro.arthurp.fr", + desc: "Application de gestion du temps basée sur la méthode Pomodoro.", + icon: , + tags: ["Productivité", "Web App"], + }, + { + name: "qcu.arthurp.fr", + url: "https://qcu.arthurp.fr", + desc: "Site de QCU pour réviser la physique.", + icon: , + tags: ["Éducation", "Physique"], + }, + { + name: "sudoku.arthurp.fr", + url: "https://sudoku.arthurp.fr", + desc: "Générateur et jeu de Sudoku en ligne.", + icon: , + tags: ["Jeu", "Logique"], + }, + { + name: "visio.arthurp.fr", + url: "https://visio.arthurp.fr", + desc: "Solution de visioconférence auto-hébergée.", + icon: