- ✦ AddedATS-safe PDF resume — a single-column version built for pasting into job-portal upload forms, alongside the polished two-column one
- ✦ AddedCase-study pages now support YouTube video embeds, code blocks, deep-linkable section anchors, and inline code formatting; showcase cards can use a looping video cover instead of a static image
- ✦ AddedAuto-generated social preview cards — one per language, built from real CV data instead of a placeholder
- ✦ Addednpm run init — a one-command reset for a fresh fork, so a new user starts from a blank CV instead of someone else's
- ✦ AddedCustom domain support
- ✦ AddedStructured data (JSON-LD), hreflang, and per-page SEO metadata — search engines and social previews now see real, page-specific content instead of one generic string site-wide
- ✦ AddedPrinting the page (Ctrl+P) now gives a clean document instead of a dark-theme screenshot
- ✦ AddedDownload buttons are now visually prioritized (PDF first), grouped by audience, and configurable per deployment
- ✦ AddedOptional "Made with CV Hub" footer credit — on by default, one line in site.yml to remove
- ✦ Added/quickstart and /get-started — short links to the CV Hub quickstart section
- ✦ AddedFull English translation of the data/field reference doc (docs/INFO_en.md) — previously Russian-only
- ✎ ChangedUpgraded to Astro 7 — closes every outstanding dependency advisory (0 vulnerabilities, down from 15); requires Node 24 to build locally
- ✔ FixedThe 404 page now renders with the site's full layout instead of a broken, doubled document
- ✔ FixedFavicon was committed but never actually linked — fixed
- ✔ FixedCase-study images now load faster and no longer shift the page layout while loading
- ✔ FixedSocial-preview images and canonical links had broken or duplicated URLs across the site — fixed
- ✔ FixedCI no longer sends a false "build failed" alert when a deploy run gets superseded by a newer push
- ✖ Removed~5.1 MB of unused media and duplicate files cleaned out of the repository
Changelog
Version history of CV Hub — curated highlights. Full technical changelog: CHANGELOG.md · Releases
- ✦ AddedCase-study video block — type: video content block, either a silent autoplay loop (short clips) or poster + controls (longer clips)
- ✦ AddedCI workflow — pull requests now run the full generation pipeline (merge → DOCX/TXT → PDF → Astro build) and upload the generated resumes and site as downloadable artifacts, so a broken build or malformed YAML is caught before it reaches main
- ✦ AddedRelease workflow — publishing a GitHub Release regenerates the resume documents and attaches all PDF/DOCX/TXT files to it, making every version a self-contained CV snapshot
- ✦ AddedDependabot — weekly grouped npm updates and monthly GitHub Actions updates; every update PR is verified by the CI pipeline instead of being merged blind
- ✦ AddedNode version pinned via .nvmrc and package.json engines (>=24), matching the CI runner
- ✎ ChangedCI: GitHub Actions runner upgraded to Node 24
- ✎ Changedpackage.json version synced to the changelog version (was stuck at 0.0.1 while the project shipped 1.5.x)
- ✎ ChangedCI: the deploy build step split into named per-stage steps (merge / DOCX+TXT / PDF / Astro) — same runner and cost, but the Actions UI now shows per-stage timing and points at the exact stage that failed
- ✎ ChangedCI: PDF export now drives the runner's preinstalled Google Chrome (channel: chrome) instead of downloading Playwright's chromium — removes the cdn.playwright.dev download that was stalling and hanging deploys; the Playwright browser-cache step was dropped. Local builds still use Playwright's bundled chromium
- ✎ ChangedResponsive breakpoints consolidated from seven ad-hoc values to two — 768px (desktop/mobile base: header, fonts, paddings, animated background) and 960px (multi-column CV and showcase grids); mobile container side padding tightened
- ✔ FixedPDF export now HTML-escapes all interpolated CV data (company names, bullets, contacts, skills) — a stray < or & in a field no longer breaks or injects into the generated PDF
- ✔ FixedMobile header — the Role dropdown button rendered larger than the nav links (16px vs 14px, wider padding) because a later .dropdown__trigger { font: inherit } overrode the mobile rule; the mobile rule's specificity was raised so the button now matches the links
- ✖ RemovedTwo unused dependencies — hast-util-parse-selector and serve were not imported or referenced by any script
- ✦ AddedClick-to-zoom lightbox for case-study images — clicking any Deep Dive image opens it fullscreen; close via backdrop click, close button or Escape
- ✦ AddedSEO: sitemap.xml (via @astrojs/sitemap, covers all profile × language routes) and robots.txt pointing to it
- ✦ Addedmerge.mjs validates the profile slug === spec invariant and fails fast with a clear message, preventing silent desync between a profile's URL and its CV/download files
- ✎ ChangedTags de-emphasized — removed borders and muted text on Platforms/Stack/Tags pills so the identical-looking groups stop competing for attention and section hierarchy reads clearer
- ✎ ChangedCI: Telegram notification now passes secrets and context through an env block instead of inline ${{ }} interpolation in the shell script
- ✔ FixedAnimatedBackground performance — reduced orb blur (80px → 60px), slowed drift cycles to 16–22s and removed scale() from keyframes so the blurred layer is cached instead of re-rasterized every frame; cuts desktop scroll/idle jank
- ✔ FixedShowcase LCP — first card with an actual image cover now loads eager with fetchpriority=high; remaining covers stay lazy
- ✔ Fixedi18n: showcase card labels (Platforms/Stack/Tags/Featured) on non-default-language lists no longer fall back to English literals — a stray [lang] index on an already-resolved string was dropping the real translations; now correctly localized and ready for additional languages
- ✔ FixedRole dropdown accessibility — added aria-haspopup, aria-controls and aria-expanded synced with open state; removed a stray always-true active class on the trigger
- ✔ FixedRemoved hover-lift from passive cards (Experience and others) — the global .card:hover translate/shadow was a false affordance on non-clickable cards; hover now stays only on interactive showcase project cards
- ✔ FixedBuild robustness: home page now guards a missing merged CV artifact with a fallback instead of crashing the build (matches the dynamic profile route)
- ✖ RemovedDead code in the dynamic showcase route — unused featured/regular/archived split, leftover CSS classes and a stray ... token in the card markup
- ✦ AddedPlayStationWaves component — XMB-inspired filled sine-wave canvas background with configurable props, time-of-day hue shift and non-deterministic start position
- ✦ AddedWaveLines component — XMB-style glowing stroke wave lines canvas background with symmetric line layout and offscreen glow compositing
- ✦ AddedGitHub Actions Telegram notification — deploy.yml notifies a Telegram bot on deploy success or failure via PIPLINE_BOT_SECRET and CHAT_ID secrets; gracefully skips if secrets are not configured
- ✎ ChangedTelegram notification now covers build failures — notify_telegram uses needs: [build, deploy] with if: always() so a failed build job also triggers a notification
- ✎ ChangedTelegram notification message extended with branch name and short commit SHA
- ✎ ChangedCI: Playwright Chromium now cached by package-lock.json hash — saves ~2 min per deploy on cache hit
- ✦ AddedLICENSE — MIT license added to repository
- ✦ AddedARCHITECTURE.md — root-level architecture overview: stack, data pipeline, routing, theming, background components, CI/CD, trade-offs
- ✦ AddedCHANGELOG.md — root-level changelog in Keep a Changelog format covering full version history
- ✔ FixedWaveLines glow compositing bug — destination-in mask was applied to full canvas each iteration, destroying background alpha at edges; fixed via per-line offscreen canvas
- ✔ FixedSticky header now works unconditionally — body height: 100% constrained scroll to html element; changed to min-height: 100%
- ✔ FixedRole dropdown — replaced CSS :hover toggle with JS click-toggle and click-outside to close; menu no longer closes on accidental cursor exit; added smooth opacity/transform transition
- ✔ FixedScroll jank — body background-attachment: fixed replaced with a fixed pseudo-element layer; gradients no longer repaint on every scroll frame
- ✔ FixedRemoved mix-blend-mode: overlay from the scanline noise layer — eliminated a fullscreen compositing pass per frame with no visible difference at 0.06 opacity
- ✔ FixedMobile pages performance — removed unnecessary CSS rules
- ✔ FixedLanguage switcher on showcase pages now correctly switches between project translations
- ✦ AddedShare button for case study pages (shareable: true in YAML, added to example_cs)
- ✎ ChangedProjectCard translation props — simplified from object-based to direct strings
- ✔ FixedLanguage switcher on Showcase list now correctly switches language instead of redirecting to home
- ✔ FixedLanguage switcher on Case Study pages now correctly switches language of the current project
- ✔ FixedBack button and Showcase nav link now preserve current language across navigation
- ✔ FixedProject card links now respect BASE_URL — no more hardcoded /cv_hub/ prefix required in YAML
- ✔ FixedProjectPage mobile layout — horizontal padding now correctly applied on small screens
- ✔ FixedShowcase slug setup for other languages was incorrect for projects with flags archived and featured
- ✦ AddedCase Study pages — dedicated per-project pages with flexible content structure
- ✦ AddedBlock-based content system (image, text, divider, links) for project storytelling
- ✦ AddedProjects can now include full narratives — architecture, decisions, and outcomes
- ✦ AddedShowcase extended with deep-dive pages (Notion-like but static and controlled)
- ✦ AddedPer-project routing for case studies
- ✎ ChangedShowcase transformed from preview-only to entry point for detailed project pages
- ✎ ChangedShowcase style fixes
- ✎ ChangedError page 404 works correctly now, fallbacks to main page with default language
- ✎ ChangedDropdown styles moved from /changelog to global.css
- ✎ ChangedFixed linking in footer menu in Lyaout
- ✦ AddedMulti-profile system — N profiles × N languages from one YAML source
- ✦ Addedmerge.mjs — YAML merge pipeline with base + spec delta model
- ✦ Addedprofiles.yml — profile registry (optional, graceful fallback)
- ✦ Addedlanguages.yml — language config, dynamic language switcher
- ✦ Addedi18n system — translations.yaml + makeT() helper with fallback chain
- ✦ AddedProfile dropdown in header (Role ▾)
- ✦ Added[...slug].astro — dynamic routing for all profile × language combos
- ✦ AddedPer-profile PDF/DOCX/TXT generation for all profiles and languages
- ✎ Changedgenerate-resume.js and resume-export-pdf.mjs now iterate public/cv/ dynamically
- ✎ ChangedDownload links now point to profile-specific files (resume_en_devops.pdf)
- ✖ Removedru.astro and showcase/ru.astro — replaced by [...slug].astro
- ✎ ChangedsiteUrl resolved dynamically from GITHUB_REPOSITORY — forks work without config
- ✎ ChangedDropdown styles moved to global.css
- ✦ AddedREADME, ENGINEERING.md and INFO.md fully updated to reflect new architecture
- ✦ AddedURL-based theme switching (?theme=peachy)
- ✦ AddedOG tags and Twitter Card meta
- ✦ AddedAnimated background
- ✦ AddedLighthouse badges in README (100/100/96/100)
- ✦ AddedChangelog page with version history
- ✎ ChangedStyle and structure updates
- ✎ ChangedDocumentation updated
- ✦ AddedProjects pin & archive options
- ✎ ChangedDOM tree and CSS structure refactor
- ✔ FixedMobile layout fixes
- ✔ FixedIndex page fix
- ✦ AddedAutomated PDF generation via Playwright
- ✦ AddedNew theme presets
- ✦ AddedTheme previews in docs
- ✦ AddedInitial release — YAML-driven CV site
- ✦ AddedTwo languages (EN/RU)
- ✦ AddedExport to PDF, DOCX, TXT
- ✦ AddedGitHub Actions CI/CD deploy