OpenClaw Maintenance mit Claude Code

Der Schmerz der OpenClaw Maintenance

OpenClaw ist ein Produkt des Vibe Coding. Man sagt, die Qualität des Code sei — hmm — optimierungsfähig bis fragwürdig. Ich kann das nicht wirklich beurteilen — ich bin kein (ausreichend guter) Entwickler. 

Was mir aber recht schnell klar wurde, nachdem ich seit Anfang 2026 mit OpenClaw experimentiere, dass selbst ein einfaches Update ziemlich herausfordernd sein kann. Während ich eines im Februar noch selbst durchführen und anschließend diverse Unstimmigkeiten beseitigen konnte, ging OpenClaw beim Wechsel von v2026.4.12 auf v2026.7.1–2 komplett auf die Bretter. 

Mit Hilfe von Claude konnte ich das zwar alles beheben, aber es war trotzdem extrem zeitaufwändig. Ich habe nämlich den “klassischen” Claude Chat benutzt, was dann zu ziemlichen Copy ‘n Paste-Orgien führte: Problem (Text oder Screenshot) und mit Bitte um Lösung prompten, Claudes Lösungsvorschlag sichten und ins Terminal pasten, Ergebnis und Logs wieder zurück zu Claude. 

Nach 2h mehr oder minder konstantem Rumgewerkel fasste Claude dann das Ergebnis wie folgt zusammen: 

- Gateway sauber auf 2026.7.1-2, über npm/stable statt dem alten Git-Checkout
- Alle Workspace-Daten erhalten
- Command Owner gesetzt
- pdf-tools und mcp-hass wieder aktiv
- iMessage komplett von BlueBubbles auf das native imsg-Plugin migriert – DM und Gruppe laufen

Das gesamte Vorgehen, das Claude wählte, um die Probleme nach der Migration von .4.12 auf .7.1–2 zu testen, zu analysieren, zu fixen und erneut zu testen war dabei extrem beeindruckend. Nach ich diesen Erfahrungsbericht dann auf Mastodon postete, meinte dann jemand, dass er Wartungsaufgaben durch ChatGPT Codex durchführen lässt. 

Da eines meiner Teams sehr gute Erfahrungen mit Codex gemacht hat, dachte ich mir, dass nun der Zeitpunkt gekommen ist, an dem ich mir hierzu mal selbst Hands-on-Erfahrungen hole — allerdings nicht mit Codex, sondern mit Claude Code.

OpenClaw Maintenance mit Claude Code

Hintergrund

Mein OpenClaw läuft auf einem dedizierten Mac Studio mit einer eigenen UserID und normalen Nutzerrechten (kein admin, kein root, kein sudo), hat eine eigene Identität im Netz (Max), eine eigene Mailadresse und kann nur auf seine eigene Daten schreibend zugreifen. Max kann nur lesend auf sehr wenige meiner Daten zugreifen, die ich hierfür extra selektiert habe (bspw. eine Obsidian Knowledge Base). Kommunizieren kann Max via Telegram, iMessage und Email. Ansonsten kann er ins Web gehen via Brave Search, WebFetch und Brave Browser. Auf extra für diesen Zweck selektierte Entitäten der Hausautomation kann er via Home Assistant MCP zugreifen, den Status auslesen und bei einigen wenigen den Status ändern (bspw. einige Schalter schalten oder auch die Temperatur von Klimaanlage oder Whirlpool einstellen). 

Die Aufgabe

Mein Ziel bei Max war und ist es, einen OpenClaw-Playground zu haben, bei dem nichts kaputt gehen kann, wenn ich damit experimentiere oder eine Prompt Injection das Ding Amok laufen lässt. Und wenn doch etwas kaputt geht — oder sogar alles — dann soll das schlichtweg nichts ausmachen, weil meine Daten getrennt sind und ich die Maschine plattmachen und wieder komplett neu aufbauen kann. Selbst eine potentielle Komplettexfiltration der Daten, die Max lesen kann, sollte kein Problem sein.

Ein weiteres Ziel ist Max’ Autarkie: Der gesamte Software-Stack, den der User “Max” benötigt, um OpenClaw mit Ollama und allen zugehörigen Skills und Tools laufen zu lassen, soll komplett in Max’ User-Kontext laufen und sich dort maintainen lassen. 

Dieses Ziel habe ich als Aufgabe formuliert an Claude Code gegeben. 

Und was soll ich sagen? Es hat grandios gut funktioniert: Claude Code zunächst unter einem Admin laufen gelassen, um die Abhängigkeiten zu Tools analysieren zu lassen, die Max nicht selbst maintainen kann (kein sudo) und soll (Impact auf andere User). Dann diese Abhängigkeiten aufgelöst: Claude Code unter Max laufen lassen und alles in seinem User-Kontext beschafft und installiert, was er benötigt.

Weil das so extrem gut funktioniert hat, habe ich anschließend noch mehrere Optimierung an OpenClaw vorgenommen: Performance optimiert, E‑Mail von Apple Mail MCP auf Himalaya umgestellt, Finetuning an iMessage- und Telegram-Gruppen, etc.

Abschließend habe ich Claude Code gebeten, seine gesamte Arbeit in einer strukturierten MD-Datei zu dokumentieren. Und da ich bei jedem Schritt dabei war, den er gemacht hat, kann ich sagen: Exzellente Arbeit! Sowohl die Analyse, die Arbeitsplanung, die Durchführung, das Testen und auch die abschließende Dokumentation: Einfach nur Wow. 

Um einen Eindruck von Claudes Fähigkeiten zu bekommen — und ich bin sicher nur an der Oberfläche gekratzt zu haben — folgt hier die Dokumentation, die er erstellt hat.

OpenClaw / Mac Studio — Änderungsprotokoll

Dokumentation aller Änderungen, die Claude am OpenClaw-Setup auf dem Mac Studio (macstudio*****, User max****) vorgenommen hat. Stand: 29. Juli 2026.


1 Node.js / nvm — Autonomie von max****

Ziel: OpenClaw und alle Abhängigkeiten sollen vollständig unter dem Nicht-Admin-User max**** laufen, unabhängig vom Admin-Account b****** und dessen Homebrew-Installation (/opt/homebrew, für max**** nicht beschreibbar).

  • nvm installiert (offizielles Install-Skript), Node 22.23.1 als Default gesetzt
  • ~/.npmrc bereinigt (prefix=...-Zeile entfernt, die mit nvm kollidierte)
  • openclaw und mcporter unter nvm neu installiert (parallel zur bestehenden Homebrew-Node-Installation)
  • uv installiert (~/.local/bin, kein Homebrew nötig) — für spätere Python-Abhängigkeiten ohne Admin-Rechte

2 OpenClaw-Gateway-Service

  • Service-PATH (~/.openclaw/service-env/ai.openclaw.gateway.env) manuell um ~/.local/bin ergänzt, da der reguläre gateway install-Reinstall die PATH nicht korrekt aus der interaktiven Shell übernimmt (betrifft z.B. Erkennung von himalaya, siehe Abschnitt 8)
  • openclaw doctor --repair mehrfach ausgeführt (Plugin-Registry-Reparatur nach nvm-Umstieg, Telegram-groupAllowFrom-Korrektur)
  • Tool-Sichtbarkeit tools.sessions.visibility von Default tree auf agent gesetzt — notwendig, damit isolierte Cron-Sessions (z.B. der Memory-Sync-Job) auf andere Sessions desselben Agents zugreifen können (sessions_history)

3 Apple Mail MCP (apple-mail-mcp) — Repariert, dann komplett abgelöst

3.1 Ursprüngliche Reparatur (mittlerweile obsolet, siehe Abschnitt 7)

  • Python-venv des Skills war leer/defekt (Python 3.9, ModuleNotFoundError: mcp) → mit uv + Python 3.12 neu aufgebaut
  • Falsche venv zuerst repariert (plugin/venv statt der tatsächlich von mcporter.json referenzierten Top-Level-venv) → korrigiert
  • macOS-Automation-Berechtigungen (AppleEvents) für zwei Prozess-Identitäten erteilt (Terminal, Homebrew-Node 22.23.1) — jeweils per physischer Bestätigung am Bildschirm
  • Syntax-Bug in SKILL.md: Beispiele nutzten ungültige tool(arg: "value")-Syntax statt key=value → korrigiert (verursachte zsh:1: number expected)
  • Zeilenumbruch-Bugescape_applescript() in core.py wandelte echte Zeilenumbrüche in den literalen Text \n um (AppleScript kennt kein \n-Escape) → neue Funktion escape_applescript_multiline() ergänzt, nutzt AppleScripts & return &-Verkettung
  • Zitat-Bug: Mail.app verpackt per content-Property gesetzten Text automatisch in ein <blockquote> (Darstellung als Zitat mit blauem Balken auf iOS) — als Workaround auf Zwischenablage-Paste umgestellt (compose_emailgeneriert automatisch simples HTML via _build_html_from_text(), wenn kein body_html übergeben wird)

3.2 Warum trotzdem abgelöst

Die Paste-basierte Lösung hängt an macOS Accessibility/UI-Automatisierung (System Events), die sich als grundsätzlich instabil erwies (Fenster-Erkennung fiel wiederholt und unvorhersehbar aus, u.a. mit einem realen Mail-Verlust bei einem unbeaufsichtigten Cron-Lauf zur Folge). Auf Wunsch des Nutzers komplett durch eine protokoll-basierte Lösung ersetzt (Abschnitt 7).

4 Cron-Jobs — Diverse Fixes

JobFix
Täglicher Memory-Log Eintrag(a) tools.sessions.visibility global auf agent gesetzt (Grundproblem: isolierte Cron-Session konnte andere Sessions nicht lesen → sessions_history lief ins Leere, Job meldete fälschlich MEMORY_SKIP). (b) Prompt umgeschrieben: feste Session-Keys statt unzuverlässiger sessions_list-Suche; alle 4 relevanten Kanäle (Telegram/iMessage × direkt/Gruppe) statt nur einem. © Explizite Regel ergänzt: MEMORY_SKIP-Antwort und tatsächliches Schreiben schließen sich gegenseitig aus (behebt Fälle, in denen der Job schrieb, aber trotzdem “Skip” meldete).
Morgens — News“Kein \n”-Formatierungs-Notbremse entfernt (durch den Zeilenumbruch-Fix in Abschnitt 3 nicht mehr nötig), echte Absatzstruktur erlaubt. Später auf Himalaya umgestellt (Abschnitt 7).
Donnerstagsnachmittags — WochenendeSuche auf nichtkommerzielle Veranstaltungskalender eingeschränkt. Timeout-Fehler behoben (payload.timeoutSeconds von Default 600s auf 1200s erhöht, da Recherche + Versand bei diesem Job regelmäßig >600s brauchten). Später auf Himalaya umgestellt.
Donnerstagsnachmittags — J**Timeout ebenfalls auf 1200s erhöht (gleicher Grund).

5 Tailscale — Fernzugriff für die iOS-App

  • Tailscale (App Store, unter max**** eigener Apple-ID/Tailscale-Identität, getrennt von b****) installiert und eingerichtet
  • Gateway umgestellt: gateway.bind: loopback (kein LAN-Zugriff mehr) + gateway.tailscale.mode: serve(nur innerhalb des eigenen Tailnets erreichbar, kein öffentliches Funnel)
  • Erreichbar unter wss://macstudio*****.*.*.*
  • Für b***** iPhone: separates, eigenes Tailscale-Konto empfohlen, nur der Mac-Studio-Host gezielt geteilt (statt volles Tailnet-Mitglied)
  • Device-Pairing der iOS-App mehrfach neu aufgesetzt (Node-Rolle freigegeben für Kamera/Fotos-Zugriff)

