The problem
A small newsroom that runs WordPress sites has to follow many sources, pick the news, write, check facts, find an image and then post the same story on social channels and podcasts. Each step is manual and lives in a different tool.
What I built
I built a multi-user web platform that takes news from feeds and web sources and carries it through AI drafting to publication on WordPress and other channels.
- 12-step article wizard: source, news item, deep search, five title options, lead, body, a fact and grammar pass, SEO, image, audio, review and publish. Each step has its own endpoint, so a failed step can be retried alone.
- AI characters: author profiles with identity, tone and style, reused across articles. Everything written under one “author” keeps the same voice.
- Bot engine: scheduled bots fetch news, filter it, write with a chosen character and publish or save a draft. The scheduler checks every 60 seconds and supports daily, hourly, interval and weekday schedules, with a cooldown that prevents double runs.
- Multi-channel publishing: several WordPress sites, Facebook, Instagram, X, Substack, Spreaker podcasts and WhatsApp, plus audio news with ElevenLabs voices and video with HeyGen avatars.
- Roles and credits: 7 roles, from administrator to tester. Each user has a credit quota with a log of every AI action and top-ups through PayPal. Administrators can impersonate a user to give support.
- Built for teams abroad too: the interface is translated into 8 languages, including Arabic, Hindi and Chinese.
How it performs
- 111 API route handlers behind the dashboard.
- 67 pages in the application, including the admin area.
- 8 interface languages and 7 user roles with separate permissions.
Built with
Next.js 14 with the App Router, React 18, TypeScript and Tailwind CSS. NextAuth for login with email, Google or Facebook. MySQL 8 through mysql2. OpenAI for text and images, with Gemini, ElevenLabs and HeyGen as further providers. Each user’s API keys are stored encrypted with AES-256-GCM. A companion WordPress plugin in PHP adds journalist and newsroom roles inside WordPress. I also packaged the platform as a self-hosted product, with install and architecture guides.
Why it was done this way
I chose no ORM. Queries are plain parameterized SQL through mysql2, and Next.js builds in standalone mode into a single server.js. The reason is the hosting: Prisma’s WASM engine ran out of memory on shared cPanel hosting, and a standalone bundle runs on cheap servers. Users bring their own AI keys, so the platform does not pay for their AI calls.


