Content, orchestrated.
A production-grade AI content generation platform that turns source documents into publish-ready blog posts — with strict source-first methodology to eliminate hallucinations. Built for content teams, agencies, and SaaS marketers.
Dashboard — Projects, usage analytics, and recent activity at a glance
- Upload your source material — PDFs, DOCX, Markdown, or CSV files
- Generate content — AI produces SEO-optimised blog posts grounded in your sources (no hallucinations)
- Review & refine — Built-in SEO scoring, readability analysis, and heading structure checks
- Publish & schedule — Push directly to WordPress or LinkedIn, or schedule via the content calendar
Configure topic, voice, target length, and AI provider — then generate a full blog post in seconds.
Review the full generated post with markdown rendering, content blocks, and version history.
Every post is scored on readability, keyword density, heading structure, and content length — with actionable recommendations.
Reusable generation templates for consistent output across teams and projects.
Schedule posts across platforms with a visual calendar — month, week, day, and agenda views.
Connect LinkedIn and WordPress accounts — publish directly from the platform with one click.
Five tiers from Free to Enterprise. Word-based quotas, Paystack billing, and self-service plan management.
| Layer | Technology |
|---|---|
| API | FastAPI (Python 3.11), fully async |
| Frontend | React 18 + TypeScript + Vite + Tailwind CSS |
| Database | MongoDB 7.0 with Motor async driver |
| Queue | Celery + Redis (broker & result backend) |
| Storage | MinIO (S3-compatible object store) |
| AI/LLM | OpenAI GPT-4o, Anthropic Claude 3.5, Google Gemini 2.0 — multi-provider with circuit-breaker failover |
| Auth | JWT (HTTPOnly cookies) + Google/GitHub OAuth |
| Billing | Paystack (ZAR & USD) |
| Infra | Docker Compose, Jenkins CI/CD, GitHub Container Registry |
| Monitoring | Sentry, Prometheus + Grafana |
- Source-first pipeline — 3-stage generation (Outline → Section Drafting → SEO Metadata) grounded in uploaded documents
- Multi-provider LLM — OpenAI, Anthropic, and Google with automatic failover and circuit-breaker resilience
- 4 voice presets — Professional, Casual, Witty, Technical
- NEEDS_INPUT markers — AI flags gaps instead of hallucinating when source material is insufficient
- Real-time progress — Server-Sent Events stream per-section generation progress to the UI
- Bulk generation — CSV-driven batch content creation
- Automated SEO scoring — Readability, keyword density, heading structure, content length
- Meta generation — Auto-generated SEO title, meta description, URL slug, and focus keyword
- Internal linking — Automatic link suggestions based on existing content
- Actionable recommendations — Specific improvement suggestions per post
- WordPress integration — Direct publish via REST API + Application Passwords
- LinkedIn publishing — Share posts directly to LinkedIn profiles
- Content calendar — Visual scheduling with month, week, day, and agenda views
- Draft or publish — Choose status, categories, and tags before pushing
- Multi-tenant organisations — Teams, invitations, role-based access (Owner / Editor / Writer)
- Project-based workspaces — Organise content by client, campaign, or topic
- Content templates — Reusable generation briefs for consistent output
- Document parsing — Async Celery workers parse PDF, DOCX, Markdown, and CSV sources
- Subscription billing — Free / Starter / Pro / Business / Enterprise with word-based quotas
- Account management — Full OAuth, GDPR-compliant account deletion
- CAPTCHA — Google reCAPTCHA v3 with bot scoring
- Content moderation — OpenAI moderation API on both inputs and outputs
- Email validation — Format validation + disposable domain detection
- Audit logging — Centralised event log with 90-day TTL
- Prompt injection protection — Input sanitisation layer
- Rate limiting — Per-endpoint throttling
┌──────────┐ ┌──────────┐ ┌──────────┐
│ React UI │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │◀─SSE│ (async) │ │ (Motor) │
└──────────┘ └────┬─────┘ └──────────┘
│
┌────▼─────┐ ┌──────────┐
│ Celery │────▶│ Redis │
│ Workers │ │ (broker) │
└────┬─────┘ └──────────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ OpenAI │ │Anthropic│ │ Google │
│ GPT-4o │ │Claude3.5│ │Gemini2 │
└────────┘ └────────┘ └────────┘
Detailed diagrams:
- Content Generation Flow — Full generation pipeline sequence
- Trust & Safety Architecture — Service layer overview
- Service Classes — Class relationships
- Decision Flow — Trust & Safety decision tree
151+ tests passing across backend, integration, and Trust & Safety services.
| Suite | Tests | Status |
|---|---|---|
| Authentication | 11 | ✅ |
| Projects & Sources | 40 | ✅ |
| AI Generation | 24 | ✅ |
| Trust & Safety | 100 | ✅ |
| WordPress Integration | 15 | ✅ |
| Billing & Subscriptions | 30+ | ✅ |
E2E coverage via Playwright (289 scenarios: auth, generation, billing, accessibility).
- Docker Desktop
- Git
git clone https://github.com/Poolchaos/serelo.git
cd serelo
cp .env.example .env
# Edit .env — set JWT_SECRET_KEY and OPENAI_API_KEY at minimumdocker compose up --build| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| API | http://localhost:8000 |
| API docs (Swagger) | http://localhost:8000/docs |
| Health check | http://localhost:8000/health |
| Grafana | http://localhost:3001 |
docker compose exec api pytest -vserelo/
├── backend/
│ ├── app/
│ │ ├── api/v1/ # REST endpoints (30+ routers)
│ │ ├── core/ # Config, security, middleware
│ │ ├── db/ # MongoDB connection & queries
│ │ ├── models/ # Data models
│ │ ├── schemas/ # Pydantic request/response schemas
│ │ ├── services/ # Business logic (40+ services)
│ │ ├── tasks/ # Celery async tasks
│ │ ├── prompts/ # LLM prompt templates
│ │ └── main.py
│ ├── scripts/ # Ops & migration scripts
│ ├── tests/ # 151+ backend tests
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── components/ # React UI components
│ │ ├── pages/ # Route pages
│ │ ├── services/ # API client layer
│ │ └── stores/ # Context-based state
│ ├── e2e/ # Playwright E2E tests
│ └── Dockerfile
├── docs/ # API docs, architecture diagrams, guides
│ └── screenshots/ # Application screenshots
├── monitoring/ # Prometheus + Grafana config
├── docker-compose.yml
└── .env.example
See .env.example for the full list. Minimum required:
JWT_SECRET_KEY= # openssl rand -hex 64
OPENAI_API_KEY= # OpenAI API key
MONGODB_URL=mongodb://localhost:27017
REDIS_URL=redis://localhost:6379/0- JWT with HTTPOnly cookies (XSS-resistant)
- CSRF protection on all mutating endpoints
- bcrypt password hashing (cost factor 12)
- OAuth state parameter HMAC validation
- Input sanitisation + prompt injection detection
- Rate limiting per endpoint
- Content moderation on AI inputs and outputs
- All secrets via environment variables — never committed
- API Reference — Full endpoint reference
- Development Guide — Local setup, testing, contribution guide
- WordPress Integration — Setup and usage
- Help Center — User-facing articles
Copyright (c) 2023–2026 Phillip-Juan van der Berg. All rights reserved. See LICENSE.







