# Character ENGINE — Complete Platform Documentation for AI Agents > AI character management platform powering a synthetic local media network. Built by Mornings in the Lab (MiTL) Studios as a standalone module in the ConversationOS ecosystem. Character ENGINE is the source of truth for all character data, storyworld data, and content generation across the MiTL network. It powers desk.mornings.live (The Desk), universe.mitl.studio (The Universe), globe.mornings.live (The Globe), and mitl.news (city-level local news). --- ## Platform Statistics - 155+ AI Correspondent Characters - 311 API Routes - 55 Database Tables - 84 Cities Covered - 32 NHL Teams + 32 NFL Teams - 8 Automated Publishing Pipelines - 10 Deep Intel Dashboards - 5 Production Studio Tools (Image, Video, Avatar, Voice, Media Queue) ## Deployed Domains - universe.mitl.studio — Character ENGINE admin + public showcase - desk.mornings.live — The Desk (newspaper-style news site) - globe.mornings.live — The Globe (3D interactive story map) - mitl.news — City-level local news with subdomain routing ({city}.mitl.news) ## Technology Stack - Backend: Express.js (Node.js) - Database: SQLite (55 tables) - AI (Content Generation): Google Gemini (gemini-2.5-flash) - AI (Image Generation): Nano Banana Pro (gemini-3-pro-image-preview) - AI (Video Generation): Veo 3.1, Grok - AI (Avatars): Runway ML - AI (Voice): ElevenLabs - AI (Investigative Agent): Harry (Claude-powered internal agent) - Social Distribution: Buffer (GraphQL API) - Editorial Intake: Notion API - Video Editing: Descript API - Design: Canva API - Infrastructure: Railway (auto-deploy from GitHub) - Authentication: JWT (admin), X-API-Key (external integrations), bcrypt password hashing --- ## Core Module 1: Character Management ### Character CRUD Full create, read, update, delete for all 155+ characters. Each character has: - Identity: name, role, status (active/inactive/archived), team, city, beat - Visual: profile image, portrait gallery, image provenance tracking - Personality: voice patterns, personality traits, backstory - DNA Profile: auto-extracted physical appearance, personality keywords, visual sentences from character bible - Voice: ElevenLabs voice ID, preview capability - Storyworld: universe membership, role within universe - Shows: linked show assignments ### Character DNA System The character DNA engine parses each character's bible into structured data: - Physical traits (body, build, hair, face, eyes, skin, glasses, tattoos, etc.) - Personality traits (energy, attitude, communication style) - Visual sentences extracted via keyword matching - Wardrobe/appearance description (up to 400 chars) - Role, team, city context Used by Thumbnail ENGINE for accurate character likeness in generated images. ### Key Characters | Character | Role | Beat | |-----------|------|------| | Kaith | Primary MiTL host | Morning show | | Jonai | Primary MiTL host | Morning show | | Sterling James | Correspondent | Trending Topics | | Preston Vale | Correspondent | Trending Topics | | Sophia Grant | AI Agent | Guest ENGINE host (Center Stage) | | Frankie | Correspondent | GEMS Evening Shorts | | Tommy | Correspondent | GEMS Evening Shorts | | Maya Reyes | Correspondent | Culture, Community Corner | | Mack Hewston | AI Agent | Internal showrunner (46 tools) | | Harry | AI Agent | Investigative intelligence | | Dr. Peter Parkher | Correspondent | Investigative journalism | | Knox Halden | Correspondent | Deep intel | | Atlas | Correspondent | Wire | | Beatrice | Correspondent | Wire | | Zola | Correspondent | Wire | Plus 140+ city-level, NHL, and NFL correspondents. ### API Endpoints (Character) - POST /api/auth/login — Admin authentication - GET /api/characters — List all characters (admin, full data) - GET /api/characters/public — Public character list (safe fields only) - GET /api/characters/:id — Character detail (admin) - POST /api/characters — Create character - PUT /api/characters/:id — Update character - DELETE /api/characters/:id — Delete character - GET /api/character-dna/:charId — Get character DNA profile - PUT /api/character-dna/:charId — Update character DNA - POST /api/character-dna/:charId/auto-extract — AI auto-extract DNA from bible - GET /api/character-intelligence — Character analytics and intelligence - GET /api/character-threads — Character conversation threads - POST /api/character-generate — Generate character content - PUT /api/characters/:id/voice — Assign ElevenLabs voice ### Public API v1 (Characters) - GET /api/v1/characters — List all characters (public, filterable by team, city, status, role) - GET /api/v1/characters/:id — Character detail with full profile - GET /api/v1/characters/:id/brain — Character brain/DNA data - GET /api/v1/brain — Global brain/DNA data - GET /api/v1/characters/:id/gallery — Character image gallery - GET /api/v1/characters/:id/provenance — Image provenance records - GET /api/v1/leaderboard — Character activity leaderboard - GET /api/v1/rivalries — Character rivalry data - GET /api/v1/word-cloud — Character word cloud data - GET /api/v1/correspondents — List all correspondents (public-safe fields) --- ## Core Module 2: Universe & Storyworld System ### Universe Management Fictional universes with lore, arcs, episodes, relationships, and canon management. - Universe CRUD with DNA profiles - Auto-extracted universe DNA from universe bible - Image gallery per universe with cover image designation - Universe-level image generation - Image provenance tracking ### Storyworld Features - Story arcs with lifecycle tracking - Canon entries for world-building rules - Episode management within universes - Character relationship mapping - Membership management (character ↔ universe with role assignments) ### API Endpoints (Universes) Admin: - GET /api/universes — List universes - GET /api/universes/:id — Universe detail - POST /api/universes — Create universe - PUT /api/universes/:id — Update universe - DELETE /api/universes/:id — Delete universe - GET /api/universe-dna/:universeId — Universe DNA - PUT /api/universe-dna/:universeId — Update DNA - POST /api/universe-dna/:universeId/auto-extract — AI auto-extract DNA - GET/POST/DELETE /api/universe-gallery/:universeId — Gallery management - PUT /api/universe-gallery/:universeId/:imageId/cover — Set cover image - POST /api/universe-generate — Generate universe content Storyworld: - GET /api/storyworld — Get storyworld data - PUT /api/storyworld — Update storyworld - POST/PUT/DELETE /api/storyworld/arcs — Arc management - POST/PUT/DELETE /api/storyworld/canon — Canon management - POST/PUT/DELETE /api/storyworld/episodes — Episode management - POST/PUT/DELETE /api/storyworld/relationships — Relationship management - POST /api/generate-story-arc — AI story arc generation Memberships & Licenses: - GET/POST/PUT/DELETE /api/memberships — Character-universe memberships - GET/POST/PUT/DELETE /api/universe-licenses — Universe licensing - GET/POST/PUT/DELETE /api/licenses — Character licensing Public v1: - GET /api/v1/universes — List universes - GET /api/v1/universes/:id — Universe detail - GET /api/v1/universes/:id/characters — Characters in universe - GET /api/v1/universes/:id/gallery — Universe gallery - GET /api/v1/universes/:id/provenance — Image provenance - GET /api/v1/universes/:id/rules — Universe rules/canon --- ## Core Module 3: Content Generation & Publishing ### AI Content Generation Character-voiced content generation powered by Google Gemini: - POST /api/v1/content/generate — Generate character-voiced content (articles, takes, stories) - Input: character ID, topic, content type, optional context - Output: character-voiced text maintaining personality, voice patterns, and beat alignment ### Content Studio Story draft pipeline: AI generation → editorial queue → publish - GET /api/v1/stories — List stories - POST /api/v1/stories/create — Create story draft ### Feed Hub Centralized content aggregation and curation: - GET /api/feed-hub — List feed items - POST /api/feed-hub/items — Create feed item - PATCH /api/feed-hub/items/:id — Update feed item - DELETE /api/feed-hub/items/:id — Delete feed item - POST /api/feed-hub/takes — Generate takes for feed ### Takes System Published correspondent takes: - GET /api/takes/published — List published takes - GET /api/takes/snapshot — Current takes snapshot - PATCH /api/takes/:id — Update take - DELETE /api/takes/:id — Delete take - POST /api/takes/merge — Merge duplicate takes - POST /api/takes/publish — Publish a take --- ## Core Module 4: 8 Automated Publishing Pipelines All pipelines run on Railway cron schedules: ### Pipeline 1 — NHL Sports Desk - Schedule: 11:30 PM CDT (late night scores) - Source: ESPN NHL API - Output: Game recaps, scores, standings for all 32 NHL teams - Endpoints: GET /api/nhl/scores/:date, GET /api/nhl/schedule/:date - Autopublish: POST /api/autopublish/late-night ### Pipeline 2 — NFL Sports Desk - Schedule: Sunday late night + Monday morning - Source: ESPN NFL API - Output: Game recaps, standings, transactions, news - Endpoints: GET /api/nfl/scoreboard, GET /api/nfl/standings, GET /api/nfl/transactions, GET /api/nfl/news - Autopublish: POST /api/autopublish/nfl/morning, POST /api/autopublish/nfl/late-night ### Pipeline 3 — The Feed (26+ Characters) - Schedule: 6:00–7:15 AM CDT daily - Source: Google Gemini + character DNA - Output: Character-voiced morning takes from 26+ correspondents - Autopublish: POST /api/autopublish/feed/morning ### Pipeline 4 — Civic (City Hall) - Schedule: Daily morning - Source: Municipal open data (Socrata SODA, CKAN) for 49 Canadian cities - Output: Council votes, building permits, 311 data, lobbyist registries, expense disclosures - Autopublish: POST /api/autopublish/civic/publish - Intelligence: POST /api/autopublish/civic/intelligence, POST /api/autopublish/civic/intelligence/monitor ### Pipeline 5 — The Desk (Notion Intake) - Schedule: Daily morning - Source: Notion databases (Conversation Desk, Morning Loop) - Output: Correspondent reactions to daily headlines - Autopublish: POST /api/autopublish/desk/publish ### Pipeline 6 — The Wire - Schedule: Daily morning - Source: AI generation from city context + current events - Output: Morning wire takes from 65+ city correspondents ### Pipeline 7 — Trending Topics - Schedule: Daily morning - Source: Conversation ENGINE trending topics - Output: Sterling & Preston's daily conversation starter - Autopublish: POST /api/autopublish/trending/publish ### Pipeline 8 — Midterms / Elections - Schedule: Event-driven - Source: Elections Canada, riding data, polling - Output: Federal election coverage, riding profiles, candidate tracking ### Pipeline Monitoring - GET /api/v1/pipeline/health — Pipeline health status - GET /api/v1/pipeline/stats — Pipeline statistics - GET /api/v1/pipeline/status — Current pipeline status - Diagnostic endpoints per pipeline: POST /api/autopublish/{pipeline}/diagnostic ### Social Distribution - POST /api/export/buffer — Schedule post to Buffer - GET /api/export/buffer/channels — List Buffer channels - POST /api/autopublish/social/distribute — Distribute content to social platforms - POST /api/autopublish/social/auto-post — Auto-post to configured channels --- ## Core Module 5: Production Studio ### Image Generation (Nano Banana Pro / Gemini) - POST /api/generate-image — Generate image with character DNA enrichment - POST /api/production/generate-image — Production-grade image generation - POST /api/v1/thumbnails/generate — Direct thumbnail generation - POST /api/v1/thumbnails/:id/regenerate — Regenerate existing thumbnail - GET /api/v1/thumbnails — List generated thumbnails - GET /api/v1/thumbnails/:id — Thumbnail detail ### Prompt Template System - GET /api/prompt-templates — List templates - POST /api/prompt-templates — Create template - PUT /api/prompt-templates/:id — Update template - DELETE /api/prompt-templates/:id — Delete template 8 seed templates: show-thumbnail, game-day, reaction, breaking, roundtable, headshot, cinematic, mitl-evergreen-thumbnail. ### Thumbnail Queue (ConversationOS Integration) - GET /api/v1/thumbnail-queue — List queued briefs - GET /api/v1/thumbnail-queue/:id — Brief detail - POST /api/v1/thumbnail-queue — Create brief (accepts from TitleENGINE) - POST /api/v1/thumbnail-queue/:id/generate — Trigger generation - PATCH /api/v1/thumbnail-queue/:id — Update brief ### Media Queue - GET /api/v1/media-queue — List media queue - GET /api/v1/media-queue/:id — Queue item detail - POST /api/v1/media-queue — Create queue item - PUT /api/v1/media-queue/:id — Update queue item - DELETE /api/v1/media-queue/:id — Delete queue item - POST /api/v1/media-queue/:id/generate — Trigger generation - POST /api/media-queue/:id/variation — Generate variation ### Video Generation - POST /api/video/generate — Generate video (Veo 3.1 / Grok) - GET /api/video/jobs — List video jobs - GET /api/video/jobs/:id — Job detail - POST /api/video/jobs/:id/poll — Poll job status - POST /api/video/jobs/:id/approve — Approve generated video - POST /api/video/jobs/:id/reject — Reject generated video - DELETE /api/video/jobs/:id — Delete video job ### AI Avatars (Runway ML) - GET /api/runway/avatars — List avatars - POST /api/runway/avatars — Create avatar - GET /api/runway/avatars/:id — Avatar detail - POST /api/runway/sessions — Create avatar session - GET /api/runway/sessions/:id — Session status - GET /api/runway/voices — List available voices - POST /api/runway/sync — Sync avatar data - POST /api/avatar/connect — Connect character to avatar (rate-limited) ### Voice (ElevenLabs) - GET /api/elevenlabs/voices — List available voices - POST /api/elevenlabs/preview — Preview voice with text ### Descript (Video Editing) - POST /api/descript/import — Import media to Descript - POST /api/descript/edit — Apply edits - GET /api/descript/jobs — List edit jobs - GET /api/descript/jobs/:jobId — Job status ### Canva - POST /api/canva/upload — Upload asset to Canva --- ## Core Module 6: Deep Intel Dashboards ### Investigations 1.13M+ government contracts, sunshine lists, court decisions, fire/police dispatch. Harry AI agent powers investigative queries. ### The Numbers StatCan releases, CMHC housing data, immigration processing times, commodity prices. - GET /desk/numbers — Numbers dashboard - POST /api/v1/numbers/refresh — Refresh data ### Civic Intelligence Municipal open data for 49 Canadian cities: - GET /api/v1/civic/cities — List all covered cities - GET /api/v1/civic/cities/:slug — City detail with civic data - GET /api/v1/civic/takes — Civic takes - GET /api/v1/civic/stats — Civic data statistics - GET /api/v1/civic/dashboard/:slug — City dashboard data - GET /api/v1/civic/weather-alerts/:slug — Weather alerts by city - GET /api/v1/civic/rcmp-news/:slug — RCMP news by city - GET /api/v1/civic/local-news/:slug — Local news by city - GET /api/v1/civic/cfl-sports/:slug — CFL sports by city - GET /api/v1/civic/cfl-standings — CFL standings - GET /api/v1/civic/wildfires/:slug — Wildfire data by city - GET /api/v1/civic/crime/:slug — Crime data by city - GET /api/v1/civic/enhanced-news/:slug — Enhanced local news ### Elections / Midterms - GET /api/midterms — Election overview - GET /api/midterms/senate — Senate races - GET /api/midterms/house — House races - GET /api/midterms/governors — Governor races ### Dead Zones & News Deserts - GET /dead-zones — Canadian news desert mapping - GET /news-deserts — Media coverage gap analysis --- ## Core Module 7: AI Agents ### Harry — Investigative Agent Claude-powered internal AI agent for deep intelligence queries: - POST /api/harry/chat — Chat with Harry - Custom system prompt and tools for investigative analysis - Access to government contracts, court data, sunshine lists ### Gemini Chat General AI assistant powered by Google Gemini: - POST /api/gemini/chat — Chat with Gemini - Character-aware responses using DNA profiles ### Correspondent Chat Public-facing character conversations: - POST /api/correspondents/:slug/chat — Chat with a specific correspondent --- ## Core Module 8: Transcripts YouTube transcript pipeline: - POST /api/transcripts/youtube/fetch/:videoId — Fetch YouTube transcript - POST /api/transcripts/youtube/check — Check transcript availability - GET /api/transcripts/youtube/status — Transcript processing status - GET /api/transcripts/latest — Latest transcript - POST /api/transcripts/sync — Sync transcript data --- ## Public Pages & SEO ### Content Pages - / — Character ENGINE showcase (landing page) - /feed/ — Social-style content timeline - /desk/ — Newspaper-style news site (The Desk) - /desk/{category}/ — Category pages (wire, sports, investigations, elections, numbers, entertainment, health, money, tech, science, city-hall, correspondents, our-story, queue) - /desk/takes/:takeSlug — Individual take pages - /desk/city-hall/:citySlug — City hall coverage pages - /desk/city-hall/:citySlug/:takeSlug — Individual city hall take pages - /cast/ — Full cast directory - /cast/:slug/ — Individual character profile pages - /correspondents/ — Correspondent directory - /correspondents/:slug/ — Individual correspondent pages - /cities/ — City directory (84 cities) - /cities/:slug/ — City landing pages with local coverage - /takes/ — Takes archive - /takes/:slug/ — Individual take pages - /corus/ — Media landscape intelligence - /dead-zones/ — Canadian news desert mapping - /news-deserts/ — Media coverage gap analysis - /midterms/ — Federal election coverage - /about/ — About page - /search/ — Search interface ### SEO & Feeds - GET /sitemap.xml — Main sitemap - GET /sitemap-index.xml — Sitemap index - GET /news-sitemap.xml — News sitemap (Google News) - GET /robots.txt — Robots.txt - GET /llms.txt — AI agent discovery (this file) - GET /feeds/civic.xml — Civic RSS feed - GET /feeds/elections.xml — Elections RSS feed - GET /feeds/takes.xml — Takes RSS feed - GET /feeds/{citySlug}.xml — City-specific RSS feeds - GET /feeds/province/{provinceSlug}.xml — Province-specific RSS feeds - GET /feeds/cluster/{clusterSlug}.xml — Cluster RSS feeds --- ## Administration ### Settings - GET /api/settings/platform — Platform configuration - PUT /api/settings/platform — Update configuration - POST /api/settings/test-connection — Test external service connections ### API Keys - GET /api/api-keys — List API keys - POST /api/api-keys — Create API key - DELETE /api/api-keys/:id — Revoke API key ### Dashboard - GET /api/dashboard — Admin dashboard data - GET /api/stats — Platform statistics ### Newsletter - POST /api/newsletter/signup — Newsletter signup - GET /api/newsletter/signups — List signups ### Regional Data - GET /api/regional-correspondents — Regional correspondent assignments and clusters ### External Data - GET /api/weather-alerts — Weather alert data - GET /api/police-news — Police news/RCMP releases ### Marketplace (Internal) - GET /api/marketplace — List marketplace items - GET /api/marketplace/:id — Item detail - POST /api/marketplace — Create item - PUT /api/marketplace/:id — Update item - DELETE /api/marketplace/:id — Delete item --- ## Integration with ConversationOS Character ENGINE integrates with ConversationOS at multiple points: 1. Thumbnail ENGINE → Character ENGINE: Fetches character DNA for accurate facial likeness in generated thumbnails 2. Title ENGINE → Character ENGINE: Pushes thumbnail briefs to the media queue on title approval 3. Build ENGINE → Character ENGINE: References character profiles for show segments 4. Guest ENGINE (Sophia Grant) → Character ENGINE: Sophia's personality and DNA are sourced from Character ENGINE 5. MCP Server (mcp.conversationos.live) → Character ENGINE: 4 character tools (list, get, search, content generation) ### ConversationOS API Integration Character ENGINE provides an X-API-Key authenticated endpoint used by ConversationOS: - GET /api/v1/characters — Used by Thumbnail ENGINE prompt assembler - GET /api/v1/content — Used by content pipelines - POST /api/v1/thumbnail-queue — Accepts briefs from Title ENGINE --- ## Data Sources ### Municipal Open Data (49 Canadian Cities) Socrata SODA API and CKAN portals for council votes, building permits, 311 data, lobbyist registries, expense disclosures. ### Federal Government (10 Sources) StatCan, Elections Canada, Canada Gazette, CanLII, Immigration (IRCC), Treasury Board, Lobbying Commissioner, Parliamentary Budget Officer, Ethics Commissioner, Auditor General. ### Provincial Data (34 Sources across 10 Provinces) Health regions, education, infrastructure, justice, environment, municipal affairs. ### Sports APIs ESPN NHL API (scores, schedule, standings), ESPN NFL API (scoreboard, standings, transactions, news). ### Editorial Notion databases for Conversation Desk and Morning Loop content intake. --- ## Contact Mornings in the Lab (MiTL) Studios Email: mornings@bapl.ai Web: https://mornings.live Platform: https://conversationos.live Character ENGINE: https://universe.mitl.studio