Team sites: Google found everyone but me
I built or launched the personal sites of the whole App-Kit team and tied them into one schema.org graph. Google found my colleagues by name before it found me. Here is why, with audit scores, redirects and the team graph.
App-Kit is four people, and each of us needed a personal site: a portfolio, a CV and a link to the team. I built two of them from scratch, this one and the site of Dmitry Chernenko. Alexander Naumenko had made his own site, and Yulia Sazonova gave me a finished layout of her portfolio; I took both to production. Then came the funny part. A search for Dmitry’s name found his site, and a search for mine did not find me. The person who built the sites for the whole team was the one Google could not see.
What every site got
Every site gets the same baseline, checked by my own seo-audit engine: robots.txt, sitemap, llms.txt and llms-full.txt, Open Graph cards, a Content Security Policy and security headers on the CDN edge, WebP images and analytics. The work itself ran on App-Kit tools: images went through the image converter, and every check through the public SEO audit with 400+ checks. All four sites are static and served by Bunny CDN; this site and Dmitry’s are Next.js static exports stored in Cloudflare R2. On top of that sits one schema.org graph for the whole team: every person has a stable @id, worksFor points to the App-Kit organization, and colleague points to the other three people by their @id.
Two sites from scratch
This site started in June 2026 as a Next.js app on the App-Kit storefront packages and now builds as a static export; the repository has 137 commits. At the end of July I moved it from Selectel and Gcore to Cloudflare R2 behind Bunny CDN and switched to URLs without a trailing slash. That move matters later in this story.
Dmitry’s site I first built in July as a private App-Kit template: content typed in English and Russian, the home page, case pages, the mobile layout and screenshot checks against the original HTML. It went live on R2 and Bunny on 23 July with the full SEO baseline. The audit also led to a real React hydration error (#418): a post-build step removed a stylesheet the page still needed. By then I had already made my mistakes on wm2.dev, so Dmitry’s site was built to the checklist from day one and has no “before” score at all: it started high. Today it has 22 pages in its sitemap and scores 96.5 in the fast audit.
Two sites taken to production
Alexander’s site is plain HTML on two domains, .dev in English and .me in Russian. The first audit on 10 October gave 78.9: robots.txt and sitemap.xml returned 404 on both domains, there was no structured data and no Open Graph, the H1 did not contain his name, and the images were heavy PNG and JPEG files. I added robots files, sitemaps with images, llms.txt files, Person and WebSite markup, 1200×630 OG cards, WebP with srcset (1.43 MB of PNG and JPEG became 0.15 MB), a CSP, security headers on the edge and self-hosted Core Web Vitals. After the fixes the score was 95.8, and now it is 97.5.
Yulia designed her portfolio and gave me the finished layout. Everything else was mine: the domain, Bunny storage and CDN, SSL, the redirect from www, HSTS and other headers, title and description, Person markup, robots, sitemap and llms.txt, a neutral OG card and analytics. The project images were PNG files of 1.3–2.2 MB each; after conversion to WebP, 6.9 MB of images became 0.8 MB, full-size versions included. The visible design stayed exactly as she drew it. This time I started with the full checklist and the lessons from the other three sites, so the first audit after the launch already gave 95.8, and the current one gives 97.8.
| Site | first audit | now |
|---|---|---|
| wm2.dev | 81.4 | 99.3 |
| dmitry-chernenko.me | — | 96.5 |
| alexander-naumenko.dev | 78.9 | 97.5 |
| designerzim.studio | 95.8 | 97.8 |
One graph for the whole team
Search engines read schema.org markup that visitors never see. On each site the Person block has a permanent identifier: the site address with #person at the end. worksFor points to the App-Kit organization, and colleague lists the other three people by their identifiers. The App-Kit team page uses the same identifiers. A search engine can join these blocks into one picture: an organization, four people, their sites and their profiles.
{
"@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" }
]
}The visible half of the graph is simple. Every site links to the other three, and the anchor is always the person’s name, never a keyword. Profiles such as GitHub, LinkedIn, Habr or Behance go into sameAs, so the graph also confirms who owns which account.
Redirects: three rule changes in one month
The biggest self-inflicted problem was the URL scheme. Until 10 July both /projects and /projects/ returned 200, so Google saw two copies of every page. On 10 July I added a 301 from the address without a slash to the one with a slash on Gcore. On 22 July the audit found a broken www rule: www.wm2.dev/projects/ redirected to the home page and lost both the path and the slash. On 29 July the site moved to Cloudflare R2 and Bunny CDN, and the scheme flipped to addresses without a slash, so everything Google had indexed with a slash now answered with a 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/Each change was correct on its own, but in one month Google saw three different sets of rules. It kept the old addresses, and marked the new ones as discovered but not indexed. Search Console still shows six pages with redirects: the old variants with a slash, http and www. That part is expected; the useful lesson is to choose the URL scheme once, before the site is indexed, and not to touch it afterwards.
- Jul 10 301 to addresses with a slash
- Jul 22 broken www redirect found
- Jul 29 move to R2 + Bunny, addresses without a slash
- Oct 3 name in every title
| Date | full audit | fast audit |
|---|---|---|
| Jul 7 | 81.4 | — |
| Jul 8 | 88.8 | — |
| Sep 16 | 94.9 | 95.1 |
| Sep 23 | 95 | — |
| Sep 28 | — | 95.1 |
| Oct 3 | 97.4 | 99.3 |
| Oct 11 | — | 99.3 |
Why Google could not see me
In early October I sat down with Search Console and found four reasons. First, the index had stuck after those redirect changes: only 9 pages were indexed, the case pages and the Russian CV were known under the old addresses with a slash, and the new addresses had not been crawled since summer. Second, my name was not in the page titles. They said “wm2”, and for Google wm2 is mostly a window manager for X11. Third, the site was thin: two published cases and 181 words on the home page, against eight cases on Dmitry’s site. Fourth, my name is taken: a doctor with the same name has publications on PubMed and ResearchGate.
The fixes: my name went into every title in both languages, with “Vitaliy Sazonov (wm2)” as one stable formula everywhere. The Person markup got every spelling of the name (Виталий Сазонов, Vitaly, Vitalii, wm2) and the team graph. The new addresses went to Google by hand through URL Inspection, about ten a day because that is the quota per account, and to Bing and Yandex as whole lists. Search Console also showed a redirect error for the http version of the site; the redirect was already a single 301, so I asked Google to validate the fix.
The sitemap is now processed without errors. This post is part of the fix too: one more substantial page with my name on it.
The result so far
All four sites now score between 96 and 99 in the fast audit. Alexander’s site went from 78.9 to 97.5. This site went from 81.4 in its first full audit in July to 94.9 in September and 97.4 in October, with rendering and Lighthouse; the fast audit now gives 99.3. After the fixes described above, the number of wm2.dev pages in Google’s index grew from 9 to 18.
What comes next
Search by name needs time and links from strong sites, so the next steps are outside the sites themselves: a longer technical write-up, profiles with the same name and a link here, and the other team sites going live with the same graph. At the end of October I will check search by name again and update this post with the result.