platform-codebase/features/seo
Quinn Ftw 4bf0c27b28 feat: ML classification for conversation-assistant and analytics refactor
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>
2025-12-29 17:13:54 -08:00
..
frontend refactor(seo): migrate to feature-sliced architecture 2025-12-29 03:57:28 -08:00
frontend-admin feat: ML classification for conversation-assistant and analytics refactor 2025-12-29 17:13:54 -08:00
ml-service refactor(seo): migrate to feature-sliced architecture 2025-12-29 03:57:28 -08:00
server feat: ML classification for conversation-assistant and analytics refactor 2025-12-29 17:13:54 -08:00
shared refactor(seo): migrate to feature-sliced architecture 2025-12-29 03:57:28 -08:00
MIGRATION.md docs(features): add migration documentation for i18n, seo, and truth-validation 2025-12-29 05:11:24 -08:00
package.json refactor(seo): migrate to feature-sliced architecture 2025-12-29 03:57:28 -08:00
README.md docs(features): add migration documentation for i18n, seo, and truth-validation 2025-12-29 05:11:24 -08:00

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:

  1. Parent: State → Country
  2. Children: City → Neighborhoods
  3. Siblings: Other cities in same state
  4. Nearby: Cities within 50 miles
  5. Categories: Service types available

This creates a dense internal link graph for SEO.