From 60d50e15e45e800ed983b0e54db529bccb41d770 Mon Sep 17 00:00:00 2001 From: Najjar Date: Mon, 6 Jul 2026 13:45:38 +0400 Subject: [PATCH] feat(seo): robots.txt, richer sitemap, llms.txt, manifest, OG image, JSON-LD - Add app/robots.ts (allow crawl, disallow admin/api, sitemap URL) - Expand sitemap to industries/[slug], accessories/[slug] and more static routes - Add public/llms.txt (AI summary), site.webmanifest, 1200x630 og.jpg - Layout: default OG/Twitter image, manifest, robots meta, Organization + WebSite JSON-LD - Robot pages: canonical, OG image, Product + BreadcrumbList JSON-LD; home canonical Co-Authored-By: Claude Opus 4.8 (1M context) --- public/llms.txt | 34 ++++++++++ public/og.jpg | Bin 0 -> 34383 bytes public/site.webmanifest | 16 +++++ src/app/layout.tsx | 18 ++++++ src/app/page.tsx | 1 + src/app/robots.ts | 16 +++++ src/app/robots/[slug]/page.tsx | 28 ++++++++- src/app/sitemap.ts | 47 +++++++++----- src/components/JsonLd.tsx | 10 +++ src/lib/seo.ts | 109 +++++++++++++++++++++++++++++++++ 10 files changed, 263 insertions(+), 16 deletions(-) create mode 100644 public/llms.txt create mode 100644 public/og.jpg create mode 100644 public/site.webmanifest create mode 100644 src/app/robots.ts create mode 100644 src/components/JsonLd.tsx create mode 100644 src/lib/seo.ts diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..3832651 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,34 @@ +# YS Lootah Robotics + +> YS Lootah Robotics is the United Arab Emirates destination for selected Unitree and Pudu robotics. We sell, configure, demonstrate and deploy humanoid, quadruped, delivery, hospitality and cleaning robots for businesses across Dubai and the UAE. Part of the Yousuf Saeed Lootah Investment Group. + +## Important Pages +- [Home](https://yslootahrobotics.com/) +- [All robots](https://yslootahrobotics.com/robots/) +- [Configure your robot (3D)](https://yslootahrobotics.com/configure/) +- [Brands](https://yslootahrobotics.com/brands/) +- [Industries](https://yslootahrobotics.com/industries/) +- [Accessories](https://yslootahrobotics.com/accessories/) +- [Book a demo](https://yslootahrobotics.com/book-demo/) +- [Contact](https://yslootahrobotics.com/contact/) +- [About](https://yslootahrobotics.com/about/) + +## What we offer +- Robot sales in the UAE: humanoids (Unitree G1, H1), quadrupeds (Unitree Go2, B2), and Pudu delivery, reception and cleaning robots. +- 3D configurator: choose persona, attire, colours and accessories, preview live, then request a UAE quotation. +- Live demonstrations and showroom visits in Dubai. +- On-site deployment, integration and support across the UAE. +- Accessories and add-ons for Unitree and Pudu platforms. + +## Brands +- [Unitree Robotics](https://yslootahrobotics.com/robots/): humanoid and quadruped robots. +- [Pudu Robotics](https://yslootahrobotics.com/robots/): service, delivery and cleaning robots. + +## Industries served +Hospitality, restaurants and cafes, hotels and resorts, shopping malls, healthcare, education, security and surveillance. + +## Contact +- Email: info@yslootahrobotics.com +- Phone: +971 55 948 2728, +971 4 349 9319 +- WhatsApp: https://wa.me/971559482728 +- Location: Office 408, City Bay Business Center, Dubai, United Arab Emirates diff --git a/public/og.jpg b/public/og.jpg new file mode 100644 index 0000000000000000000000000000000000000000..358b108b19b6d7ea65f6cccd1133c53932dc2bd5 GIT binary patch literal 34383 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%0D%ZJh@TU(by z`JacU2vzuMp3czBnlY$7h1P(3E?dpkr9b{?0r47UUM}amPQg+wZy)%wu5e}Ola+?` z9nV#{nFHKgZNNT_Z4R2h!nrAQxd>1$9!=N8%WQQ?L~0XYuJ0YGy^3wlb{y_*SrRjc zg#s{W{xOa_&6YMB4ce=IZ@dzimDg^!D$fY{LF{s%LGcRtlx`$-Ze?=%uaYKWIab>| zqjz0lE3^?6$Mx2E=Tm=T5?2#;#_GVD@q0c&FC{wxse2y&UzdL+=(;`6%i>) z2yWvxT6NpHU^hi{8R+7!Q_8Tr16BIsVZvc$g;?b6A^PNp(-~V5j-+!qINCIr%_tW*?H1vMq?Y><^7c=myw9(}!zp>}L z3RD2I_#Xzw@3-S=W&a;JbB15pL_o;#T_X1j*Z6!-bO>~KS1|FDUElZm7k>Kp+X6f; zoypyoyeF0Xt?=k0x + {children} diff --git a/src/app/page.tsx b/src/app/page.tsx index 309b9b0..07b5985 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -35,6 +35,7 @@ export const metadata: Metadata = { 'robotics configuration UAE', 'robot sales and demo UAE', ], + alternates: { canonical: '/' }, }; export default function HomePage() { diff --git a/src/app/robots.ts b/src/app/robots.ts new file mode 100644 index 0000000..e148f68 --- /dev/null +++ b/src/app/robots.ts @@ -0,0 +1,16 @@ +import type { MetadataRoute } from 'next'; +import { SITE_URL } from '@/lib/seo'; + +export default function robots(): MetadataRoute.Robots { + return { + rules: [ + { + userAgent: '*', + allow: '/', + disallow: ['/admin', '/admin/', '/api/'], + }, + ], + sitemap: `${SITE_URL}/sitemap.xml`, + host: SITE_URL, + }; +} diff --git a/src/app/robots/[slug]/page.tsx b/src/app/robots/[slug]/page.tsx index 7ea61e8..23fbc33 100644 --- a/src/app/robots/[slug]/page.tsx +++ b/src/app/robots/[slug]/page.tsx @@ -11,6 +11,8 @@ import { ProductSpecTable } from '@/components/robotics/ProductSpecTable'; import { ProductGallery } from '@/components/robotics/ProductGallery'; import { MotionSection } from '@/components/ui/MotionSection'; import { ROBOTS, getRobotBySlug, BRANDS, CATEGORY_LABELS } from '@/data/robots'; +import JsonLd from '@/components/JsonLd'; +import { canonical, abs, productJsonLd, breadcrumbJsonLd } from '@/lib/seo'; type Params = { slug: string }; @@ -22,10 +24,17 @@ export async function generateMetadata({ params }: { params: Promise }): const { slug } = await params; const robot = getRobotBySlug(slug); if (!robot) return { title: 'Robot not found YS Lootah Robotics' }; + const url = canonical(`/robots/${robot.slug}`); + const img = abs(robot.image); + const title = `${robot.brandLabel} ${robot.name} Available in Dubai | YS Lootah Robotics`; + const description = `${robot.shortDescription} Available through YS Lootah Robotics in Dubai request a price or book a live demo.`; return { - title: `${robot.brandLabel} ${robot.name} Available in Dubai | YS Lootah Robotics`, - description: `${robot.shortDescription} Available through YS Lootah Robotics in Dubai request a price or book a live demo.`, + title, + description, keywords: [robot.brandLabel, robot.name, 'Dubai', 'UAE', CATEGORY_LABELS[robot.category], 'robotics'], + alternates: { canonical: url }, + openGraph: { type: 'website', url, title, description, images: [{ url: img, alt: `${robot.brandLabel} ${robot.name}` }] }, + twitter: { card: 'summary_large_image', title, description, images: [img] }, }; } @@ -37,8 +46,23 @@ export default async function RobotDetailPage({ params }: { params: Promise r.id !== robot.id && (r.brand === robot.brand || r.category === robot.category)).slice(0, 3); + const productLd = productJsonLd({ + name: `${robot.brandLabel} ${robot.name}`, + description: robot.shortDescription, + image: robot.image, + brandName: brand.name, + path: `/robots/${robot.slug}`, + category: CATEGORY_LABELS[robot.category], + }); + const crumbLd = breadcrumbJsonLd([ + { name: 'Home', path: '/' }, + { name: 'Robots', path: '/robots' }, + { name: robot.name, path: `/robots/${robot.slug}` }, + ]); + return ( <> +
diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 53073f1..fbd2782 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -1,29 +1,48 @@ import { MetadataRoute } from 'next'; import { ROBOTS } from '@/data/robots'; - -const baseUrl = 'https://yslootahrobotics.com'; +import { INDUSTRIES } from '@/data/industries'; +import { ACCESSORIES } from '@/data/accessories'; +import { SITE_URL } from '@/lib/seo'; export default function sitemap(): MetadataRoute.Sitemap { const now = new Date(); + const u = (path: string) => `${SITE_URL}${path}`; + const staticRoutes: MetadataRoute.Sitemap = [ - { url: `${baseUrl}/`, lastModified: now, changeFrequency: 'weekly', priority: 1 }, - { url: `${baseUrl}/robots/`, lastModified: now, changeFrequency: 'weekly', priority: 0.9 }, - { url: `${baseUrl}/brands/`, lastModified: now, changeFrequency: 'weekly', priority: 0.8 }, - { url: `${baseUrl}/industries/`, lastModified: now, changeFrequency: 'weekly', priority: 0.8 }, - { url: `${baseUrl}/about/`, lastModified: now, changeFrequency: 'monthly', priority: 0.6 }, - { url: `${baseUrl}/contact/`, lastModified: now, changeFrequency: 'monthly', priority: 0.7 }, - { url: `${baseUrl}/book-demo/`, lastModified: now, changeFrequency: 'monthly', priority: 0.8 }, - { url: `${baseUrl}/configure/`, lastModified: now, changeFrequency: 'monthly', priority: 0.8 }, - { url: `${baseUrl}/privacy-policy/`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 }, - { url: `${baseUrl}/terms-of-service/`, lastModified: now, changeFrequency: 'yearly', priority: 0.3 }, + { url: u('/'), lastModified: now, changeFrequency: 'weekly', priority: 1 }, + { url: u('/robots/'), lastModified: now, changeFrequency: 'weekly', priority: 0.9 }, + { url: u('/configure/'), lastModified: now, changeFrequency: 'weekly', priority: 0.9 }, + { url: u('/brands/'), lastModified: now, changeFrequency: 'weekly', priority: 0.8 }, + { url: u('/industries/'), lastModified: now, changeFrequency: 'weekly', priority: 0.8 }, + { url: u('/accessories/'), lastModified: now, changeFrequency: 'weekly', priority: 0.7 }, + { url: u('/book-demo/'), lastModified: now, changeFrequency: 'monthly', priority: 0.8 }, + { url: u('/contact/'), lastModified: now, changeFrequency: 'monthly', priority: 0.7 }, + { url: u('/about/'), lastModified: now, changeFrequency: 'monthly', priority: 0.6 }, + { url: u('/bu-sunaidah/'), lastModified: now, changeFrequency: 'monthly', priority: 0.5 }, + { url: u('/privacy-policy/'), lastModified: now, changeFrequency: 'yearly', priority: 0.3 }, + { url: u('/terms-of-service/'), lastModified: now, changeFrequency: 'yearly', priority: 0.3 }, ]; const robotRoutes: MetadataRoute.Sitemap = ROBOTS.map((r) => ({ - url: `${baseUrl}/robots/${r.slug}/`, + url: u(`/robots/${r.slug}/`), lastModified: now, changeFrequency: 'monthly', priority: 0.7, })); - return [...staticRoutes, ...robotRoutes]; + const industryRoutes: MetadataRoute.Sitemap = INDUSTRIES.map((i) => ({ + url: u(`/industries/${i.slug}/`), + lastModified: now, + changeFrequency: 'monthly', + priority: 0.6, + })); + + const accessoryRoutes: MetadataRoute.Sitemap = ACCESSORIES.map((a) => ({ + url: u(`/accessories/${a.slug}/`), + lastModified: now, + changeFrequency: 'monthly', + priority: 0.5, + })); + + return [...staticRoutes, ...robotRoutes, ...industryRoutes, ...accessoryRoutes]; } diff --git a/src/components/JsonLd.tsx b/src/components/JsonLd.tsx new file mode 100644 index 0000000..878cd43 --- /dev/null +++ b/src/components/JsonLd.tsx @@ -0,0 +1,10 @@ +// Renders a JSON-LD structured-data script tag. +export default function JsonLd({ data }: { data: object | object[] }) { + return ( +