Most “AI marketing” posts still sell seats and prompt packs. OpenCMO is the other bet: a self-hosted multi-agent CMO you clone, point at your own model key, and run against a real product URL – research, SEO/GEO/community signals, drafts stuck in your approval queue. Data stays on your box. Spend is BYOK.
OpenCMO on main lists package version 0.1.0 in pyproject.toml (confirm after pull; tags can lag). Stack in plain terms: FastAPI, OpenAI Agents SDK, Crawl4AI, React UI on 8080, Apache-2.0, Python ≥3.10. Below is zero → verified install on that mainline, not another tool roundup.
System requirements before you touch Docker
Upstream doesn’t publish a single official RAM figure. As of early 2026 on main, plan around what the image actually pulls in: Playwright/Chromium for Crawl4AI, a Node 20 frontend build stage, Python 3.11-slim runtime.
| Resource | Practical floor | More comfortable |
|---|---|---|
| OS | Linux, macOS, or Windows with Docker | Linux server or current Docker Desktop |
| Runtime | Docker Engine + Compose v2 | Same – skip ancient Compose v1 |
| CPU / RAM | ~2 vCPU and a couple GB free while image + browser spin up | 4 vCPU / 4+ GB if you enable RAG and heavy scans |
| Disk | Several GB for image + opencmo_data |
Headroom if you keep crawl artifacts and Qdrant |
| Source-only path | Python ≥3.10, Node.js 20+ | Python 3.11, Node 20 LTS |
| Model | OpenAI-compatible API with tool calling | gpt-4o-class or DeepSeek / NIM / Ollama tools-capable equivalent |
No platform key ships in the image. Bring your own.
Download / official source
git clone https://github.com/Lling0000/OpenCMO.git
cd OpenCMO
cp .env.example .env
Canonical repo only – aidcmo.com is the project home. Docker first. The deployment checklist is the authority for public hosts, health checks, and backups.
Install OpenCMO with Docker Compose
Edit .env before build so the container doesn’t boot blind:
OPENAI_API_KEY=sk-your-key-here
# Optional compatible provider:
# OPENAI_BASE_URL=https://api.deepseek.com/v1
# OPENCMO_MODEL_DEFAULT=deepseek-chat
docker compose versiondocker compose up -d --builddocker compose logs -f opencmo- Browser:
http://localhost:8080
Compose on main maps 127.0.0.1:8080:8080 and mounts volume opencmo_data at /data (OPENCMO_DB_PATH=/data/data.db). That loopback bind is intentional – and it’s why a phone on the same LAN won’t see the UI until you change ports or put a proxy in front.
docker compose --profile rag up -d --build
RAG profile pulls qdrant/qdrant:v1.19.1 on localhost:6333. Wire embeddings later under Knowledge → Models.
Pro tip: One provider key first. The configuration guide is clear: Tavily, PageSpeed, GEO, SMTP – after a scan that actually finishes.
First-time configuration (minimum viable)
Laptop: key in .env is enough. Dashboard Settings also accepts keys if the red setup cue shows up.
Public box checklist from deployment docs:
OPENCMO_WEB_HOST=0.0.0.0(image default; compose still publishes host loopback unless you edit ports)OPENCMO_WEB_TOKEN=<long-random-secret>before you expose workspace APIs- Nginx or Caddy →
127.0.0.1:8080with TLS - SMTP when real signup mail matters:
OPENCMO_SMTP_HOST, 587/465, user/pass, optionalOPENCMO_SMTP_FROM OPENCMO_AUTO_PUBLISH=0until Reddit/X credentials are deliberate
DeepSeek pattern from config docs: key + OPENAI_BASE_URL=https://api.deepseek.com/v1 + OPENCMO_MODEL_DEFAULT=deepseek-chat. Ollama: key ollama, base http://localhost:11434/v1, model name that actually supports tools.
Verify the install works
Health first – same check deployment.md wants after every rollout:
curl -sS http://127.0.0.1:8080/api/v1/health
You want a healthy HTTP response. UI next: project from a product or repo URL → first scan → chat or strategic report. Missing key? Settings yells. Silent empty chat usually means you skipped that.
That’s the moment it stops feeling like another chatbot tab. Context sticks to the project instead of dying when you close the window.
Common install errors and fixes
UI fine on the server, dead from your laptop. Ports line is loopback-only. Either "8080:8080" (know what you’re doing) or keep loopback and terminate TLS on a reverse proxy.
BrowserType.launch / Chromium missing (source installs). Crawl paths need Playwright browsers. After the venv: playwright install chromium plus system deps. Dockerfile already runs playwright install-deps chromium and crawl4ai-setup – rebuild if you stripped the stage.
Valid API key, agents still fall over. README line that people skip: model must support tool calling. Tiny completion-only endpoints won’t drive the specialist grid. Change OPENCMO_MODEL_DEFAULT.
Signup stuck, no email. Turns out codes only hit container stderr at WARNING when OPENCMO_SMTP_HOST is unset. Local: docker compose logs opencmo 2>&1 | grep -i verif. Public: set SMTP.
Build dies mid npm ci / pip, or scans thrash the box. Chromium plus multi-agent work is greedy. Free RAM, or build the image on a stronger machine and ship the artifact.
Upgrade, rollback, uninstall
Back up the Docker volume (or the host path behind OPENCMO_DB_PATH) before you pull. Schema surprises are dull until they aren’t.
cd OpenCMO
git pull
docker compose up -d --build
curl -sS http://127.0.0.1:8080/api/v1/health
Rollback from the docs: git checkout <previous-sha> && docker compose up -d --build, restore the DB backup if needed.
docker compose down
# add -v only if you mean to wipe opencmo_data and qdrant_data
docker compose down -v
cd .. && rm -rf OpenCMO
Source path: stop opencmo-web, drop the venv, delete the DB file you configured.
Would one honest product-URL scan on your own hardware beat another year of marketing-SaaS seats? Clone, one key, docker compose up -d --build, confirm /api/v1/health, then judge the first report before you renew anything.
FAQ
Is OpenCMO the same as “using ChatGPT for marketing”?
No. ChatGPT is a general assistant. OpenCMO is a self-hosted project workspace: specialist agents, optional RAG, approval queue so drafts don’t auto-post.
Do I need every optional API key on day one?
Only OPENAI_API_KEY – or key + base URL + model for a compatible provider. Everything else (Tavily, PageSpeed, YouTube, Twitter bearer, GEO, SMTP) waits until the first URL scan succeeds. Typical first hour: key → project URL → scan → chat the findings → documents only if you flipped on the rag profile.
Can I run this multi-tenant for clients tomorrow?
Not as agency SaaS. Current mainline reads as single-tenant BYOK: one trust boundary, one SQLite-backed workspace pattern, shared web token if you set OPENCMO_WEB_TOKEN. Full client isolation and billing aren’t something the README promises. Separate deploys (or separate volumes/tokens) per client until upstream documents stronger tenancy – treat “multi-tenant tomorrow” as an open gap, not a hidden feature.