12 KiB
12 KiB
Autonomous AI Publishing System — Architecture
Overview
A fully autonomous, self-hosted publishing platform that continuously discovers valuable topics, generates original useful content, and publishes to a collection of evergreen authority websites.
Sites (Vertical Authority Domains)
| Site | Domain | CT ID | IP | Port |
|---|---|---|---|---|
| AI | ai.thetempleofdoom.com | TBD | TBD | 5000 |
| Tech | tech.thetempleofdoom.com | TBD | TBD | 5000 |
| Science | science.thetempleofdoom.com | TBD | TBD | 5000 |
| Crypto | crypto.thetempleofdoom.com | TBD | TBD | 5000 |
| Linux | linux.thetempleofdoom.com | TBD | TBD | 5000 |
| Gaming | gaming.thetempleofdoom.com | TBD | TBD | 5000 |
| DIY | diy.thetempleofdoom.com | TBD | TBD | 5000 |
| Guides | guides.thetempleofdoom.com | TBD | TBD | 5000 |
System Architecture
┌──────────────────────────────────────────────────────────────────┐
│ CRON ORCHESTRATOR (MacBook) │
│ Every morning @ 6AM Pacific │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ TREND DISCOVERY ENGINE │
│ Sources: News APIs, RSS, Reddit, HN, GitHub, Google Trends, │
│ arXiv, Stack Overflow, Twitter/X, seasonal calendar │
│ Output: Scored topic list with vertical assignments │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ RESEARCH AGENT │
│ Per topic: multi-source extraction → facts, stats, citations, │
│ FAQs, timelines, misconceptions, examples │
│ LLM: GamingPC ornith:latest for deep research │
│ Output: Knowledge Package (JSON) → stored in SQLite │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ MULTI-AGENT WRITING PIPELINE │
│ Outline Agent → Technical Writer → SEO Writer → Copy Editor │
│ → Fact Checker → Quality Reviewer │
│ LLMs: qwen3.5:4b (fast gate) + ornith:latest (verify) │
│ Output: Polished Markdown article + frontmatter │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ IMAGE GENERATION │
│ FLUX via FAL.ai for hero images, diagrams, charts │
│ Output: WebP images in site assets/ │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ SEO PROCESSOR │
│ Meta titles, descriptions, OG tags, JSON-LD, schema.org, │
│ canonical URLs, breadcrumbs, XML sitemap, robots.txt │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ SITE BUILDER (per vertical) │
│ Static site generator: Markdown → HTML, rebuilds on new content │
│ Updates: homepage, category pages, RSS, sitemap, related links │
│ Built-in search via pagefind │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ DEPLOYMENT │
│ 1. Build static site locally │
│ 2. scp to Proxmox CT │
│ 3. Restart nginx/service │
│ 4. Ping sitemap to Google/Bing │
│ 5. Verify live │
└──────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ ANALYTICS + LEARNING LOOP │
│ Nightly: analyze pageviews, time-on-page, bounce rate │
│ Feed back into topic scoring → improve selection over time │
│ Plausible-style privacy-first analytics, self-hosted │
└──────────────────────────────────────────────────────────────────┘
Service APIs (REST)
Every component is an independent API service:
Trend Discovery API (port 5100)
POST /api/trends/discover— Run full discovery scanGET /api/trends/scored— Get scored topic listGET /api/trends/sources— List active data sources
Research API (port 5101)
POST /api/research/topic— Research a topic, return knowledge packageGET /api/research/package/{id}— Get stored knowledge packageGET /api/research/sources/{topic}— Raw sources for a topic
Writing API (port 5102)
POST /api/write/article— Generate article from knowledge packageGET /api/write/draft/{id}— Get draftPOST /api/write/review/{id}— Request quality review
SEO API (port 5103)
POST /api/seo/optimize— SEO-optimize an articlePOST /api/seo/sitemap— Generate sitemap for a sitePOST /api/seo/structured-data— Generate JSON-LD
Image API (port 5104)
POST /api/images/generate— Generate image for articlePOST /api/images/optimize— Optimize existing image
Deploy API (port 5105)
POST /api/deploy/site/{name}— Build and deploy a sitePOST /api/deploy/all— Deploy all sitesGET /api/deploy/status/{name}— Deployment status
Admin Dashboard (port 5106)
- Full control panel UI
- Topic approval, manual triggers, analytics views
Database Schema
topics
CREATE TABLE topics (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
vertical TEXT NOT NULL, -- ai, tech, science, crypto, linux, gaming, diy, guides
trend_score REAL,
search_volume INTEGER,
competition_score REAL,
freshness_score REAL,
evergreen_score REAL,
composite_score REAL,
sources TEXT, -- JSON array
status TEXT DEFAULT 'discovered', -- discovered, approved, researching, writing, reviewing, published, rejected
knowledge_package_id INTEGER,
article_id INTEGER,
published_url TEXT,
published_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
knowledge_packages
CREATE TABLE knowledge_packages (
id INTEGER PRIMARY KEY,
topic_id INTEGER,
facts TEXT, -- JSON
stats TEXT, -- JSON
definitions TEXT, -- JSON
faqs TEXT, -- JSON
misconceptions TEXT, -- JSON
timeline TEXT, -- JSON
citations TEXT, -- JSON
examples TEXT, -- JSON
related_concepts TEXT, -- JSON
raw_sources TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
articles
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
topic_id INTEGER,
vertical TEXT,
title TEXT,
slug TEXT UNIQUE,
content_md TEXT,
content_html TEXT,
seo_title TEXT,
seo_description TEXT,
og_image TEXT,
json_ld TEXT,
word_count INTEGER,
reading_time_minutes INTEGER,
status TEXT DEFAULT 'draft',
published_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
analytics
CREATE TABLE analytics (
id INTEGER PRIMARY KEY,
article_id INTEGER,
vertical TEXT,
pageviews INTEGER DEFAULT 0,
unique_visitors INTEGER DEFAULT 0,
avg_time_on_page REAL,
bounce_rate REAL,
referrers TEXT, -- JSON
recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
performance_learning
CREATE TABLE performance_learning (
id INTEGER PRIMARY KEY,
vertical TEXT,
top_performing_patterns TEXT, -- JSON
headline_formats TEXT, -- JSON
optimal_word_count INTEGER,
best_publish_times TEXT, -- JSON
keyword_insights TEXT, -- JSON
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
LLM Strategy
| Task | Model | Host | Reasoning |
|---|---|---|---|
| Topic scoring | qwen3.5:4b | MacBook | Fast, cheap |
| Research extraction | ornith:latest | GamingPC | Deep reasoning |
| Outline generation | qwen3.5:4b | MacBook | Structural, fast |
| Technical writing | ornith:latest | GamingPC | Quality matters |
| SEO optimization | qwen3.5:4b | MacBook | Pattern matching |
| Copy editing | qwen3.5:4b | MacBook | Fast iteration |
| Fact checking | ornith:latest | GamingPC | Accuracy critical |
| Quality review | ornith:latest | GamingPC | Final gate |
Deployment Strategy
Each site is a standalone Proxmox CT running:
- Python Flask/FastAPI (static site generator)
- nginx (serving static files)
- pagefind (search index)
- cloudflared (tunnel to CF)
Core orchestrator runs on MacBook via cron (launchd-supervised).
Security Model
- All APIs internal-only (10.30.20.0/24)
- Admin dashboard: localhost only, auth via Hermes
- Cloudflare tunnels: only expose nginx on :80
- No secrets in code — env vars only
- Gitea private repos for all sites
Backup Strategy
- All article content in Gitea (git history = backup)
- SQLite DBs synced to iCloud daily
- Proxmox CT snapshots weekly
- Knowledge packages exported to JSON nightly
Monitoring
- Health checks on all 8 site CTs
- Orchestrator pipeline status dashboard
- LLM usage/cost tracking
- Publish success/failure alerts via Telegram