Personal portfolio and CV site for Pavel Piatrovich, Frontend Engineer with 6+ years of experience in React, React Native, and TypeScript. Built as a static Next.js app - fully server-rendered, print-ready, and deployable to Vercel in one click.
| Layer | Choice |
|---|---|
| Framework | Next.js 15 (App Router, React 19) |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS v3 |
| Fonts | Syne (display) · Space Mono (code) via next/font |
| Analytics | Vercel Analytics |
| Deployment | Vercel |
Structured with Feature-Sliced Design (FSD) - layers import only downward:
src/
├── app/ Next.js App Router (layout, page, globals.css)
│
├── shared/ No project deps - safe to import anywhere
│ ├── config/cv.ts Single source of truth for all CV data
│ ├── lib/cn.ts clsx + tailwind-merge utility
│ ├── types/ All TypeScript interfaces and types
│ └── ui/ Badge · Button · Card · SectionHeader
│
├── entities/ Business entity cards, import from shared/ only
│ ├── job/ JobCard · ProjectCard
│ ├── skill/ SkillCategoryCard
│ ├── education/ EducationCard · CertificationCard
│ └── contact/ ContactCard
│
└── widgets/ Assembled page sections, import from entities/ + shared/
├── header/ Sticky nav with active-section highlight + mobile menu
├── hero/ Full-screen intro with marquee
├── about/ Summary + tags
├── experience/ Timeline with project cards
├── skills/ Categorised badge grid
├── education/ Degree · Certifications · Language bars
├── contact/ Contact cards + CTA
└── footer/
Each slice exposes a single index.ts public API - consumers never import from internal ui/ paths directly.
npm install
npm run dev # http://localhost:3000
npm run build # production build
npm run lintNode >= 20 required (see engines in package.json).
Drop the PDF at public/pavel-piatrovich-cv.pdf - the "Download CV" and "View CV" buttons in the Hero point to it automatically via PERSONAL.cvPath in shared/config/cv.ts.
All CV data lives in one file: src/shared/config/cv.ts.
Change anything there - name, jobs, skills, contact links - and the entire site updates. No other files need to be touched for content changes.
Open in Chrome → Print (Cmd+P) → Save as PDF. The site includes a full @media print stylesheet:
- White background, dark text
- Header, footer, animations, and decorative elements hidden
- A4 page size with sensible margins
- Page break before the Skills section
One-click deploy to Vercel:
- Push to GitHub
- Import repo in the Vercel dashboard
VERCEL_PROJECT_PRODUCTION_URLis set automatically by Vercel for production- Deploy
Security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) are configured in next.config.ts.
- Dark theme (
#0a0a0abackground), electric cyan accent (#06b6d4) - Dot-matrix background with radial mask + SVG concentric arcs
- CSS-only gradient text animation and marquee strip
- Responsive from 320 px - hamburger menu on mobile, full nav on desktop
@media print- full print stylesheet for clean A4 CV export- Accessible:
aria-hiddenon decorative elements,aria-label/aria-expandedon interactive controls