Production portfolio website for Viacheslav Murakhin built with React, TypeScript, Vite, React Router, SCSS Modules, Vitest, and Playwright.
The repository is structured as a real product rather than a one-off landing page. It includes a scroll-synced homepage shell, dedicated resume and legal pages, regional hiring landing pages, centralized content ownership, SEO metadata, automated tests, and a repeatable static-production build.
- Recruiters and hiring managers who want a clear technical profile, direct resume access, and credible project evidence.
- Developers who need a maintainable React codebase with documented content ownership, routing, SEO, and release behavior.
- Release owners who need reproducible builds, static-hosting guidance, QA checkpoints, and production handoff notes.
| Area | Details |
|---|---|
| Product type | Personal portfolio and hiring website |
| Runtime model | React 18 with BrowserRouter, build-time prerendering, and static route HTML output |
| Primary routes | /, /about, /expertise, /experience, /projects, /resume, /privacy, /copyright |
| Regional routes | /canada, /usa, /europe |
| Legacy redirect | /home redirects to / |
| Content model | TypeScript source-of-truth content in src/content/ plus protected contact constants in src/utils/contact.ts |
| UX behaviors | Scroll-synced section routing, desktop sidebar collapse, mobile menu, theme switching, draggable desktop project ordering |
| SEO model | Per-route metadata, prerendered HTML, sitemap, robots, structured data, and hreflang alternates for regional pages |
| Analytics | Optional GA4, loaded only after consent and only when VITE_GA_MEASUREMENT_ID is configured |
| Deployment target | Static hosting with route folders, 404.html, manifest, sitemap, downloadable resume PDF, and regenerated docs screenshots |
| Category | Summary |
|---|---|
| Role focus | Full Stack Developer |
| Core stack | React, TypeScript, Java, Spring Boot |
| Supporting tools | Vite, React Router, SCSS Modules, Vitest, Playwright |
| Target work style | Remote product teams, startups, and software companies across Canada, the United States, and Europe |
| Languages | English, Polish, Russian, Ukrainian |
| Resume route | /resume |
| PDF resume | public/documents/viacheslav-murakhin-resume.pdf |
- Production-minded frontend architecture instead of a static brochure page.
- Centralized content that keeps homepage copy, resume, legal pages, footer, and SEO metadata aligned.
- Regional hiring landing pages that support Canada, USA, and Europe targeting without fragmenting the codebase.
- Static deployment readiness with prerendered route HTML,
404.html, manifest, sitemap, and legal/privacy coverage. - Automated verification across unit tests, route tests, SEO tests, and Playwright browser coverage.
- Node.js 20+
- npm 10+
npm installnpm run devDefault local address:
http://localhost:3000
- Copy
.env.exampleto.env.local. - Replace
G-XXXXXXXXXXwith the real GA4 Measurement ID. - Restart the dev server.
cp .env.example .env.localnpm run buildOutput directory:
build/
npm run previewPreview address:
http://localhost:4173
| Command | Purpose |
|---|---|
npm run dev |
Start the local Vite server |
npm run build |
Type-check, build the client, build the SSR entry, and prerender public routes into build/ |
npm run preview |
Preview the production build locally |
npm test |
Run Vitest once |
npm run test:watch |
Run Vitest in watch mode |
npm run test:e2e |
Run Playwright end-to-end tests |
npm run test:e2e:install |
Install Chromium for Playwright-based flows |
npm run export:resume |
Rebuild the site and export the /resume route to public/documents/ as PDF |
npm run docs:screenshots |
Refresh documentation screenshots in docs/assets/ |
| Route | Role |
|---|---|
/ |
Canonical portfolio landing route |
/about, /expertise, /experience, /projects |
Deep links into the one-page portfolio shell |
/resume |
Dedicated resume page with PDF download |
/privacy, /copyright |
Legal and production-trust pages |
/canada, /usa, /europe |
Regional hiring landing pages with market-specific copy and hreflang support |
/home |
Legacy route that redirects to / |
* |
Not-found route rendered through the shared page shell |
| Path | Responsibility |
|---|---|
src/content/site.ts |
Identity, navigation, about copy, expertise copy, resume data, legal copy, and base route metadata |
src/content/projects.ts |
Project cards, proof points, stacks, actions, and responsive image metadata |
src/content/marketPages.ts |
Canada, USA, and Europe landing-page copy plus regional route metadata |
src/components/ |
Shared UI such as sidebar, footer, route metadata, consent banner, protected email links, and cards |
src/sections/ |
Homepage sections mounted inside the main scrolling portfolio shell |
src/pages/ |
Routed pages for resume, legal content, regional landing pages, and not-found handling |
src/hooks/ |
Shared media-query and scroll behavior hooks |
src/utils/ |
Analytics, contact constants, scrolling helpers, and low-level helpers |
scripts/ |
Prerendering, resume export, and docs-screenshot automation |
public/ |
Static assets copied into the build, including icons, manifest, robots, sitemap, and PDF resume |
docs/ |
HR-facing overview, architecture, content model, testing, deployment, release, and handoff documentation |
- Open
/. - Review
/projects. - Open
/resume. - Skim
docs/hr-overview.md.
- Read
docs/architecture.md. - Read
docs/content-model.md. - Run
npm testandnpm run build. - Read
docs/production-handoff.md.
- Read
docs/deployment.md. - Run
npm test,npm run build, andnpm run test:e2e. - Re-export the resume if copy changed.
- Refresh docs screenshots if the UI changed materially.
- Walk through
docs/release-checklist.md.
The production build is prepared to ship with:
- prerendered HTML for all public portfolio, resume, legal, and regional routes
404.htmlfor unknown routesrobots.txtandsitemap.xml- canonical, Open Graph, Twitter, and JSON-LD metadata
hreflangalternate links for Canada, USA, Europe, and the default landing page- manifest and icon assets
- downloadable resume PDF
- documentation screenshots that can be regenerated from the current UI state
This repository is not published under an open-source license.
Unless a specific third-party dependency states otherwise:
- original source code is all rights reserved
- original written copy is all rights reserved
- original design and portfolio presentation are all rights reserved
- custom portfolio assets remain proprietary
See COPYRIGHT.md for the project notice.