Add SEO basics: separate EN/RU pages, sitemap, OG banner

Splits the landing page into /  and /ru/ so each language can rank on
its own, with hreflang links between them; boot.js/main.js now do a
real navigation between the two instead of toggling text in place.
Adds robots.txt and sitemap.xml, JSON-LD SoftwareApplication markup,
Twitter Card tags, and a proper 1200x630 og-image.png in place of the
SVG favicon for social previews.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 23:57:28 +05:00
co-authored by Claude Sonnet 5
parent 8fe0e72664
commit b6733f37fa
9 changed files with 847 additions and 51 deletions
+23 -17
View File
@@ -378,16 +378,19 @@ does, and a privacy policy saying that it collects nothing. Partner Center leave
the policy optional for an app that gathers no data, but a page saying so out
loud is what takes the question off the reviewer's desk.
The whole of it is five files in `site`, and nothing is fetched from anywhere
else — no framework, no build step, no font from a network:
Nothing is fetched from anywhere else — no framework, no build step, no font
from a network:
| File | What is in it |
|---|---|
| `index.html` | The markup, both languages at once |
| `index.html` | The English page — the markup, both languages at once |
| `ru/index.html` | The same markup, Russian in front by default |
| `styles.css` | Every rule, the palette included |
| `boot.js` | The language and the theme of an earlier visit, before the first frame |
| `main.js` | The rest: the switches, the menu, the demo, the preview |
| `favicon.svg` | The same dark plate with "Aя" as the application icon |
| `robots.txt` | Points crawlers at the sitemap, nothing disallowed |
| `sitemap.xml` | Both pages, cross-linked by `hreflang` |
`boot.js` is small and separate for one reason: it has to run before the body is
parsed. It reads what was chosen last time and puts it on the `<html>` element,
@@ -395,22 +398,25 @@ and without it the first frame would be English in the system theme and correct
itself a moment later, in plain sight. `main.js` works on markup that has to
exist by then, so it is deferred instead.
Both languages live in the markup at once, and a switch in the corner picks one.
Every translated piece is a `<span lang="en">` beside a `<span lang="ru">`, and
whichever does not match the language on the `<html>` element is hidden by a rule
of two lines. With the scripts switched off the page still reads, in English.
Both languages live in the markup of each page at once, and a switch in the
corner picks one. Every translated piece is a `<span lang="en">` beside a
`<span lang="ru">`, and whichever does not match the language on the `<html>`
element is hidden by a rule of two lines. With the scripts switched off either
page still reads, in the language it defaults to.
Publishing means copying the five files as they are. Before that, two things are
still waiting for an address.
English and Russian are two pages rather than one page with a client-side
switch, so that each can rank in search on its own: `/` and `/ru/`, with
`hreflang` links between them in both the markup and `sitemap.xml`, and each
carrying its own title, description and canonical address. Clicking EN or RU is
a real navigation between the two rather than a rewrite in place, and `boot.js`
sends a first-time visitor to the page matching their browser's language —
but never away from whichever of the two a link already pointed them at, since
that would undo the separate ranking for anyone arriving that way, crawlers
included.
The Store listing is the first: the two download buttons are
`<span class="btn disabled" role="link">` rather than links, because a
placeholder in `href` would be a relative address and anything following it would
land on a 404. The address turns each of them back into
`<a class="btn" href="…">` and takes the note beside it away.
The address of the site itself is the second, wanted by three tags the head does
not carry yet: `og:image`, `og:url` and the canonical link.
Publishing means copying the files as they are — assets are referenced by an
absolute path (`/styles.css` and so on) so `ru/index.html` reaches the same
copy rather than needing one of its own.
Support goes to `support@alrakis.kz`: it stands in the privacy section, under the
download buttons and in the footer.