Skip to content
publik.
Browse appsAppsPricingSupport buildersSupport
+Publish a repoPublish
Browse appsHow it worksPublish a repoSupport buildersGet helpPricingDevelopersGitHubPrivacy
© 2026 Publik
← All apps

OpenCampaign

Free Mailchimp Alternative

AI runs online

not yet reviewed by publik. It is live now; the founder has not reviewed this version yet.

O

OpenCampaign

open source · on publik

On your phone?

You install OpenCampaign from a computer. Send yourself the link and open it there.

Vote on OpenCampaign
0
Read the install guide→Open in GitHub↗

Compared with

M

Mailchimp

Paid

Make this yours→Fork OpenCampaign, change it, publish your version. About 30 minutes. No experience needed.

Having trouble? Tell us

Where OpenCampaign’s AI runs, and what it costs

Prices are for one typical use: one request of about 1,500 words sent and 375 words back. A higher quality score is better.

On your computer

Not checked yet: publik has not read whether OpenCampaign can run its AI on your computer.

publik API

Price
$0.0100 per use, $10.00 per 1,000 usespublik-balanced, the default level
Quality
MiMo-V2.6-Pro: 46
Setup
Not built into OpenCampaign yet. A publik API key works wherever OpenCampaign takes an OpenAI-compatible address.

Your own key

Price
$0.0013 per use, $1.31 per 1,000 usesMiMo-V2.6-Pro at OpenRouter’s list price, before its fee for buying usage
Quality
MiMo-V2.6-Pro: 46
Setup
Open a provider account, add a card, paste the key into OpenCampaign.

Quality and price, side by side

Quality score and cost per 1,000 typical uses for local models and the three publik API levels
ModelQualityPer 1,000 uses
On your computer (Ollama, 4-bit download size)
Granite 4.2 3B2.2 GB9$0
Phi-4 Mini2.5 GB6$0
Llama 3.1 8B4.9 GB7$0
gpt-oss 20B14 GB9$0
Gemma 4 31B20 GB19*$0
Qwen3.5 35B-A3B24 GB19*$0
publik API
publik-fastGLM-5.3 Flash42$1.00
publik-balancedMiMo-V2.6-Pro · OpenCampaign46$10.00
publik-smartGPT-6 Sol48$18.00

Quality: Artificial Analysis Intelligence Index v4.3.2, read 2026-09-22 (publik API models 2026-09-25); * = estimated by Artificial Analysis. Sizes: the Ollama library, read 2026-09-22.

What you pay for

  • On your computer: nothing per use. You pay in disk space, memory and electricity, at lower quality.
  • publik API: publik’s published price for each use, in dollars, from your publik balance. It is above the model’s cost; the difference runs publik and pays the app’s builder.
  • Your own key: the provider’s price, billed to an account you keep with the provider.
See plans and prices →How publik API pricing works →

How to install OpenCampaign

Every step written out. No terminal experience needed. Pick your setup.

  • How to install OpenCampaign on Mac →
  • How to install OpenCampaign on Windows →

README

Open in GitHub ↗

OpenCampaign

Self-hosted email marketing: accounts, campaigns, audiences, automations, signup forms, open/click tracking and AI-assisted campaign review — in one Next.js app backed by SQLite.

Features

  • Accounts — multi-account with per-account workspaces: each account gets its own audience, campaigns, templates, automations, settings and AI keys. Sessions are DB-backed httpOnly cookies; passwords hashed with scrypt.
  • Campaigns — HTML editor with live preview, personalization tokens ({{first_name}}, {{company}}, …), test sends, and a guided send flow with simulation mode.
  • Audience — contacts with statuses (subscribed / pending / unsubscribed / cleaned), tags, search and filters, CSV import/export.
  • Automations — signup- and tag-triggered emails with optional delay. A 60-second in-app heartbeat processes jobs; an external cron can drive it too.
  • Templates — reusable HTML layouts with per-template preview, start campaigns from any of them.
  • Reports — open/click rates per campaign and per contact, 30-day engagement timeline. No demo numbers: every metric reflects real activity on your account.
  • Signup forms — embeddable form snippet with honeypot spam protection, optional double opt-in. The snippet carries your account id so signups land in the right workspace.
  • Tracking & compliance — open pixel, click redirects, one-click unsubscribe page; an unsubscribe footer is appended automatically when missing.
  • AI review — pre-send analysis of every campaign (see below).

No demo data ships with the app — workspaces start empty, so dashboards and reports only ever show your real numbers.

Environment variables

VariablePurpose
DATABASE_URLSQLite file path, e.g. file:./db/custom.db
APP_URLPublic base URL used in tracking links, pixels and unsubscribe URLs

Everything else (SMTP credentials, AI keys) is configured in the app under Settings and stored in the database — no extra env vars needed.

