Skip to content

Website Audit

Audit Date: 2026-02-19 Audited By: Claude Code (Opus 4) Scope: Full codebase (36 source files, 15 CSS files, 110+ assets, 8 components, 22 pages) Live Site: https://urwhats.com (all 8 public pages fetched and analyzed)


CategoryScoreKey Issues
Architecture & Packages8/10Lean dependencies, clean structure
UI/UX Design7/10CTA hidden on mobile, no 404 page
Content Quality5/10Legal contradictions, thin FAQs, fake reviews
SEO4/10CRITICAL: Meta descriptions broken on live site
Accessibility5/10Color contrast fails WCAG, no skip link
Performance7/10Unused CSS bloat (style.css 8000 lines)
Security8/10Good CSP, but unsafe-inline/eval in CSP
i18n / Localization7/10Good Arabic, but duplicated page files

These are actively hurting the website RIGHT NOW:

BUG 1: All Meta Descriptions Show Raw i18n Keys

Section titled “BUG 1: All Meta Descriptions Show Raw i18n Keys”
  • Severity: CRITICAL (SEO destroyed)
  • URL: Every page except homepage
  • Evidence: <meta name="description" content="meta.services.html.description">
  • Cause: SEO.astro builds translation key with .html in the path (e.g., meta.services.html.description instead of meta.services.description)
  • Impact: Google indexes gibberish descriptions, OG/Twitter sharing broken, AI crawlers get nonsense
  • Fix: Debug page name extraction in SEO.astro — the Astro pathname includes .html on some pages
Section titled “BUG 2: Arabic Language Switcher Links to /.html (404)”
  • Severity: CRITICAL
  • URL: /ar (Arabic homepage)
  • Evidence: <a href="/.html">EN</a> in the navigation
  • Cause: getLanguageSwitchLink() in page.config.ts generates empty slug + .html for the homepage
  • Impact: Arabic users cannot switch to English from the homepage
  • Severity: CRITICAL (SEO)
  • URL: All Arabic pages
  • Evidence: <link rel="alternate" hreflang="ar" href="https://urwhats.com/ar/.html">
  • Cause: Same slug extraction bug as BUG 1
  • Impact: Google cannot properly index bilingual pages, may cause duplicate content penalties

BUG 4: Canonical URL Broken on Arabic Homepage

Section titled “BUG 4: Canonical URL Broken on Arabic Homepage”
  • Severity: HIGH
  • URL: /ar
  • Evidence: <link rel="canonical" href="https://urwhats.com/ar.html">
  • Expected: https://urwhats.com/ar
  • Severity: HIGH
  • File: public/assets/images/logos/urWhats-og-image.png (referenced in SEO.astro but does not exist)
  • Impact: Social sharing on Facebook, Twitter, LinkedIn shows no preview image

  • Minimal dependency footprint (3 prod + 3 dev npm packages)
  • Astro 5.16 + static output — excellent for marketing site
  • Clean separation: config, components, layouts, models, utils
  • TypeScript strict mode with path aliases
  • Comprehensive CSS design token system in custom-overrides.css
