Artikel

28. Anhang

Allgemein

Der Anhang enthält lauffähige Beispielkonfigurationen, Beispieldaten, Prompts, Cronjobs, Systemd-Dateien, Fehlercodes und Checklisten für MVP und Produktivbetrieb.

28.1 Beispiel .env

Datei:

.env

OPENAI_API_KEY=sk-...
APP_ENV=prod
APP_TIMEZONE=Europe/Berlin
DRY_RUN=true

LINKEDIN_LOGIN_EMAIL=
LINKEDIN_LOGIN_PASSWORD=

INSTAGRAM_LOGIN_USERNAME=
INSTAGRAM_LOGIN_PASSWORD=

FACEBOOK_LOGIN_EMAIL=
FACEBOOK_LOGIN_PASSWORD=

Produktiv:

chmod 600 .env

.env gehört nicht ins Repository.

28.2 Beispiel config.yaml

app:
  name: "social-publisher"
  timezone: "Europe/Berlin"
  mode: "dry_run"

storage:
  data_path: "data"
  prompts_path: "prompts"
  sessions_path: "storage/sessions"
  screenshots_path: "storage/screenshots"
  images_path: "storage/images"
  logs_path: "storage/logs"

platforms:
  linkedin:
    enabled: true
    adapter: "linkedin"
    live_confirmed: false
    session_path: "storage/sessions/linkedin.json"
    screenshots_path: "storage/screenshots/linkedin"
    default_post_type: "text"

  instagram:
    enabled: false
    adapter: "instagram"
    live_confirmed: false
    session_path: "storage/sessions/instagram.json"
    screenshots_path: "storage/screenshots/instagram"
    default_post_type: "image"

  facebook:
    enabled: false
    adapter: "facebook"
    live_confirmed: false
    session_path: "storage/sessions/facebook.json"
    screenshots_path: "storage/screenshots/facebook"
    default_post_type: "text"

accounts:
  linkedin:
    account_name: "xyz Verlag"
    account_type: "personal"
    profile_url: ""

  instagram:
    account_name: "xyz"
    account_type: "business"

  facebook:
    account_name: "xyz Verlag"
    account_type: "page"
    page_name: "xyz Verlag"
    business_suite_url: "https://business.facebook.com/latest/home"

limits:
  max_posts_per_day: 1
  max_comments_per_day: 3
  max_likes_per_day: 5
  max_failures_per_day: 3
  min_minutes_between_posts: 240
  min_minutes_between_comments: 30
  max_retry_attempts: 2

interaction_limits:
  max_comment_suggestions_per_day: 10
  max_approved_comments_per_day: 3
  max_executed_comments_per_day: 3
  max_likes_per_day: 5
  max_external_comments_per_day: 1

topics:
  allowed:
    - "klassiker"
    - "gemeinfreie-literatur"
    - "verlagswerkstatt"
    - "ebook-produktion"
    - "ki-im-verlag"
    - "buchvorstellung"
    - "blogartikel"

  blocked:
    - "parteipolitik"
    - "privates"
    - "religionsstreit"
    - "tagesaufreger"

topic_limits:
  max_posts_per_topic_per_week: 2
  max_posts_per_author_per_week: 2
  max_book_promotions_per_week: 3
  max_workshop_posts_per_week: 2
  max_ai_posts_per_week: 2

content_mix:
  linkedin:
    workshop: 0.4
    ai_publishing: 0.3
    book_intro: 0.2
    blog_summary: 0.1

  instagram:
    quote_card: 0.5
    book_visual: 0.3
    author_note: 0.2

  facebook:
    book_intro: 0.5
    blog_summary: 0.3
    quote: 0.2

posting_days:
  linkedin:
    - "monday"
    - "wednesday"
    - "friday"

  instagram:
    - "tuesday"
    - "thursday"
    - "saturday"

  facebook:
    - "monday"
    - "friday"

posting_windows:
  linkedin:
    - start: "08:30"
      end: "10:30"
    - start: "16:00"
      end: "18:00"

  instagram:
    - start: "11:00"
      end: "13:00"
    - start: "18:00"
      end: "20:00"

  facebook:
    - start: "09:00"
      end: "11:00"
    - start: "17:00"
      end: "19:00"

