Skip to content

mitekk/portfolio

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

122 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ‘‹ Mitya Kurs β€” Portfolio & CV

A fast, prerendered personal portfolio β€” introduce Β· showcase Β· share

CI License: MIT Node React TypeScript Vite Tailwind React Router

A small, fast personal site that introduces who I am, walks through my experience and toolbox, and lets you read or download my CV. Every route is prerendered to static HTML, so it loads instantly and shares cleanly on LinkedIn and in search results β€” tuned for performance, accessibility, and SEO, with the numbers gated in CI by Lighthouse.

Live at profile.mitya.dev.



What it is

A personal portfolio and CV site. The landing page opens with an animated grid background and a typing intro; from there, About, Experience, and Toolbox sections introduce my background, and a dedicated /cv page renders an inline PDF preview with a download link and a branded share card. It's deliberately small and fast β€” single-page React, prerendered to static HTML, with per-route SEO metadata so each page shares cleanly.

Quick start

npm install
npm run dev        # Vite dev server on http://localhost:5173
Command URL Notes
npm run dev http://localhost:5173 hot-reloading dev server
npm run build β€” type-check, build, then prerender routes to static HTML
npm run preview http://localhost:4173 preview the production build locally

Requirements: Node 22 (matches the Dockerfile and CI). No runtime configuration β€” the site is fully static once built.

Architecture

A single-page React app built by Vite, then prerendered to static HTML per route by react-snap (the postbuild step). The static dist/ is served by Nginx in a Docker image; no server runtime, no API. Per-route <head> metadata is set with react-helmet-async from a single SEO config (src/seo/config.ts).

flowchart LR
  Dev["Vite dev :5173"]
  Build["vite build"]
  Snap["react-snap<br/>prerender per route"]
  Dist[("dist/ Β· static HTML")]
  Nginx["Nginx (Docker)<br/>profile.mitya.dev"]
  Build --> Snap --> Dist --> Nginx
Loading
.
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ pages/         # intro Β· theBuzz (about Β· experience Β· toolbox) Β· cv Β· notFound
β”‚   β”œβ”€β”€ components/    # UI Β· animated grid backgrounds Β· navbar Β· prompter Β· SEO head
β”‚   β”œβ”€β”€ seo/           # single-source SEO config + structured data
β”‚   β”œβ”€β”€ routes.tsx     # route table (lazy-loaded for bundle splitting)
β”‚   └── main.tsx       # app entry
β”œβ”€β”€ scripts/           # prerender.cjs (postbuild) Β· og-image.cjs
β”œβ”€β”€ tests/             # Playwright e2e: flows Β· content Β· accessibility Β· layout
β”œβ”€β”€ public/            # CV PDF, share cards, icons, robots.txt, sitemap.xml
β”œβ”€β”€ docs/              # performance baseline + working specs/plans
β”œβ”€β”€ nginx.conf         # production serving (caching, inline CV)
└── Dockerfile         # build β†’ static β†’ Nginx image

Tech stack

Layer Tech
UI React 19 Β· React Router 7 Β· react-helmet-async (per-route meta)
Styling Tailwind CSS 4 Β· @fontsource/poppins
Build Vite 6 Β· TypeScript 5 Β· react-snap (static prerender)
Tests Vitest 4 (unit) Β· Playwright (e2e) Β· Testing Library
Quality ESLint Β· Prettier Β· Husky Β· Lighthouse CI
Serving Nginx Β· Docker Β· Node 22

Scripts

Command What it does
npm run dev Start the Vite dev server
npm run build Type-check, build, and prerender routes to static HTML
npm run preview Preview the production build locally
npm run lint Run ESLint
npm run format Format with Prettier (format:check to verify)
npm run test:unit Run unit tests (Vitest)
npm run test:e2e Run end-to-end tests (Playwright)
npm run test Run unit and e2e tests
npm run lhci Build and run Lighthouse CI

Testing

npm run test:unit   # Vitest unit tests (jsdom + Testing Library)
npm run test:e2e    # Playwright e2e against the dev server (auto-started)
npm run test        # both

Playwright drives the real app on http://localhost:5173 (it boots npm run dev itself) and covers the intro flow, navigation and routing, content/SEO presence, keyboard accessibility, and responsive layout β€” see tests/.

Continuous integration

GitHub Actions (.github/workflows/deploy.yml) runs on every push to master and on pull requests, in parallel jobs:

  • quality β€” npm ci, ESLint, and Prettier format:check.
  • build β€” full npm run build (type-check + Vite + prerender).
  • unit-tests / e2e-tests β€” Vitest and Playwright, each uploading JUnit results (and the Playwright HTML report) as artifacts.
  • test-report β€” aggregates the JUnit artifacts into a single test summary.

Lighthouse CI gates performance, accessibility, best-practices, and SEO scores β€” see lighthouserc.json and the recorded baseline in docs/performance-baseline.md.

Deployment

npm run build outputs prerendered static HTML to dist/. The Dockerfile builds that in a node:22-alpine stage and serves it from nginx:alpine using nginx.conf (gzip, long-lived asset caching, the CV served inline). Deployed to profile.mitya.dev.

Docs & decisions

  • Performance baseline: docs/performance-baseline.md β€” Lighthouse scores + the CI gates that lock them in.
  • Design specs & plans: docs/superpowers/ β€” working notes for the responsive UI, intro overlay, theming, Lighthouse setup, and testing layer.

License

Released under the MIT License β€” see LICENSE.

About

πŸ‘‹ Mitya Kurs β€” my personal portfolio & CV site: an animated intro, my experience & toolbox, and a readable/downloadable CV. Fast, prerendered to static HTML, and shares cleanly.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors