ivanovo.online
Regional news portal with an AI content pipeline
A regional news portal for the Ivanovo region that collects news from many sources, clusters near-duplicate stories, and synthesizes a single article per cluster through an LLM — respecting per-source citation and attribution rules. It started as a personal experiment to learn how LLM pipelines actually work in production, and grew into a real project for a client.
Architecture
Everything is built and operated solo. The frontend is Nuxt 3 with server routes and a server-side sitemap.
A separate admin SPA (Vue 3 + Vite + Pinia + Vue Router) ships a TipTap-based rich text editor for content management.
The backend is Node.js + Express 5 with Prisma ORM (11+ migrations, including scheduled/delayed publishing), JWT in HttpOnly cookies for the admin, bcrypt for passwords, and Zod for input validation. Storage is PostgreSQL, Redis for caching/queues, and MinIO (S3-compatible) for images.
The AI pipeline
A multi-provider LLM abstraction switches between OpenAI, Z.ai (GLM), Anthropic, Yandex GPT, and GigaChat. Production currently runs Z.ai's glm-5 for text and GLM-Image for image generation, with Tavily as optional web-search augmentation.
Cron jobs collect news from sources, cluster near-duplicate stories with PostgreSQL pg_trgm fuzzy title matching, and hand each cluster of 2–5 similar articles to an LLM synthesis step that returns structured JSON (title, body, summary, confirmedFacts, differences, contentClass, usedSourceUrls). Delayed publishing runs on a schedule.
A SourceUsageRule model enforces per-source citation quotas, attribution requirements, and manual-approval queues for analytical content — the legal and editorial guardrails needed to run this in production, not just a demo.
Deployment
Six containers via Docker Compose (admin / frontend / backend / postgres / redis / minio), images published to Docker Hub, and GitHub Actions auto-deploying on PR merge (docker compose pull && up -d) behind an Nginx reverse proxy with separate hosts for the admin panel and the public site.
What this demonstrates
End-to-end product thinking across frontend, backend, AI, and infrastructure, with production-grade legal guardrails around sourced content.
A real experiment carried through to production: started as a personal way to learn how LLM pipelines actually work, then grew into a client project — initiative that goes beyond a one-off proof of concept.
PostgreSQL knowledge beyond the basics (pg_trgm fuzzy matching), a proper multi-provider LLM architecture rather than a single API call, and a full CI/CD + containerized deployment pipeline.
← Back to all projects