Offen/ungelöst: Bild- und Text-Versand aus der iOS-App blieb sporadisch in der lokalen Warteschlange hängen (“In Warteschlange”, nie beim Gateway angekommen). Ursache nicht abschließend geklärt — es zeigte sich zusätzlich eine instabile Accessibility-Erkennung von Mail-Fenstern durch macOS selbst (siehe Abschnitt 3), möglicherweise ein verwandtes systemseitiges Phänomen. Nutzer hat das Thema vorerst zurückgestellt (Telegram funktioniert zuverlässig für Bilder).

6 Gruppen-Verhalten (Telegram & iMessage)

  • Problem: Max antwortete in der gemeinsamen Gruppe (Bodo & Y****) auf jede Nachricht, auch wenn nur Y**** direkt angesprochen wurde
  • requireMention: true für die Telegram-Gruppe UND für alle iMessage-Gruppen (channels.imessage.groups.*.requireMention) gesetzt
  • Globales Trigger-Wort ergänzt: messages.groupChat.mentionPatterns: ["\\bmax\\b"] — Max reagiert jetzt nur bei @max****, direkter Antwort auf seine eigene Nachricht, oder dem Wort “Max” im Text. Gilt für beide (Bodo und Y****) gleichermaßen.

7 Mail-Migration: Apple Mail MCP → Himalaya CLI

Vollständige Ablösung der AppleScript/Mail.app-Automatisierung durch direktes SMTP/IMAP.

  • Himalaya CLI installiert (curl ... | PREFIX=~/.local sh, kein Homebrew nötig), Version 2.0.0
  • Skill in OpenClaw aktiviert (skills.entries.himalaya.enabled: true), lag zuvor deaktiviert unter skills.entries.<name>.enabled (unabhängig von Binary-Verfügbarkeit)
  • ~/.config/himalaya/config.toml angelegt (iCloud SMTP smtp.mail.me.com:587, IMAP imap.mail.me.com:993)
  • Sicheres Credential-Handling: App-spezifisches Passwort liegt in der macOS-Keychain (security add-generic-password ... -s himalaya-icloud), Config referenziert es nur per password.command — kein Klartext-Passwort in Dateien
  • Bundled SKILL.md hatte veraltete Befehlssyntax (z.B. folder statt mailboxmessage write statt message compose --send) — korrigiert auf die tatsächliche v2.0‑Syntax
  • End-to-end getestet: Senden (SMTP) und Empfangen/Lesen (IMAP) funktionieren zuverlässig, deutlich schneller und stabiler als die alte Mail.app-Automatisierung
  • Cron-Jobs Morgens — News und Donnerstagsnachmittags — Wochenende auf himalaya message compose ... --send --save "Sent Messages" umgestellt; explizite Anweisung, Erfolg nur bei tatsächlicher Erfolgsmeldung zu melden

7.1 Vollständige Bereinigung alter Referenzen

  • apple-mail-mcp-Skill deaktiviert (skills.entries.apple-mail-mcp.enabled: false)
  • apple-mail-mcp-Eintrag aus beiden aktiven mcporter.json-Configs entfernt
  • AGENTS.md: Mail-Instruktion auf Himalaya umgeschrieben, mcporter/apple-mail-mcp für Mail explizit verboten
  • MCP-SYNTAX.md: Enthielt noch die generell falsche mcporter-Syntax (Doppelpunkt-Stil, Ursache des ursprünglichen zsh-Bugs) — korrigiert auf key=value; Mail-Beispiel durch Himalaya-Verweis ersetzt
  • MEMORY.md: Komplette alte apple-mail-mcp-Befehlsreferenz durch Himalaya-Referenz ersetzt
  • Sieben veraltete, seit Monaten ungenutzte Einzel-Skripte gelöscht (send_event_email.py/.shemail_reader.pytmp_send_email.pyemail_venues_2026_04_30.pydaily/newsletter_email.pytmp/send_email.py)

8 Inbox-Schutz gegen Prompt Injection (Himalaya-Äquivalent zur Mail.app-Regel)