quiet_hours:
  start: "21:00"
  end: "07:00"

blackout_dates:
  - "2026-01-01"
  - "2026-12-24"
  - "2026-12-25"

safety:
  dry_run_required_for_new_platforms: true
  stop_on_captcha: true
  stop_on_login_required: true
  stop_on_platform_warning: true
  stop_on_unexpected_redirect: true
  stop_after_consecutive_failures: 2
  disable_platform_after_daily_failures: 3
  require_screenshot_after_publish: true
  require_screenshot_on_error: true

kill_switch:
  enabled: false
  reason: ""

platform_kill_switch:
  linkedin:
    enabled: false
    reason: ""

  instagram:
    enabled: false
    reason: ""

  facebook:
    enabled: false
    reason: ""

blocked_actions:
  - "auto_follow"
  - "auto_unfollow"
  - "mass_like"
  - "captcha_bypass"
  - "multi_account_rotation"

comment_safety:
  require_manual_approval_for_external_comments: true
  allow_auto_reply_to_own_comments: false
  allow_sales_links_in_comments: false
  max_comment_length: 600
  reject_generic_comments: true

openai:
  default_model: "gpt-4.1-mini"
  quality_model: "gpt-4.1-mini"
  comment_model: "gpt-4.1-mini"
  max_output_tokens_post: 700
  max_output_tokens_quality: 500
  max_output_tokens_comment: 300
  prompt_version: "1.0.0"

cost_estimates:
  gpt-4.1-mini:
    input_per_1m_tokens: 0.40
    output_per_1m_tokens: 1.60

28.3 Beispiel books.json

Datei:

data/books.json

[
  {
    "id": "book_001",
    "title": "Stolz und Vorurteil",
    "author": "Jane Austen",
    "language": "de",
    "category": "klassiker",
    "description": "Ein Gesellschaftsroman über Herkunft, Heirat, Stolz und Selbsttäuschung.",
    "shop_url": "https://www.xyz.de/stolz-und-vorurteil",
    "cover_image_path": "storage/images/source/stolz-und-vorurteil.jpg",
    "tags": [
      "klassiker",
      "jane-austen",
      "gesellschaftsroman"
    ]
  },
  {
    "id": "book_002",
    "title": "Das Paradies der Damen",
    "author": "Émile Zola",
    "language": "de",
    "category": "klassiker",
    "description": "Ein Roman über Warenhäuser, Konsum, Verführung und wirtschaftlichen Wandel.",
    "shop_url": "https://www.xyz.de/das-paradies-der-damen",
    "cover_image_path": "storage/images/source/das-paradies-der-damen.jpg",
    "tags": [
      "klassiker",
      "zola",
      "warenhaus",
      "gesellschaftsroman"
    ]
  }
]

28.4 Beispiel posts.json

Datei:

data/post_drafts.json

[
  {
    "id": "draft_20260512_093000_123456",
    "source_type": "manual_topic",
    "source_id": "topic_001",
    "platform": "linkedin",
    "post_type": "workshop",
    "status": "draft",
    "text": "Gemeinfreie Texte sind frei verfügbar, aber nicht automatisch verlagsfertig. OCR-Korrektur, Typografie und Metadaten bleiben echte Arbeit.",
    "image_path": null,
    "target_url": "https://www.xyz.de",
    "prompt_name": "workshop_note",
    "prompt_version": "1.0.0",
    "model": "gpt-4.1-mini",
    "quality_result": {
      "passed": true,
      "reason": "passed",
      "checks": {
        "hard_reject": true,
        "character_limit": true,
        "link": true,
        "generic": true,
        "duplicate": true,
        "similarity": true,
        "tone": true,
        "sales_pressure": true,
        "comment_sales_link": true
      }
    },
    "created_at": "2026-05-12T09:30:00+02:00",
    "updated_at": "2026-05-12T09:30:00+02:00"
  },
  {
    "id": "draft_20260512_100000_654321",
    "source_type": "book",
    "source_id": "book_001",
    "platform": "facebook",
    "post_type": "book_intro",
    "status": "approved",
    "text": "Jane Austens Stolz und Vorurteil beobachtet gesellschaftliche Erwartungen genauer, als es eine reine Liebesgeschichte könnte. Herkunft, Vermögen und Selbsttäuschung stehen im Zentrum.",
    "image_path": "storage/images/prepared/facebook/facebook_cover_book_001_1080x1080.jpg",
    "target_url": "https://www.xyz.de/stolz-und-vorurteil",
    "prompt_name": "book_intro",
    "prompt_version": "1.0.0",
    "model": "gpt-4.1-mini",
    "quality_result": {
      "passed": true,
      "reason": "passed"
    },
    "created_at": "2026-05-12T10:00:00+02:00",
    "updated_at": "2026-05-12T10:05:00+02:00",
    "approved_at": "2026-05-12T10:05:00+02:00",
    "approval_mode": "manual"
  }
]

28.5 Beispiel interaction_log.json

Datei:

data/interaction_candidates.json

[
  {
    "id": "interaction_20260512_101500_123456",
    "platform": "linkedin",
    "interaction_type": "external_comment",
    "source_url": "https://www.linkedin.com/feed/update/example",
    "source_author": "Max Beispiel",
    "source_text": "Kleine Anbieter haben oft gute Produkte, aber zu wenig Sichtbarkeit.",
    "relevance_score": 0.82,
    "risk_score": 0.08,
    "status": "suggested",
    "suggested_text": "Im Buchmarkt ist Sichtbarkeit oft der eigentliche Engpass. Eine digitale Ausgabe kann technisch sauber sein, aber ohne Metadaten, Auffindbarkeit und Wiederholung bleibt sie praktisch unsichtbar.",
    "created_at": "2026-05-12T10:15:00+02:00",
    "updated_at": "2026-05-12T10:16:00+02:00"
  },
  {
    "id": "interaction_20260512_102000_654321",
    "platform": "facebook",
    "interaction_type": "comment_reply",
    "source_url": "https://www.facebook.com/example/posts/123",
    "source_author": "Erika Beispiel",
    "source_text": "Sind die Bücher auch als EPUB verfügbar?",
    "relevance_score": 0.91,
    "risk_score": 0.02,
    "status": "approved",
    "suggested_text": "Ja, die aktuellen Ausgaben sind als EPUB angelegt. PDF wird nicht mehr neu produziert, weil der Pflege- und Prüfaufwand dafür im Vertrieb deutlich höher ist.",
    "created_at": "2026-05-12T10:20:00+02:00",
    "updated_at": "2026-05-12T10:25:00+02:00",
    "approved_at": "2026-05-12T10:25:00+02:00"
  }
]

Optionales Ausführungslog:

data/interaction_logs.json

[
  {
    "id": "interaction_log_20260512_001",
    "candidate_id": "interaction_20260512_102000_654321",
    "platform": "facebook",
    "interaction_type": "comment_reply",
    "executed_text": "Ja, die aktuellen Ausgaben sind als EPUB angelegt. PDF wird nicht mehr neu produziert, weil der Pflege- und Prüfaufwand dafür im Vertrieb deutlich höher ist.",
    "status": "executed",
    "screenshot_path": "storage/screenshots/facebook/interaction_20260512_102000_654321_executed.png",
    "executed_at": "2026-05-12T10:30:00+02:00",
    "error_message": null
  }
]

28.6 Beispiel-Prompts

prompts/workshop_note.v1.txt

Du schreibst einen kurzen Werkstattbeitrag aus der Perspektive eines kleinen deutschen E-Book-Verlags.

Thema:
{{ title }}

Ausgangsmaterial:
{{ body }}

Ziel:
Der Beitrag soll einen konkreten Einblick in digitale Verlagsarbeit geben.

Stil:
- fachlich
- konkret
- ruhig
- keine Selbstinszenierung
- keine Emojis
- keine Floskeln
- keine übertriebene Dramatisierung

Regeln:
- maximal 1.000 Zeichen
- ein konkreter technischer oder verlegerischer Punkt
- keine allgemeinen Marketingphrasen
- keine erfundenen Prozessdetails
- keine direkte Ansprache mit „Du“
- kein Verkaufsdruck

Ausgabe:
Erzeuge nur den Beitragstext.

prompts/book_intro.v1.txt

Du schreibst eine kurze Buchvorstellung für einen kleinen deutschen E-Book-Verlag.

Buchtitel:
{{ book_title }}

Autor:
{{ author }}

Beschreibung:
{{ body }}

Kategorie:
{{ category }}

Shoplink:
{{ url }}

Ziel:
Die Buchvorstellung soll Interesse wecken, ohne werblich oder pathetisch zu klingen.

Stil:
- sachlich
- klar
- kultiviert
- nicht kitschig
- nicht akademisch überladen
- keine Emojis

Regeln:
- maximal 900 Zeichen
- keine Formulierungen wie „zeitloses Meisterwerk“, „unvergesslich“, „muss man gelesen haben“
- keine erfundenen historischen Angaben
- keine Inhaltsdetails behaupten, die nicht im Ausgangsmaterial stehen
- kein direkter Kaufbefehl
- ein dezenter Hinweis auf die Ausgabe ist erlaubt

Ausgabe:
Erzeuge nur den Beitragstext.

prompts/comment_suggestion.v1.txt

Du erzeugst einen Kommentarvorschlag für einen kleinen deutschen E-Book-Verlag.

Beitrag:
{{ source_text }}

Verlagskontext:
{{ publisher_context }}

Ziel:
Der Kommentar soll einen konkreten fachlichen Gedanken ergänzen.

Regeln:
- maximal 500 Zeichen
- keine Emojis
- kein Verkaufslink
- keine Eigenwerbung
- keine generischen Komplimente
- keine politische Zuspitzung
- kein Angriff
- keine private Ansprache
- nur ein konkreter Gedanke

Ausgabe:
Wenn ein sinnvoller Kommentar möglich ist, gib nur den Kommentartext zurück.
Wenn kein sinnvoller Kommentar möglich ist, gib exakt zurück:
NO_COMMENT

prompts/tone_check.v1.txt

Du prüfst die Tonalität eines Social-Media-Beitrags für einen kleinen deutschen E-Book-Verlag.

Beitrag:
{{ post_text }}

Gewünschte Tonalität:
- sachlich
- professionell
- kultiviert
- nicht werblich
- nicht generisch
- nicht anbiedernd
- keine Emojis
- keine Floskeln
- keine übertriebene Begeisterung

Unerwünschte Formulierungen:
- unbedingt lesen
- Meisterwerk
- Tauchen Sie ein
- perfekt für
- entdecken Sie jetzt
- lassen Sie sich verzaubern
- für alle Fans von
- ein Muss

Aufgabe:
Bewerte, ob der Beitrag zur gewünschten Tonalität passt.

Antworte ausschließlich im vorgegebenen JSON-Format.

28.7 Beispiel-Crontab

Dry-Run:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.generate_posts >> storage/logs/cron.log 2>&1
10 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.review_queue auto-approve >> storage/logs/cron.log 2>&1
*/15 8-18 * * 1-5 flock -n /tmp/social-publisher.lock bash -lc 'cd /opt/social-publisher && .venv/bin/python -m src.scheduler run' >> /opt/social-publisher/storage/logs/cron.log 2>&1
0 18 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.report daily --date $(date +\%F) >> storage/logs/reports.log 2>&1

Live:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.generate_posts >> storage/logs/cron.log 2>&1
10 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.review_queue auto-approve >> storage/logs/cron.log 2>&1
*/15 8-18 * * 1-5 flock -n /tmp/social-publisher.lock bash -lc 'cd /opt/social-publisher && .venv/bin/python -m src.scheduler run --live' >> /opt/social-publisher/storage/logs/cron.log 2>&1
0 18 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.report daily --date $(date +\%F) >> storage/logs/reports.log 2>&1

28.8 Beispiel-Systemd-Service

Smoke-Test:

[Unit]
Description=Social Publisher Smoke Test
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.main queue status
User=socialpublisher
Group=socialpublisher

[Install]
WantedBy=multi-user.target

Scheduler-Dry-Run:

[Unit]
Description=Social Publisher Scheduler Dry Run
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.scheduler run
User=socialpublisher
Group=socialpublisher

Scheduler-Live:

[Unit]
Description=Social Publisher Scheduler Live
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.scheduler run --live
User=socialpublisher
Group=socialpublisher

Aktivieren ist für oneshot nicht zwingend erforderlich. Cron oder Systemd-Timer startet den Dienst.

28.9 Fehlercodes

Fehlercodes sollten stabil und knapp sein.

CONFIG_MISSING
CONFIG_INVALID
ENV_MISSING
OPENAI_REQUEST_FAILED
OPENAI_EMPTY_RESPONSE
OPENAI_INVALID_JSON
QUALITY_FAILED
DUPLICATE_POST
LINK_INVALID
TEXT_TOO_LONG
IMAGE_MISSING
IMAGE_INVALID
SESSION_MISSING
LOGIN_REQUIRED
CAPTCHA_DETECTED
PLATFORM_WARNING
PLATFORM_ANOMALY
SELECTOR_NOT_FOUND
UPLOAD_FAILED
PUBLISH_FAILED
PUBLISH_STATUS_UNKNOWN
DAILY_LIMIT_REACHED
FAILURE_LIMIT_REACHED
GLOBAL_KILL_SWITCH_ENABLED
PLATFORM_KILL_SWITCH_ENABLED
INTERACTION_REJECTED
COMMENT_TOO_GENERIC
COMMENT_CONTAINS_LINK
COMMENT_TOPIC_BLOCKED
DRY_RUN_ONLY

Beispielstruktur im Fehlerlog:

{
  "timestamp": "2026-05-12T09:31:00+02:00",
  "level": "error",
  "event": "post_failed",
  "platform": "linkedin",
  "reference_id": "draft_20260512_001",
  "payload": {
    "error_code": "SELECTOR_NOT_FOUND",
    "error_type": "PlaywrightTimeoutError",
    "error_message": "Post button not found.",
    "screenshot_path": "storage/screenshots/linkedin/draft_20260512_001_failed.png"
  }
}

Zuordnung:

CONFIG_MISSING
Konfigurationsdatei fehlt.

CONFIG_INVALID
Konfigurationsdatei ist vorhanden, aber strukturell ungültig.

ENV_MISSING
Erforderliche Umgebungsvariable fehlt.

OPENAI_REQUEST_FAILED
OpenAI-Aufruf ist fehlgeschlagen.

OPENAI_EMPTY_RESPONSE
OpenAI-Antwort enthält keinen Text.

OPENAI_INVALID_JSON
Strukturierte OpenAI-Antwort ist kein gültiges JSON.

QUALITY_FAILED
Quality-Gate hat den Beitrag abgelehnt.

DUPLICATE_POST
Beitrag ist identisch oder zu ähnlich.

LINK_INVALID
Link ist formal ungültig oder Domain nicht erlaubt.

TEXT_TOO_LONG
Text überschreitet internes Plattformlimit.

IMAGE_MISSING
Erforderliches Bild fehlt.

IMAGE_INVALID
Bilddatei existiert nicht oder hat ungültiges Format.

SESSION_MISSING
Playwright-Sessiondatei fehlt.

LOGIN_REQUIRED
Plattform verlangt erneuten Login.

CAPTCHA_DETECTED
CAPTCHA oder Sicherheitsprüfung erkannt.

PLATFORM_WARNING
Plattform zeigt Warnung.

PLATFORM_ANOMALY
Ungewöhnliche Plattformreaktion.

SELECTOR_NOT_FOUND
Button, Textbox oder Uploadfeld nicht gefunden.

UPLOAD_FAILED
Bild-Upload fehlgeschlagen.

PUBLISH_FAILED
Veröffentlichung fehlgeschlagen.

PUBLISH_STATUS_UNKNOWN
Nach Absenden ist unklar, ob veröffentlicht wurde.

DAILY_LIMIT_REACHED
Tageslimit erreicht.

FAILURE_LIMIT_REACHED
Fehlerlimit erreicht.

GLOBAL_KILL_SWITCH_ENABLED
Globaler Kill-Switch aktiv.

PLATFORM_KILL_SWITCH_ENABLED
Plattform-Kill-Switch aktiv.

INTERACTION_REJECTED
Interaktionskandidat wurde abgelehnt.

COMMENT_TOO_GENERIC
Kommentar ist zu generisch.

COMMENT_CONTAINS_LINK
Kommentar enthält Link oder Verkaufsverweis.

COMMENT_TOPIC_BLOCKED
Kommentarquelle enthält blockiertes Thema.

