Social Calendar

Verwandle einen beliebigen Content (Feature-Notiz, Screenshot, News-Link, Podcast-Clip, Kundenbewertung, Eventfoto, Datenpunkt) in Social-Media-Beiträge für alle relevanten Kanäle, verfasse sie in der jeweiligen Kanalstimme und plane sie in einem Airtable-Redaktionskalender zur Freigabe ein.

Was ist Social Calendar?

Das 'Social Calendar'-Skill automatisiert den Content-Workflow von einem einzelnen Input bis zu geplanten Beiträgen. Es analysiert die Inhaltsstrategie (strategy.md), die Kanaleigenschaften (channels/*.md) und den bestehenden Kalender, um Lücken, Kollisionen und Duplikate zu erkennen. Anschließend generiert es für jeden aktiven Kanal zielgruppengerechte Beiträge (z. B. LinkedIn, X, Instagram, TikTok, Substack) inklusive visueller Assets und schreibt sie als 'To approve'-Datensätze in Airtable. Der Publisher (publish_approved.py) lässt sich auf Befehl ausführen, um genehmigte Beiträge an Upload-Post zu übergeben. Das Skill vermeidet Halluzinationen (nutzt nur Fakten aus Quelle und Strategie), unterstützt mehrere Sprachen, Bild-Uploads über catbox.moe und eine detaillierte Validierung. Plattformen: Claude Code, Cursor, Codex, GitHub Copilot Agent. Es ist ideal für Marketingteams, Gründer und Agenturen, die einen konsistenten, skalierbaren Social-Media-Prozess ohne ständige manuelle Eingriffe benötigen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/faloppad/agent-social-calendar/tree/main/skills/social-calendar

Installed? Explore more Produktivität & Zusammenarbeit skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Social Calendar?

Verwandle einen einzelnen Content in Beiträge für viele Kanäle und lege sie im Airtable-Kalender zur Freigabe ab. Die Veröffentlichung erfolgt über scripts/publish_approved.py, das genehmigte Beiträge an den Upload-Post-Scheduler übergibt. Du führst es nur aus, wenn der Benutzer darum bittet.

Feldnamen, Statuswerte und Umgebungsvariablen stammen aus docs/data-model.md im Repository. Benenne nichts um. Die Skriptpfade unten sind relativ zum Ordner dieses Skills.

Vorbereitung

  1. Prüfe, ob AIRTABLE_TOKEN und AIRTABLE_BASE_ID gesetzt sind (Umgebung oder eine .env im Arbeitsverzeichnis oder Repository-Stamm). Führe python3 scripts/airtable_calendar.py channels als Rauchtest aus. Falls die Tabellen noch nicht existieren, verweise den Benutzer auf scripts/setup_airtable.py im Repository-Stamm.
  2. Finde den Strategie-Ordner. Verwende STRATEGY_DIR, falls gesetzt. Andernfalls suche nach strategy.md im Arbeitsverzeichnis, ./my-strategy/ und ./strategy/. Wenn es keinen gibt, frage, wo er sich befindet. Wenn der Benutzer noch keinen hat, biete an, templates/strategy.md und templates/channels/_channel-template.md zu kopieren und gemeinsam auszufüllen, bevor du Beiträge schreibst.

Wenn der Airtable-MCP-Connector verfügbar ist, kannst du ihn anstelle der Skripte für Lese- und Schreibvorgänge verwenden. Die Regeln dieser Datei gelten weiterhin. Siehe references/airtable.md.

Arbeitsablauf

1. Strategie und Kanaldaten lesen

Lies strategy.md vollständig: Ziele, OKRs, Zielgruppen, Content-Säulen, globale Regeln. Liste dann channels/*.md auf und lies die Dateien für die Kanäle, für die dieser Content infrage kommt. Jede Kanaldaten enthält die Stimme des Kontos, Ziele, Kadenz, Formate, Do's und Don'ts sowie Beispielbeiträge.

Ordne Kanaldaten den Zeilen in der Channels-Tabelle über das Feld Channel file zu. Nur Kanäle, die in Airtable Active sind, können Beiträge erhalten. Wenn eine Kanaldaten keine passende Channels-Zeile hat, teile dies mit und überspringe sie.

2. Beitragstyp und Kampagne identifizieren

Arbeite heraus, um welchen Content es sich handelt: Feature-Launch, News, Podcast- oder Videoclips, Kundenbewertung, Eventfotos, Daten- oder Texterkenntnis, Artikelwerbung oder etwas anderes. Lies references/post-types.md, um zu erfahren, wie jeder Typ zu Beiträgen wird, welche Kanäle geeignet sind und wie weit er gestreut werden sollte.

Gib der Charge ein Campaign-Label im Format YYYY-MM <Typ> <Label>, z. B. 2026-11 Podcast Ep 12 oder 2026-11 Feature CSV-Export. Füge die Rohdaten in Source ein (Link, Dateiname, Episode oder ein einzeilige Notiz).

Stelle nur dann eine Frage, wenn die Antwort die Beiträge verändert, z. B. „Welche Kanäle?“, wenn die Strategie es nicht offensichtlich macht, oder „Ist das bis zu einem Datum embargoed?“. Ansonsten entscheide und teile mit, was du entschieden hast.

3. Kalender ansehen

Liste auf, was bereits für den Zeitraum geplant ist, den du füllen möchtest (Standard: die nächsten 4 Wochen, bei Podcast-Clips länger):

python3 scripts/airtable_calendar.py list --from today --to +28 --json > /tmp/calendar.json

Ermittle für jeden Zielkanal:

  • Kadenzenlücken. Beiträge pro Woche im Vergleich zum Ziel der Kanaldaten. Zähle jeden Status außer Rejected und Failed.
  • Kollisionen. Tage, die bereits einen Beitrag auf diesem Kanal haben. Standardmäßig maximal ein Beitrag pro Tag und Kanal, sofern die Kanaldaten nichts anderes sagen.
  • Themenmix. Zu viel von einem Typ in einer Woche (drei News-Beiträge, zwei Promos hintereinander). Verschiebe den neuen Beitrag stattdessen in eine leisere Woche.
  • Duplikate. Dieselbe Nachricht bereits geplant oder kürzlich live. Der create-Befehl führt eine Ähnlichkeitsprüfung durch. Du kannst sie auch separat mit check-duplicates ausführen.

4. Beiträge entwerfen

Schreibe einen Beitrag pro Kanal pro Datum. Jeder folgt der entsprechenden Kanaldaten: Stimme, Länge, Format, Hashtags, Handlungsaufforderung. Allgemeingültige Regeln:

  • Verwende nur Fakten, die in der Quelle oder den Strategiedateien stehen. Erfinde keine Zahlen, Zitate, Kundennamen oder Ergebnisse.
  • Füge denselben Text nicht kanalübergreifend ein. Das Profil eines Gründers und die Unternehmensseite sagen unterschiedliche Dinge über dieselbe Funktion.
  • Mitarbeiter- und Mitgründer-Kanäle werden in der Stimme dieser Person verfasst und benötigen deren Freigabe. Setze Owner auf den in der Kanaldaten genannten Genehmiger.
  • PostContent enthält den endgültigen Text mit echten Zeilenumbrüchen. Emojis und Unicode sind in Ordnung. Hashtags werden inline gesetzt, normalerweise am Ende, wie es die Kanaldaten vorgibt.
  • LinkedIn und X zeigen **text** als literale Sternchen. Verwende **fett** nur für Kanäle, in die ein Mensch in einen Markdown-fähigen Editor einfügt, z. B. Substack. Folge der Kanaldaten, wenn sie etwas anderes sagt.
  • Längenbeschränkungen: X teilt alles über 280 Zeichen in einen Thread auf, Threads über 500, Bluesky über 300. Schreibe passend, es sei denn, die Kanaldaten verlangen nach Threads.
  • Befolge die Schreibregeln in strategy.md. Wenn es keine gibt, schreibe klare, direkte Sätze und verzichte auf Füllwörter, Hype-Wörter und Standardphrasen.

5. Daten auswählen

Scheduled for ist nur ein Datum, YYYY-MM-DD. Die Stunde stammt aus der Post time und Timezone des Kanals, also füge keine Uhrzeiten in den Beitrag ein.

  • Fülle zuerst Kadenzenlücken, dann verteile den Rest. Werbebeiträge für einen einzelnen Artikel verteilen sich auf 2 bis 3 Wochen, nicht alle am selben Tag.
  • News gehen am selben oder nächsten Tag raus, oder gar nicht.
  • Podcast-Clips gehen grob ein oder zwei pro Kanal und Woche über etwa 3 Monate.
  • Mische Typen über eine Woche: Bildung, Engagement, Produkt, sozialer Beweis.
  • Verwende niemals ein Datum in der Vergangenheit. Verwende „heute“ nur, wenn der Benutzer danach fragt und weiß, dass der tägliche Durchlauf bereits stattgefunden haben könnte.
  • Wenn eine Woche voll ist, verschiebe den Beitrag auf die nächste Woche und teile dies im Bericht mit.

6. Medien hosten

Airtable verarbeitet nur öffentliche URLs. Lokale Pfade und file://-Links werden stillschweigend ignoriert. Bilder und Videos in einem create-Batch können lokale Pfade sein. Das Skript lädt sie zunächst auf catbox.moe hoch und übergibt die öffentliche URL an Airtable, das die Datei in seinen eigenen Speicher kopiert. Catbox-Uploads sind öffentlich und können nicht gelöscht werden, also verwende es nicht für vertrauliche Daten. Frage den Benutzer in diesem Fall nach einem anderen Host. Details finden sich in references/airtable.md.

Für Text- und Datenbeiträge, die ein visuelles Element benötigen (Instagram, TikTok oder eine Kanaldaten, die eines verlangt), erstelle ein einfaches Bild. Folge references/visuals.md.

7. Datensätze erstellen

Schreibe den Batch als JSON-Liste unter Verwendung der Posts-Feldnamen:

[
  {
    "Name": "Feature - CSV-Export",
    "Status": "To approve",
    "Scheduled for": "2026-11-12",
    "Channel": "Brightloop LinkedIn",
    "PostContent": "Sie können jetzt jeden Bericht als CSV exportieren.\n\nEin Klick, oben rechts.",
    "Media": ["/tmp/csv-export.png"],
    "Source": "Release Note 2026-11-10",
    "Campaign": "2026-11 Feature CSV-Export",
    "Owner": "[email protected]"
  }
]

Wähle den Status wie folgt:

SituationStatus
Bereit zur Überprüfung durch den Besitzer (Standard)To approve
Instagram-, TikTok-, YouTube- oder Pinterest-Beitrag ohne MedienNeeds media
Der Benutzer möchte zuerst am Text feilenDraft
Der Benutzer genehmigt explizit für seine eigenen Kanäle (siehe unten)Approved

Führe zuerst einen Probelauf durch, zeige dem Benutzer den Plan und erstelle dann:

python3 scripts/airtable_calendar.py create /tmp/batch.json --dry-run
python3 scripts/airtable_calendar.py create /tmp/batch.json

create validiert Feldnamen, Status, Daten und Kanalnamen, stuft beitragslose Beiträge für reine Bildplattformen auf Needs media herab und weigert sich zu schreiben, wenn wahrscheinliche Duplikate gefunden werden. Korrigiere den Batch oder übergib --allow-duplicates, wenn der Benutzer die Wiederholung bestätigt. Es schreibt in Batches von 10. Pläne, die in einer CSV mit den Spalten Date, Channel, Content Type, Post Text, Hashtags, Image Suggestion gespeichert sind, können direkt mit --csv übernommen werden.

8. Bericht erstatten

Schließe mit einer Tabelle ab, eine Zeile pro erstelltem Datensatz, sortiert nach Datum:

DatumKanalStatusNameEröffnungszeile

Darunter liste in einfachen Sätzen auf: Kanäle, die du übersprungen hast (mit Grund), Beiträge, die du auf eine spätere Woche verschoben hast, Beiträge in Needs media und was sie benötigen, sowie alles, was der Besitzer überprüfen sollte (Behauptungen, Namen, Links).

Andere Anfragen

  • „Füge diesen Beiträgen das Bild hinzu.“ Führe python3 scripts/airtable_calendar.py attach <record_id> <file or URL> aus. Ein Beitrag in Needs media wechselt automatisch zu To approve.
  • „Verschiebe diesen Beitrag“, „lehne diesen ab“. Führe update <record_id> --set "Scheduled for=2026-11-20" oder --set Status=Rejected aus. Wenn der Beitrag bereits Scheduled ist, führe anschließend python3 scripts/publish_approved.py --sync aus, damit sich die Kopie in Upload-Post ebenfalls ändert.
  • „Was geht diese Woche raus?“ Führe list --from today --to +7 aus und fasse nach Kanal und Tag zusammen.
  • Änderungen an Strategie oder Stimme. Bearbeite die Markdown-Dateien, nicht Airtable. Das wöchentliche social-calendar-review-Skill schlägt diese Änderungen vor.

Im Auftrag des Benutzers genehmigen

Nur wenn der Benutzer es explizit sagt („genehmige meine“, „die können direkt raus“), und nur für Kanäle, deren Owner er ist. Genehmige niemals Beiträge auf dem Profil eines Mitarbeiters oder Mitgründers, selbst wenn beiläufig darum gebeten wird. Verweise den Benutzer stattdessen an diese Person. Setze diese Datensätze auf Approved, entweder bei der Erstellung oder mit update <record_id> --set Status=Approved, und liste sie im Bericht separat auf.

Übergabe an die Veröffentlichung

Wenn der Benutzer darum bittet, genehmigte Beiträge einzuplanen („plane alles ein, was genehmigt ist“, „veröffentliche diese“):

  1. Führe python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-run aus und zeige, was gesendet würde: Kanal, Datum und Uhrzeit, Medientyp, erste Textzeile.
  2. Nach Bestätigung durch den Benutzer führe es ohne --dry-run aus. Upload-Post übernimmt den Zeitplan und die Beiträge werden zu Scheduled.
  3. Wenn der Slot eines genehmigten Beitrags bereits verstrichen ist, erwähne es und biete --mode now an.

Der Benutzer hat möglicherweise auch einen Routine- oder Cron-Job, der das Skript ausführt; in diesem Fall werden genehmigte Beiträge ohne dein Zutun geplant. Lese references/publishing.md für Neuplanung, Stornierung, Abgleich und die vollständige Feldzuordnung. Bevorzuge das Skript gegenüber eigenen Upload-Post-Aufrufen, da das Skript keine Token pro Beitrag kostet.

Veröffentliche oder plane niemals etwas, das der Benutzer nicht in dieser Unterhaltung angefragt hat. Das Schreiben von Datensätzen mit To approve ist der normale Abschluss dieses Skills.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Verwandte Skills