Skip to content
ENGINEERING SHOWCASE · LIVE SYSTEM

One server. Infinite leverage.

A mostly-autonomous AI newsletter pipeline, running on efficient, self-hosted infrastructure. Video (Shorts, long-form, Reels) is in development, not live yet. Here's every layer of the stack.

3
issues / week
8
pipeline stages
Architecture

The pipeline, end to end.

Every issue goes through eight deterministic stages. Human touches: one review gate via Telegram.

01 RSS ingest
02 Thesis select
03 Evidence gather
04 DeepSeek write
05 Hallucination scan
06 Fact validate
07 Consensus check
08 Telegram → Review → Publish

Overfitted

Mon / Wed / Fri · 1:30pm IST
Sources 15 RSS feeds, with a Camofox headless-browser fallback for blocked/failed feeds
Sections 8-stage pipeline: source-ingestion → thesis-selection → evidence-gathering → writing → hallucination-scan → fact-validation → consensus-check → publish
Fact check Two dedicated gating stages (hallucination-scan, fact-validation) plus an independent-model consensus check
Output Substack draft, reviewed by hand before it goes out

The Long Game

Sundays (currently paused); essays so far published by hand
Sources Shares the same RSS feed pool, thesis-driven rather than news-driven
Sections Single thesis essay · long-form
Fact check Same 8-stage pipeline as Overfitted, plus a Sunday-only gate
Output overfitted.tech/long-game/ + Medium
AI Models

Right model. Right stage. Right cost.

Model selection is a deliberate engineering decision at every stage, not just "use the best model for everything."

STAGE 4 Writing (primary)

DeepSeek V3 (deepseek-chat)

Via OpenRouter. Primary writing model for the Overfitted newsletter, pinned as a deliberate cost-performance decision and gated through hallucination-scan, fact-validation, and consensus-check stages before publish.

FALLBACK Writing (fallback)

OpenRouter fallback chain

If the primary writing call is unavailable, the pipeline falls back to secondary OpenRouter models so a run degrades gracefully instead of failing outright.

STAGE 7 Consensus check

Independent judge model (OpenRouter)

A second, different model family reviews the draft independently before it's allowed to publish, deliberately not the same model as the writer, for a genuine second opinion.

STAGE 1 Semantic Dedup

sentence-transformers

all-MiniLM-L6-v2 generates embeddings for every article ingested, stored in Qdrant, to reject near-duplicate topics across pipeline runs.

Runtime

Scheduled via Hermes cron. All active.

Both newsletter pipelines run on Hermes's own cron scheduler, plus an always-on personal-assistant agent.

ACTIVE
overfitted-new-issue
Mon/Wed/Fri newsletter pipeline
Hermes cron
ACTIVE
long-game-new-issue
Sunday essay pipeline (currently paused)
Hermes cron
ACTIVE
Munna
AI personal-assistant agent, runs via OpenClaw
Always on
Infrastructure

Hostinger KVM2. Ubuntu. Nginx. That's it.

No Kubernetes. No multi-region. No managed services. A single VPS running lean.

OS Ubuntu 24.04 LTS
Web Server Nginx
Language Python (shared venv)
Vector DB Qdrant (native binary)
Job Scheduler Hermes cron
Notifications Telegram Bot API
Uptime 24 / 7, minimal human intervention

Design decisions

  • Shared Python venv for both newsletter pipelines: single dependency surface
  • All API credentials in one file, symlinked across profiles: one edit on renewal
  • Qdrant runs as a native binary under a user systemd service: no container overhead
  • Hermes cron drives both pipelines: no external orchestration needed
  • Telegram as the human interface: no dashboard logins, no email checks, one chat handles everything
Integrations

A handful of external APIs. Mostly automated.

The pipeline runs unattended end to end; a human reviews the draft before it publishes to Substack.

Telegram Bot API
Issue delivery and human review gate
OpenRouter API
DeepSeek-chat (primary writer), fallback chain, and consensus-check judge
Anthropic API
Claude model integrations across research tooling
Pexels API
Stock imagery for in-development video work
Gumroad + Dodo
Digital product sales: checkout and fulfillment handled natively by each platform
Frontend

Static. Fast. Intentionally cinematic.

Astro generates static HTML at build time. React only hydrates where interactivity is needed. Zero unnecessary JavaScript in the critical path.

Astro 6
Static site generator, island architecture
React 19
Interactive components, 3D scene hydration
Three.js / R3F
3D rendering, custom shaders
GSAP + ScrollTrigger
Scroll-driven animations, text reveals, counters
Lenis
Smooth scroll, driven by GSAP ticker (single RAF)
Tailwind CSS v4
Utility-first styling, zero runtime
TypeScript
Type-safe throughout
Pillow 9.5
Thumbnail generation: 1280×720 + 1080×1920 per video
MoviePy
Video assembly, in development, not live yet
Video Pipeline: In Development

Not live yet.

YouTube Shorts, Instagram Reels, and an automated thumbnail generator are being built (rendering tooling, TTS, and asset pipeline exist), but there's no live upload integration yet. Nothing below is currently shipping.

The Economics

Efficient, self-hosted infrastructure.
Media empire included.

VPS (Hostinger KVM2) Low-cost, single server
DeepSeek Chat (OpenRouter) Sub-cent per run
OpenRouter fallback models Free tier
Qdrant, Telegram, Edge TTS Free / self-hosted

This is not a demo. This is a live production system. Every newsletter in your inbox was written, fact-checked, and delivered by this stack.