AI analysis

Open any campaign → AI review → Analyze campaign. Four interchangeable engines, all returning the same score / strengths / issues / suggestions / subject-ideas report. Keys are stored per account and can be tested from Settings → AI analysis:

ProviderNotes
LocalBuilt-in heuristics: subject quality, spam trigger words, caps/punctuation, image-to-text balance, link count, CTA verbs, personalization, unsubscribe compliance. No key, nothing leaves the server.
OpenRouterUses your key and picks a free model automatically — fetches the live model list, filters for $0/$0 pricing, prefers strong known free models, retries down the list. Caches for an hour.
OpenAIChat Completions with JSON-mode output (gpt-4o-mini).
PublikHQPosts to a PublikHQ-compatible AI endpoint.

PublikHQ endpoint contract

POST {publikhqUrl}/api/v1/ai/analyze
Authorization: Bearer {apiKey}
{ "campaign": { "name", "subject", "previewText", "content", "fromName", "fromEmail" } }

Responses are parsed flexibly: a JSON object with score / summary / strengths / issues / suggestions / subjectIdeas, the same wrapped in { "data": … }, a { "analysis" | "content" | "text": "…" } string (JSON or prose), or raw prose — which is then merged with local scoring. When OpenCampaign itself is deployed on publikhq.com, set the endpoint to your own domain for fully self-hosted AI.

Sending email

  • Simulation mode (default): records recipients, tokens and tracking without delivering — safe for testing the whole pipeline.
  • Live SMTP: fill in Settings → Delivery (host, port, user, password, TLS). Campaigns and automations then send real email through nodemailer. Test sends always render the exact final email (personalization + tracking + unsubscribe).

Automations processing

The dashboard pings POST /api/automations/process every 60 s. For server-side processing independent of the UI, add a cron:

* * * * * curl -fsS -X POST https://your-domain.com/api/automations/process > /dev/null

Deploying to publikhq.com

Option A — Docker on a VPS (recommended)
  1. Point DNS: an A record for publikhq.com (and www) at your server's IP.
  2. On the server:
git clone <your-repo-url> opencampaign && cd opencampaign
APP_URL=https://publikhq.com docker compose up -d --build

Schema migration and server start happen automatically; SQLite persists in the opencampaign-data volume.

  1. TLS + reverse proxy with Caddy:
# /etc/caddy/Caddyfile
publikhq.com, www.publikhq.com {
    reverse_proxy localhost:3000
}
sudo systemctl reload caddy

Caddy issues and renews certificates automatically. (Nginx + certbot works the same way: proxy_pass http://127.0.0.1:3000; with standard upgrade headers.)

Option B — Node process (no Docker)
git clone <your-repo-url> opencampaign && cd opencampaign
npm install
cp .env.example .env          # DATABASE_URL=file:/var/lib/opencampaign/app.db  APP_URL=https://publikhq.com
npm run db:push
npm run build
npx pm2 start "npm run start:node" --name opencampaign
pm2 save && pm2 startup

Then reverse-proxy port 3000 as above.

Option C — any Node hosting platform

Set these on the platform dashboard:

SettingValue
Build commandnpm install && npm run build
Start commandnpm run start:node
Env varsDATABASE_URL (persistent disk path!), APP_URL=https://publikhq.com, NODE_ENV=production

SQLite needs a persistent disk mounted at the path in DATABASE_URL. On ephemeral filesystems use a hosted Postgres/MySQL by swapping the Prisma datasource in prisma/schema.prisma.

Post-deploy checklist
  • APP_URL set to https://publikhq.com (tracking links in emails must be absolute and public).
  • Open /settings: sender defaults, SMTP credentials, AI provider + keys.
  • Add the automations cron from the section above.
  • Send yourself a test campaign and click through the unsubscribe link.

Project structure

src/
  app/
    page.tsx                  # auth gate + single-page app shell (sidebar + views)
    api/                      # REST API + auth + tracking endpoints
      auth/{signup,signin,signout,me,password}
      campaigns/[id]/{send,test,analyze}
      contacts/{import,export}
      automations/process     # cron-friendly job processor
      track/{open,click,unsubscribe}/[token]
      signup                  # public form endpoint (routes by account id)
  components/oc/              # feature views (auth, dashboard, campaigns, audience, …)
  lib/
    ai/                       # local engine + openrouter + openai + publikhq
    auth.ts                   # scrypt hashing, sessions, per-account settings
    mail.ts                   # personalization, tracking rewrite, SMTP
    automations.ts            # enqueue + process due jobs
    csv.ts, oc-client.ts, db.ts
prisma/
  schema.prisma               # data model (User, Session, Campaign, Contact, …)

No seed script — accounts start empty on purpose.

License

MIT — see LICENSE.