feat: seo descriptions for 20 core tools, index follows content

This commit is contained in:
2026-10-12 15:50:14 +05:00
parent 984f71c822
commit 0b30eef16c
5 changed files with 741 additions and 13 deletions
+39 -11
View File
@@ -180,14 +180,24 @@
Разбито на две группы: **domain-free** (делаем параллельно с покупкой домена) и
**domain-required** (после покупки и DNS-настройки).
- [ ] **[S1h]** Снять `noindex, nofollow` со страниц инструментов
(`web/src/routes/tools/[slug]/+page.svelte`) — заменить на
`<meta name="robots" content="index, follow" />`. **Это первым
обязательным шагом S1:** пока тег стоит, остальные задачи S1 готовят
инфраструктуру, но не приводят трафик. Порядок: S1h ставится после
S1b/S1c/S1d, иначе Google проиндексирует сайт без sitemap и canonical.
Снимать `noindex` до готовности S2-контента осознанно не стоит: в индекс
попадут тонкие страницы с одним title/description.
- [x] **[S1h]** Robots-тег на страницах инструментов — **сделано 2026-10-12, но
не снят, а сделан условным** (`web/src/routes/tools/[slug]/+page.svelte`):
`index, follow` ставится **тогда и только тогда, когда у страницы есть
EN-`seo`-блок** (`isPageIndexable()` в
`web/src/lib/i18n/schema-tool-strings.ts`), иначе `noindex, nofollow`.
Единого места правки нет: индексность следует за контентом, поэтому
страницу нельзя забыть при написании текста и нельзя проиндексировать с
заготовкой. Читается базовый словарь, а не объединённый, — переключение
посетителя на RU не переворачивает тег. Тот же признак выкидывает
noindex-страницы из sitemap (`gen-sitemap.mjs`), так что список в sitemap
и набор индексируемых страниц не могут разойтись. **Страховка от «сломать
руками»:** контентный гейт вынесен в
`web/src/lib/i18n/schema-tool-strings.test.ts` — страница с `seo`-блоком
обязана иметь ≥250 слов, ≥3 шага how-to, ≥3 FAQ и title/description в
границах SERP, иначе тест падает до индексации. Проверено на сборке:
`index, follow` ровно на страницах с текстом, `noindex` на остальных,
sitemap совпадает с этим набором. **Осталось:** снять `noindex` совсем,
когда текст появится у всех страниц, которые имеет смысл индексировать.
#### S1-free: без домена
@@ -255,6 +265,11 @@
> `pnpm --dir web test:e2e` — по правилам `docs/quality-gates.md`, в CI job
> `e2e` non-blocking, поэтому его статус читается по отдельному job
> (`docs/decisions.md`, раздел 10).
>
> **Фактически (2026-10-12) порядок изменился:** S2-контент написан раньше
> снятия `noindex`, а S1h сделан условным — индексность страницы равна наличию
> её текста (S1h). Гейт выше в части «`noindex` отсутствует» выполняется для
> страниц с текстом; полное снятие тега остаётся отдельной задачей.
### S2. Контентный слой (параллельно quality-плану, волнами по категориям)
@@ -282,9 +297,22 @@
перелинковка, без неё страницы ядра плохо связаны между собой.
- [ ] **[S2d]** Первая волна контента — топ приоритетных инструментов ядра
(приоритет по вордстату: transparent png, jpg→png, compress, resize, crop,
rotate, circle crop, add text, pixelate, grayscale…); отбор — §5. **В
работе:** 2 страницы из 5-стадия (crop-png, resize-png) — это пилот формы,
а не волна; до снятия `noindex` (S1h) нужны минимум все страницы §5.
rotate, circle crop, add text, pixelate, grayscale…); отбор — §5. **Ядро
закрыто: 20 страниц из §5** — `crop-png`, `resize-png`,
`remove-background-png`, `convert-png-to-jpg`, `pixelate-png`,
`grayscale-png`, `rotate-png`, `create-empty-png`, `linear-gradient-png`,
`change-png-opacity`, `set-alpha-channel-png`, `round-corners-png`,
`invert-colors-png`, `flip-png`, `convert-png-to-webp`, `png-to-bmp`,
`svg-to-png`, `png-to-base64`, `change-aspect-ratio-png`, `add-text-png`.
Каждая: `title` (H1), `metaTitle` (38–54 симв.), `metaDescription`
(134–159 симв.), `longDescription`, how-to (3–5 шагов) и 4 FAQ. Текст
написан по фактической схеме инструмента (параметры реестра), без
шаблонной подстановки. **Правило набора текста, которое доказало себя на
пилоте:** H1 — чистый интент, «free / no upload» — в `metaTitle` и
`metaDescription`, форматы — в первом абзаце и FAQ, ограничения
инструмента проговариваются прямо («это не AI-удаление фона», «только
90/180/270, произвольный угол ресемплит»). Честное ограничение работает
лучше приписывания. Остальное ядро §5 — тем же шаблоном.
- Гейты: на каждой странице инструмента — уникальный текст ≥ 300 слов, H1
совпадает с интентом, FAQ ≥ 3, related ≥ 3; текст в статике (prerender), не в
рантайме.