DRY_RUN_ONLY
Live-Ausführung nicht erlaubt.

28.10 Checkliste MVP

Projektstruktur angelegt
Python venv erstellt
requirements.txt vorhanden
Playwright installiert
Chromium installiert
.env erstellt
config.yaml erstellt
.gitignore enthält .env, .venv, storage/sessions
OpenAI-Client funktioniert
safety_identifier gesetzt
books.json vorhanden
topics.json vorhanden
post_drafts.json vorhanden
Prompts vorhanden
Content-Generator erzeugt Entwurf
Quality-Gate prüft Entwurf
Review-Queue zeigt Entwurf
Entwurf kann freigegeben werden
Entwurf kann abgelehnt werden
Dry-Run für LinkedIn funktioniert
Screenshot wird gespeichert
Logs werden geschrieben
Report kann erzeugt werden
Kill-Switch wird geprüft
Session kann gespeichert werden
Session kann geprüft werden
pytest läuft
keine echten Plattformaktionen in Unit-Tests
Cron läuft im Dry-Run

Minimaler MVP-Testlauf:

python -m src.browser_session login linkedin
python -m src.browser_session check linkedin --headed
python -m src.main generate --platform linkedin --type workshop
python -m src.main queue list --status draft
python -m src.main queue approve draft_...
python -m src.main publish draft_...
python -m src.main logs events --limit 20
python -m src.main report daily --date 2026-05-12
pytest

28.11 Checkliste Produktivbetrieb

Serververzeichnis unter /opt/social-publisher angelegt
eigener Systemnutzer eingerichtet
Dateirechte gesetzt
.env mit chmod 600 geschützt
storage/sessions mit chmod 700 geschützt
Playwright-Browser mit Dependencies installiert
LinkedIn-Session manuell erstellt
Instagram-Session nur bei Bedarf erstellt
Facebook-Session nur bei Bedarf erstellt
config.yaml auf prod geprüft
DRY_RUN zunächst aktiv
globaler Kill-Switch geprüft
Plattform-Kill-Switches geprüft
Posting-Limits geprüft
Fehlerlimits geprüft
Cron mit Lockfile eingerichtet
Smoke-Test erfolgreich
Dry-Run produktiv erfolgreich
Screenshot nach Dry-Run geprüft
Logs geprüft
erster Live-Post manuell freigegeben
erster Live-Post einzeln ausgeführt
Plattform danach manuell geprüft
Tagesreport geprüft
Backup vor Änderungen eingerichtet
Rollback-Verzeichnis vorbereitet
Monatsroutine dokumentiert
Plattformänderungen werden dokumentiert
Prompts werden versioniert
Sessions werden regelmäßig geprüft
blocked-Status wird nicht automatisch wiederholt
CAPTCHA wird nicht automatisiert behandelt
Login-Probleme werden manuell gelöst

Produktiver Start in sicherer Reihenfolge:

cd /opt/social-publisher
.venv/bin/python -m src.main queue status
.venv/bin/python -m src.browser_session check linkedin --headed
.venv/bin/python -m src.main generate --platform linkedin --type workshop
.venv/bin/python -m src.main queue list --status draft
.venv/bin/python -m src.main queue approve draft_...
.venv/bin/python -m src.main publish draft_...
.venv/bin/python -m src.main logs events --limit 20
.venv/bin/python -m src.main publish draft_... --live
.venv/bin/python -m src.main report daily --date 2026-05-12

Abschluss

Damit ist das schnelle Handbuch vollständig:

Ziel und Rahmen
Architektur
Setup
Konfiguration
Datenmodell
Content-Quellen
OpenAI-Integration
Prompt-Bibliothek
Content-Generator
Qualitätsprüfung
Review-Queue
Playwright-Grundlagen
Posting-Engine
LinkedIn
Instagram
Facebook
Bildverwaltung
Interaktionssystem
Kommentarlogik
Scheduler
Logging
Monitoring
Sicherheitslogik
CLI
Deployment
Tests
Wartung
Anhang

Das System bleibt bewusst kontrolliert:

erst erzeugen
dann prüfen
dann freigeben
dann veröffentlichen
immer loggen
immer Screenshots speichern
bei Unsicherheit stoppen

0 Kommentare