diff --git a/.claude/prompt/seo-landing-pages.md b/.claude/prompt/seo-landing-pages.md
new file mode 100644
index 00000000..ecff266f
--- /dev/null
+++ b/.claude/prompt/seo-landing-pages.md
@@ -0,0 +1,325 @@
+# هفت لندینگپیج سئویی با تم صفحهٔ اصلی
+
+## زمینه
+
+سایت عمومی کلینیکپرو الان فقط یک صفحه دارد: `/` که با
+`src/Shared/Controller/HomeController.php` رندر میشود و کل محتوایش در یک فایل
+۹۹۳ خطی `templates/public/home.html.twig` هاردکد است — شامل `
` کامل، متای سئو،
+JSON-LD، هدر، شش بخش محتوا، مودال ثبتنام و فوتر.
+
+`sitemap.xml` هم فقط همان یک URL را دارد
+(`src/Shared/Controller/SeoController.php`).
+
+برای هفت کلیدواژهٔ تجاری، هفت صفحهٔ فرود جدا لازم است. هرکدام باید عنوان، توضیحات،
+canonical، `h1` و متن مخصوص خودش را داشته باشد، ولی ظاهرش دقیقاً همان تم صفحهٔ اصلی
+باشد.
+
+## مشکل / هدف
+
+هفت لندینگ با این کلیدواژهها:
+
+| کلیدواژه | آدرس |
+|---|---|
+| نرمافزار مدیریت کلینیک زیبایی | `/نرم-افزار-مدیریت-کلینیک-زیبایی` |
+| نرمافزار مدیریت کلینیک دندانپزشکی | `/نرم-افزار-مدیریت-کلینیک-دندانپزشکی` |
+| نرمافزار مدیریت کلینیک فیزیوتراپی | `/نرم-افزار-مدیریت-کلینیک-فیزیوتراپی` |
+| سیستمهای جامع درمانگاهی | `/سیستم-جامع-درمانگاهی` |
+| نرمافزار مجانی مدیریت کلینیک | `/نرم-افزار-رایگان-مدیریت-کلینیک` |
+| نرمافزار مدیریت مطب | `/نرم-افزار-مدیریت-مطب` |
+| CRM کلینیکها | `/crm-کلینیک` |
+
+**تصمیم معماری (تأییدشده):** یک قالب مشترک + رجیستری PHP. کپیکردن
+`home.html.twig` هفت بار یعنی هر تغییر تم باید هشت بار تکرار شود و بعد از دو ماه هشت
+نسخهٔ واگرا داریم. متن هر صفحه داده است، نه کد.
+
+## معیار پذیرش
+
+- ✅ موفق: `GET /نرم-افزار-مدیریت-کلینیک-زیبایی` → ۲۰۰ با `` و
+ `` و `` و `
` مخصوص همان صفحه؛
+ ظاهرش همان تم صفحهٔ اصلی است (همان CSS، همان هدر و فوتر)؛ مودال «ثبت نام» باز
+ میشود و فرمش به `/api/v1/pre-registration` ارسال میکند.
+- ❌ خطا: `GET /یک-اسلاگ-ناموجود` → ۴۰۴ استاندارد Symfony، نه صفحهٔ خالی و نه ۲۰۰
+ با محتوای پیشفرض.
+- ⚠️ مرزی: `GET /sitemap.xml` هر هشت URL را دارد (خانه + هفت لندینگ) و XML معتبر
+ است؛ هیچ دو صفحهای `title` یا `h1` یا `canonical` یکسان ندارند؛ روی دامنهٔ
+ `.ddev.site` مقدار `robots.txt` همچنان `Disallow: /` میماند.
+
+## فایلهای مرتبط
+
+| فایل | نقش |
+|------|-----|
+| `src/Shared/Controller/HomeController.php` | کنترلر فعلی صفحهٔ اصلی |
+| `src/Shared/Controller/SeoController.php` | robots.txt و sitemap.xml — باید لندینگها را بشناسد |
+| `templates/public/home.html.twig` | تم مرجع؛ هدر، فوتر، مودال و بخشها از اینجا میآیند |
+| `assets/home/styles.css` | تمام کلاسهای تم (`hero`, `fcols`, `band`, `devices`, `specs`, `btn-*`, `wrap`) |
+| `webpack.config.js` | entry بهنام `home` که لندینگها هم از آن استفاده میکنند |
+| `src/Shared/Landing/` | **جدید** — رجیستری و مدل لندینگ |
+| `templates/public/landing.html.twig` | **جدید** — قالب مشترک |
+| `templates/public/_reg_modal.html.twig` | **جدید** — مودال ثبتنام، مشترک بین خانه و لندینگها |
+
+## وضعیت فعلی
+
+کنترلر فعلی:
+
+```php
+class HomeController extends AbstractController
+{
+ public function __construct(private readonly AltchaService $altcha) {}
+
+ #[Route('/', name: 'home', methods: ['GET'])]
+ public function index(): Response
+ {
+ return $this->render('public/home.html.twig', [
+ 'altcha_enabled' => $this->altcha->enabled(),
+ ]);
+ }
+}
+```
+
+`sitemap.xml` فقط یک URL دارد:
+
+```php
+ #[Route('/sitemap.xml', name: 'seo_sitemap', methods: ['GET'])]
+ public function sitemap(Request $request): Response
+ {
+ $base = $request->getSchemeAndHttpHost();
+ $xml = '' . "\n"
+ . '' . "\n"
+ . ' ' . "\n"
+ . " {$base}/\n"
+ . ' weekly' . "\n"
+ . ' 1.0' . "\n"
+ . ' ' . "\n"
+ . '' . "\n";
+```
+
+اسکلت صفحهٔ اصلی — خطوطی که مرزهای قابل استخراجاند:
+
+```
+ 66: {{ encore_entry_link_tags('home') }}
+ 74: … تا 99
+101: … تا 744
+600:
diff --git a/templates/public/_reg_modal.html.twig b/templates/public/_reg_modal.html.twig
new file mode 100644
index 00000000..4d040b9e
--- /dev/null
+++ b/templates/public/_reg_modal.html.twig
@@ -0,0 +1,240 @@
+
+