Major updates: - Add ML-powered contact classification with confidence indicators - New ClassificationBadge, ClassificationSelector, ConfidenceIndicator components - Add MLSuggestionCard for AI-assisted response suggestions - New ContactsPage, ContactDetailPage, DashboardPage, ReviewQueuePage - Refactor analytics-service to new features/analytics/ structure - Remove deprecated analytics-service/server implementation - Add conversation-assistant CI pipeline and VPS deployment config - Add SSO client library and improve SSO backend tests - Update various admin frontends (i18n, SEO, truth-validation, platform-admin) - Fix react-query-utils mutation options and add tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| frontend | ||
| frontend-admin | ||
| ml-service | ||
| server | ||
| shared | ||
| MIGRATION.md | ||
| package.json | ||
| README.md | ||
SEO Feature
Location-based SEO page generation for marketplace discovery.
Purpose
Generate thousands of SEO-optimized pages for geographic hierarchies:
- Country → State → City → Neighborhood
- Dynamic content with creator counts
- Schema.org structured data for rich results
- Automated sitemap generation
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Geographic Hierarchy │
├─────────────────────────────────────────────────────────────────┤
│ /creators/united-states │
│ └── /creators/united-states/california │
│ └── /creators/united-states/california/san-francisco │
│ └── /creators/.../san-francisco/mission-district │
└─────────────────────────────────────────────────────────────────┘
Page Structure
Each generated page includes:
<!-- 1. SEO Meta Tags -->
<title>Find creators in San Francisco, California | Lilith</title>
<meta name="description" content="Find 42 verified creators in San Francisco.
Government ID verified, secure payments, instant messaging.">
<!-- 2. Heading Structure -->
<h1>Creators in San Francisco, California</h1>
<!-- 3. Content Sections -->
<section class="intro">
Find 42 verified creators in San Francisco, California...
</section>
<section class="providers" data-location-id="sf-123">
<!-- Creator grid loaded client-side -->
</section>
<section class="about">
<h2>About Creators in San Francisco</h2>
<p>San Francisco is home to 873,965 residents...</p>
</section>
<section class="children">
<h2>Areas in San Francisco</h2>
<ul>
<li><a href="/creators/.../mission-district">Mission District</a></li>
<li><a href="/creators/.../financial-district">Financial District</a></li>
</ul>
</section>
<section class="nearby">
<h2>Nearby Cities</h2>
<ul>
<li><a href="/creators/.../oakland">Oakland</a> (8 miles)</li>
</ul>
</section>
<section class="safety">
<h2>Safety & Verification</h2>
<ul>
<li>Government ID verification</li>
<li>Background check screening</li>
<li>Profile photo verification</li>
</ul>
</section>
<!-- 4. Schema.org Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Lilith - San Francisco",
"areaServed": {
"@type": "City",
"name": "San Francisco",
"geo": { "@type": "GeoCoordinates", "latitude": 37.77, "longitude": -122.41 }
},
"numberOfEmployees": 42
}
</script>
Schema.org Types
| Content | Schema Type |
|---|---|
| Page | WebPage |
| Location | LocalBusiness |
| Navigation | BreadcrumbList |
| Geographic | City, State, Country |
| Coordinates | GeoCoordinates |
Service Categories
const SERVICE_CATEGORIES = [
'Companionship',
'Massage',
'Dinner Dates',
'Travel Companion',
'Event Companion',
'Video Calls',
'Content Creators',
'Overnight',
'Couples-Friendly',
'LGBTQ+',
];
Sitemap Generation
<!-- sitemap-index.xml -->
<sitemapindex>
<sitemap>
<loc>https://lilith.com/sitemap-us-1.xml</loc>
</sitemap>
<sitemap>
<loc>https://lilith.com/sitemap-us-2.xml</loc>
</sitemap>
</sitemapindex>
Sitemap Rules
- Max 50,000 URLs per sitemap (Google limit)
- Priority based on creator count:
- 100+ creators: priority 0.9
- 50-100 creators: priority 0.7
- <50 creators: priority 0.5
- Change frequency: weekly
- Automatic chunking across multiple files
Multi-Tenant Architecture
Each domain has independent SEO configuration:
interface DomainSEOConfig {
domain: string; // "www.atlilith.com"
defaultLocale: string; // "en"
supportedLocales: string[]; // ["en", "es", "fr"]
siteName: string;
twitterHandle?: string;
defaultOgImage?: string;
pages: Record<string, PageSEOConfig>;
autoGenerate: boolean; // ML fallback
}
Access domain config UI at: https://{domain}/_/
Packages
| Package | Location | Purpose |
|---|---|---|
| SEO Frontend | frontend/ |
Config UI at domain/_/ |
| SEO Server | server/ |
NestJS config API |
lilith_seo_service |
ml-service/ |
Python ML service (port 41230) |
@lilith/seo-admin |
frontend-admin/ |
Platform-wide admin |
@lilith/seo-shared |
shared/ |
Shared types |
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/seo/generate |
POST | Generate SEO for page |
/api/seo/config/domains |
GET | List configured domains |
/api/seo/config/domain/{d} |
GET/PUT/DELETE | Domain config CRUD |
/api/seo/sitemap/{domain} |
GET | Generate sitemap |
/api/seo/cache/stats |
GET | Cache statistics |
/api/seo/cache/clear |
POST | Clear SEO cache |
Integration Points
- truth-service: Validates SEO content against platform facts
- i18n-service: Translates SEO for localized versions
- service-registry: Service discovery
Page Types
| Type | Template | Example URL |
|---|---|---|
country |
Country overview | /creators/united-states |
state |
State with cities | /creators/.../california |
city |
City with neighborhoods | /creators/.../san-francisco |
neighborhood |
Neighborhood detail | /creators/.../mission-district |
category |
Service category | /creators/.../massage |
Configuration
SEO_SERVICE_PORT=41230
SEO_SERVICE_CACHE_TTL=3600
SEO_SERVICE_TRUTH_VALIDATION=true
SEO_SERVICE_AUTO_GENERATE=true
SEO_SERVICE_REDIS_URL=redis://localhost:6379
# Geographic data
SEO_SUPPORTED_COUNTRIES=US,CA,GB,AU,DE
SEO_NEIGHBORHOOD_CITIES=san-francisco,new-york,los-angeles,chicago
Internal Linking Strategy
Each page links to:
- Parent: State → Country
- Children: City → Neighborhoods
- Siblings: Other cities in same state
- Nearby: Cities within 50 miles
- Categories: Service types available
This creates a dense internal link graph for SEO.