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
+38 -6
View File
@@ -3,25 +3,57 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CursorLang — the keyboard layout at your cursor</title>
<title data-title-en="CursorLang — the keyboard layout at your cursor"
data-title-ru="CursorLang — раскладка клавиатуры у курсора">CursorLang — the keyboard layout at your cursor</title>
<meta name="description" content="A tiny Windows tray app that names the keyboard layout you have just switched to — beside the text caret, beside the mouse pointer, or at a fixed point on the screen. Free, offline, under 9 MB."
data-content-en="A tiny Windows tray app that names the keyboard layout you have just switched to — beside the text caret, beside the mouse pointer, or at a fixed point on the screen. Free, offline, under 9 MB."
data-content-ru="Небольшая программа в трее Windows, называющая раскладку, на которую вы только что переключились, — у текстового курсора, у указателя мыши или в выбранной точке экрана. Бесплатно, без доступа в сеть, меньше 9 МБ.">
<meta property="og:type" content="website">
<meta property="og:title" content="CursorLang — the keyboard layout at your cursor">
<meta property="og:description" content="Switch the layout and a small popup names it, right where you are typing. Free, offline, under 9 MB in the tray.">
<meta property="og:url" content="https://cursor-lang.alrakis.kz/">
<meta property="og:image" content="https://cursor-lang.alrakis.kz/favicon.svg">
<meta property="og:image" content="https://cursor-lang.alrakis.kz/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:locale" content="en_US">
<meta property="og:locale:alternate" content="ru_RU">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="CursorLang — the keyboard layout at your cursor">
<meta name="twitter:description" content="A tiny Windows tray app that names the keyboard layout you have just switched to — beside the text caret, beside the mouse pointer, or at a fixed point on the screen. Free, offline, under 9 MB.">
<meta name="twitter:image" content="https://cursor-lang.alrakis.kz/og-image.png">
<link rel="canonical" href="https://cursor-lang.alrakis.kz/">
<link rel="alternate" hreflang="en" href="https://cursor-lang.alrakis.kz/">
<link rel="alternate" hreflang="ru" href="https://cursor-lang.alrakis.kz/ru/">
<link rel="alternate" hreflang="x-default" href="https://cursor-lang.alrakis.kz/">
<meta name="theme-color" content="#fbfbfd" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0d0d10" media="(prefers-color-scheme: dark)">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="/styles.css">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "CursorLang",
"url": "https://cursor-lang.alrakis.kz/",
"image": "https://cursor-lang.alrakis.kz/og-image.png",
"description": "A tiny Windows tray app that names the keyboard layout you have just switched to — beside the text caret, beside the mouse pointer, or at a fixed point on the screen. Free, offline, under 9 MB.",
"applicationCategory": "UtilitiesApplication",
"operatingSystem": "Windows 10 1809 and later, 64-bit",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"downloadUrl": "https://apps.microsoft.com/detail/9nvpp6h49kpp",
"inLanguage": ["en", "ru"]
}
</script>
<!-- boot.js runs before the body is parsed, so the language and the theme of an
earlier visit are in place for the first frame; everything else waits for
the markup it works on -->
<script src="boot.js"></script>
<script src="main.js" defer></script>
<script src="/boot.js"></script>
<script src="/main.js" defer></script>
</head>
<body>