Azerbaijan Website Build
Build a stunning, $75K+ agency-quality website from scratch for an Azerbaijani business. Every site is tri-lingual (Azerbaijani, Russian, English) with a language switcher, built on Astro 5.x + Tailwind CSS v4, and deployed to Vercel.
Quick Reference
| Item |
Value |
| Tech stack |
Astro 5.x, Tailwind CSS v4 (Vite plugin), npm |
| Languages |
Azerbaijani (primary), Russian, English |
| i18n approach |
Directory-based: /az/, /ru/, /en/ |
| Images |
Unsplash (local), scraped assets, NanoBanana 2 |
| Fonts |
@fontsource, must support Latin Extended + Cyrillic |
| Deploy |
GitHub repo → Vercel |
| Project location |
~/Azerbaijan/projects/<slug>/ |
| Quality bar |
Apple/Stripe/Linear tier. AI Slop Test must pass. |
Reference Files
Read these before building — they contain non-negotiable rules and technical specs:
references/design-rules.md — Visual design rules, banned fonts/colors/layouts, component architecture
references/accessibility-spec.md — WCAG AA requirements, contrast minimums, keyboard nav
references/i18n-spec.md — Astro i18n routing, LanguageSwitcher component, hreflang, JSON strings
references/interview-questionnaire.md — Structured interview for businesses with no online presence
references/azerbaijani-design-guide.md — Cultural design considerations, font coverage, image selection
references/nano-banana-logo.md — Logo generation via NanoBanana 2 / Gemini API
Project Structure
~/Azerbaijan/projects/<slug>/
├── BUSINESS_PROFILE.md # Phase 1 output
├── BRAND_BRIEF.md # Phase 2 output
├── SITE_PLAN.md # Phase 3 output
├── COPY_CHANGES.md # Phase 6 output
├── QA_REPORT.md # Phase 7 output
├── scraped/
│ ├── website/ # Crawled website content (markdown)
│ ├── instagram/ # Instagram data
│ ├── facebook/ # Facebook data
│ └── assets/ # Downloaded images, logos
│ ├── logos/
│ ├── photos/
│ └── gallery/
└── site/ # Astro project
├── src/
│ ├── layouts/
│ │ └── BaseLayout.astro
│ ├── pages/
│ │ ├── index.astro # Redirects to /az/
│ │ ├── az/ # Azerbaijani pages
│ │ ├── ru/ # Russian pages
│ │ └── en/ # English pages
│ ├── components/
│ │ ├── Header.astro
│ │ ├── LanguageSwitcher.astro
│ │ ├── Footer.astro
│ │ ├── Hero.astro
│ │ └── ...sections
│ ├── content/
│ │ └── i18n/
│ │ ├── az.json
│ │ ├── ru.json
│ │ └── en.json
│ ├── utils/
│ │ └── i18n.ts
│ ├── styles/
│ │ └── global.css
│ └── assets/
│ └── images/
├── public/
│ ├── images/
│ ├── favicon.svg
│ └── robots.txt
├── astro.config.mjs
└── package.json
Phase 1: Data Gathering
Output: ~/Azerbaijan/projects/<slug>/BUSINESS_PROFILE.md
Determine which input path applies and follow it. All paths produce the same standardized output.
Path A — Has Website (+ possibly social media)
Scrape the website using Apify RAG Web Browser (apify/rag-web-browser):
Query: the business website URL
maxResults: 1
outputFormats: ["markdown"]
Save markdown output to scraped/website/.
Fallback for JS-heavy sites (Wix, Squarespace, etc.): Use Chrome automation (mcp__Claude_in_Chrome) to:
- Navigate to each page
- Take screenshots
- Extract visible text via
get_page_text
- Download images
Scrape social media if available:
- Instagram: Use Apify Instagram scraper to extract bio, recent posts (last 20), all post images, follower count. Save to
scraped/instagram/.
- Facebook: Use Apify Facebook scraper or Chrome automation to extract page info, about section, services, reviews, photos. Save to
scraped/facebook/.
- Twitter/X: Check if exists. If so, extract bio and recent posts via Chrome.
Download all usable images to scraped/assets/:
- Logo (highest resolution available)
- Team/staff photos
- Product/service photos
- Interior/exterior photos
- Gallery images
- Validate: files must be >1KB (reject HTML error pages)
Compile BUSINESS_PROFILE.md from all scraped data.
Path B — Social Media Only (no website)
Instagram is primary source:
- Scrape full profile: bio, highlights, all posts (up to 50), all images
- Extract: business name, category, contact info (often in bio), location
- Download all quality images to
scraped/assets/
Facebook page:
- Extract: about section, services list, reviews/testimonials, photo albums
- Download photos
Twitter/X: Check for presence, extract bio and recent content if exists.
Identify gaps — social media alone often lacks:
- Detailed service descriptions
- Pricing information
- Team information
- Business history
- Operating hours
Flag these in BUSINESS_PROFILE.md under "Gaps to Fill" and ask the user for this information.
Compile BUSINESS_PROFILE.md.
Path C — No Online Presence (Interview)
- Read
references/interview-questionnaire.md for the full question set.
- Present questions to the user in batches (don't dump all 40 questions at once):
- Start with Business Fundamentals (name, industry, location, contact)
- Then Services & Products
- Then Brand & Visual Identity
- Then Content & Features
- Accept whatever the user provides. Minimum viable: business name, description, city, phone, 3+ services.
- Request assets: Logo file, photos, any marketing materials.
- Compile BUSINESS_PROFILE.md. Mark inferred fields with
[INFERRED] and missing fields with [NEEDED].
BUSINESS_PROFILE.md Format
# Business Profile: [Business Name]
**Data Source:** Path A (website + social) | Path B (social only) | Path C (interview)
**Date Gathered:** YYYY-MM-DD
**Slug:** [url-safe-slug]
## Business Overview
- **Name:** [Azerbaijani name]
- **Name (English):** [transliteration]
- **Industry:** [category]
- **Year Established:** [year or "Unknown"]
- **Description:** [2-3 sentences about what they do]
- **Unique Selling Points:** [what makes them different]
## Services / Products
| Service | Description | Price (if known) |
|---------|-------------|-----------------|
| ... | ... | ... |
## Target Audience
- **Primary customers:** [description]
- **Language preference:** [AZ / RU / both]
- **Geographic reach:** [local / national / international]
## Brand Personality
- **Tone:** [luxury / professional / friendly / modern / traditional / etc.]
- **Color preferences:** [if expressed or extracted]
- **Inspiration:** [competitor or admired sites]
## Contact & Location
- **Address:** [full address in Azerbaijani]
- **Phone:** [+994 XX XXX XX XX]
- **Email:** [if available]
- **Hours:** [operating hours]
- **WhatsApp:** [if available — very common in Azerbaijan]
- **Social media:**
- Instagram: [URL]
- Facebook: [URL]
- Twitter: [URL]
## Content Inventory
- **About text:** [available / needs writing]
- **Service descriptions:** [available / needs writing]
- **Testimonials:** [count, or "none available"]
- **Team info:** [available / none]
## Image Inventory
| Type | Count | Quality | Notes |
|------|-------|---------|-------|
| Logo | ... | ... | ... |
| Team photos | ... | ... | ... |
| Product photos | ... | ... | ... |
| Interior/exterior | ... | ... | ... |
| Gallery | ... | ... | ... |
## Gaps to Fill
- [ ] [list anything missing that needs to be created, sourced, or asked about]
PAUSE POINT: Present BUSINESS_PROFILE.md to the user for review before proceeding. Ask about any gaps that need filling.
Phase 2: Brand Development
Output: ~/Azerbaijan/projects/<slug>/BRAND_BRIEF.md
Read references/design-rules.md and references/azerbaijani-design-guide.md before starting.
Step 1: Logo
If business HAS a logo:
- Download/copy to
scraped/assets/logos/
- Analyze for color extraction
- Verify it's high enough resolution for web use (minimum 200px wide)
If business DOES NOT have a logo:
- Read
references/nano-banana-logo.md
- Gather inputs: business name, industry, brand personality from BUSINESS_PROFILE.md
- Generate 3 logo concepts using NanoBanana 2 via Gemini API
- Present options to user for selection
- If none are satisfactory after 3 rounds: fall back to a typographic logo using the chosen display font (styled in CSS/SVG)
- Save final logo to
scraped/assets/logos/logo.png
Step 2: Color Palette
- If logo exists: extract 2-3 dominant colors from the logo
- If no logo: develop palette from industry + brand personality
- Define the full system:
- Primary color (dominant)
- Secondary color
- Accent color (sharp, attention-grabbing)
- Background color (off-white, warm — not pure white)
- Text color (near-black, warm — not pure black)
- Neutral shades (tinted toward brand hue)
- Verify EVERY combination passes WCAG AA:
- Text on background: 4.5:1 minimum
- Large text: 3:1 minimum
- UI components: 3:1 minimum
Use
scripts/contrast-check.js to verify.
- Document as CSS custom properties with contrast ratios as comments.
Step 3: Typography
- Select a display/heading font and a body font from the verified candidates in
references/design-rules.md
- VERIFY both fonts render the Azerbaijani test string AND Cyrillic correctly
- Define the typographic scale: display, h1, h2, h3, body, small, caption
- Use fluid sizing with
clamp() for all sizes
- Install via @fontsource with correct subsets:
latin, latin-ext, cyrillic, cyrillic-ext
Step 4: Brand Voice
Define the communication tone for each language:
- Azerbaijani: [warm/formal/casual] — this is the primary voice
- Russian: Typically slightly more formal
- English: Clean, international, professional
Step 5: Brand Card
Create an HTML brand card (single HTML file) showing:
- Logo (or placeholder)
- Color palette with hex codes and contrast ratios
- Typography samples in all three languages
- Brand voice summary
- Tagline/headline suggestions in Azerbaijani
Save to project root and open for review.
Step 6: Generate DESIGN.md
After the Brand Card, produce a structured DESIGN.md using the design-system-generator skill with Azerbaijan extensions.
- Read
00-design-references/design-md-format.md for the base 9-section format.
- Select 1-2 reference DESIGN.md files from
00-design-references/references/by-aesthetic/ matching the brand direction.
- Generate DESIGN.md with all 9 standard sections PLUS Section 10: Multi-Lingual Considerations:
- Font verification test string:
"Əlaqə üçün bizə zəng edin. Ğəbul saatları: Ş. 09:00-18:00 | Связаться с нами"
- Russian text ~30% expansion accommodation rules for layouts, buttons, and navigation
- Azerbaijan cultural color notes (flag colors used subtly, gold for luxury)
- Per-language content tone (AZ: warm/formal, RU: slightly more formal, EN: clean international)
- The BRAND_BRIEF.md Color Palette and Typography sections should say "See DESIGN.md for the complete design system" — BRAND_BRIEF.md retains brand voice, logo metadata, and non-design content.
Output: ~/Azerbaijan/projects/<slug>/DESIGN.md
BRAND_BRIEF.md Format
# Brand Brief: [Business Name]
## Logo
- Source: [existing / generated / typographic]
- File: [path to logo file]
## Color Palette
| Token | Hex | Usage | Contrast vs bg |
|-------|-----|-------|----------------|
| --color-primary | #xxx | Headings, buttons | X.X:1 AA PASS |
| --color-secondary | #xxx | Accents | X.X:1 AA PASS |
| --color-accent | #xxx | CTAs, highlights | X.X:1 AA PASS |
| --color-bg | #xxx | Page background | — |
| --color-text | #xxx | Body text | X.X:1 AA PASS |
## Typography
- **Display:** [Font Name] — [weights]
- **Body:** [Font Name] — [weights]
- **Verified:** AZ characters ✓ | Cyrillic ✓
> **Note:** Complete design system specification (color tokens, typography hierarchy table, component stylings, shadow system, layout principles) is in `DESIGN.md`. The sections below are summaries — see DESIGN.md for exact values.
## Brand Voice
- **AZ:** [description]
- **RU:** [description]
- **EN:** [description]
## Aesthetic Direction
- **Tone:** [chosen aesthetic]
- **Differentiation:** [the unforgettable thing]
PAUSE POINT: Present BRAND_BRIEF.md and brand card to user for approval before proceeding.
Phase 3: Content Strategy & Site Architecture
Output: ~/Azerbaijan/projects/<slug>/SITE_PLAN.md
Step 1: Page Structure
Based on the business type and content available, define the sitemap. Typical structures:
Standard (most businesses):
- Home (
/az/, /ru/, /en/)
- About (
/az/haqqimizda/, /ru/o-nas/, /en/about/)
- Services (
/az/xidmetler/, /ru/uslugi/, /en/services/)
- Contact (
/az/elaqe/, /ru/kontakty/, /en/contact/)
Extended (if content available):
- Gallery (
/az/qalereya/, /ru/galereya/, /en/gallery/)
- Blog (
/az/bloq/, /ru/blog/, /en/blog/)
- Pricing (
/az/qiymetler/, /ru/tseny/, /en/pricing/)
- Menu (restaurants:
/az/menyu/, /ru/menyu/, /en/menu/)
Step 2: Per-Page Content Plan
For each page, define:
- Sections (Hero, About, Services grid, Testimonials, CTA, etc.)
- Copy direction in Azerbaijani (what each section should communicate)
- Image needs per section (what we have vs. what we need)
- Interactive elements (accordion, gallery lightbox, contact form, map)
Step 3: Image Strategy
Categorize all image needs:
| Section |
Image Needed |
Source |
Status |
| Hero |
Hero background |
Unsplash / NanoBanana |
[need] |
| About |
Team/office photo |
Scraped |
[have] |
| Services |
Service illustrations |
Unsplash |
[need] |
| ... |
... |
... |
... |
Download all Unsplash images NOW — before the build phase:
- Search Unsplash for each needed image
- Verify cultural appropriateness (see
references/azerbaijani-design-guide.md)
- Download to
site/src/assets/images/ (for Astro optimization) or site/public/images/ (for static)
- Name descriptively:
hero-restaurant-baku.jpg, team-working.jpg
- NEVER hotlink external URLs
Step 4: SEO Plan
- Target keywords in Azerbaijani (primary), Russian, English
- JSON-LD schema type (LocalBusiness, Restaurant, etc.)
- Meta title/description templates for each page × each language
- Sitemap strategy with hreflang alternates
SITE_PLAN.md Format
Document all of the above. This is the blueprint for the build phase.
PAUSE POINT: Present SITE_PLAN.md to user. This is the last checkpoint before building.
Phase 4: Image Curation
Output: All images organized in the Astro project
Process scraped images:
- Copy usable images from
scraped/assets/ to site/src/assets/images/
- Resize oversized images (max 2000px wide)
- Ensure quality is sufficient for web use
Download Unsplash images (per SITE_PLAN.md image strategy):
- Use Unsplash API or search via web to find appropriate images
- Download each to
site/src/assets/images/ or site/public/images/
- Follow Azerbaijan cultural image guidelines
- NEVER use external Unsplash URLs in production code
Generate images via NanoBanana 2 (if needed):
- Hero backgrounds
- Product/service imagery when no originals exist
- See
references/nano-banana-logo.md for API usage
Verify every image:
- Color temperature matches brand palette?
- Culturally appropriate for Azerbaijan?
- Right demographic for actual customer base?
- Matches the section copy, not just vaguely related?
Organize into folders:
site/src/assets/images/
├── hero/
├── about/
├── services/
├── gallery/
├── team/
└── general/
Phase 5: Build the Website
Read ALL reference files before building:
references/design-rules.md — Design rules (non-negotiable)
references/accessibility-spec.md — WCAG AA requirements
references/i18n-spec.md — i18n routing, LanguageSwitcher, hreflang
Step 1: Initialize Astro Project
cd ~/Azerbaijan/projects/<slug>
npm create astro@latest site -- --template minimal --no-install
cd site
npm install
npx astro add tailwind --yes
npx astro add sitemap --yes
npm install -D prettier
Install fonts (example):
npm install @fontsource/dm-sans @fontsource/playfair-display
Step 2: Configure Astro
In astro.config.mjs:
- Set
site to the expected Vercel URL
- Configure sitemap with i18n (see
references/i18n-spec.md)
- Configure i18n routing with
az as default locale
Step 3: Build Design System
Read the project's DESIGN.md before building the design system. Use it as the authoritative source for all CSS custom properties, font imports, typographic scale, component specs, and shadow tokens. Verify that fonts from the DESIGN.md pass the AZ/RU character verification test before proceeding.
Create src/styles/global.css:
- Import font packages
- Define ALL CSS custom properties from BRAND_BRIEF.md
- Document contrast ratios as comments
- Define typographic scale with
clamp()
- Set base styles (body, headings, links)
Step 4: Build i18n Infrastructure
From references/i18n-spec.md:
- Create
src/utils/i18n.ts with getLang(), getStrings(), switchLang(), getAlternateLinks()
- Create
src/content/i18n/az.json, ru.json, en.json with UI strings
- Create root
src/pages/index.astro that redirects to /az/
Step 5: Build Layout & Shared Components
BaseLayout.astro:
<html lang> attribute from i18n utility
<head> with hreflang links for all 3 languages + x-default
- Open Graph / Twitter Card meta (per language)
- Font imports
- Global CSS import
- View Transitions
- Skip-to-content link
Header.astro:
- Navigation links (translated via i18n strings)
- LanguageSwitcher component
- Mobile hamburger menu
- Sticky/fixed position
LanguageSwitcher.astro:
- AZ | RU | EN with flag indicators
- Preserves current page path
aria-current on active language
- See
references/i18n-spec.md for complete implementation
Footer.astro:
- Contact info from BUSINESS_PROFILE.md
- Social media links
- Copyright with current year
- All text from i18n strings
Step 6: Build Page Sections as Components
Each visually distinct section is its OWN .astro component:
Hero.astro — Full-width hero with image/overlay, headline, CTA
About.astro — Business story/description
Services.astro — Services grid/cards
Testimonials.astro — Customer quotes/reviews
CTA.astro — Call-to-action banner
Gallery.astro — Photo grid/lightbox (if applicable)
Contact.astro — Contact form, map, info
- Additional sections as needed
Each component receives language-specific content as props. The per-language page files pass the correct content to shared components.
Step 7: Build Azerbaijani Pages First
Build all pages under src/pages/az/:
az/index.astro — Homepage
az/haqqimizda.astro — About
az/xidmetler.astro — Services
az/elaqe.astro — Contact
- Additional pages per SITE_PLAN.md
Write all content in native Azerbaijani. This is the primary language — it must read naturally, not like a translation.
Step 8: Apply Design Rules
Go through references/design-rules.md checklist:
Step 9: Responsive Design
- Mobile-first: base styles for 320px+
- Breakpoints: 640px (sm), 768px (md), 1024px (lg), 1280px (xl), 1536px (2xl)
- Use
min-width media queries, NOT max-width
- Touch targets: minimum 44px height
- Verify at all breakpoints — no horizontal scrollbar
Step 10: SEO Implementation
Per page, per language:
- Unique
<title> and <meta name="description">
- JSON-LD schema (LocalBusiness or appropriate type)
- hreflang
<link> tags (see i18n-spec.md)
- Sitemap via @astrojs/sitemap with i18n alternates
robots.txt in public/
- Semantic HTML (
<main>, <nav>, <article>, <section>)
- Descriptive alt text on every image (in the page's language)
Step 11: Favicon
- Generate from logo
- At minimum:
public/favicon.svg
- Add to
<head> in BaseLayout
Phase 6: Copy & Translation
Step 1: Azerbaijani Copy (Primary)
Review all Azerbaijani page content:
- Value proposition clear within 5 seconds?
- Every page has a visible, benefit-driven CTA?
- Copy leads with benefits, not features?
- Addresses customer objections early?
- Uses specific numbers where possible?
- Short sentences for impact?
- 8th-grade reading level equivalent?
Document improvements in COPY_CHANGES.md.
Step 2: Russian Translation
Create all pages under src/pages/ru/:
- Adapt, don't translate word-for-word. Russian has different sentence structures and formality norms.
- Russian text is ~30% longer than English — verify layouts don't break
- Use proper Russian conventions (formal "вы" for business sites)
- URL slugs in Russian transliteration:
/ru/o-nas/, /ru/uslugi/, /ru/kontakty/
Step 3: English Translation
Create all pages under src/pages/en/:
- Clean, professional international English
- Standard URL slugs:
/en/about/, /en/services/, /en/contact/
- This version serves tourists, expats, and international contacts
Step 4: UI Strings
Update all three JSON files (az.json, ru.json, en.json):
- Navigation labels
- Button text (CTA, forms)
- Footer content
- Form labels and placeholders
- Error messages
- Meta descriptions
Step 5: Verify Completeness
Check every page × every language:
- No placeholder text remaining
- No untranslated strings
- No broken i18n references
- All JSON string keys used consistently
Phase 7: QA (Combined Round)
Output: ~/Azerbaijan/projects/<slug>/QA_REPORT.md
Run the dev server and systematically check everything:
cd ~/Azerbaijan/projects/<slug>/site
npm run dev
7.1 Functional QA (All 3 Languages)
7.2 Visual QA
7.3 Responsive QA (Test ALL 3 Languages at Each Viewport)
7.4 Accessibility QA
7.5 SEO QA
7.6 Content QA
7.7 Image QA
Run broken image check:
Array.from(document.querySelectorAll('img')).filter(img => !img.complete || img.naturalWidth === 0).map(img => img.src)
Fix & Reverify
Fix all issues found. Re-run checks on fixed items. Document everything in QA_REPORT.md.
Phase 8: Deployment
Step 1: Build Test
cd ~/Azerbaijan/projects/<slug>/site
npm run build
Fix any build errors. The build must succeed cleanly.
Step 2: Git Setup
cd ~/Azerbaijan/projects/<slug>/site
git init
# Ensure .gitignore exists (Astro generates one)
# Verify .env.local is in .gitignore
git add .
git commit -m "Initial build: [business name] - tri-lingual website (AZ/RU/EN)"
Step 3: GitHub
Create a new GitHub repository: <slug>-az
gh repo create <slug>-az --public --source=. --push
Step 4: Vercel
Deploy to Vercel:
npx vercel --yes
npx vercel --prod
Or connect via Vercel dashboard for auto-deploy on push.
Step 5: Live Verification
Open the live Vercel URL and verify:
Step 6: Final Accessibility Scan
Run axe-core against the LIVE URL for a final check.
Step 7: Deliver
Provide the user with:
- Live URL
- GitHub repo URL
- Summary of what was built (pages, features, languages)
Rules & Standards
Non-Negotiable
- Tri-lingual is not optional. Every page must exist in AZ, RU, and EN. Every UI string must be translated.
- Azerbaijani is the primary language. Write Azerbaijani content first. It must read natively, never like a translation.
- WCAG AA compliance. Contrast ratios verified, keyboard nav works, alt text present.
- All images local. Never hotlink external URLs. Download everything.
- Fonts must support both scripts. Latin Extended (AZ) + Cyrillic (RU). Verify before using.
- Design rules apply. See
references/design-rules.md. No banned fonts, colors, or layouts.
- AI Slop Test. If it looks like AI made it, redesign.
- Cultural appropriateness. Images, tone, and design must feel Azerbaijani, not generic American.
Technical Standards
- Astro 5.x with Tailwind CSS v4 (Vite plugin)
- npm only (not pnpm, not yarn)
- @fontsource for self-hosted fonts
- Astro
<Image> component for image optimization
- CSS-only animations (no JS animation libraries)
- View Transitions for page navigation
- Semantic HTML throughout
- Mobile-first responsive design
- Lighthouse 95+ performance target
Copy Standards
- Hook → Problem → Solution → Proof → Action (every page)
- Value proposition clear within 5 seconds
- Lead with benefits, not features
- Specific numbers > vague claims
- 8th-grade reading level equivalent
- Short sentences for impact
- Testimonials near CTAs and decision points
1---2name: azerbaijan-website-build3description: Build premium tri-lingual websites from scratch for Azerbaijani businesses. Handles data gathering (website scrape, social media, or interview), brand development, and full Astro + Tailwind build with AZ/RU/EN language support.4---56# Azerbaijan Website Build78Build a stunning, $75K+ agency-quality website from scratch for an Azerbaijani business. Every site is tri-lingual (Azerbaijani, Russian, English) with a language switcher, built on Astro 5.x + Tailwind CSS v4, and deployed to Vercel.910## Quick Reference1112| Item | Value |13|------|-------|14| Tech stack | Astro 5.x, Tailwind CSS v4 (Vite plugin), npm |15| Languages | Azerbaijani (primary), Russian, English |16| i18n approach | Directory-based: `/az/`, `/ru/`, `/en/` |17| Images | Unsplash (local), scraped assets, NanoBanana 2 |18| Fonts | @fontsource, must support Latin Extended + Cyrillic |19| Deploy | GitHub repo → Vercel |20| Project location | `~/Azerbaijan/projects/<slug>/` |21| Quality bar | Apple/Stripe/Linear tier. AI Slop Test must pass. |2223## Reference Files2425Read these before building — they contain non-negotiable rules and technical specs:2627- `references/design-rules.md` — Visual design rules, banned fonts/colors/layouts, component architecture28- `references/accessibility-spec.md` — WCAG AA requirements, contrast minimums, keyboard nav29- `references/i18n-spec.md` — Astro i18n routing, LanguageSwitcher component, hreflang, JSON strings30- `references/interview-questionnaire.md` — Structured interview for businesses with no online presence31- `references/azerbaijani-design-guide.md` — Cultural design considerations, font coverage, image selection32- `references/nano-banana-logo.md` — Logo generation via NanoBanana 2 / Gemini API3334## Project Structure3536```37~/Azerbaijan/projects/<slug>/38├── BUSINESS_PROFILE.md # Phase 1 output39├── BRAND_BRIEF.md # Phase 2 output40├── SITE_PLAN.md # Phase 3 output41├── COPY_CHANGES.md # Phase 6 output42├── QA_REPORT.md # Phase 7 output43├── scraped/44│ ├── website/ # Crawled website content (markdown)45│ ├── instagram/ # Instagram data46│ ├── facebook/ # Facebook data47│ └── assets/ # Downloaded images, logos48│ ├── logos/49│ ├── photos/50│ └── gallery/51└── site/ # Astro project52 ├── src/53 │ ├── layouts/54 │ │ └── BaseLayout.astro55 │ ├── pages/56 │ │ ├── index.astro # Redirects to /az/57 │ │ ├── az/ # Azerbaijani pages58 │ │ ├── ru/ # Russian pages59 │ │ └── en/ # English pages60 │ ├── components/61 │ │ ├── Header.astro62 │ │ ├── LanguageSwitcher.astro63 │ │ ├── Footer.astro64 │ │ ├── Hero.astro65 │ │ └── ...sections66 │ ├── content/67 │ │ └── i18n/68 │ │ ├── az.json69 │ │ ├── ru.json70 │ │ └── en.json71 │ ├── utils/72 │ │ └── i18n.ts73 │ ├── styles/74 │ │ └── global.css75 │ └── assets/76 │ └── images/77 ├── public/78 │ ├── images/79 │ ├── favicon.svg80 │ └── robots.txt81 ├── astro.config.mjs82 └── package.json83```8485---8687## Phase 1: Data Gathering8889**Output:** `~/Azerbaijan/projects/<slug>/BUSINESS_PROFILE.md`9091Determine which input path applies and follow it. All paths produce the same standardized output.9293### Path A — Has Website (+ possibly social media)94951. **Scrape the website** using Apify RAG Web Browser (`apify/rag-web-browser`):96 ```97 Query: the business website URL98 maxResults: 199 outputFormats: ["markdown"]100 ```101 Save markdown output to `scraped/website/`.1021032. **Fallback for JS-heavy sites** (Wix, Squarespace, etc.): Use Chrome automation (`mcp__Claude_in_Chrome`) to:104 - Navigate to each page105 - Take screenshots106 - Extract visible text via `get_page_text`107 - Download images1081093. **Scrape social media** if available:110 - **Instagram:** Use Apify Instagram scraper to extract bio, recent posts (last 20), all post images, follower count. Save to `scraped/instagram/`.111 - **Facebook:** Use Apify Facebook scraper or Chrome automation to extract page info, about section, services, reviews, photos. Save to `scraped/facebook/`.112 - **Twitter/X:** Check if exists. If so, extract bio and recent posts via Chrome.1131144. **Download all usable images** to `scraped/assets/`:115 - Logo (highest resolution available)116 - Team/staff photos117 - Product/service photos118 - Interior/exterior photos119 - Gallery images120 - Validate: files must be >1KB (reject HTML error pages)1211225. **Compile BUSINESS_PROFILE.md** from all scraped data.123124### Path B — Social Media Only (no website)1251261. **Instagram is primary source:**127 - Scrape full profile: bio, highlights, all posts (up to 50), all images128 - Extract: business name, category, contact info (often in bio), location129 - Download all quality images to `scraped/assets/`1301312. **Facebook page:**132 - Extract: about section, services list, reviews/testimonials, photo albums133 - Download photos1341353. **Twitter/X:** Check for presence, extract bio and recent content if exists.1361374. **Identify gaps** — social media alone often lacks:138 - Detailed service descriptions139 - Pricing information140 - Team information141 - Business history142 - Operating hours143144 Flag these in BUSINESS_PROFILE.md under "Gaps to Fill" and ask the user for this information.1451465. **Compile BUSINESS_PROFILE.md.**147148### Path C — No Online Presence (Interview)1491501. **Read `references/interview-questionnaire.md`** for the full question set.1512. **Present questions to the user** in batches (don't dump all 40 questions at once):152 - Start with Business Fundamentals (name, industry, location, contact)153 - Then Services & Products154 - Then Brand & Visual Identity155 - Then Content & Features1563. **Accept whatever the user provides.** Minimum viable: business name, description, city, phone, 3+ services.1574. **Request assets:** Logo file, photos, any marketing materials.1585. **Compile BUSINESS_PROFILE.md.** Mark inferred fields with `[INFERRED]` and missing fields with `[NEEDED]`.159160### BUSINESS_PROFILE.md Format161162```markdown163# Business Profile: [Business Name]164165**Data Source:** Path A (website + social) | Path B (social only) | Path C (interview)166**Date Gathered:** YYYY-MM-DD167**Slug:** [url-safe-slug]168169## Business Overview170- **Name:** [Azerbaijani name]171- **Name (English):** [transliteration]172- **Industry:** [category]173- **Year Established:** [year or "Unknown"]174- **Description:** [2-3 sentences about what they do]175- **Unique Selling Points:** [what makes them different]176177## Services / Products178| Service | Description | Price (if known) |179|---------|-------------|-----------------|180| ... | ... | ... |181182## Target Audience183- **Primary customers:** [description]184- **Language preference:** [AZ / RU / both]185- **Geographic reach:** [local / national / international]186187## Brand Personality188- **Tone:** [luxury / professional / friendly / modern / traditional / etc.]189- **Color preferences:** [if expressed or extracted]190- **Inspiration:** [competitor or admired sites]191192## Contact & Location193- **Address:** [full address in Azerbaijani]194- **Phone:** [+994 XX XXX XX XX]195- **Email:** [if available]196- **Hours:** [operating hours]197- **WhatsApp:** [if available — very common in Azerbaijan]198- **Social media:**199 - Instagram: [URL]200 - Facebook: [URL]201 - Twitter: [URL]202203## Content Inventory204- **About text:** [available / needs writing]205- **Service descriptions:** [available / needs writing]206- **Testimonials:** [count, or "none available"]207- **Team info:** [available / none]208209## Image Inventory210| Type | Count | Quality | Notes |211|------|-------|---------|-------|212| Logo | ... | ... | ... |213| Team photos | ... | ... | ... |214| Product photos | ... | ... | ... |215| Interior/exterior | ... | ... | ... |216| Gallery | ... | ... | ... |217218## Gaps to Fill219- [ ] [list anything missing that needs to be created, sourced, or asked about]220```221222**PAUSE POINT:** Present BUSINESS_PROFILE.md to the user for review before proceeding. Ask about any gaps that need filling.223224---225226## Phase 2: Brand Development227228**Output:** `~/Azerbaijan/projects/<slug>/BRAND_BRIEF.md`229230**Read `references/design-rules.md` and `references/azerbaijani-design-guide.md` before starting.**231232### Step 1: Logo233234**If business HAS a logo:**235- Download/copy to `scraped/assets/logos/`236- Analyze for color extraction237- Verify it's high enough resolution for web use (minimum 200px wide)238239**If business DOES NOT have a logo:**240- Read `references/nano-banana-logo.md`241- Gather inputs: business name, industry, brand personality from BUSINESS_PROFILE.md242- Generate 3 logo concepts using NanoBanana 2 via Gemini API243- Present options to user for selection244- If none are satisfactory after 3 rounds: fall back to a typographic logo using the chosen display font (styled in CSS/SVG)245- Save final logo to `scraped/assets/logos/logo.png`246247### Step 2: Color Palette2482491. If logo exists: extract 2-3 dominant colors from the logo2502. If no logo: develop palette from industry + brand personality2513. Define the full system:252 - Primary color (dominant)253 - Secondary color254 - Accent color (sharp, attention-grabbing)255 - Background color (off-white, warm — not pure white)256 - Text color (near-black, warm — not pure black)257 - Neutral shades (tinted toward brand hue)2584. **Verify EVERY combination** passes WCAG AA:259 - Text on background: 4.5:1 minimum260 - Large text: 3:1 minimum261 - UI components: 3:1 minimum262 Use `scripts/contrast-check.js` to verify.2635. Document as CSS custom properties with contrast ratios as comments.264265### Step 3: Typography2662671. Select a display/heading font and a body font from the verified candidates in `references/design-rules.md`2682. **VERIFY both fonts** render the Azerbaijani test string AND Cyrillic correctly2693. Define the typographic scale: display, h1, h2, h3, body, small, caption2704. Use fluid sizing with `clamp()` for all sizes2715. Install via @fontsource with correct subsets: `latin`, `latin-ext`, `cyrillic`, `cyrillic-ext`272273### Step 4: Brand Voice274275Define the communication tone for each language:276- **Azerbaijani:** [warm/formal/casual] — this is the primary voice277- **Russian:** Typically slightly more formal278- **English:** Clean, international, professional279280### Step 5: Brand Card281282Create an HTML brand card (single HTML file) showing:283- Logo (or placeholder)284- Color palette with hex codes and contrast ratios285- Typography samples in all three languages286- Brand voice summary287- Tagline/headline suggestions in Azerbaijani288289Save to project root and open for review.290291### Step 6: Generate DESIGN.md292293After the Brand Card, produce a structured `DESIGN.md` using the `design-system-generator` skill with Azerbaijan extensions.2942951. Read `00-design-references/design-md-format.md` for the base 9-section format.2962. Select 1-2 reference DESIGN.md files from `00-design-references/references/by-aesthetic/` matching the brand direction.2973. Generate DESIGN.md with all 9 standard sections PLUS **Section 10: Multi-Lingual Considerations**:298 - Font verification test string: `"Əlaqə üçün bizə zəng edin. Ğəbul saatları: Ş. 09:00-18:00 | Связаться с нами"`299 - Russian text ~30% expansion accommodation rules for layouts, buttons, and navigation300 - Azerbaijan cultural color notes (flag colors used subtly, gold for luxury)301 - Per-language content tone (AZ: warm/formal, RU: slightly more formal, EN: clean international)3024. The BRAND_BRIEF.md Color Palette and Typography sections should say "See DESIGN.md for the complete design system" — BRAND_BRIEF.md retains brand voice, logo metadata, and non-design content.303304**Output:** `~/Azerbaijan/projects/<slug>/DESIGN.md`305306### BRAND_BRIEF.md Format307308```markdown309# Brand Brief: [Business Name]310311## Logo312- Source: [existing / generated / typographic]313- File: [path to logo file]314315## Color Palette316| Token | Hex | Usage | Contrast vs bg |317|-------|-----|-------|----------------|318| --color-primary | #xxx | Headings, buttons | X.X:1 AA PASS |319| --color-secondary | #xxx | Accents | X.X:1 AA PASS |320| --color-accent | #xxx | CTAs, highlights | X.X:1 AA PASS |321| --color-bg | #xxx | Page background | — |322| --color-text | #xxx | Body text | X.X:1 AA PASS |323324## Typography325- **Display:** [Font Name] — [weights]326- **Body:** [Font Name] — [weights]327- **Verified:** AZ characters ✓ | Cyrillic ✓328329> **Note:** Complete design system specification (color tokens, typography hierarchy table, component stylings, shadow system, layout principles) is in `DESIGN.md`. The sections below are summaries — see DESIGN.md for exact values.330331## Brand Voice332- **AZ:** [description]333- **RU:** [description]334- **EN:** [description]335336## Aesthetic Direction337- **Tone:** [chosen aesthetic]338- **Differentiation:** [the unforgettable thing]339```340341**PAUSE POINT:** Present BRAND_BRIEF.md and brand card to user for approval before proceeding.342343---344345## Phase 3: Content Strategy & Site Architecture346347**Output:** `~/Azerbaijan/projects/<slug>/SITE_PLAN.md`348349### Step 1: Page Structure350351Based on the business type and content available, define the sitemap. Typical structures:352353**Standard (most businesses):**354- Home (`/az/`, `/ru/`, `/en/`)355- About (`/az/haqqimizda/`, `/ru/o-nas/`, `/en/about/`)356- Services (`/az/xidmetler/`, `/ru/uslugi/`, `/en/services/`)357- Contact (`/az/elaqe/`, `/ru/kontakty/`, `/en/contact/`)358359**Extended (if content available):**360- Gallery (`/az/qalereya/`, `/ru/galereya/`, `/en/gallery/`)361- Blog (`/az/bloq/`, `/ru/blog/`, `/en/blog/`)362- Pricing (`/az/qiymetler/`, `/ru/tseny/`, `/en/pricing/`)363- Menu (restaurants: `/az/menyu/`, `/ru/menyu/`, `/en/menu/`)364365### Step 2: Per-Page Content Plan366367For each page, define:368- Sections (Hero, About, Services grid, Testimonials, CTA, etc.)369- Copy direction in Azerbaijani (what each section should communicate)370- Image needs per section (what we have vs. what we need)371- Interactive elements (accordion, gallery lightbox, contact form, map)372373### Step 3: Image Strategy374375Categorize all image needs:376| Section | Image Needed | Source | Status |377|---------|-------------|--------|--------|378| Hero | Hero background | Unsplash / NanoBanana | [need] |379| About | Team/office photo | Scraped | [have] |380| Services | Service illustrations | Unsplash | [need] |381| ... | ... | ... | ... |382383**Download all Unsplash images NOW** — before the build phase:3841. Search Unsplash for each needed image3852. Verify cultural appropriateness (see `references/azerbaijani-design-guide.md`)3863. Download to `site/src/assets/images/` (for Astro optimization) or `site/public/images/` (for static)3874. Name descriptively: `hero-restaurant-baku.jpg`, `team-working.jpg`3885. NEVER hotlink external URLs389390### Step 4: SEO Plan391392- Target keywords in Azerbaijani (primary), Russian, English393- JSON-LD schema type (LocalBusiness, Restaurant, etc.)394- Meta title/description templates for each page × each language395- Sitemap strategy with hreflang alternates396397### SITE_PLAN.md Format398399Document all of the above. This is the blueprint for the build phase.400401**PAUSE POINT:** Present SITE_PLAN.md to user. This is the last checkpoint before building.402403---404405## Phase 4: Image Curation406407**Output:** All images organized in the Astro project4084091. **Process scraped images:**410 - Copy usable images from `scraped/assets/` to `site/src/assets/images/`411 - Resize oversized images (max 2000px wide)412 - Ensure quality is sufficient for web use4134142. **Download Unsplash images** (per SITE_PLAN.md image strategy):415 - Use Unsplash API or search via web to find appropriate images416 - Download each to `site/src/assets/images/` or `site/public/images/`417 - Follow Azerbaijan cultural image guidelines418 - **NEVER use external Unsplash URLs in production code**4194203. **Generate images via NanoBanana 2** (if needed):421 - Hero backgrounds422 - Product/service imagery when no originals exist423 - See `references/nano-banana-logo.md` for API usage4244254. **Verify every image:**426 - Color temperature matches brand palette?427 - Culturally appropriate for Azerbaijan?428 - Right demographic for actual customer base?429 - Matches the section copy, not just vaguely related?4304315. **Organize into folders:**432 ```433 site/src/assets/images/434 ├── hero/435 ├── about/436 ├── services/437 ├── gallery/438 ├── team/439 └── general/440 ```441442---443444## Phase 5: Build the Website445446**Read ALL reference files before building:**447- `references/design-rules.md` — Design rules (non-negotiable)448- `references/accessibility-spec.md` — WCAG AA requirements449- `references/i18n-spec.md` — i18n routing, LanguageSwitcher, hreflang450451### Step 1: Initialize Astro Project452453```bash454cd ~/Azerbaijan/projects/<slug>455npm create astro@latest site -- --template minimal --no-install456cd site457npm install458npx astro add tailwind --yes459npx astro add sitemap --yes460npm install -D prettier461```462463Install fonts (example):464```bash465npm install @fontsource/dm-sans @fontsource/playfair-display466```467468### Step 2: Configure Astro469470In `astro.config.mjs`:471- Set `site` to the expected Vercel URL472- Configure sitemap with i18n (see `references/i18n-spec.md`)473- Configure i18n routing with `az` as default locale474475### Step 3: Build Design System476477**Read the project's `DESIGN.md` before building the design system.** Use it as the authoritative source for all CSS custom properties, font imports, typographic scale, component specs, and shadow tokens. Verify that fonts from the DESIGN.md pass the AZ/RU character verification test before proceeding.478479Create `src/styles/global.css`:480- Import font packages481- Define ALL CSS custom properties from BRAND_BRIEF.md482- Document contrast ratios as comments483- Define typographic scale with `clamp()`484- Set base styles (body, headings, links)485486### Step 4: Build i18n Infrastructure487488From `references/i18n-spec.md`:489- Create `src/utils/i18n.ts` with `getLang()`, `getStrings()`, `switchLang()`, `getAlternateLinks()`490- Create `src/content/i18n/az.json`, `ru.json`, `en.json` with UI strings491- Create root `src/pages/index.astro` that redirects to `/az/`492493### Step 5: Build Layout & Shared Components4944951. **BaseLayout.astro:**496 - `<html lang>` attribute from i18n utility497 - `<head>` with hreflang links for all 3 languages + x-default498 - Open Graph / Twitter Card meta (per language)499 - Font imports500 - Global CSS import501 - View Transitions502 - Skip-to-content link5035042. **Header.astro:**505 - Navigation links (translated via i18n strings)506 - LanguageSwitcher component507 - Mobile hamburger menu508 - Sticky/fixed position5095103. **LanguageSwitcher.astro:**511 - AZ | RU | EN with flag indicators512 - Preserves current page path513 - `aria-current` on active language514 - See `references/i18n-spec.md` for complete implementation5155164. **Footer.astro:**517 - Contact info from BUSINESS_PROFILE.md518 - Social media links519 - Copyright with current year520 - All text from i18n strings521522### Step 6: Build Page Sections as Components523524Each visually distinct section is its OWN `.astro` component:525- `Hero.astro` — Full-width hero with image/overlay, headline, CTA526- `About.astro` — Business story/description527- `Services.astro` — Services grid/cards528- `Testimonials.astro` — Customer quotes/reviews529- `CTA.astro` — Call-to-action banner530- `Gallery.astro` — Photo grid/lightbox (if applicable)531- `Contact.astro` — Contact form, map, info532- Additional sections as needed533534**Each component receives language-specific content as props.** The per-language page files pass the correct content to shared components.535536### Step 7: Build Azerbaijani Pages First537538Build all pages under `src/pages/az/`:539- `az/index.astro` — Homepage540- `az/haqqimizda.astro` — About541- `az/xidmetler.astro` — Services542- `az/elaqe.astro` — Contact543- Additional pages per SITE_PLAN.md544545Write all content in **native Azerbaijani**. This is the primary language — it must read naturally, not like a translation.546547### Step 8: Apply Design Rules548549Go through `references/design-rules.md` checklist:550- [ ] 4+ different layout patterns used551- [ ] No two consecutive sections share same column structure552- [ ] Banned fonts NOT used553- [ ] Color system uses CSS custom properties554- [ ] All contrast ratios pass WCAG AA555- [ ] 3+ distinct animation types556- [ ] Scroll-triggered reveals on 2+ sections557- [ ] `prefers-reduced-motion` respected558- [ ] Visual depth (noise, gradients, SVG shapes, shadows)559- [ ] Component architecture (no monolithic pages)560- [ ] AI Slop Test: would someone think AI made this? If yes, redesign.561562### Step 9: Responsive Design563564- Mobile-first: base styles for 320px+565- Breakpoints: 640px (sm), 768px (md), 1024px (lg), 1280px (xl), 1536px (2xl)566- Use `min-width` media queries, NOT `max-width`567- Touch targets: minimum 44px height568- Verify at all breakpoints — no horizontal scrollbar569570### Step 10: SEO Implementation571572Per page, per language:573- Unique `<title>` and `<meta name="description">`574- JSON-LD schema (LocalBusiness or appropriate type)575- hreflang `<link>` tags (see i18n-spec.md)576- Sitemap via @astrojs/sitemap with i18n alternates577- `robots.txt` in `public/`578- Semantic HTML (`<main>`, `<nav>`, `<article>`, `<section>`)579- Descriptive alt text on every image (in the page's language)580581### Step 11: Favicon582583- Generate from logo584- At minimum: `public/favicon.svg`585- Add to `<head>` in BaseLayout586587---588589## Phase 6: Copy & Translation590591### Step 1: Azerbaijani Copy (Primary)592593Review all Azerbaijani page content:594- Value proposition clear within 5 seconds?595- Every page has a visible, benefit-driven CTA?596- Copy leads with benefits, not features?597- Addresses customer objections early?598- Uses specific numbers where possible?599- Short sentences for impact?600- 8th-grade reading level equivalent?601602Document improvements in `COPY_CHANGES.md`.603604### Step 2: Russian Translation605606Create all pages under `src/pages/ru/`:607- **Adapt, don't translate word-for-word.** Russian has different sentence structures and formality norms.608- Russian text is ~30% longer than English — verify layouts don't break609- Use proper Russian conventions (formal "вы" for business sites)610- URL slugs in Russian transliteration: `/ru/o-nas/`, `/ru/uslugi/`, `/ru/kontakty/`611612### Step 3: English Translation613614Create all pages under `src/pages/en/`:615- Clean, professional international English616- Standard URL slugs: `/en/about/`, `/en/services/`, `/en/contact/`617- This version serves tourists, expats, and international contacts618619### Step 4: UI Strings620621Update all three JSON files (`az.json`, `ru.json`, `en.json`):622- Navigation labels623- Button text (CTA, forms)624- Footer content625- Form labels and placeholders626- Error messages627- Meta descriptions628629### Step 5: Verify Completeness630631Check every page × every language:632- No placeholder text remaining633- No untranslated strings634- No broken i18n references635- All JSON string keys used consistently636637---638639## Phase 7: QA (Combined Round)640641**Output:** `~/Azerbaijan/projects/<slug>/QA_REPORT.md`642643Run the dev server and systematically check everything:644645```bash646cd ~/Azerbaijan/projects/<slug>/site647npm run dev648```649650### 7.1 Functional QA (All 3 Languages)651652- [ ] All navigation links work653- [ ] Language switcher works from EVERY page (preserves current page)654- [ ] Root `/` redirects to `/az/`655- [ ] All images load (no broken images)656- [ ] Contact form works (if applicable)657- [ ] Social media links open correctly658- [ ] Phone/email links work (`tel:`, `mailto:`)659- [ ] WhatsApp link works (if applicable)660- [ ] Map embed works (if applicable)661- [ ] 404 page works for all language prefixes662663### 7.2 Visual QA664665- [ ] Design rules checklist passes (4+ layouts, no banned elements)666- [ ] Animations smooth, no jank667- [ ] Consistent branding across all pages668- [ ] Images high quality, properly sized669- [ ] No "AI slop" — would a human designer sign off on this?670- [ ] Dark overlays on text-over-image sections671- [ ] Visual hierarchy clear on every page672673### 7.3 Responsive QA (Test ALL 3 Languages at Each Viewport)674675- [ ] 320px (mobile) — all languages676- [ ] 768px (tablet) — all languages677- [ ] 1024px (small desktop) — all languages678- [ ] 1280px (desktop) — all languages679- [ ] 1536px+ (large) — all languages680- [ ] No horizontal scrollbar at any viewport681- [ ] Russian text (longest) doesn't break layouts682- [ ] Touch targets ≥ 44px on mobile683- [ ] Mobile nav works correctly684685### 7.4 Accessibility QA686687- [ ] Run axe-core on every page (fix all CRITICAL/SERIOUS)688- [ ] Contrast check all color combinations (`scripts/contrast-check.js`)689- [ ] Keyboard navigation works (Tab through all interactive elements)690- [ ] Skip-to-content link present and functional691- [ ] All images have alt text (in correct language)692- [ ] `prefers-reduced-motion` disables animations693- [ ] Focus indicators visible694695### 7.5 SEO QA696697- [ ] hreflang tags correct on every page (AZ, RU, EN, x-default)698- [ ] JSON-LD schema valid per language699- [ ] Sitemap includes all pages × all languages700- [ ] robots.txt present and correct701- [ ] Unique title + meta description per page per language702- [ ] Semantic HTML used correctly703- [ ] Canonical URLs correct704705### 7.6 Content QA706707- [ ] All three languages complete — no placeholders708- [ ] Azerbaijani reads naturally (not translated-sounding)709- [ ] Russian reads naturally, proper formality710- [ ] English is clean and professional711- [ ] No untranslated UI strings712- [ ] Business info accurate (name, address, phone, hours)713714### 7.7 Image QA715716Run broken image check:717```javascript718Array.from(document.querySelectorAll('img')).filter(img => !img.complete || img.naturalWidth === 0).map(img => img.src)719```720- [ ] No broken images on any page721- [ ] No external/hotlinked image URLs722- [ ] All images optimized (Astro `<Image>` or properly sized)723724### Fix & Reverify725726Fix all issues found. Re-run checks on fixed items. Document everything in `QA_REPORT.md`.727728---729730## Phase 8: Deployment731732### Step 1: Build Test733734```bash735cd ~/Azerbaijan/projects/<slug>/site736npm run build737```738739Fix any build errors. The build must succeed cleanly.740741### Step 2: Git Setup742743```bash744cd ~/Azerbaijan/projects/<slug>/site745git init746# Ensure .gitignore exists (Astro generates one)747# Verify .env.local is in .gitignore748git add .749git commit -m "Initial build: [business name] - tri-lingual website (AZ/RU/EN)"750```751752### Step 3: GitHub753754Create a new GitHub repository: `<slug>-az`755```bash756gh repo create <slug>-az --public --source=. --push757```758759### Step 4: Vercel760761Deploy to Vercel:762```bash763npx vercel --yes764npx vercel --prod765```766767Or connect via Vercel dashboard for auto-deploy on push.768769### Step 5: Live Verification770771Open the live Vercel URL and verify:772- [ ] All three language versions load773- [ ] Language switcher works774- [ ] All images load775- [ ] Forms functional776- [ ] SSL certificate active (https)777- [ ] Performance acceptable (check Lighthouse)778779### Step 6: Final Accessibility Scan780781Run axe-core against the LIVE URL for a final check.782783### Step 7: Deliver784785Provide the user with:786- Live URL787- GitHub repo URL788- Summary of what was built (pages, features, languages)789790---791792## Rules & Standards793794### Non-Negotiable7957961. **Tri-lingual is not optional.** Every page must exist in AZ, RU, and EN. Every UI string must be translated.7972. **Azerbaijani is the primary language.** Write Azerbaijani content first. It must read natively, never like a translation.7983. **WCAG AA compliance.** Contrast ratios verified, keyboard nav works, alt text present.7994. **All images local.** Never hotlink external URLs. Download everything.8005. **Fonts must support both scripts.** Latin Extended (AZ) + Cyrillic (RU). Verify before using.8016. **Design rules apply.** See `references/design-rules.md`. No banned fonts, colors, or layouts.8027. **AI Slop Test.** If it looks like AI made it, redesign.8038. **Cultural appropriateness.** Images, tone, and design must feel Azerbaijani, not generic American.804805### Technical Standards806807- **Astro 5.x** with Tailwind CSS v4 (Vite plugin)808- **npm** only (not pnpm, not yarn)809- **@fontsource** for self-hosted fonts810- **Astro `<Image>`** component for image optimization811- **CSS-only animations** (no JS animation libraries)812- **View Transitions** for page navigation813- **Semantic HTML** throughout814- **Mobile-first** responsive design815- **Lighthouse 95+** performance target816817### Copy Standards818819- Hook → Problem → Solution → Proof → Action (every page)820- Value proposition clear within 5 seconds821- Lead with benefits, not features822- Specific numbers > vague claims823- 8th-grade reading level equivalent824- Short sentences for impact825- Testimonials near CTAs and decision points