Ersetzt/ergänzt die bestehende Mail.app-Regel (client-seitig, nur aktiv wenn Mail.app läuft) durch einen Himalaya-nativen, deterministischen Mechanismus.

  • Neues Skript: ~/.openclaw/workspace/scripts/inbox_allowlist_filter.py
    • Prüft ausschließlich den Absender (From-Header über envelope list --json), liest niemals den Mail-Body
    • Verschiebt alle Nachrichten von nicht erlaubten Absendern nach “Deleted Messages”
    • Allowlist: …
  • Als Cron-Job vom Typ “command” eingerichtet (Inbox Allowlist Filter, alle 10 Minuten) — bewusst kein LLM-Turn, rein deterministisch, dadurch von Natur aus immun gegen Prompt-Injection-Versuche im Mail-Inhalt
  • Benachrichtigungen deaktiviert (würde sonst alle 10 Minuten auch “nichts gefunden” melden); Verlauf über openclaw cron runs einsehbar
  • Getestet mit simulierten Absendern außerhalb der Allowlist (inkl. eines Prompt-Injection-Textbeispiels) — korrekt erkannt und in den Papierkorb verschoben

9 Ollama / Performance

  • keep_alive: "24h" für das aktive Modell (qwen3.6:35b-a3b-q4_K_M) gesetzt — Standard war 5 Minuten, danach musste das Modell bei jeder Anfrage neu geladen werden (gemessen: 7,2s Kaltstart vs. 132ms warm)
  • temperature: 0.7top_p: 0.9 gesetzt (Standard war temperature=1top_p=0.95) — Milderung des gelegentlichen Einstreuens chinesischer Schriftzeichen (bekanntes Qwen-Phänomen, keine 100%ige Garantie)
  • Geprüft, aber unverändert gelassen (Nutzer-Entscheidung): OLLAMA_NUM_PARALLEL=1OLLAMA_KV_CACHE_TYPE(Standard) — beides bräuchte einen Ollama-Neustart mit geänderten Server-Umgebungsvariablen
  • web_search-Tool wieder aktiviert (tools.web.search.provider: "brave") — Brave-API-Key war bereits als Plugin-Credential vorhanden, aber nicht mit dem web_search-Tool verknüpft

10 Aktueller Stand (Zusammenfassung)

  • Mail: läuft vollständig über Himalaya/SMTP/IMAP, keine Mail.app-Automatisierung mehr für Senden/Empfangen durch Max; Passwort sicher in der Keychain
  • Cron-Jobs: alle mail-versendenden Jobs auf Himalaya umgestellt, Timeouts und Formatierung korrigiert, Memory-Sync-Job liest zuverlässig alle 4 Kanäle
  • Fernzugriff: Tailscale eingerichtet und aktiv; iOS-App-Nachrichtenversand mit Bildern bleibt ein offener, nicht abschließend gelöster Punkt
  • Gruppen: Max reagiert nur noch auf direkte Ansprache (Name/Mention/Reply), nicht mehr auf jede Nachricht
  • Sicherheit: Absender-Allowlist-Filter als eigenständige, KI-freie Schutzschicht gegen Prompt Injection über Mail aktiv
  • Performance: Modell bleibt 24h warm geladen, Sampling leicht konservativer eingestellt

Hähnlein gegen Rechtsextremismus: Merz’ CDU, Rechtspopulismus, die Wirtschaft und der Bürgermeister

Gestern war in Hähnlein die erste Versammlung gegen Rechtsextremismus und Demokratiefeindlichkeit. Ein Aufruf aller Fraktionen. 

Aufruf zur Versammlung gegen Rechtsextremismus am 1. März 2024 in Hähnlein

Gut so! Immerhin haben in Hähnlein bei der letzten Landtagswahl über 20% der Wähler ihre Stimme der sog. Alternative für Deutschland (AfD) gegeben. 

Ergebnisse der Landtagswahl 2023 (Landesstimmen) im Wahlbezirk Hähnlein

