diff --git a/docs/backlog.md b/docs/backlog.md index e216f61..22258a1 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -227,7 +227,15 @@ переименований уже опубликованных страниц; клонов с canonical не делать (`docs/plan-seo.md` §5) - [ ] sitemap.xml из реестра + `Sitemap:` в robots.txt (S1b/S1c) -- [ ] Seo.svelte: canonical + OG-теги, per-tool OG-картинки (S1d/S1e) +- [ ] Seo.svelte: per-tool OG-картинки (S1e) — у каждой страницы инструмента + своя превью-карточка 1200×630 для соцсетей/мессенджеров: имя инструмента, + бренд, иконка. Сейчас все страницы ссылаются на общую + `static/og/default.png` (генерирует `pnpm --dir web gen:og` — + Playwright-скриншот HTML-карточки в `web/scripts/gen-og.mjs`). Что делать: + расширить gen-og.mjs — проход по реестру страниц, карточка с названием + инструмента в `static/og/[slug].png`, в `Seo.svelte` подставлять og-URL по + slug страницы. Критерий приёмки: у `/tools/flip-png` в og:image своя + картинка с названием инструмента, файл лежит в `static/og/` - [ ] контент страницы инструмента: seo-блок в словарях, how-to/FAQ/related (S2) - [ ] JSON-LD (SoftwareApplication/FAQPage/Breadcrumb) + llms.txt (S3) - [ ] дистрибуция: закрепить репо, alternative.to, Product Hunt, Reddit/HN (S4c) diff --git a/web/package.json b/web/package.json index 65e9f05..60a5d43 100644 --- a/web/package.json +++ b/web/package.json @@ -14,6 +14,7 @@ "test:coverage": "vitest run --coverage", "test:rules": "vitest run eslint-plugins/__tests__", "test:e2e": "playwright test", + "gen:og": "node scripts/gen-og.mjs", "format": "prettier --write . --log-level warn --cache", "format:check": "prettier --check . --log-level warn --cache", "lint": "eslint .", diff --git a/web/scripts/gen-og.mjs b/web/scripts/gen-og.mjs new file mode 100644 index 0000000..0f7c77d --- /dev/null +++ b/web/scripts/gen-og.mjs @@ -0,0 +1,56 @@ +// Генерирует static/og/default.png — дефолтная OG-карточка 1200×630. +// Запуск: pnpm --dir web gen:og. Карточка рисуется в браузере (текст, иконки), +// per-tool карточки — этим же harness позже (docs/plan-seo.md S1e). +import { mkdirSync } from "node:fs"; +import { chromium } from "playwright"; + +const W = 1200; +const H = 630; + +const IMAGE_ICON = ``; + +function cardHtml() { + return `
+