Skip to main content
The Taxonomy System is a proprietary 6-concept classification framework designed to organize adult content with semantic precision. It powers auto-tagging, content search, performance analytics, and cross-platform content strategy.

Overview

Total tags: 3,208 classified across 6 super-concepts Purpose: Enables creators to:
  • Auto-tag uploaded media for fast organization
  • Analyze which content themes perform best on each platform
  • Search their library by mood, activity, aesthetic, etc.
  • Generate platform-optimized captions based on tag patterns
Implementation: Tags are stored in taxonomy_mapping collection, linked to taxonomy_dimensions (the 6 concepts).

The 6 Concepts

ConceptDescriptionExample Tags
AestheticVisual style and themeglamour, luxury, vintage, gothic, minimalist, neon, cyberpunk
ActivityWhat’s happening in the contentposing, dancing, workout, cooking, gaming, bathing, teasing
MoodEmotional tone and energyconfident, playful, seductive, shy, dominant, submissive, mysterious
SettingLocation and environmentindoor, outdoor, bedroom, bathroom, kitchen, gym, beach, car
AttireClothing and accessorieslingerie, swimwear, latex, leather, cosplay, uniform, casual, nude
Body TypePhysical attributesathletic, curvy, petite, plus-size, tall, muscular, slim

How It Works

1. Tag Assignment

Tags are assigned to content via:
  • AI classification: scout-fast-tag:latest model (custom SmolLM fine-tune)
  • Manual tagging: Creators can add/remove tags in Media Library UI
  • ACTION flow: [ACTION:taxonomy-tag:{"media_id":"uuid"}]
AI Classification Pipeline:

2. Storage Schema

taxonomy_dimensions (6 rows)
{
  "id": "uuid",
  "name": "aesthetic",
  "description": "Visual style and theme",
  "sort_order": 1
}
taxonomy_mapping (3,208 rows)
{
  "id": "uuid",
  "dimension_id": "uuid",  // FK to taxonomy_dimensions
  "tag": "glamour",
  "description": "Luxurious, high-end visual presentation",
  "parent_tag": null,  // For hierarchical tags
  "platform_weight": {
    "onlyfans": 1.2,
    "fansly": 1.0,
    "instagram": 0.8
  }
}
taxonomy_assignments (junction table)
{
  "id": "uuid",
  "media_id": "uuid",  // FK to scraped_media
  "tag_id": "uuid",    // FK to taxonomy_mapping
  "confidence": 0.92,  // AI confidence score
  "source": "ai",      // 'ai' | 'manual' | 'bulk'
  "created_at": "2026-03-04T12:00:00Z"
}

3. Tag Weighting

Each tag has platform-specific weights to account for performance differences: Example: glamour tag
  • OnlyFans: 1.2 (performs 20% better than baseline)
  • Fansly: 1.0 (baseline performance)
  • Instagram: 0.8 (underperforms due to algorithm)
Weights are used by:
  • post-create ACTION flow (selects high-weight tags for captions)
  • Analytics dashboards (filters low-performing content)
  • Content strategy recommendations

Tag Hierarchy

Some concepts support hierarchical tags:
aesthetic
  └─ luxury
      ├─ glamour
      ├─ high-fashion
      └─ designer
  └─ vintage
      ├─ retro
      ├─ 80s
      └─ pin-up
Storage: parent_tag field in taxonomy_mapping references another tag’s ID Inference: When a child tag is assigned, the parent is implicitly included in search/filters

Use Cases

Auto-Tagging Workflow

  1. Creator uploads 50 photos to Media Library
  2. Dashboard triggers [ACTION:taxonomy-tag:{"media_id":"..."}] for each
  3. scout-fast-tag classifies all 50 in ~25 seconds
  4. Tags written to taxonomy_assignments with confidence scores
  5. Creator reviews low-confidence tags (less than 0.7) and corrects if needed

Performance Analysis

Query: “Which aesthetic performs best on OnlyFans?”
SELECT 
  tm.tag,
  AVG(sm.likes) as avg_likes,
  COUNT(*) as post_count
