All notable changes to this project will be documented here.
Format: Keep a Changelog Versioning: Semantic Versioning
- i18n: English + German language support — EN/DE switcher in navbar (desktop) and mobile menu; language persists via
localStorage;document.langupdated reactively per locale src/locales/en.js+src/locales/de.js— all user-facing strings centralised; German copy written for Germany-based recruiterssrc/context/LangContext.jsx— lightweightLangProvider+useTranslation()hook; dot-notation key resolver with EN fallback; no external i18n frameworksrc/components/LanguageSwitcher.jsx— EN/DE pill toggle;aria-pressedstate; visible on desktop header and inside mobile navnavigation.css—.lang-switcherand.nav__endstyles; mobile breakpoint hides desktop switcher, shows it inside slide-out menu insteadsrc/hooks/useOgMeta.js— fix pre-existing duplicateimagekey
- All section components (
Hero,About,AIAugmentedSDLC,Skills,Projects,Certifications,Contact,Footer,CaseStudyModal,TimelineSwitch,BackToTop) updated to consumeuseTranslation()— all visible strings now resolve from locale files Navbar.jsx— nav labels driven by locale keys;nav__togglemoved insidenav__endwrapper alongside the language switcherApp.jsx— wrapsAppInnerwithLangProvider; inner component pattern preserves hook call order
docs/ROADMAP.md— markvercel.json, Lighthouse CI, and "Last updated" case study timestamps as complete; update domain references fromroman-mazuryk.vercel.apptowww.mazuryk.dev; version history entry v1.1
App.jsx+utilities.css— skip-to-main link (.skip-link): visually hidden until focused, appears at top for keyboard users (WCAG 2.4.1)Navbar.jsx— mobile menu keyboard fix:aria-hidden+inertonnav__listwhen closed on mobile; Escape key closes open menuProjects.jsx— empty state with "Clear filter" when tag filter yields zero resultsProjects.jsx+modal.css— case study lazy-load spinner (.cs-loading__spinner) replaces plain text fallbackutilities.css—@media (hover: none):activefallbacks for cards and interactive elements
-
timeline.css— scroll buttons repositioned to4pxinside on viewports ≤ 900px (was-48px, clipped off-screen) -
modal.css— close button enlarged 36→44px (WCAG 2.5.5); hover + focus-visible styles added; backdrop 0.55→0.72 opacity, blur 2→4px -
projects.css— category tabs redesigned as segmented control to distinguish from tag filter chips; empty state style added -
hero.css— CTA hierarchy: primary button larger with glow; email link de-emphasised -
Contact.jsx— copy confirmation extended to 2.5s witharia-live="polite" -
main.css— section padding48px 0on ≤ 640px -
About.jsx— profile image explicitwidth/heightto prevent CLS -
ai-sdlc.css,skills.css,certifications.css,about.css,projects.css,contact.css,timeline.css,modal.css—border-radius: 14px→var(--radius)token -
Hero.jsx,Footer.jsx— replace dead-end#contactanchor CTAs with directmailto:romazuryk@proton.melinks; Hero "Get in touch" becomes one-click email open with visible address and Mail icon; Footer "Get in touch" becomes "Send an email" mailto -
index.html— add<link rel="canonical" href="https://www.mazuryk.dev/" />so search engines consolidate authority on the custom domain -
Hero.jsx— replace external LinkedIn ghost CTA with on-site#contactanchor ("Get in touch"); keeps conversion loop on-site -
public/robots.txt,public/sitemap.xml,index.html(og:url, og:image, twitter:image) — update all canonical URLs fromroman-mazuryk.vercel.apptowww.mazuryk.dev -
vercel.json— explicit build config + security headers (X-Frame-Options: DENY,X-Content-Type-Options: nosniff,Referrer-Policy,Permissions-Policy); immutable cache headers for/assets/ -
.github/workflows/lighthouse.yml— Lighthouse CI on every push/PR tomain; fails build if any category drops below 90 -
.lighthouserc.json— Lighthouse CI thresholds: Performance ≥ 90, Accessibility ≥ 90, Best Practices ≥ 90, SEO ≥ 90 -
"Last updated: Feb 2026" footer added to all 6 case study modals (AlphaRhythm, Flowlogics, LiveSurgery, Medintegro, Portfolio, SmartShooter)
Footer.jsx— replaceicon: Icondestructuring alias (invisible to ESLintno-unused-vars) with directicon+React.createElement(icon, ...)patternContact.jsx— add/* clipboard unavailable */comment to emptycatch {}block to satisfyno-emptyruleAlphorythmCaseStudy.jsx,FlowLogixCaseStudy.jsx— replace literal->arrows in JSX text with Unicode→to fix parser error
- Replace all
import * as Lucidewildcard imports with named imports + static lookup maps inProjects.jsx,Milestones.jsx,JourneyFull.jsx— enables tree-shaking, removes ~800 kB of unused icon code from bundle - Lazy-load all 6 case study components with
React.lazy+Suspense— they are modal-only and never needed on initial page load - Add
manualChunkstovite.config.jsto splitreact-vendorinto a separate cacheable chunk - Add
<link rel="preload">for/images/profile.jpgwithfetchpriority="high"— fixes LCP delay - Result: initial JS bundle (gzip) reduced from 242 kB → 78 kB (68% reduction); Lighthouse Performance 38 → 99
- Vercel Analytics (
@vercel/analytics) — privacy-respecting visitor tracking via<Analytics />inApp.jsx docs/PRD.md— product requirements, target user, MVP scope, acceptance criteria, risksdocs/ARCHITECTURE.md— system design, component map, data flow, key trade-offs, scaling notesdocs/ROADMAP.md— 12-week outcome-based roadmap with weekly DoD and demo artifactsdocs/DECISIONS_LOG.md— 6 architectural decision records (ADRs) covering routing, CSS, state, data, OS adoption, and build toolingCHANGELOG.md— this file; tracks all shipped changes going forwardCONTRIBUTING.md— branch naming conventions, commit rules, PR discipline, release process.github/ISSUE_TEMPLATE/feature.md— feature request template with acceptance criteria.github/ISSUE_TEMPLATE/bug.md— bug report template with severity and reproduction steps.github/pull_request_template.md— PR checklist with lint/build/mobile/docs/changelog gatesREADME.md— rewritten with 30-second pitch, setup steps, project structure, stack table, docs index
- AI-Augmented SDLC section (
AIAugmentedSDLC.jsx) explaining methodology TimelineSwitchcomponent — toggle between 3-milestone summary and full 11-entry timelineJourneyFullcomponent — horizontal scrollable timeline with sort and tag filterCaseStudyModal— accessible modal with focus trap, Escape key support, hash-based routing- 6 case study components: LiveSurgery, SmartShooter, Flowlogics, Alphorythm, Portfolio, Medintegro
BackToTopbutton — appears after 400px scrolluseScrollRevealhook — IntersectionObserver scroll reveal withprefers-reduced-motionsupport- Open Graph and Twitter Card meta tags in
index.html - PWA manifest (
site.webmanifest) and full favicon set
- CSS reorganized into 16 component-scoped files with master import in
main.css - All CSS custom properties centralized in
:rootblock
- Projects section with category filter tabs (Tech / MedTech)
- Tag-based filtering on project grid
- Skills section with 5 category groups (PM, Systems, Leverage, Tech Stack, Soft)
- Certifications section with status badges
- Contact section with email copy-to-clipboard and 4s confirmation state
- Footer with socials and availability CTA
- Navbar upgraded with scroll-spy active section tracking using IntersectionObserver
- Mobile hamburger menu with auto-close on nav link click
- Initial React + Vite project scaffold
- Hero section with positioning statement and CTA buttons
- About section with multi-panel narrative and profile photo
- Basic Navbar with anchor links
- Core CSS design system (dark theme, CSS custom properties, responsive layout)
- Vercel deployment configured