# Safeteb — Meshkee website context
Next.js storefront for **safeteb.com** (RTL, Persian). Uses the Meshkee Website API for CMS-managed static images and favicon.
## Environment
| Variable | Purpose |
|----------|---------|
| `NEXT_PUBLIC_DOMAIN` or `NEXT_PUBLIC_WEBSITE_DOMAIN` | Apex domain (`safeteb.com`) |
| `NEXT_PUBLIC_API_BASE_URL` or `NEXT_PUBLIC_MESHKEE_API_BASE` | API base (`https://api.meshkee.com/api/v1`) |
| `NEXT_PUBLIC_CUSTOMER_DASHBOARD_URL` | Customer portal URL |
## Meshkee integration
### Static images
- **Fetch:** `GET /tenants/safeteb.com/website/static-images?pageKey=home`
- **Catalog (dashboard refresh):** `GET /meshkee/static-image-slots`
- **Implementation:** `src/lib/static-images.ts` + homepage in `src/app/page.tsx`
Homepage slot keys (match by `key`):
| Key | Section | Kind | Count |
|-----|---------|------|-------|
| `slider` | Hero slider | list (duplicatable) | — |
| `four-icon` | Hero quick links | list | 4 |
| `two-banner` | Hero promo row | list | 2 |
| `online-program-banner` | Online program image | single | 1 |
| `four-link-icon` | Services icons | list | 4 |
| `medical-plants-banner` | Medicinal plants image | single | 1 |
| `two-banner` (2nd occurrence) | Lower promo row | list | 2 |
| `about-us-banner` | About section image | single | 1 |
Rules:
- Use `slot.images` — all images if `kind=list`, first if `kind=single`.
- `url` → `
`. `linkUrl` → wrap in ``.
- Empty slot or API failure → keep local placeholder from `public/images/`.
- Use `slot.aspectRatio` from API; catalog ratios in `STATIC_IMAGE_SLOTS` must stay in sync when layout changes.
### Favicon
- **Fetch:** `GET /tenants/safeteb.com/website/favicon` → `{ faviconUrl, logoUrl, ... }`
- **Layout:** `src/app/layout.tsx` uses `faviconUrl` when set; otherwise `/favicon.png`.
### SEO + sitemap
- **Do not ship** `public/sitemap.xml` or `public/robots.txt` — nginx proxies both to the Meshkee API.
- **Sitemap config:** `GET /meshkee/sitemap-config.json` (generated at build via `scripts/generate-sitemap-config.mjs`).
- **On-page SEO:** unique title + meta description per page (`src/lib/seo.ts`), one H1 per page, meaningful image `alt` text.
- **After deploy:** business dashboard → Website → Settings → Sync sitemap config.
## Pages
- `/` — Home (static-image slots wired)
- `/about` — About
- `/contact` — Contact
## AI prompt reference
Latest images-placeholder prompt:
https://api.meshkee.com/api/v1/public/ai-prompts/safeteb/images-placeholder/67da3a9c5a81b4c50d53768c
Latest SEO prompt:
https://api.meshkee.com/api/v1/public/ai-prompts/safeteb/seo/52c03d5a636374e28da417cd
## Docs
- Meshkee Website API: https://api.meshkee.com/docs/website
- OpenAPI: https://api.meshkee.com/docs/website/openapi.json