fix(seo): Wave 1 — fix critical SEO gaps

- Fix duplicate faq/ruFaq keys in dice.json, list.json, colors.json
- Add <main> landmarks to about/privacy pages (EN + RU)
- Move YandexRTB after <main> on homepage
- Add x-default hreflang to BaseLayout
- Configure sitemap i18n with hreflang alternates
- Add Open Graph + Twitter Card meta tags
- Create default OG image (1200x630)
This commit is contained in:
emil
2026-05-14 02:39:56 +03:00
parent 75038780d5
commit 43ea9bc8f3
23 changed files with 2087 additions and 146 deletions
+185
View File
@@ -0,0 +1,185 @@
> randify@0.0.1 build
> astro build
02:36:15 [types] Generated 342ms
02:36:15 [build] output: "static"
02:36:15 [build] directory: /home/emil/Desktop/Coding/AI/Randify.pro/dist/
02:36:15 [build] Collecting build info...
02:36:15 [build] ✓ Completed in 368ms.
02:36:15 [build] Building static entrypoints...
02:36:17 [vite] ✓ built in 2.10s
02:36:17 [build] ✓ Completed in 2.15s.
building client (vite)
02:36:17 [vite] transforming...
02:36:17 [vite] ✓ 71 modules transformed.
02:36:17 [vite] rendering chunks...
02:36:17 [vite] computing gzip size...
02:36:17 [vite] dist/_astro/hoisted.BKKrxAht.js 0.16 kB │ gzip: 0.15 kB
02:36:17 [vite] dist/_astro/animations.JKmio82t.js 0.19 kB │ gzip: 0.13 kB
02:36:17 [vite] dist/_astro/validation.plcuGzaj.js 0.20 kB │ gzip: 0.16 kB
02:36:17 [vite] dist/_astro/clipboard.v9BZgIeL.js 0.43 kB │ gzip: 0.22 kB
02:36:17 [vite] dist/_astro/random.PhfdigkC.js 0.50 kB │ gzip: 0.31 kB
02:36:17 [vite] dist/_astro/hoisted.B5m2ZYh6.js 0.90 kB │ gzip: 0.56 kB
02:36:17 [vite] dist/_astro/hoisted.CdG8uTdI.js 1.23 kB │ gzip: 0.61 kB
02:36:17 [vite] dist/_astro/hoisted.CT9HX5_Y.js 1.38 kB │ gzip: 0.72 kB
02:36:17 [vite] dist/_astro/hoisted.Cb7Tv2oN.js 1.48 kB │ gzip: 0.83 kB
02:36:17 [vite] dist/_astro/hoisted.D82rtlIG.js 1.54 kB │ gzip: 0.84 kB
02:36:17 [vite] dist/_astro/hoisted.uArMeWBD.js 1.63 kB │ gzip: 0.81 kB
02:36:17 [vite] dist/_astro/hoisted.CwDo-_-Z.js 1.64 kB │ gzip: 0.73 kB
02:36:17 [vite] dist/_astro/hoisted.j6ibv0wb.js 1.65 kB │ gzip: 0.81 kB
02:36:17 [vite] dist/_astro/hoisted.BEwWV8JC.js 1.73 kB │ gzip: 0.90 kB
02:36:17 [vite] dist/_astro/hoisted.6rLeMLDm.js 1.74 kB │ gzip: 0.86 kB
02:36:17 [vite] dist/_astro/hoisted.DOtqogeQ.js 1.76 kB │ gzip: 0.99 kB
02:36:17 [vite] dist/_astro/hoisted.CHG7AXVP.js 1.89 kB │ gzip: 1.05 kB
02:36:17 [vite] dist/_astro/hoisted.DnGtBYme.js 1.99 kB │ gzip: 0.95 kB
02:36:17 [vite] dist/_astro/hoisted.hrxZZFEF.js 2.19 kB │ gzip: 1.07 kB
02:36:17 [vite] dist/_astro/hoisted.CjZD7f2g.js 2.33 kB │ gzip: 1.15 kB
02:36:17 [vite] dist/_astro/hoisted.qLZXl1Do.js 2.88 kB │ gzip: 1.70 kB
02:36:17 [vite] dist/_astro/hoisted.BKosNXxl.js 2.91 kB │ gzip: 1.41 kB
02:36:17 [vite] dist/_astro/hoisted.CpSL7HYx.js 3.94 kB │ gzip: 1.95 kB
02:36:17 [vite] dist/_astro/hoisted.DmqdUAAB.js 4.10 kB │ gzip: 1.70 kB
02:36:17 [vite] dist/_astro/hoisted.COsV1Syq.js 4.30 kB │ gzip: 1.96 kB
02:36:17 [vite] dist/_astro/hoisted.Ftg8tUcf.js 4.53 kB │ gzip: 1.97 kB
02:36:17 [vite] dist/_astro/hoisted.3XDY-7Px.js 4.79 kB │ gzip: 1.97 kB
02:36:17 [vite] dist/_astro/hoisted.mRfAHLMS.js 5.27 kB │ gzip: 2.20 kB
02:36:17 [vite] dist/_astro/hoisted.B7vaoHN9.js 7.19 kB │ gzip: 2.54 kB
02:36:17 [vite] dist/_astro/hoisted.DU8tsC8l.js 9.71 kB │ gzip: 3.84 kB
02:36:17 [vite] dist/_astro/i18n.DYCg5-VL.js 10.76 kB │ gzip: 5.53 kB
02:36:17 [vite] dist/_astro/hoisted.ChvQAxmv.js 10.92 kB │ gzip: 3.89 kB
02:36:17 [vite] dist/_astro/hoisted.DdCnpAKh.js 11.83 kB │ gzip: 2.76 kB
02:36:17 [vite] dist/_astro/hoisted.CvjQ9xHL.js 35.55 kB │ gzip: 17.46 kB
02:36:17 [vite] dist/_astro/hoisted.Bdx021zL.js 45.26 kB │ gzip: 14.58 kB
02:36:17 [vite] ✓ built in 438ms
generating static routes
02:36:18 ▶ src/pages/about.astro
02:36:18 └─ /about/index.html (+11ms)
02:36:18 ▶ src/pages/generators/cards.astro
02:36:18 └─ /generators/cards/index.html (+6ms)
02:36:18 ▶ src/pages/generators/coin.astro
02:36:18 └─ /generators/coin/index.html (+4ms)
02:36:18 ▶ src/pages/generators/colors.astro
02:36:18 └─ /generators/colors/index.html (+3ms)
02:36:18 ▶ src/pages/generators/country.astro
02:36:18 └─ /generators/country/index.html (+4ms)
02:36:18 ▶ src/pages/generators/date.astro
02:36:18 └─ /generators/date/index.html (+2ms)
02:36:18 ▶ src/pages/generators/dice.astro
02:36:18 └─ /generators/dice/index.html (+3ms)
02:36:18 ▶ src/pages/generators/emoji.astro
02:36:18 └─ /generators/emoji/index.html (+3ms)
02:36:18 ▶ src/pages/generators/fontpair.astro
02:36:18 └─ /generators/fontpair/index.html (+3ms)
02:36:18 ▶ src/pages/generators/gradient.astro
02:36:18 └─ /generators/gradient/index.html (+2ms)
02:36:18 ▶ src/pages/generators/hash.astro
02:36:18 └─ /generators/hash/index.html (+2ms)
02:36:18 ▶ src/pages/generators/letter.astro
02:36:18 └─ /generators/letter/index.html (+2ms)
02:36:18 ▶ src/pages/generators/list.astro
02:36:18 └─ /generators/list/index.html (+2ms)
02:36:18 ▶ src/pages/generators/lorem.astro
02:36:18 └─ /generators/lorem/index.html (+2ms)
02:36:18 ▶ src/pages/generators/lottery.astro
02:36:18 └─ /generators/lottery/index.html (+2ms)
02:36:18 ▶ src/pages/generators/magic8ball.astro
02:36:18 └─ /generators/magic8ball/index.html (+2ms)
02:36:18 ▶ src/pages/generators/meal.astro
02:36:18 └─ /generators/meal/index.html (+2ms)
02:36:18 ▶ src/pages/generators/names.astro
02:36:18 └─ /generators/names/index.html (+3ms)
02:36:18 ▶ src/pages/generators/numbers.astro
02:36:18 └─ /generators/numbers/index.html (+2ms)
02:36:18 ▶ src/pages/generators/palette.astro
02:36:18 └─ /generators/palette/index.html (+2ms)
02:36:18 ▶ src/pages/generators/password.astro
02:36:18 └─ /generators/password/index.html (+2ms)
02:36:18 ▶ src/pages/generators/rps.astro
02:36:18 └─ /generators/rps/index.html (+2ms)
02:36:18 ▶ src/pages/generators/shuffler.astro
02:36:18 └─ /generators/shuffler/index.html (+2ms)
02:36:18 ▶ src/pages/generators/teams.astro
02:36:18 └─ /generators/teams/index.html (+2ms)
02:36:18 ▶ src/pages/generators/time.astro
02:36:18 └─ /generators/time/index.html (+2ms)
02:36:18 ▶ src/pages/generators/uuid.astro
02:36:18 └─ /generators/uuid/index.html (+2ms)
02:36:18 ▶ src/pages/generators/weighted.astro
02:36:18 └─ /generators/weighted/index.html (+2ms)
02:36:18 ▶ src/pages/generators/wheel.astro
02:36:18 └─ /generators/wheel/index.html (+2ms)
02:36:18 ▶ src/pages/generators/yesno.astro
02:36:18 └─ /generators/yesno/index.html (+2ms)
02:36:18 ▶ src/pages/privacy.astro
02:36:18 └─ /privacy/index.html (+2ms)
02:36:18 ▶ src/pages/ru/about.astro
02:36:18 └─ /ru/about/index.html (+3ms)
02:36:18 ▶ src/pages/ru/generators/cards.astro
02:36:18 └─ /ru/generators/cards/index.html (+3ms)
02:36:18 ▶ src/pages/ru/generators/coin.astro
02:36:18 └─ /ru/generators/coin/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/colors.astro
02:36:18 └─ /ru/generators/colors/index.html (+3ms)
02:36:18 ▶ src/pages/ru/generators/country.astro
02:36:18 └─ /ru/generators/country/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/date.astro
02:36:18 └─ /ru/generators/date/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/dice.astro
02:36:18 └─ /ru/generators/dice/index.html (+3ms)
02:36:18 ▶ src/pages/ru/generators/emoji.astro
02:36:18 └─ /ru/generators/emoji/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/fontpair.astro
02:36:18 └─ /ru/generators/fontpair/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/gradient.astro
02:36:18 └─ /ru/generators/gradient/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/hash.astro
02:36:18 └─ /ru/generators/hash/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/letter.astro
02:36:18 └─ /ru/generators/letter/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/list.astro
02:36:18 └─ /ru/generators/list/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/lorem.astro
02:36:18 └─ /ru/generators/lorem/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/lottery.astro
02:36:18 └─ /ru/generators/lottery/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/magic8ball.astro
02:36:18 └─ /ru/generators/magic8ball/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/meal.astro
02:36:18 └─ /ru/generators/meal/index.html (+3ms)
02:36:18 ▶ src/pages/ru/generators/names.astro
02:36:18 └─ /ru/generators/names/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/numbers.astro
02:36:18 └─ /ru/generators/numbers/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/palette.astro
02:36:18 └─ /ru/generators/palette/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/password.astro
02:36:18 └─ /ru/generators/password/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/rps.astro
02:36:18 └─ /ru/generators/rps/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/shuffler.astro
02:36:18 └─ /ru/generators/shuffler/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/teams.astro
02:36:18 └─ /ru/generators/teams/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/time.astro
02:36:18 └─ /ru/generators/time/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/uuid.astro
02:36:18 └─ /ru/generators/uuid/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/weighted.astro
02:36:18 └─ /ru/generators/weighted/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/wheel.astro
02:36:18 └─ /ru/generators/wheel/index.html (+2ms)
02:36:18 ▶ src/pages/ru/generators/yesno.astro
02:36:18 └─ /ru/generators/yesno/index.html (+2ms)
02:36:18 ▶ src/pages/ru/privacy.astro
02:36:18 └─ /ru/privacy/index.html (+2ms)
02:36:18 ▶ src/pages/ru/index.astro
02:36:18 └─ /ru/index.html (+4ms)
02:36:18 ▶ src/pages/index.astro
02:36:18 └─ /index.html (+3ms)
02:36:18 ✓ Completed in 381ms.
02:36:18 [@astrojs/sitemap] `sitemap-index.xml` created at `dist`
02:36:18 [build] 62 page(s) built in 3.40s
02:36:18 [build] Complete!
+16
View File
@@ -0,0 +1,16 @@
Task: Fix <main> landmarks on about/privacy pages
Files modified:
- src/pages/about.astro
- src/pages/ru/about.astro
- src/pages/privacy.astro
- src/pages/ru/privacy.astro
Verification:
- npm run lint: 0 errors
- npm run build: success
- grep dist for <main> on about/privacy pages: all 4 files contain <main> tag
Pattern applied:
- Breadcrumb nav and page header remain outside <main>
- Content sections wrapped in <main> following GeneratorLayout.astro pattern
+8
View File
@@ -0,0 +1,8 @@
TASK: Fix ad placement on homepage
FILE: src/pages/index.astro
CHANGE: Moved <YandexRTB /> from before <main> to after </main>
BUILD: PASS (npm run build exited 0)
VERIFICATION:
- dist/index.html: </main> at byte 43284
- dist/index.html: yandex_rtb at byte 43335
- Order correct: True (main content before ad block)
+11
View File
@@ -0,0 +1,11 @@
Task: Add x-default hreflang to BaseLayout
Date: 2026-05-14
Verification:
- npm run build: PASS (62 pages built)
- grep dist/index.html for x-default: FOUND
<link rel="alternate" hreflang="x-default" href="https://randify.pro/">
- grep dist/generators/dice/index.html for x-default: FOUND
- grep all dist/*.html for x-default: 62 matches across 62 files
All pages now include x-default hreflang fallback pointing to the English version.
+13
View File
@@ -0,0 +1,13 @@
# Task 5 Evidence: Sitemap i18n Config
## Build Status
PASS
## Verification
File: dist/sitemap-0.xml
Contains <xhtml:link rel="alternate" hreflang="en-US"> and <xhtml:link rel="alternate" hreflang="ru-RU"> entries for all bilingual pages.
## Sample Entries
- https://randify.pro/ -> en-US + ru-RU
- https://randify.pro/about/ -> en-US + ru-RU
- https://randify.pro/generators/coin/ -> en-US + ru-RU
+31
View File
@@ -0,0 +1,31 @@
Evidence: Open Graph and Twitter Card meta tags added successfully.
Build status: PASS (npm run build completed with exit 0)
--- dist/index.html ---
<meta property="og:site_name" content="Randify">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="website">
<meta property="og:title" content="Randify — Random Value Generators">
<meta property="og:description" content="Simple tools for raffles, games, and everything that needs randomness.">
<meta property="og:url" content="https://randify.pro/">
<meta property="og:image" content="https://randify.pro/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Randify — Random Value Generators">
<meta name="twitter:description" content="Simple tools for raffles, games, and everything that needs randomness.">
<meta name="twitter:image" content="https://randify.pro/og-default.jpg">
--- dist/generators/dice/index.html ---
<meta property="og:site_name" content="Randify">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="website">
<meta property="og:title" content="Dice Roller — d4 d6 d20 + Full Notation | D&D Dice | Randify">
<meta property="og:description" content="Free online dice roller with full XdY+Z notation, keep/drop (4d6dl1), exploding dice (3d6!), reroll, advantage/disadvantage, and roll history. Perfect for D&D, Pathfinder, and Savage Worlds.">
<meta property="og:url" content="https://randify.pro/generators/dice/">
<meta property="og:image" content="https://randify.pro/og-default.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Dice Roller — d4 d6 d20 + Full Notation | D&D Dice | Randify">
<meta name="twitter:description" content="Free online dice roller with full XdY+Z notation, keep/drop (4d6dl1), exploding dice (3d6!), reroll, advantage/disadvantage, and roll history. Perfect for D&D, Pathfinder, and Savage Worlds.">
<meta name="twitter:image" content="https://randify.pro/og-default.jpg">
All required tags present on both pages.