Personal portfolio website built with Next.js, TypeScript, and Tailwind CSS. Bilingual (EN/FR), dark/light mode, static export.
- 🌓 Dark/Light mode with system preference detection
- 🌍 Internationalization (English/French)
- 📱 Fully responsive
- ⚡ Static export (GitHub Pages)
- 🎨 Smooth animations with Framer Motion
- 📄 LaTeX-generated resume PDFs (EN/FR)
- 🎯 TypeScript throughout
- Framework: Next.js 16 (App Router, static export)
- Language: TypeScript
- Styling: Tailwind CSS 4
- Icons: Lucide React, React Icons
- Animations: Framer Motion
- Font: Space Grotesk
- Runtime: Bun
- Resume: LaTeX (texlive) + custom TypeScript generator
- Bun 1.x
git clone git@github.com:dimahc/dimahc.github.io.git
cd dimahc.github.io
bun install
bun devOpen http://localhost:3000.
bun run buildProduces a static export in out/.
docker build -t portfolio:latest .
docker run -p 3000:3000 portfolio:latestCopy env.example to .env and fill in the values:
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_EMAILJS_SERVICE_ID |
Yes | EmailJS service ID |
NEXT_PUBLIC_EMAILJS_TEMPLATE_ID |
Yes | EmailJS template ID |
NEXT_PUBLIC_EMAILJS_PUBLIC_KEY |
Yes | EmailJS public key |
BASE_PATH |
No | Custom base path (default: /) |
The project includes a LaTeX resume generation pipeline:
scripts/generate-resume.ts— injects content data intoresume/template.texscripts/compile-resume.sh— compiles.tex→ PDF via latexmk
Run manually: bun run generate-resume or bun run compile-resume.
The pipeline runs automatically in prebuild.
src/
app/ # Next.js App Router (pages, layouts, global styles)
components/ # React components (common, home, layout, resume, ui)
content/ # Bilingual structured data (experience, projects, etc.)
context/ # React context providers (language, navigation)
hooks/ # Custom React hooks
lib/ # Utilities (i18n, animations, validators, constants)
locales/ # JSON translation files (en.json, fr.json)
types/ # TypeScript type definitions
resume/ # LaTeX template and generated .tex files
scripts/ # Resume generation and compilation scripts
public/ # Static assets (images, PDFs, favicon)
Pushing to main triggers GitHub Actions to build and deploy to GitHub Pages automatically.