Rund 250 Menschen waren dem Aufruf gefolgt. Erwartungsgemäß hielt auch Bürgermeister Sebastian Bubenzer (CDU) eine Rede. Dessen Parteivorsitzender Friedrich Merz lässt bekanntermaßen keine Gelegenheit aus, mit rechtspopulistischen Äußerungen die Mitte der Gesellschaft zu spalten (“kleine Paschas”, “Asylbewerber lassen sich die Zähne neu machen“ [3, 4]) und eine unsere Verfassung in Frage stellende sogenannte Leitkultur zu postulieren [7].

Herr Merz möchte mit seinen menschenfeindlichen und aufstachelnden Parolen seine CDU genau bei den Wählern andienen, die er glaubt, an die AfD verloren zu haben oder die er in Gefahr sieht, dort hin zu verlieren. Noch in 2018 wollte Merz die AfD halbieren [5], inzwischen ist sie mehr als doppelt so stark! Wähler die rechts wählen wollen, wählen AfD [1, 2].

Der Vorsitzende Merz und sein Generalsekretär Linnemann lassen keine Gelegenheit aus, um die vermeintlichen Ursachen der Umfrage- und Wahlerfolge der AfD als die Konsequenzen einer verfehlten Politik der Ampel in Berlin zu deklarieren. Merz erklärt die Grünen zum Hauptgegner, macht sie für eine “Volkserziehungsattitüde” verantwortlich [6]. Zugleich macht er Stimmung gegen Andersdenkende und Menschen, die nicht zu einer sogenannten Leitkultur nach seiner Fasson passen [7]. Noch 2017 wurde die sog. Leitkultur als das bezeichnet, was sie ist — als “pure rechte Stimmungsmache” [8].

Kurzum: Friedrich Merz projiziert Probleme auf Andersdenkende und andere demokratische Parteien. Er tritt damit in die Fußstapfen rechtspopulistischer bis nationalsozialistischer Parteien und macht aus der CDU eine schlechte Kopie der rechtsextremistischen AfD, die “AfD mit Substanz”, wie er es nennt.

Genau aus genau diesem Grunde bin ich dann zur Demonstration mit einem dazu passenden Schild, um an Herrn Bubenzer von der CDU eine Botschaft zu übermitteln.

Schild mit der Aufschrift: Merz’ CDU ist mitgemeint

Und diese Botschaft lautet: “Merz’ CDU ist mitgemeint”. Ob sich der Bürgermeister Bubenzer den populistischen Aussagen seines Parteivorsitzenden anschließen würde, weiß ich nicht. Deshalb war mir auch wichtig zu differenzieren und gezielt die “Merz’ CDU” anzusprechen. Mir ist sehr wohl bewusst, dass auch die CDU als demokratische Partei einem stetigen Wandel unterliegt und auch heute noch Mitglieder hat, die ihren Vorsitzenden sehr kritisch sehen [12].

Bubenzer betonte in seiner Rede, dass man natürlich auch über die Ursachen des zunehmenden Rechtsextremismus sprechen dürfen müsse, wenngleich er es ausgelassen hat, seine Sicht auf eben diese Ursachen darzustellen. Dass auch CDU-Mitglieder Teilnehmer des Treffens von Rechtsextremisten in Potsdam waren [9], hat er selbstredend unerwähnt gelassen wie auch die populistischen Ausfälle seines Bundesvorsitzenden und das Durchbrechen der sog. Brandmauer durch die CDU [10].

Stattdessen hat Bubenzer gleich mehrfach betont, dass es ja neben der menschenverachtenden Haltung, die hinter dem Begriff der Remigration steckt, doch auch wirtschaftlich problematisch sei, wenn die vielen Menschen mit Migrationshintergrund aus Deutschland “remigriert” würden. Um dies zu untermauern, hatte er sich zuvor extra frische “Zahlen” von lokal ansässigen Betrieben eingeholt, um zu erfahren, dass deren Belegschaft aus mehr als 50% und bis zu 70% Menschen mit Migrationshintergrund bestehen würde.

