mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
docs: update a lot of plans, readmes, descriptions
This commit is contained in:
+72
-54
@@ -1,10 +1,12 @@
|
||||
# План: SEO + GEO — индексация и конкуренция в image tools
|
||||
|
||||
> **Статус (2026-09-11):** план к выполнению. Переезд `preview/*` на реальные
|
||||
> маршруты выполнен (в `noindex` сохраняются до запуска S1). Сейчас применять
|
||||
> можно domain-free часть S1. **Уточнено:** домен не был блокером C17 (см. §6).
|
||||
> Задачи S1 разбиты на domain-free (можно делать параллельно с покупкой домена)
|
||||
> и domain-required (после покупки и настройки домена на Vercel).
|
||||
> **Статус (2026-09-11; уточнено 2026-09-27):** план к выполнению. Переезд
|
||||
> `preview/*` на реальные маршруты выполнен. **`noindex` на страницах
|
||||
> инструментов не выставляется** — снимать нечего, каталог открыт для
|
||||
> индексации; запрет индексации держится только на служебных путях
|
||||
> (`robots.txt`). Домен не был блокером переезда (см. §6). Задачи S1 разбиты на
|
||||
> domain-free (можно делать параллельно с покупкой домена) и domain-required
|
||||
> (после покупки и настройки домена).
|
||||
>
|
||||
> **Цель:** каждая страница инструмента — индексируемый лендинг под конкретный
|
||||
> интент («crop png», «make png transparent», «jpg to png»…), конкуренция с
|
||||
@@ -37,18 +39,21 @@
|
||||
каждого инструмента — с селектором PNG/JPG/WebP/BMP (+quality для lossy). Райз
|
||||
«выбор формата/качества в Download» вытащен из backlog №7 в S1f: механика уже
|
||||
есть (`ToolEntry.output`), нужна как продуктовая основа «image
|
||||
tools»-позиционирования. Отдельные страницы-конвертеры — только для
|
||||
подтверждённых вордстатом интентов.
|
||||
tools»-позиционирования. В направлении «из формата в PNG» отдельных
|
||||
инструментов нет (загрузка принимает любой формат) — см. §5.
|
||||
- **Слаги инструментов `-png` сохраняются.** Они держат низкоконкурентные
|
||||
png-интенты; широкие интенты («crop image online») переносятся теми же
|
||||
страницами контентом: H1 «Crop image», текст «works with PNG, JPG, WebP».
|
||||
URL-алиасы без `-png` не создаются (канонический беспорядок).
|
||||
- **Индексируемая локаль — EN** (базовая; конкурент англоязычный). RU-версия —
|
||||
отдельно и позже: префикс `/ru/`, prerender обеих локалей, hreflang
|
||||
(сознательно отложено в `archive/plan-i18n.md`). Пока язык переключается на
|
||||
клиенте (localStorage) — для SEO не учитываем.
|
||||
- **Прод-домен без `BASE_PATH`.** Сборка с базой (GitHub Pages `/repo/`) ломает
|
||||
абсолютные URL, canonical и «корневость» страниц. Свой домен + корень.
|
||||
(сознательно отложено). Пока язык переключается на клиенте (localStorage) —
|
||||
для SEO не учитываем.
|
||||
- **Прод-домен без `BASE_PATH`.** Сборка с базой (GitHub Pages `/repo/`, см.
|
||||
`BASE_PATH` в `web/vite.config.ts` и `deploy.yml`) ломает абсолютные URL,
|
||||
canonical и «корневость» страниц. Свой домен + корень. Текущий деплой — GitHub
|
||||
Pages (`.github/workflows/deploy.yml`); перенос на свой домен выполняется
|
||||
сменой origin в CI и `PUBLIC_SITE_ORIGIN`.
|
||||
- **URL-схема инструментов:** короткие плоские адреса. После C17 страницы
|
||||
инструментов находятся в корне на `/tools/[id]`, каталог — на `/list-tools`;
|
||||
текущую схему не менять без отдельного SEO-плана: после индексации
|
||||
@@ -66,28 +71,28 @@
|
||||
- SvelteKit + `adapter-static`, `prerender = true` на весь сайт
|
||||
(`web/src/routes/+layout.ts`) — весь контент в статичном HTML, ботам не нужен
|
||||
JS. Это главный технический козырь.
|
||||
- 122 инструмента в `web/src/lib/registry` с «SEO-шными» id (`crop-png`,
|
||||
`add-border-png`, …) — URL уже повторяют паттерн конкурента.
|
||||
- Инструменты в `web/src/lib/registry` с «SEO-шными» id (`crop-png`,
|
||||
`add-border-png`, …) — URL уже повторяют паттерн конкурента. Актуальный
|
||||
состав: `docs/tools-map.md`.
|
||||
- На корневых страницах инструментов есть базовые `<title>` и `robots`; полный
|
||||
SEO-слой (canonical, OG, content и JSON-LD) остаётся S1/S2.
|
||||
- Каталог со ссылками на все инструменты (внутренняя перелинковка) и карта
|
||||
инструментов против конкурента: `docs/tools-map.md` (у них 311, из них 107 —
|
||||
нишевые клоны-серии Logo*/Icon*/Stamp* поверх обычных операций).
|
||||
инструментов против конкурента: `docs/tools-map.md`.
|
||||
- EN-тексты в реестре + i18n-словари ru/en.
|
||||
|
||||
Чего нет (пробелы закрываются этапами ниже):
|
||||
|
||||
| Пробел | Где сейчас | Этап |
|
||||
| ----------------------------------------------------- | ---------------------------------------- | ---- |
|
||||
| `sitemap.xml` | нет | S1 |
|
||||
| `robots.txt` без `Sitemap:` | allow-all (`web/static/robots.txt`) | S1 |
|
||||
| `rel=canonical` | нет | S1 |
|
||||
| OG/Twitter-теги, OG-картинки | нет | S1 |
|
||||
| `noindex, nofollow` на страницах инструментов preview | `web/src/routes/tools/[id]/+page.svelte` | S1 |
|
||||
| Контент страницы (H1-текст, how-to, FAQ, related) | только title/description | S2 |
|
||||
| JSON-LD (SoftwareApplication, FAQPage, Breadcrumb) | нет | S3 |
|
||||
| `llms.txt`, хабы категорий с текстом | нет | S3 |
|
||||
| GSC + приватная аналитика | нет | S4 |
|
||||
| Пробел | Где сейчас | Этап |
|
||||
| -------------------------------------------------- | ----------------------------------- | ---- |
|
||||
| `sitemap.xml` | нет | S1 |
|
||||
| `robots.txt` без `Sitemap:` | allow-all (`web/static/robots.txt`) | S1 |
|
||||
| `rel=canonical` | нет | S1 |
|
||||
| OG/Twitter-теги, OG-картинки | нет | S1 |
|
||||
| Канонический домен в абсолютных URL | нет, деплой на GitHub Pages с базой | S1 |
|
||||
| Контент страницы (H1-текст, how-to, FAQ, related) | только title/description | S2 |
|
||||
| JSON-LD (SoftwareApplication, FAQPage, Breadcrumb) | нет | S3 |
|
||||
| `llms.txt`, хабы категорий с текстом | нет | S3 |
|
||||
| GSC + приватная аналитика | нет | S4 |
|
||||
|
||||
## 2. Конкурент (onlinepngtools.com)
|
||||
|
||||
@@ -109,8 +114,8 @@
|
||||
## 3. Стратегия
|
||||
|
||||
1. **Не лобовая, а ядро интентов.** 80% объёма поиска приносят ~30–50 запросов.
|
||||
Покрытие инструментов у нас почти полное (122); приоритет — контент и
|
||||
качество страниц ядра, затем хвосты.
|
||||
Покрытие инструментов у нас почти полное (список — `docs/tools-map.md`);
|
||||
приоритет — контент и качество страниц ядра, затем хвосты.
|
||||
2. **Страница = лендинг, а не «пустая коробка».** Шаблон контента: H1 → 1–2
|
||||
абзаца «что делает» → как использовать (шаги) → параметры → FAQ (3–5 вопросов
|
||||
уровня People-Also-Ask) → related tools по категории.
|
||||
@@ -132,34 +137,35 @@
|
||||
|
||||
## 4. Этапы
|
||||
|
||||
### S1. Технический минимум (сразу после C17)
|
||||
### S1. Технический минимум (закрывает блокер индексации)
|
||||
|
||||
Разбито на две группы: **domain-free** (делаем параллельно с покупкой домена) и
|
||||
**domain-required** (после покупки и DNS-настройки).
|
||||
|
||||
#### S1-free: без домена (параллельно с quality-планом)
|
||||
#### S1-free: без домена
|
||||
|
||||
- [ ] **[S1e]** OG-картинки per-tool: генерация PNG-карточек скриптом на
|
||||
существующем ядре (мы сами умеем рисовать PNG) — имя инструмента + бренд,
|
||||
файл `static/og/[id].png`, ссылка из `Seo.svelte`. Относительные пути
|
||||
(`/og/crop-png.png`) работают без домена; при деплое на Vercel с
|
||||
собственным доменом OG-картинки будут корректными.
|
||||
(`/og/crop-png.png`) работают без домена; при деплое на собственном домене
|
||||
OG-картинки будут абсолютными и корректными.
|
||||
- [ ] **[S1f]** Download-кнопка с селектором формата PNG/JPG/WebP/BMP (+quality
|
||||
для lossy) для всех инструментов — механика `ToolEntry.output` уже есть
|
||||
(backlog №7, райз «выбор формата/качества»). Продуктовая основа «image
|
||||
tools»-позиционирования: без неё сайт остаётся PNG-сайтом. Вести
|
||||
параллельно с текущими quality-задачами.
|
||||
- [ ] **[S1g]** Поведение конвертеров после S1f: не предлагать в меню форматов
|
||||
формат исходника (disable) — чтобы «convert png to jpg» не мог сохранить в
|
||||
png. Существующие страницы не трогать: `jpg-to-png`, `png-to-jpg`,
|
||||
`png-to-webp`, `png-to-bmp` остаются самостоятельными лендингами со своим
|
||||
контентом (§5).
|
||||
формат исходника (disable) — чтобы `convert-png-to-jpg` не мог сохранить в
|
||||
png. Существующие страницы не трогать: `jpg-to-png`, `convert-png-to-jpg`,
|
||||
`convert-png-to-webp`, `png-to-bmp` остаются самостоятельными лендингами
|
||||
со своим контентом (§5).
|
||||
|
||||
#### S1-domain: с доменом (после покупки + DNS на Vercel)
|
||||
#### S1-domain: с доменом (после покупки + DNS)
|
||||
|
||||
- [ ] **[S1a]** Снять `noindex, no_follow` со страницы инструмента
|
||||
(`tools/[id]/+page.svelte`) — делается одновременно с S1d (canonical)
|
||||
чтобы Google сразу проиндексировал с правильным доменом.
|
||||
- [ ] **[S1a]** Перевести прод на собственный домен: убрать `BASE_PATH` из
|
||||
`deploy.yml`, задать `PUBLIC_SITE_ORIGIN`, перенаправить
|
||||
`https://<юзер>/<repo>/…` на корневые URL (301). Делается одновременно с
|
||||
S1d (canonical), чтобы Google проиндексировал сразу с правильным доменом.
|
||||
- [ ] **[S1b]** Скрипт `web/scripts/gen-sitemap.mjs`: генерирует `sitemap.xml` в
|
||||
`build/` из `TOOLS` реестра (`web/src/lib/registry`) + статических
|
||||
страниц. Вызов из `pnpm build` после `vite build` (adapter-static пишет в
|
||||
@@ -181,8 +187,8 @@
|
||||
- [ ] **[S2a]** Схема данных: `seo`-блок per-tool (`longDescription`,
|
||||
`howTo: string[]`, `faq: {q, a}[]`) — в i18n-словарях (ru/en), не в коде
|
||||
реестра. Черновики — генерацией из схемы параметров инструмента, вычитка
|
||||
вручную пачками по категориям (самый трудоёмкий этап: ~122 × 2 локали; RU
|
||||
— отложить до решения о `/ru/`).
|
||||
вручную пачками по категориям (самый трудоёмкий этап: объём растёт вместе
|
||||
с числом инструментов × 2 локали; RU — отложить до решения о `/ru/`).
|
||||
- [ ] **[S2b]** Компонент контента страницы инструмента (kit): H1, lead, how-to
|
||||
(`ol`), описание параметров (из схемы), FAQ, related tools (перелинковка
|
||||
внутри категории + 2–3 «соседних» интента).
|
||||
@@ -237,15 +243,28 @@
|
||||
|
||||
## 5. Приоритизация инструментов (первая волна контента)
|
||||
|
||||
Источник — `docs/tools-map.md` (122 реализовано; у конкурента 311, из них 107 —
|
||||
клоны-серии). Первая волна — топ-интенты, где конкуренты ранжируются, а у нас
|
||||
уже есть инструмент и он не хуже:
|
||||
Источник — `docs/tools-map.md` (наш состав и замер по конкуренту — §2). Ids ниже
|
||||
— **фактические id реестра**; первая волна — топ-интенты, где конкуренты
|
||||
ранжируются, а у нас уже есть инструмент и он не хуже:
|
||||
|
||||
- прозрачность/фон: create-transparent-png, remove-background, change-opacity
|
||||
- конвертация: jpg-to-png, png-to-jpg, webp-to-png, svg-to-png, png-to-base64
|
||||
- геометрия: crop, resize, rotate, circle-crop, round-corners, flip
|
||||
- цвет/фильтры: grayscale, invert, pixelate, add-text, watermark
|
||||
- генерация: gradient, empty-canvas
|
||||
- прозрачность/фон: create-empty-png, remove-background-png, change-png-opacity,
|
||||
set-alpha-channel-png
|
||||
- конвертация: convert-png-to-jpg, convert-png-to-webp, png-to-bmp, svg-to-png,
|
||||
png-to-base64
|
||||
- геометрия: crop-png, resize-png, rotate-png, round-corners-png, flip-png,
|
||||
change-aspect-ratio-png
|
||||
- цвет/фильтры: grayscale-png, invert-colors-png, pixelate-png, add-text-png,
|
||||
watermark-tile-png
|
||||
- генерация: linear-gradient-png, create-empty-png
|
||||
|
||||
> **Открытый вопрос по интентам «из формата в PNG».** У конкурента есть
|
||||
> `jpg-to-png`, `webp-to-png`, `gif-to-png` как отдельные страницы; у нас таких
|
||||
> инструментов нет и создавать их не хочется — загрузка файла уже принимает
|
||||
> любой формат, а конвертер «во что-то» закрывает обратное направление. Это
|
||||
> high-volume интент без посадочной страницы. Решение (страница-обёртка на
|
||||
> существующий инструмент / приём в H1 и тексте / ничего) требует вордстата и
|
||||
> должно быть принято до старта S2, иначе первая волна контента закроет не ядро
|
||||
> запросов.
|
||||
|
||||
Новая волна форматов (после S1f): jpg↔webp и другие конвертации «формат →
|
||||
формат» — только по подтверждённому вордстату; базовые кейсы закрывает селектор
|
||||
@@ -325,7 +344,7 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
||||
ключи localStorage (`easy-png-tools:*` — или мигрировать отдельной
|
||||
мелочью), историю docs/archive.
|
||||
- [ ] **[R2]** Купить выбранный домен (кандидаты и пробы — в локальном плане) и
|
||||
настроить деплой на Vercel без `BASE_PATH` (§0). Домен нужен до S1-domain:
|
||||
перевести прод на него без `BASE_PATH` (§0). Домен нужен до S1-domain:
|
||||
canonical и sitemap генерятся от `PUBLIC_SITE_ORIGIN`.
|
||||
- **Порядок:** R1+R2 можно делать параллельно с текущими quality-задачами (не
|
||||
блокируют). R2 (домен) — блокер только для S1-domain (canonical + sitemap +
|
||||
@@ -334,8 +353,8 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
||||
|
||||
## 7. Что осознанно НЕ делаем
|
||||
|
||||
- Клонирование 311 URL конкурента (низкокачественные дубли + нет ресурсов на
|
||||
контент) — вместо этого ядро + обоснованные хвосты.
|
||||
- Клонирование всего каталога конкурента (низкокачественные дубли + нет ресурсов
|
||||
на контент) — вместо этого ядро + обоснованные хвосты.
|
||||
- RU-локаль в индексе до решения о структуре `/ru/` + hreflang.
|
||||
- GA/реклама/трекинг — противоречит позиционированию.
|
||||
- Дорвеи, программные зеркала, покупные ссылки.
|
||||
@@ -352,6 +371,5 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
||||
- `docs/backlog.md` — пункты SEO/GEO в общем бэклоге.
|
||||
- `docs/roadmap.md` — фазы 2–8 (ядро TS→Rust/wasm, CLI); фазы 9–10 — API и PWA.
|
||||
- `docs/plan-platform.md` — планы API и PWA (общее ядро, оффлайн-режим).
|
||||
- `docs/archive/plan-i18n.md` — отложенная многоязычная схема (будущий `/ru/`).
|
||||
- `docs/plan-domain.local.md` — план переименования/домена; **в git не входит**
|
||||
(`.gitignore`), лежит только локально.
|
||||
|
||||
Reference in New Issue
Block a user