#IssueSeverityFile
1No ESLint or Prettier configuredMediumRoot
2Alpine.js loaded from CDN with wildcard @3.x.x — no version pinMediumLayout.astro
3Duplicate sitemap: static public/sitemap.xml AND dynamic src/pages/sitemap-index.xml.tsMediumBoth
4Service Worker cache stuck at v1 with no auto-bustingMediumsw.js
5Plans.astro (583 lines) is dead code — fully commented outLowPlans.astro
6Unused CSS files: 4 color themes (red, sky, yellow), 4 font CSS files never loadedLowpublic/assets/css/

  • Professional design system with CSS custom properties (18 colors, 8 spacing tokens)
  • Consistent green brand identity (#45b33d)
  • 5 responsive breakpoints
  • Full RTL support
  • Scroll animations via IntersectionObserver
  • Floating WhatsApp FAB on all pages
#IssueSeverityFile
1”Start Free Trial” CTA hidden on mobile (d-none d-md-block)HIGHNavigation.astro
2Solution cards “Learn More” all link to /faqs instead of /servicesMediumindex.astro
3No 404 page existsMediumMissing
4Mobile nav drawer has no backdrop/overlayMediumNavigation.astro
5Duplicate illustrations: platform.png used for 2 different servicesMediumservices.astro
6No CTA buttons on /services, /use-cases, /faqs pagesMediumMultiple
7”Choose Plan” links go to /contact, not app.urwhats.com/registerHIGHDynamicPlans.astro
8Inconsistent breakpoints (768px vs 767px for same threshold)LowMultiple

  • Arabic translation quality is above average (not machine-translated for main sections)
  • Good hero statistics (10x results, 98% delivery, 5x conversion)
  • FAQ structure covers 5 categories
#IssueSeverityDetails
1Privacy Policy says Dubai/UAE, Terms say Saudi ArabiaCRITICALContradictory legal jurisdiction
2AggregateRating 4.8/5 from 150 reviews — no sourceHIGHRisk of Google manual action
3Pricing page (en.json) shows different model than homepageHIGH3 plans with “Projects” vs 4 plans with “Users”
4Meta Technical Provider not mentioned anywhereHIGHBiggest trust signal missing
530+ compound word typos in byIndustry/byRole sectionsMedium”highintent”, “nocode”, “followups” etc.
6”7/24” instead of “24/7” (3 instances)Mediumen.json lines 345, 352, 358
7Arabic apps page title says “urWave” instead of “urWhats”Mediumar.json line 576
8Arabic phone number formatted backwards in privacy policyMediumar.json line 75: 971-509056326+
9Duplicate FAQ content between homepage and FAQs pageLowSame questions copy-pasted
10Trailing spaces in multiple translation valuesLowen.json lines 98, 127, 130

  • 7 JSON-LD schemas per page
  • Per-page unique titles in both languages
  • Proper hreflang structure (when URLs aren’t broken)
  • AI-specific meta tags and llms.txt files
  • Comprehensive robots.txt
#IssueSeverity
1All meta descriptions show raw i18n keys on live siteCRITICAL
2Broken hreflang URLs (append .html)CRITICAL
3Broken canonical URL on Arabic pagesHIGH
4Missing OG imageHIGH
5Fake AggregateRating could trigger Google manual actionHIGH
6Duplicate robots meta tag in headMedium
7URL casing inconsistency: /Privacy and /Terms vs lowercase everything elseMedium
8Duplicate sitemapsMedium
9Static dateModified in WebPage schema (hardcoded, never updates)Medium
10SearchAction target points to /contact?q= (not a real search)Low

  • <html lang> and dir set correctly per language
  • Form accessibility: labels, aria-required, role=“alert”
  • prefers-reduced-motion support
  • 44px minimum touch targets on mobile
  • :focus-visible styles defined
#IssueWCAGSeverity
1No skip navigation link (CSS exists, HTML missing)2.4.1HIGH
2Green #45b33d fails WCAG AA on white (3.2:1 ratio, needs 4.5:1)1.4.3HIGH
3Alpine.js price updates not announced to screen readers4.1.3Medium
4Accordion buttons missing aria-expanded4.1.2Medium
5Mobile hamburger doesn’t trap focus2.4.3Medium
6Images without width/height cause CLSN/AMedium
7Pricing toggle has no aria-pressed4.1.2Medium

  • Static HTML (no server runtime)
  • Vendor chunk splitting (Bootstrap separate)
  • 1-year immutable cache on static assets
  • Service Worker with stale-while-revalidate
  • Lazy image loading
#IssueSeverity
1style.css is 8000+ lines of unoptimized theme CSS (~200KB)HIGH
2Bootstrap CSS fully loaded (~200KB) but only ~30% usedMedium
3Alpine.js loaded on every page but only used on /pricesLow
45 CSS files loaded sequentially in headMedium
5PNG illustrations could be WebP (50-70% smaller)Medium

  • Comprehensive CSP header
  • HSTS with preload (1 year)
  • X-Frame-Options: DENY
  • Contact info obfuscation
  • Cloudflare Turnstile CAPTCHA
  • noopener noreferrer on external links
#IssueSeverity
1’unsafe-inline’ and ‘unsafe-eval’ in CSP script-srcHIGH
2Formspree endpoint exposed (expected for client-side, but noted)Low

  • Full bilingual EN/AR with mirrored page structure
  • RTL support in every component
  • Language switcher preserves current page
  • Arabic font (Tajawal) loaded for RTL only
#IssueSeverity
111 duplicated page files (Arabic mirrors) — could use dynamic [lang] routeMedium
2No fallback if translation key missing (shows raw key path)Medium
3Translation files in public/ — exposed at /assets/i18n/en.jsonLow
4HTML mixed into translation stringsLow