Maksutov Design MAKSUTOV DESIGN
Self-project Technical SEO Schema.org i18n

SEO of the site

Technical SEO for my own site, maksutovdesign.ru: 268 pages in four languages with no CMS. Which rules I introduced so that a search engine understands every page the same way, what it produced in numbers as of 3 October 2026, and how this differs from "we set up a plugin".

01 / task

No CMS means SEO has to be built with scripts and verified with numbers

268pages: the Russian version and mirrors in English, Chinese and Arabic.
4languages with full mirrors — RU, EN, ZH and AR (right-to-left).
10,586internal links between pages — each one checked for existence.
0CMS, plugins or third-party SEO services: everything lives in static HTML files.

In WordPress a plugin handles canonical and the sitemap. Here every page is a separate HTML file, so the same meta information would have to be kept by hand in 268 places. The goal was to turn SEO from a set of scattered fixes into a repeatable process: a shared rule, a generator, a check, and the result recorded in numbers.

02 / technical pack

Canonical, hreflang, Open Graph and JSON-LD — on every page

100%of pages (268 of 268) with canonical, Open Graph, Twitter Card and JSON-LD.
261pages with hreflang for ru/en/zh/ar and x-default.
250unique 1200×630 OG images — one per page, not a single shared one.
1h1 on every page — verified across all 268.

On 6 September 2026 I applied a single technical pack to the site, following the recommendations of the book "The Craft Bible" (appendices A and B — launch readiness and Schema.org markup). The block is inserted into <head> between seo-pack markers and built by one idempotent script: it can be run repeatedly, never duplicates data, and rebuilds the block from the current title, description and breadcrumbs.

Hreflang is generated only for languages that really exist: if a page has no translation, no link to a non-existent address appears. This prevents the "hreflang link leads to 404" error.

  • Canonical on every page, domain without www
  • Hreflang ru/en/zh/ar + x-default, with no links to missing translations
  • Open Graph and Twitter Card with an individual image
  • theme-color, favicon set and site.webmanifest
  • One script rebuilds the block on all pages at once

03 / structured data

Twelve Schema.org types in one graph on every page

A single Organization + Person graph ties all pages to one site owner, and each page then gets its own type on top — according to what it actually is. Types are chosen automatically by section.

Schema.org typePagesWhere it is used
Organization + Person268 + 268the whole site — a single owner and author
BreadcrumbList256pages with breadcrumbs, built from the real navigation
WebPage72regular pages
Service64service pages and their subsections
CreativeWork53cases, projects and repositories
CollectionPage35lists: cases, projects, blog, notes
Article28blog posts
Book8"The Craft Bible" and "Color Encyclopedia" in four languages
WebSite + SearchAction4home pages, description of the built-in search
ContactPage, SearchResultsPage4 + 4contacts and search results

Two deliberate decisions. First: the site has no self-assessed AggregateRating markup — a rating the owner gives themselves is treated by search engines as a violation. Second: I do not rely on FAQ rich snippets — Google discontinued them in May 2026, so the FAQ section is an ordinary page with questions and answers.

04 / headings and metadata

One h1, a unique description and zero duplicates

1h1 heading on all 268 pages — no gaps and no repeats.
43characters — average title length; range 14–76.
110characters — average description length; no description repeats on two pages.
100%of images (3,505) have an alt attribute, 89% specify width and height.

On 6 September I ran an editorial audit of the texts: removed advertising clichés from the cases, rewrote the intros for naming and brand book, and aligned cards, names and metadata. For search this matters as much as markup: the snippet is built from description and title, and repeated descriptions blur pages against each other.

Width and height on images reserve space before loading — the page does not "jump", which improves the CLS metric. The remaining 11% are dynamic galleries where a script sets the size.

  • Title and description are written for the page, not copied from a template
  • h2–h3 headings go without skipping levels
  • Alt on all images describes the content, not the file name
  • Draft and service pages are closed with noindex

05 / indexing

Robots, a 261-URL sitemap and a branded 404

261URLs in sitemap.xml — each with hreflang alternates for all languages.
1Disallow line in robots.txt — only the service admin is closed.
404page with branded design and noindex, so errors do not reach search results.
0indexable empty pages: drafts are closed until filled.

The sitemap is more than a list of addresses: each URL carries links to its versions in other languages, so a search engine gets the map of mirrors in one file. robots.txt points to the sitemap and closes only the /admin/ folder: the site is open to indexing entirely, except the CRM.

When new sections without content appear — for example, pages of future services — they immediately get noindex and stay out of the sitemap. I lift the ban on the day a page is filled in.

  • robots.txt: Allow / and Disallow /admin/
  • sitemap.xml with hreflang alternates
  • 404.html with noindex and links to sections
  • Drafts — noindex, follow, no sitemap
  • site.webmanifest and a favicon in three formats

06 / host and redirects

One address version and 301 redirects from the old site

The site opens only at https://maksutovdesign.ru: the www version and unsecured http are redirected to the main address with a 301. A search engine does not split weight between four variants of one address.

8 redirect rules from the previous version of the site are kept: old addresses such as /ai-art, /trip, /logofolio and /case/monin lead to the new pages, so external links and bookmarks do not turn into 404s. The server also sends security headers and HSTS for a year.

  • www → no www, http → https, both 301
  • 8 rules for old addresses
  • Directory listing off: Options -Indexes
  • HSTS for 1 year and nosniff, SAMEORIGIN headers

07 / speed and weight

Static without frameworks: the home page is 87 KB of HTML

87 KBis the HTML of the home page; CSS sits inside the file, with no external blocking stylesheets.
87%of images (3,049 of 3,505) load lazily, as you scroll.
1 yearcache lifetime for images and fonts; CSS and JS — a month.
gzipcompression of HTML, CSS, JS, JSON and SVG on the server.

Speed here is a consequence of the architecture, not optimization after the fact: no JS framework, no build step, no heavy CMS. Most of the weight is images, so they are served with a one-year cache lifetime and get a new file name when replaced, so users see the new version immediately. Analytics is my own lightweight counter without third-party cookies; it does not slow the page with someone else's scripts.

09 / how it is maintained

Three scripts and a check before every release

The SEO layer does not go stale because it is not edited by hand. After any content change the same set of actions is run.

StepWhat it doesWhen it runs
seopack.pyrebuilds canonical, hreflang, OG and JSON-LD on all pagesafter changing a title, description or breadcrumbs
build_search_index.pyupdates four search indexes from the full page textafter changing text or adding a page
Tag checklooks for unclosed and extra tags in every pagebefore building the release archive
Link and mobile layout checklooks for broken links, horizontal scroll and console errorsafter major structural changes

Discuss a project

Need SEO for your website?

Send the site address — I will run an audit, prepare a brief for the fixes and show what to fix first.

Order SEO

10 / related pages