Bei Bubenzers Rede entstand deshalb der Eindruck, als sollte der wirtschaftliche Nutzen von Menschen mit Migrationshintergrund gleichwertig neben der Menschenwürde platziert werden. Wenngleich eine utilitaristische Sicht keine ungewöhnliche in wirtschaftsliberalen Kreisen ist (siehe bspw. Verkürzung der Gymnasialschulzeit zu G8), zeigt sie vor dem Hintergrund des Versammlungsanlasses doch die Sicht und Prioritäten des CDU-Bürgermeisters Bubenzer.

Herr Bubenzer, selbst wenn die von Rechtsextremisten, Faschisten, AfD- und CDU-Mitgliedern diskutierte “Remigration” nur solche Menschen bedrohen würde, die keinerlei wirtschaftlichen Nutzen für Deutschland hätten, handelt es sich bei dem Treffen von Potsdam trotzdem um die niederträchtigste und menschenverachtendste Versammlung von Nazis, die es seit Ende des zweiten Weltkrieges in Deutschland an das Licht der Öffentlichkeit geschafft hat.

Und seien Sie sich gewiss, Herr Bubenzer: Es sind nicht die den massenhaften Deportationen folgenden wirtschaftlichen Konsequenzen, die Millionen von Menschen auf die Straße bringen! 

Quellen

[1] Wie halbiert man die AfD?, FAZ 17.06.2023, https://www.faz.net/aktuell/politik/inland/merz-und-seine-brandmauer-wie-halbiert-man-die-afd-18969309.html

[2] Friedrich Merz wollte die AfD “halbieren” – und verhilft ihr nun zu neuem Aufschwung, Spiegel 26.11.2018, https://www.spiegel.de/politik/deutschland/friedrich-merz-verhilft-afd-zu-aufschwung-die-ergebnisse-der-forsa-umfrage-a-81aa3cef-718e-49ab-b58e-6dc21ecd1242

[3] Merz nennt Migrantenkinder “kleine Paschas”, WDR 11.01.2023, https://www1.wdr.de/nachrichten/merz-nennt-migranten-kinder-kleine-paschas-100.html

[4] Merz: Migranten lassen sich die Zähne machen, ZDF 28.09.2023, https://www.zdf.de/nachrichten/politik/deutschland/merz-gefluechtete-zahnarzt-100.html

[5] Merz will die AfD halbieren, Welt 14.11.2018, https://www.welt.de/politik/deutschland/article183831170/CDU-Friedrich-Merz-will-der-AfD-die-Haelfte-ihrer-Waehler-abjagen.html

[6] Merz’ Kampfansage an die Grünen, Tagesschau 27.06.2023, https://www.tagesschau.de/inland/innenpolitik/merz-gruene-100.html

[7] Verbände kritisieren CDU-Grundsatzprogramm, Tagesschau 12.12.2023, https://www.tagesschau.de/inland/innenpolitik/kritik-cdu-grundsatzprogramm-100.html

[8] “Pure rechte Stimmungsmache”, Die Zeit 30. April 2017, https://www.zeit.de/politik/deutschland/2017–04/thomas-de-maiziere-leitkultur-integration-kritik

[9] Treffen von Rechtsextremisten in Potsdam 2023, Wikipedia abgerufen 2.3.2024, https://de.wikipedia.org/wiki/Treffen_von_Rechtsextremisten_in_Potsdam_2023

[10] “Ganz besonderer politischer Tabubruch”, Tagesschau 15.09.2023, https://www.tagesschau.de/inland/thueringen-cdu-kritik-100.html

[11] Friedrich Merz: CDU soll „Alternative für Deutschland – mit Substanz“ sein, Berliner Zeitung 20.07.2023, https://www.berliner-zeitung.de/news/kritik-an-friedrich-merz-aussage-cdu-soll-alternative-fuer-deutschland-mit-substanz-sein-li.371516

[12] „Ex-Generalsekretär Polenz zu CDU-Plan: Leitkultur ist übergriffig“, taz 30. 1. 2024, https://taz.de/Ex-Generalsekretaer-Polenz-zu-CDU-Plan/!5985669/