Personal portfolio for Hamza Zeghari — full-stack developer based in Casablanca, Morocco.
Built with Next.js 16 (App Router), React 19, Tailwind CSS 4, and Framer Motion.
| Route / anchor | What it is |
|---|---|
/ |
Hero, About, Experience, Projects, Contact |
/resume |
Printable résumé (use Print → Save as PDF) |
/#about |
Bio, photo, featured skills |
/#experience |
Tabbed work history |
/#projects |
Featured and supporting project cards |
/#contact |
Email CTA and social links |
Almost everything editable lives under app/constants/:
| File | Holds |
|---|---|
infos.ts |
Contact info, experience, education, certifications |
projects.ts |
Project cards on the homepage |
skills.ts |
Featured skills (About) and categorized résumé skills |
nav.ts |
Header navigation + scroll-spy section ids |
social.ts |
Footer / contact social profile URLs |
site.ts |
Site URL, titles, descriptions, theme colours |
Set NEXT_PUBLIC_SITE_URL on preview deployments so OG tags and the sitemap advertise that origin instead of production.
npm install
npm run devOpen http://localhost:3000.
npm run lint # ESLint
npm run typecheck # TypeScript (no emit)
npm run format # Prettier write
npm run build # Production build- Brand fonts are self-hosted: Signifier (serif) and Mabry / Mabry Mono (sans / mono). Geist from
create-next-appis not used. - Dark mode is class-based (
html.dark), with a small inline script that applies the stored preference before first paint. - Open Graph, Apple Touch, and PWA icons are generated by
app/opengraph-image.tsx,app/apple-icon.tsx, andapp/icon.tsx.
Deployed on Vercel. Production domain: hzeghari.dev.