Сайты команды: Google нашёл всех, кроме меня
Сделал и запустил личные сайты всей команды App-Kit, связав их в один граф schema.org. Коллег Google нашёл по имени раньше, чем меня. Разбираю почему — с оценками аудита, редиректами и графом команды.
В App-Kit нас четверо, и каждому нужен был личный сайт: портфолио, резюме и ссылка на команду. Два из них я сделал с нуля — этот и сайт Дмитрия Черненко. Александр Науменко сделал свой сайт сам, а Юлия Сазонова отдала мне готовую вёрстку портфолио; оба сайта я довёл до продакшена. Дальше было смешно. По имени Димы Google находил его, а по моему — меня нет. Человек, который всё это сделал для команды, оказался единственным, кого поисковик не видит.
Что получил каждый сайт
У всех четырёх один базовый набор, и каждый проверяет мой собственный движок seo-audit: robots.txt, sitemap, llms.txt и llms-full.txt, OG-карточки, Content Security Policy и заголовки безопасности на краю CDN, картинки в WebP и аналитика. Работал я инструментами App-Kit: картинки проходили через конвертер изображений, а каждая проверка — через публичный SEO-аудит на 400+ проверок. Все четыре статические и раздаются через Bunny CDN; мой и Димин — статический экспорт Next.js в Cloudflare R2. Поверх этого — один граф schema.org на всю команду: у каждого человека постоянный @id, worksFor указывает на организацию App-Kit, а colleague — на трёх остальных по их @id.
Два сайта с нуля
wm2.dev появился в июне 2026 года как приложение на Next.js поверх storefront-пакетов App-Kit, а теперь собирается статическим экспортом; в репозитории 137 коммитов. В конце июля я перенёс его с Selectel/Gcore в Cloudflare R2 за Bunny CDN, заодно перейдя на адреса без слеша в конце. Этот переезд ещё всплывёт в истории.
Сайт Димы я сначала собрал в июле как приватный шаблон App-Kit: типизированный контент на английском и русском, главная, страницы кейсов, мобильная вёрстка, сверка скриншотами с исходным HTML. 23 июля он вышел на R2 и Bunny с полным набором SEO. Аудит заодно вывел на настоящую ошибку гидрации React (#418): шаг после сборки вырезал стили, которые странице ещё были нужны. К тому моменту я уже набил шишки на wm2.dev, поэтому сайт Димы с первого дня делался по чек-листу, и оценки «до» у него просто нет: он сразу стартовал высоко. Сейчас в его sitemap 22 страницы, а быстрый аудит даёт 96,5.
Два сайта до продакшена
Сайт Александра — чистый HTML на двух доменах: .dev на английском и .me на русском. Первый аудит 10 октября дал 78,9: robots.txt и sitemap.xml отвечали 404 на обоих доменах, не было ни микроразметки, ни Open Graph, в H1 не было имени, а картинки были тяжёлыми PNG и JPEG. Я добавил robots, sitemap с картинками, llms.txt, разметку Person и WebSite, OG-карточки 1200×630, WebP с srcset (1,43 МБ PNG и JPEG превратились в 0,15 МБ), CSP, заголовки безопасности на краю CDN, собственный сбор Core Web Vitals. После исправлений оценка стала 95,8, сейчас — 97,5.
Юля нарисовала своё портфолио и отдала мне готовую вёрстку. Всё остальное делал я: домен, хранилище и CDN в Bunny, SSL, редирект с www, HSTS с другими заголовками, title с description, разметку Person, robots, sitemap и llms.txt, нейтральную OG-карточку и аналитику. Картинки проектов были PNG по 1,3–2,2 МБ; после перевода в WebP 6,9 МБ картинок превратились в 0,8 МБ, вместе с полноразмерными версиями. Видимый дизайн остался ровно таким, каким его нарисовала Юля. Здесь я сразу работал по полному чек-листу и с опытом трёх предыдущих, поэтому первый аудит после запуска уже дал 95,8, а текущий — 97,8.
| Сайт | первый аудит | сейчас |
|---|---|---|
| wm2.dev | 81,4 | 99,3 |
| dmitry-chernenko.me | — | 96,5 |
| alexander-naumenko.dev | 78,9 | 97,5 |
| designerzim.studio | 95,8 | 97,8 |
Один граф на всю команду
Поисковики читают разметку schema.org, которую посетитель не видит. У каждого блока Person есть постоянный идентификатор — домен с #person на конце. worksFor указывает на организацию App-Kit, а colleague перечисляет трёх остальных по их идентификаторам. Страница команды App-Kit использует те же идентификаторы. Поисковик может собрать эти блоки в одну картину: организация, четыре человека, их страницы и профили.
{
"@type": "Person",
"@id": "https://wm2.dev/#person",
"name": "Vitaliy Sazonov",
"alternateName": ["Виталий Сазонов", "Vitaly Sazonov", "Vitalii Sazonov", "wm2"],
"worksFor": { "@id": "https://app-kit.dev/#organization" },
"colleague": [
{ "@id": "https://dmitry-chernenko.me/#person" },
{ "@id": "https://alexander-naumenko.dev/#person" },
{ "@id": "https://designerzim.studio/#person" }
]
}Видимая половина графа простая. Каждая страница ссылается на трёх остальных, и текст ссылки — всегда имя человека, а не ключевое слово. Профили вроде GitHub, LinkedIn, Хабра или Behance уходят в sameAs, так что граф заодно подтверждает, чей это аккаунт.
Редиректы: три смены правил за месяц
Главную проблему я создал себе сам — схемой адресов. До 10 июля и /projects, и /projects/ отдавали 200, то есть Google видел две копии каждой страницы. 10 июля я поставил на Gcore 301 с адреса без слеша на адрес со слешем. 22 июля аудит нашёл сломанное правило для www: www.wm2.dev/projects/ уводил на главную, теряя путь вместе со слешем. 29 июля wm2.dev переехал в Cloudflare R2 за Bunny CDN, а схема перевернулась на адреса без слеша — всё, что Google успел проиндексировать со слешем, стало отвечать 301.
$ curl -sI https://wm2.dev/projects/
HTTP/2 301
location: https://wm2.dev/projects
$ curl -sI http://wm2.dev/
HTTP/1.1 301 Moved Permanently
Location: https://wm2.dev/По отдельности каждое изменение было правильным, но за месяц Google увидел три разных набора правил. Он держался за старые адреса, а новые помечал как «обнаружена, не проиндексирована». В Search Console до сих пор шесть страниц с переадресацией — старые варианты со слешем, http и www. Это нормально; полезный урок другой: схему адресов надо выбрать один раз, до индексации, и потом её не трогать.
- 10 июл. 301 на адреса со слешем
- 22 июл. найден сломанный редирект с www
- 29 июл. переезд на R2 + Bunny, адреса без слеша
- 3 окт. имя во всех title
| Дата | полный аудит | быстрый аудит |
|---|---|---|
| 7 июл. | 81,4 | — |
| 8 июл. | 88,8 | — |
| 16 сент. | 94,9 | 95,1 |
| 23 сент. | 95 | — |
| 28 сент. | — | 95,1 |
| 3 окт. | 97,4 | 99,3 |
| 11 окт. | — | 99,3 |
Почему Google меня не видел
В начале октября я сел с Search Console и нашёл четыре причины. Первая: индекс застрял после этих смен редиректов. В индексе было всего 9 страниц, кейсы и русское резюме Google знал по старым адресам со слешем, а новые не сканировал с лета. Вторая: моего имени не было в title. Там стояло «wm2», а для Google wm2 — это в основном оконный менеджер для X11. Третья: страниц было мало — два опубликованных кейса и 181 слово на главной, против восьми кейсов у Димы. Четвёртая: имя занято. У моего тёзки-врача есть публикации в PubMed и ResearchGate.
Что исправил: имя попало в title всех страниц на обоих языках, с одной формулой «Vitaliy Sazonov (wm2)» везде. В разметку Person вошли все написания имени (Виталий Сазонов, Vitaly, Vitalii, wm2) и граф команды. Новые адреса я отправил в Google вручную через «Проверку URL» — примерно по десять в день, такая квота на аккаунт, — а в Bing и Яндекс целыми списками. Ещё Search Console показывал ошибку переадресации у http-версии. Редирект к тому моменту уже был одним 301, поэтому я запустил проверку исправления.
Sitemap теперь обрабатывается без ошибок. Эта статья — тоже часть исправления: ещё одна содержательная страница с моим именем.
Результат на сейчас
Сейчас все четыре набирают от 96 до 99 баллов в быстром аудите. Сайт Александра вырос с 78,9 до 97,5. wm2.dev — с 81,4 в первом полном аудите в июле до 94,9 в сентябре, 97,4 в октябре (с рендером и Lighthouse); быстрый аудит сейчас даёт 99,3. После исправлений, о которых выше, страниц wm2.dev в индексе Google стало 18 вместо 9.
Что дальше
Поиск по имени зависит от времени и ссылок с сильных сайтов, поэтому следующие шаги — уже не в коде: подробный технический разбор, профили с тем же именем со ссылкой сюда, выход остальных сайтов команды с тем же графом. В конце октября я снова проверю поиск по имени и допишу сюда результат.