Skip to content

Deploy OpenCMO v0.1.0: Self-Hosted AI Marketing

Install OpenCMO v0.1.0 for self-hosted AI marketing: Docker steps, system needs, first scan, health check, and real install fixes.

6 min readIntermediate

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
  1. docker compose version
  2. docker compose up -d --build
  3. docker compose logs -f opencmo
  4. 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:8080 with TLS
  • SMTP when real signup mail matters: OPENCMO_SMTP_HOST, 587/465, user/pass, optional OPENCMO_SMTP_FROM
  • OPENCMO_AUTO_PUBLISH=0 until 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.