# Mailforge Plugin

Modular email marketing tool — extracted from the Mailforge live app and refactored as an **embeddable plugin** for CRMs (Laravel, Next.js, anything that can sign a JWT and reverse-proxy).

## Was es kann

- **AI-Briefing → MJML-Email-Generation** (OpenRouter / Claude Sonnet)
- **Visual MJML-Editor** (TipTap-based)
- **Recipients / Segments** über pluggable CRM-Adapter
- **Send-Pipeline** (M365 / SMTP / eigene Provider) mit A/B-Tests
- **Open/Click/Conversion-Tracking** + Attribution
- **Spam-Preflight**, **Section-Templates**, **Trigger-Mails**

Jedes davon ist ein **eigenes Modul**, einzeln in `modules.config.ts` aktivierbar.

## 5-Minuten Quickstart

```bash
# 1. Dependencies
npm install

# 2. Konfiguration
cp .env.example .env.local
# .env.local editieren — mindestens MAILFORGE_JWT_SECRET + APP_ENCRYPTION_KEY setzen

# 3. Datenbank (SQLite-Default)
npm run db:migrate
npm run db:seed-dev      # Demo-Workspace anlegen

# 4. Start
npm run dev
# → http://localhost:3000
```

Ohne Host-CRM: Standard ist **Standalone-App** (`next.config.ts` setzt `NEXT_PUBLIC_MAILFORGE_PRODUCT=standalone` beim Build, solange nicht `MAILFORGE_EMBEDDED=1`). Beim ersten Aufruf setzt der Proxy eine Session per Auto-Bootstrap (kein `/login`). CRM-Kontakte kommen über den **Generic-REST-Adapter** (Settings → CRM oder `GENERIC_CRM_*` in der Env). **Native Login** optional: `MAILFORGE_NATIVE_AUTH=true` in `.env.local`, User mit `npm run native-user -- email pass`.

Standardmäßig läuft das Tool mit:
- SQLite-DB
- Allen 10 Modulen aktiv außer `sending` + `heroImage` + `triggerTemplates`
- Generic-REST-CRM-Adapter (Mock-Mode wenn kein CRM konfiguriert)
- SMTP-Send-Adapter

## Alternative: Mit Docker

```bash
docker compose up --build
# → http://localhost:3000
```

Compose nutzt die mitgelieferte `.env.example`. Das **Docker-Image** ist standardmäßig eine **Standalone-App** (Build ohne `MAILFORGE_EMBEDDED=1` → Auto-Bootstrap, kein CRM-Redirect). **CRM-Embed** ins Host-CRM: Image mit Build-Arg `MAILFORGE_EMBEDDED=1` bauen (siehe `Dockerfile` / `next.config.ts`). **Native Login** optional über Env + `npm run native-user`. Zwei Container (`app` + `worker`). Persistenz: `./data`, `./public/assets/upload`, `./public/assets/hero`.

Production-Setup: eigene Reverse-Proxy-Labels (Traefik/Caddy/Nginx) ergänzen und TLS terminieren — die mitgelieferte `docker-compose.yml` ist bewusst minimal.

## Was Entwickler anpassen müssen

| Aufgabe | Datei |
|---|---|
| Module ein/ausschalten | `modules.config.ts` |
| Eigenen CRM-Adapter schreiben | `src/adapters/crm/` + `adapters.config.ts` |
| Eigenen Mail-Provider schreiben | `src/adapters/send/` + `adapters.config.ts` |
| MySQL statt SQLite | `.env.local` (`DB_DRIVER=mysql`, `DATABASE_URL=...`) |
| Host-CRM Auth einbinden | `examples/laravel-jwt-middleware.php` |

## Vollständige Dokumentation

| Dokument | Zweck |
|---|---|
| `docs/INTEGRATION.md` | Schritt-für-Schritt Laravel-Integration |
| `docs/SCHEMA.md` | Datenbank-Schema + ERD + DDL |
| `docs/MODULES.md` | Was tut jedes Modul + welche Tabellen + welche Routes |
| `docs/ADAPTERS.md` | Eigenen CRM- oder Send-Adapter schreiben |

## Lizenz

Interne Verwendung. Nicht zur öffentlichen Verteilung.
