From 9e87b115ccc6f2d3795f7c28fe6455b6ed3d0c07 Mon Sep 17 00:00:00 2001 From: Mitya Date: Tue, 28 Apr 2026 16:00:53 +0300 Subject: [PATCH 1/2] fix: correct try_files directive in nginx configuration for proper routing --- nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nginx.conf b/nginx.conf index 42714f2..9d6e43f 100644 --- a/nginx.conf +++ b/nginx.conf @@ -21,6 +21,6 @@ server { } location / { - try_files $uri $uri/ /index.html; + try_files $uri $uri/index.html /index.html; } } From db8286f4508ab6837a6d25ea6adc6a6862da6f81 Mon Sep 17 00:00:00 2001 From: Mitya Date: Thu, 11 Jun 2026 11:55:11 +0300 Subject: [PATCH 2/2] feat(seo): branded social cards, /cv landing page, single-source meta Fixes two LinkedIn share problems and hardens SEO benchmarks: - Pixelated logo: og:image/twitter:image were the 48x48 favicon. Add a 1200x630 branded share card (og-image.png) and point all OG/Twitter image tags at it. Person.image -> real 500x500 profile.png. - CV had no preview: a raw .pdf URL exposes no OG tags. Add a prerendered /cv landing page (cv-thumb preview + View/Download + CreativeWork JSON-LD) with its own cv-og.png card, so the shared URL renders a real preview. - Single source of truth: SeoHead now owns all SEO meta; remove the duplicated static block from index.html. This eliminates conflicting og:image/og:title/ tags that the prerenderer was emitting on every non-home route (latent bug that gave about/experience/toolbox the home page's social title). - Enrich head: og:image width/height/type/alt, og:locale, twitter:image:alt, apple-touch-icon, web manifest, light/dark theme-color, multi-size favicons. - Add /cv to sitemap.xml and the prerender include list; nginx serves the PDF inline and caches share/icon assets. scripts/og-image.cjs is a one-off author-time generator (not in the deploy build); the produced PNGs are committed under public/. Verified: build + prerender pass; each route emits one correct og:image / title / canonical; JSON-LD parses; 62 vitest tests pass; eslint clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- index.html | 51 ++++------ nginx.conf | 20 ++++ public/apple-touch-icon.png | Bin 0 -> 45938 bytes public/cv-og.png | Bin 0 -> 186446 bytes public/cv-thumb.png | Bin 0 -> 145643 bytes public/favicon-32.png | Bin 0 -> 2252 bytes public/icon-192.png | Bin 0 -> 51101 bytes public/icon-512.png | Bin 0 -> 247668 bytes public/og-image.png | Bin 0 -> 186038 bytes public/profile.png | Bin 0 -> 222591 bytes public/site.webmanifest | 20 ++++ public/sitemap.xml | 12 ++- scripts/og-image.cjs | 164 +++++++++++++++++++++++++++++++++ scripts/prerender.cjs | 8 +- src/components/seo/seoHead.tsx | 8 ++ src/pages/cv/cvPage.tsx | 83 +++++++++++++++++ src/routes.tsx | 4 + src/seo/config.ts | 40 +++++++- src/seo/types.ts | 1 + 19 files changed, 371 insertions(+), 40 deletions(-) create mode 100644 public/apple-touch-icon.png create mode 100644 public/cv-og.png create mode 100644 public/cv-thumb.png create mode 100644 public/favicon-32.png create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/og-image.png create mode 100644 public/profile.png create mode 100644 public/site.webmanifest create mode 100644 scripts/og-image.cjs create mode 100644 src/pages/cv/cvPage.tsx diff --git a/index.html b/index.html index 104eb4d..17673b7 100644 --- a/index.html +++ b/index.html @@ -2,41 +2,30 @@ <html lang="en"> <head> <meta charset="UTF-8" /> - <link rel="icon" href="/favicon.png" type="image/png" /> - <link rel="preconnect" href="https://www.googletagmanager.com" /> - <link rel="dns-prefetch" href="https://www.googletagmanager.com" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta - name="description" - content="Mitya Kurs is a senior full-stack developer and team lead with 14 years of experience shipping products, leading teams, and building scalable systems." - /> - <meta name="robots" content="index,follow" /> - <meta property="og:type" content="website" /> - <meta property="og:site_name" content="Mitya Kurs Portfolio" /> - <meta - property="og:title" - content="Mitya Kurs | Senior Full-Stack Developer & Team Lead" - /> + <link rel="icon" href="/favicon.png" sizes="48x48" type="image/png" /> + <link rel="icon" href="/favicon-32.png" sizes="32x32" type="image/png" /> + <link rel="icon" href="/icon-192.png" sizes="192x192" type="image/png" /> + <link rel="apple-touch-icon" href="/apple-touch-icon.png" /> + <link rel="manifest" href="/site.webmanifest" /> <meta - property="og:description" - content="Mitya Kurs is a senior full-stack developer and team lead with 14 years of experience shipping products, leading teams, and building scalable systems." + name="theme-color" + content="#f3f1e9" + media="(prefers-color-scheme: light)" /> - <meta property="og:url" content="https://profile.mitya.dev/" /> - <meta property="og:image" content="https://profile.mitya.dev/favicon.png" /> - <meta name="twitter:card" content="summary_large_image" /> <meta - name="twitter:title" - content="Mitya Kurs | Senior Full-Stack Developer & Team Lead" + name="theme-color" + content="#27272a" + media="(prefers-color-scheme: dark)" /> - <meta - name="twitter:description" - content="Mitya Kurs is a senior full-stack developer and team lead with 14 years of experience shipping products, leading teams, and building scalable systems." - /> - <meta - name="twitter:image" - content="https://profile.mitya.dev/favicon.png" - /> - <title>Mitya Kurs | Senior Full-Stack Developer & Team Lead + + + +