wm2.dev
·8 мин чтения

Сайты команды: Google нашёл всех, кроме меня

Сделал и запустил личные сайты всей команды App-Kit, связав их в один граф schema.org. Коллег Google нашёл по имени раньше, чем меня. Разбираю почему — с оценками аудита, редиректами и графом команды.

frontendinfra

В 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.

Оценка SEO-аудита: первый аудит → сейчас
Сайтпервый аудитсейчас
wm2.dev81,499,3
dmitry-chernenko.me—96,5
alexander-naumenko.dev78,997,5
designerzim.studio95,897,8
«Сейчас» — последний быстрый аудит у всех сайтов. Первый аудит wm2.dev в июле был полным, с рендером и Lighthouse; последний полный даёт 97,4. У сайта Димы нет «было»: он вышел сразу сделанным по чек-листу.

Один граф на всю команду

Поисковики читают разметку schema.org, которую посетитель не видит. У каждого блока Person есть постоянный идентификатор — домен с #person на конце. worksFor указывает на организацию App-Kit, а colleague перечисляет трёх остальных по их идентификаторам. Страница команды App-Kit использует те же идентификаторы. Поисковик может собрать эти блоки в одну картину: организация, четыре человека, их страницы и профили.

JSON-LD — Person на wm2.dev (сокращённо)
{
  "@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, так что граф заодно подтверждает, чей это аккаунт.

Граф команды в schema.org
App-Kitapp-kit.dev/#organization
Виталий Сазоновwm2.dev/#person
Дмитрий Черненкоdmitry-chernenko.me/#person
Александр Науменкоalexander-naumenko.dev/#person
Юлия Сазоноваdesignerzim.studio/#person
colleague связывает каждого с каждым; на схеме связи нарисованы по краям, чтобы её можно было прочитать.

Редиректы: три смены правил за месяц

Главную проблему я создал себе сам — схемой адресов. До 10 июля и /projects, и /projects/ отдавали 200, то есть Google видел две копии каждой страницы. 10 июля я поставил на Gcore 301 с адреса без слеша на адрес со слешем. 22 июля аудит нашёл сломанное правило для www: www.wm2.dev/projects/ уводил на главную, теряя путь вместе со слешем. 29 июля wm2.dev переехал в Cloudflare R2 за Bunny CDN, а схема перевернулась на адреса без слеша — всё, что Google успел проиндексировать со слешем, стало отвечать 301.

bash — старые адреса теперь отвечают одним 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. Это нормально; полезный урок другой: схему адресов надо выбрать один раз, до индексации, и потом её не трогать.

wm2.dev: оценка SEO-аудита во времени
  1. 10 июл. 301 на адреса со слешем
  2. 22 июл. найден сломанный редирект с www
  3. 29 июл. переезд на R2 + Bunny, адреса без слеша
  4. 3 окт. имя во всех title
Датаполный аудитбыстрый аудит
7 июл.81,4—
8 июл.88,8—
16 сент.94,995,1
23 сент.95—
28 сент.—95,1
3 окт.97,499,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.

Что дальше

Поиск по имени зависит от времени и ссылок с сильных сайтов, поэтому следующие шаги — уже не в коде: подробный технический разбор, профили с тем же именем со ссылкой сюда, выход остальных сайтов команды с тем же графом. В конце октября я снова проверю поиск по имени и допишу сюда результат.