kawader-cine1.odoo.com · Audit run 2026-04-15 · Automated probes + manual analysishttps://kawader-cine1.odoo.com (or the recovered domain once transferred)
— 1-line Odoo website setting change, immediate SEO impact."Home | Kawader-Rentals" in
English even though the body content is fully Arabic. Fix in i18n_translations.py.--kw-border-hover, --kw-text-secondary,
--kw-green-soft, --kw-red-soft) and merge the near-duplicate grays.<label> elements on the 17 shop filter checkboxes (critical a11y; 1 template fix).rgba(143, 67, 163, X) uses as named opacity tokens..kw-product-card blocks across homepage.css / shop.css / product.css / components.css
into components.css only..kw-feedback-float, .kw-mobile-cta, .kw-process__steps
(currently forces direction: ltr, breaking 1→2→3→4 narrative in Arabic).| Finding | Detail | Recommendation |
|---|---|---|
| Unused tokens | 4 tokens defined, 0 references | Delete --kw-border-hover, --kw-text-secondary, --kw-green-soft, --kw-red-soft |
| Near-duplicate grays | --kw-text-muted: #4b5563 vs --kw-text-secondary: #3f3f46 (ΔE≈8, not distinguishable) |
Merge to single --kw-text-muted |
| Raw purple opacities | 51 uses of rgba(143, 67, 163, X) across 9 CSS files |
Tokenize: --kw-purple-8, --kw-purple-12, --kw-purple-25, --kw-purple-40 |
| Hardcoded state colors | #7a3a8e (hover), #6b3280 (active) inline |
Add --kw-royal-purple-hover, --kw-royal-purple-active |
Current: 40 unique font-size values across 9 CSS files. 9 cluster in a 0.17rem range (0.58, 0.6, 0.62, 0.65, 0.68, 0.7, 0.75, 0.78, 0.8rem) — visual chaos with no rhythm.
Proposed scale:
--fs-xs: 0.7rem (11.2 px) --fs-sm: 0.8rem (12.8 px) --fs-base: 0.875rem (14 px) --fs-md: 1rem (16 px) --fs-lg: 1.125rem (18 px) --fs-xl: 1.25rem (20 px) --fs-2xl: 1.5rem (24 px) --fs-hero: clamp(2rem, 4vw + 1rem, 3.5rem)
Current: 35 unique spacing/gap values. 10+ cluster in 0.2–0.7rem range.
Proposed 8px-base scale:
--sp-1: 0.25rem (4px) --sp-2: 0.5rem (8px) --sp-3: 0.75rem (12px) --sp-4: 1rem (16px) --sp-5: 1.5rem (24px) --sp-6: 2rem (32px) --sp-7: 3rem (48px) --sp-8: 4rem (64px)
| Component | Files where defined | Target |
|---|---|---|
.kw-product-card* | homepage.css, shop.css, product.css, components.css (6 blocks) | Consolidate into components.css |
.kw-price-card* | homepage.css, product.css | Consolidate into components.css |
.kw-date-chip* | product.css, components.css | Consolidate into components.css |
These are observed against the live site without survey data; confidence is directional, not quantitative.
| Leak | Where | Fix |
|---|---|---|
| No hero value-prop | Homepage renders a YouTube video (autoplay, muted) as hero with no text overlay stating what Kawader does | Overlay H1 + subhead + primary CTA on hero video |
| No trust signals on Home | No testimonials, no client logos, no press, no certifications visible above the fold | Logo strip of past clients (PSIFF, any broadcast partners); pull 2–3 testimonials from WhatsApp / email |
| Shop page has no H1 | Products page: 0 h1 elements, just category + product grid | Add <h1>Rental Catalog</h1> or localized equivalent |
| Cart pre-checkout opacity | Cart shows item + price but dates are editable inline without confirmation step | Add visible "Rental Period: 14 Apr → 21 Apr (7 days)" summary card |
| No "Why Kawader" section | No explanation of differentiation (equipment quality, film-industry focus, delivery, insurance) | Add 3-up value-prop band below hero |
| Pricing page not linked from hero | Pricing is reachable only via top nav; homepage CTAs skip it | Add secondary CTA "See Pricing Tiers" on hero |
Axe-core results (WCAG 2.1 AA) across 6 routes × 2 locales × 2 viewports = 24 runs:
| Severity | Total nodes | Top rules |
|---|---|---|
| Critical | 50 | label (form elements must have labels — 50 nodes, mostly shop filter checkboxes + contact form inputs) |
| Serious | 16 | role-img-alt (10 nodes), aria-prohibited-attr (4), scrollable-region-focusable (2) |
| Moderate | 0 | — |
| Minor | 0 | — |
Shop page filter checkboxes and the contact form inputs are missing <label for=...> associations.
On EN+AR desktop runs, shop shows 17 unlabeled form elements; contact shows 4.
Fix in the QWeb templates (shop filter widget is an Odoo stock view;
may require a snippet override or the existing brand/js/a11y-shim.js to extend its reach to filter checkboxes).
Decorative images marked role="img" without aria-label. Usually fixable by either
removing the role="img" (if truly decorative) or adding aria-label="" describing the image.
Per-page axe HTML reports under outputs/audits/design-audit-20260415-225451/a11y/.
| Gap | Observed | Fix |
|---|---|---|
AR <title> untranslated | All 6 AR routes render "Home | Kawader-Rentals" etc. in English |
Add title-tag translations to i18n_translations.py; push via i18n_translate_pages.py |
Canonical uses /ar_001/ | Six AR canonicals use the Odoo locale code | Map to /ar/ via website rewrite or canonical override |
.kw-process__steps { direction: ltr } | Forces LTR on AR Our Services page, breaking the 1→2→3→4 visual flow for Arabic readers | Remove direction override; let parent [dir="rtl"] flip naturally |
| No hreflang alternates | 0 cross-links between EN and AR equivalents in <head> |
Emit <link rel="alternate" hreflang="ar" href="/ar/..."> and vice-versa |
| RTL CSS gaps | Known: .kw-feedback-float, .kw-mobile-cta, .kw-loading*, .kw-empty-state* |
Add per-component RTL rules to brand/css/rtl.css |
| Page | Requests | Total KB | Load (ms) | Heaviest type |
|---|---|---|---|---|
| / | 65 | 10,407 KB | 3,225 | script 6,102 KB (14 reqs) |
| /shop/…aputure… | 25 | 4,626 KB | 2,035 | script — (Odoo bundles) |
Frontend JS: 802 KB wire / 2.77 MB decoded. Frontend CSS: 138 KB wire / 740 KB decoded. These are Odoo's consolidated bundles — not directly shrinkable without dropping modules, but reasonable for v18.
Sampled 5 products: average primary-image weight ~20 KB. Image optimization is not a priority.
Homepage hero uses a live autoplay YouTube embed — contributes ~450 KB document + multiple xhr/fetch calls to youtube.com. On mobile (or slow networks) this is the largest LCP blocker. Replace with a poster image + click-to-play (lazy YouTube loader).
Requires CRUX_KEY env var (Google API key). Re-run CRUX_KEY=... node tools/odoo/audit/perf_probe.js
to capture 75th-percentile LCP/CLS/INP from real visitors.
0 JSON-LD blocks across all 12 routes (6 EN + 6 AR). Priority snippets:
<!-- Home + Contact: LocalBusiness -->
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://kawader-cine.com/#org",
"name": "Cine Kawader For Artistic Productions",
"alternateName": "Kawader Art Productions & Film Services",
"url": "https://kawader-cine.com",
"telephone": "+970 59 958 8521",
"email": "management@kawader-cine.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "Al-Omaryoon St. 25",
"addressLocality": "Ramallah",
"addressRegion": "West Bank",
"addressCountry": "PS"
},
"geo": { "@type": "GeoCoordinates", "latitude": 31.9040, "longitude": 35.2033 },
"taxID": "562789826"
}
<!-- Product pages -->
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Aputure LS 600d Pro Daylight LED Monolight (V-Mount)",
"image": "...primary carousel image src...",
"brand": { "@type": "Brand", "name": "Aputure" },
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "... (daily rental rate) ...",
"availability": "https://schema.org/InStock",
"url": "..."
}
}
https://www.kawader-cine.com/ — the Squarespace domain Kawader
is currently recovering. Search engines will de-rank the Odoo storefront and point to the abandoned site.
Fix in website settings: update the base URL to https://kawader-cine1.odoo.com/
(or the recovered domain post-transfer)./ar_001/ — Odoo's internal locale slug, not the public /ar/ path.<link rel="alternate" hreflang=...> between EN and AR equivalents.robots.txt: 118 B, 200 OKsitemap.xml: 55 KB, 200 OK — URLs point to kawader-cine1.odoo.com (mismatch with canonical).--kw-text-muted / --kw-text-secondary.rgba(143, 67, 163, X) uses as --kw-purple-{8,12,25,40}.--kw-royal-purple-hover, --kw-royal-purple-active; replace 2 hardcoded hex values.<title> translations to i18n_translations.py.hreflang alternates between EN and AR equivalents.a11y-shim.js or fix QWeb..kw-process__steps { direction: ltr } on AR..kw-feedback-float, .kw-mobile-cta, .kw-loading*, .kw-empty-state*.role-img-alt — add aria-label="" to 10 decorative-image nodes..kw-product-card* across 4 CSS files → single definition in components.css..kw-price-card*, .kw-date-chip*.pages_builder.py (163 inline style="..." attrs per prior audit) into brand/css/contact.css etc.outputs/audits/image-orientation-20260415-224057/ — A1 portrait/landscape audit (5% portrait / 40 products)outputs/audits/design-audit-20260415-225451/B3-a11y-summary.json — axe-core rollupoutputs/audits/design-audit-20260415-225451/a11y/ — 24 per-page axe HTML reportsoutputs/audits/design-audit-20260415-225451/B5-perf.json — perf probe + bundle sizes + waterfallsoutputs/audits/design-audit-20260415-225451/B6-seo.json / B6-seo.md — SEO + schema audittools/odoo/audit/{a11y_axe,perf_probe,seo_schema,image_orientation,console_sweep,e2e_flow,image_sweep,link_crawl}.js — re-runnable probes