- Add back-to-generators link on EN and RU blog index pages
- Update all 16 blog post dates to 2026-05-14 with staggered times
- Sync EN and RU post dates so matching topics have identical timestamps
- Delete extra test-post.md (scope creep from F4)
- Fix EN blog index: strip 'en/' prefix from post.id in links
- Fix RU blog index: strip 'ru/' prefix from post.id in links
- Fix schema URLs in both blog indices to use clean slugs
- Install @astrojs/rss and setup content collections (blog + generators)
- Create BlogLayout with BlogPosting schema, article OG tags, prev/next nav
- Create blog post pages EN/RU ([slug].astro) with dynamic routing
- Create blog index pages EN/RU with post cards and filtering
- Create RSS feeds EN/RU with auto-discovery links
- Create generator category pages EN/RU (5 categories each)
- Add category navigation pills to homepage
- Create Breadcrumbs, RelatedGenerators, RelatedPosts components
- Add breadcrumbs to GeneratorLayout and BlogLayout
- Wire RelatedGenerators into GeneratorLayout
- Wire RelatedPosts into blog post pages
- Create 8 EN + 8 RU blog post templates with placeholder content
- Add blog link to LanguageSwitcher navigation
- Add category and blog translation keys
- Add category field to generatorSchema (required, 5 values)
- Assign categories to all 28 generators
- Add Organization JSON-LD schema to BaseLayout
- Create custom 404 pages (EN + RU)
- Add not-found and blog translation keys
- refactor(generators): migrate Teams, Time, Uuid, Weighted to crypto random
- refactor(generators): migrate WheelSpinner, YesNo to crypto random
All 28 generators now use cryptographically secure random via src/lib/client/random.ts
- refactor(generators): migrate Gradient, Hash, Letter, List to crypto random
- refactor(generators): migrate Lorem, Lottery, Magic8Ball to crypto random
- refactor(generators): migrate Card, Coin, Color, Country to crypto random
- refactor(generators): migrate Date, Emoji, FontPair to crypto random
- refactor(dice): deduplicate DiceGenerator by importing from dice-engine.ts
- Reduce font size: 8px mobile / 10px desktop
- Tighten padding and max-width for earlier line breaks
- Lower text with mt-5 for wider triangle area
- Widen triangle clip-path: 50% 12%, 94% 92%, 6% 92%
- Color Palette: 7 harmony modes (Random, Analogous, Complementary,
Triadic, Monochromatic, Split-Complementary, Tetradic), 3-8 colors,
individual swatch copy + copy all
- Lorem Ipsum: 1-20 paragraphs, Short/Medium/Long length,
optional classic start, full a11y support
- Random Country: 40 countries, region filter, flag emoji + capital
+ population, bilingual data
- Weighted Random: dynamic item-weight rows, validation,
single pick + N-trials with statistics bars
All generators include EN/RU i18n, SEO metadata, FAQ, and follow
project patterns.
New generators:
- Yes or No — random Yes/No/Maybe with confidence bar
- Random Name — male/female/any names (EN + RU databases)
- Team Splitter — split list into random teams
- Random Letter — A-Z / А-Я alphabet picker
- Random Date — date between two dates
- Rock Paper Scissors — play against random bot
Also added:
- Privacy Policy page (/privacy, /ru/privacy)
- FAQ blocks on all 16 generators (3 Q&A each, EN+RU)
- About page (/about, /ru/about)
- Improved Yandex RTB ad placement with min-height placeholder
- Navigation: About + Privacy links in LanguageSwitcher
Build: 38 pages, all passing
- Add About page (/about, /ru/about) with mission, history, contacts
- Add FaqBlock component for generator FAQ sections
- Add FAQ to all 10 generators (3 Q&A each, EN+RU)
- Expand howTo/whenTo content on numbers, password, coin generators
- Add About link to LanguageSwitcher navigation
- Improve Yandex RTB ad block: min-height placeholder, no layout shift
- Extend generator schema with optional faq/ruFaq fields
- Update translations.ts with about and faq i18n keys
- Generate 192x192, 512x512 and Apple touch icons from favicon.svg
- Add web app manifest (manifest.json)
- Add service worker with network-first for HTML, cache-first for assets
- Register SW in BaseLayout
- Add theme-color meta and apple-touch-icon link
- Add src/lib/client/clipboard.ts with CopyFeedback class
- Add src/lib/client/validation.ts with createErrorDisplay and isInteger
- Add src/lib/client/animations.ts with popElement
- Refactor NumberGenerator, LotteryGenerator, PasswordGenerator,
ListGenerator, CardGenerator, CoinGenerator, UuidGenerator,
WheelSpinner to use shared utilities
- Leave DiceGenerator and ColorGenerator untouched (complex patterns)
- Add Astro native i18n routing (prefixDefaultLocale: false)
- Introduce GeneratorLayout to deduplicate all generator pages
- Enrich generator data with pageTitle, ruPageTitle, howTo/whenTo arrays
- Make EN and RU generator pages identical using @/ path aliases
- Extract analytics (Yandex Metrika + Top.Mail.Ru) into Analytics.astro
- Move tracker IDs to src/data/config.ts, inject via define:vars
- Migrate generator metadata to Content Collections (src/content/generators/*.json)
- Add Zod schema with .strict() validation in src/lib/generator-schema.ts
- Update CLAUDE.md with new conventions
- Inline dice engine: XdY±Z, keep/drop (4d6dl1), exploding (3d6!), penetrating (!p), reroll (r1, ro1, r<3)
- Notation input with real-time validation and bidirectional sync with controls
- Advantage/Disadvantage toggle with smart disable when count>1 or keep/drop present
- 6 presets: Attack, Damage, Fireball, Sneak Attack, Stat Roll (4d6dl1), Savage Strike (2d6!)
- Roll history with dropped strikethrough, explosion chains, reroll arrows
- Updated SEO title/description and When-to-use blocks (EN+RU)
Adds XdY+Z notation parsing with bidirectional sync, 3-way advantage/disadvantage
toggle, last-10 roll history in sessionStorage, and D&D quick presets (Attack,
Damage, Fireball, Sneak Attack, Stat Roll). Updates SEO meta and SeoBlock content
in both EN and RU pages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The dynamic [slug].astro imported all 10 generator components, causing Astro
to bundle all their scripts into every Russian page. Scripts then crashed
trying to find DOM elements that don't exist on the page.
Each Russian generator page now imports only its own component, matching
the English page structure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New i18n system: src/i18n/translations.ts with en/ru translation objects
- LanguageSwitcher component (fixed top-right EN/RU toggle)
- BaseLayout updated with lang prop, hreflang links, auto-redirect for Russian browsers
- All 10 generator components updated to use T.* translations
- GeneratorCard updated to show ruTitle/ruDescription and link to /ru/ routes
- SeoBlock updated with translated section headers
- New /ru/ home page and /ru/generators/[slug] dynamic route (all 10 generators)
- Russian SEO content (howTo/whenTo) for all generator pages
- English pages explicitly pass lang="en"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each page now has a subtle text section with keyword-rich content
for search engine indexing, without disrupting the tool UX.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>