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.
Architecture
Everything is built and operated solo. There are two parallel, fully working frontends — Nuxt 3 with server routes and a server-side sitemap, and SvelteKit 5 built on Svelte 5 runes ($state / $effect / $derived / $props) with Tailwind. Switching between them is a Docker config change; both are kept working so real UX and Lighthouse metrics decide the final stack rather than personal preference. SvelteKit is the variant currently deployed to production.
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 genuine engineering approach to framework choice: two working frontends run side by side and compared on real metrics, rather than picked by preference.
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