FROM taxonomy_assignments ta
JOIN taxonomy_mapping tm ON ta.tag_id = tm.id
JOIN taxonomy_dimensions td ON tm.dimension_id = td.id
JOIN scraped_media sm ON ta.media_id = sm.id
WHERE td.name = 'aesthetic'
  AND sm.platform = 'onlyfans'
GROUP BY tm.tag
ORDER BY avg_likes DESC
LIMIT 10;
Query: “Show me all confident, glamour bedroom content”
{
  "filter": {
    "taxonomy_assignments": {
      "tag_id": {
        "_in": [
          "<confident_tag_uuid>",
          "<glamour_tag_uuid>",
          "<bedroom_tag_uuid>"
        ]
      }
    }
  }
}

Caption Generation

ACTION flow: post-create
  1. Fetch media tags from taxonomy_assignments
  2. Filter to high-weight tags for target platform
  3. Pass to dolphin-mistral:7b with prompt:
    Write a seductive OnlyFans caption for an image with these tags:
    - aesthetic: glamour, luxury
    - mood: confident
    - attire: lingerie
    - setting: bedroom
    
  4. Model outputs platform-optimized caption

Tag Sources

The 3,208 tags were compiled from:
  • OnlyFans top 1000 creators: Scraped captions and hashtags
  • Adult content research: Industry-standard categorization
  • Manual curation: Deduplicated, normalized, weighted
  • User feedback: Iteratively refined based on creator input

AI Models Used

ModelRoleSpeedAccuracy
scout-fast-tag:latestPrimary classifier~500ms/image92% (on test set)
phi-3.5:latestFallback classifier~3-5s/image89% (more robust on edge cases)
Training data: 50,000 manually-tagged images from OnlyFans, Fansly, and ManyVids Fine-tuning: Custom LoRA on SmolLM base model (1.2B parameters)

Platform-Specific Optimizations

OnlyFans

High-performing tags:
  • aesthetic: glamour, luxury, intimate
  • mood: seductive, confident, playful
  • attire: lingerie, swimwear, latex
Caption style: Direct, teasing, heavy emoji use

Fansly

High-performing tags:
  • aesthetic: artistic, gothic, cosplay
  • mood: mysterious, dominant, creative
  • attire: cosplay, latex, alternative
Caption style: Narrative, character-driven, fan interaction

Instagram (SFW subset)

Allowed tags (NSFW tags excluded):
  • aesthetic: minimalist, vintage, luxury
  • mood: confident, playful, inspiring
  • attire: casual, swimwear, athletic
Caption style: Aspirational, behind-the-scenes, lifestyle

API Access

Read Tags for Media

GET /api/directus/items/taxonomy_assignments
  ?filter[media_id][_eq]=<uuid>
  &fields=*,tag_id.tag,tag_id.dimension_id.name

Assign Tag (Manual)

POST /api/directus/items/taxonomy_assignments
{
  "media_id": "<uuid>",
  "tag_id": "<uuid>",
  "confidence": 1.0,
  "source": "manual"
}

Trigger AI Tagging

POST /api/llm/chat
{
  "message": "[ACTION:taxonomy-tag:{\"media_id\":\"<uuid>\"}]"
}

Roadmap

Planned Enhancements

  • Tag suggestions: “Creators who tagged X also tagged Y”
  • Multi-language tags: Spanish, French, German translations
  • Video tags: Temporal tags (“first 10s: teasing, 10-30s: reveal”)
  • Audio tags: Music genre, spoken content, ASMR categories
  • Engagement prediction: ML model predicts likes based on tag combination

Known Limitations

  • Context blind: Tags describe what’s in frame, not why (“Is this teasing or artistic?”)
  • Cultural bias: Optimized for Western platforms (OnlyFans, Fansly)
  • No temporal tags: Video content treated as single frame
  • Binary mood: Can’t capture mixed moods (“playful but dominant”)

  • Ollama Models — scout-fast-tag and phi-3.5 classifiers
  • Action Runnertaxonomy-tag flow definition
  • Collections:
    • taxonomy_dimensions — 6 super-concepts
    • taxonomy_mapping — 3,208 tags
    • taxonomy_assignments — Media ↔ Tag junction table
  • Graph data: Nodes/Universe/taxonomy_graph.json — 3,205-node graph (legacy format)

Build docs developers (and LLMs) love