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
- Prüfe, ob
AIRTABLE_TOKENundAIRTABLE_BASE_IDgesetzt sind (Umgebung oder eine.envim Arbeitsverzeichnis oder Repository-Stamm). Führepython3 scripts/airtable_calendar.py channelsals Rauchtest aus. Falls die Tabellen noch nicht existieren, verweise den Benutzer aufscripts/setup_airtable.pyim Repository-Stamm. - Finde den Strategie-Ordner. Verwende
STRATEGY_DIR, falls gesetzt. Andernfalls suche nachstrategy.mdim Arbeitsverzeichnis,./my-strategy/und./strategy/. Wenn es keinen gibt, frage, wo er sich befindet. Wenn der Benutzer noch keinen hat, biete an,templates/strategy.mdundtemplates/channels/_channel-template.mdzu 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
RejectedundFailed. - 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 mitcheck-duplicatesausfü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
Ownerauf den in der Kanaldaten genannten Genehmiger. PostContententhä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:
| Situation | Status |
|---|---|
| Bereit zur Überprüfung durch den Besitzer (Standard) | To approve |
| Instagram-, TikTok-, YouTube- oder Pinterest-Beitrag ohne Medien | Needs media |
| Der Benutzer möchte zuerst am Text feilen | Draft |
| 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:
| Datum | Kanal | Status | Name | Erö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 inNeeds mediawechselt automatisch zuTo approve. - „Verschiebe diesen Beitrag“, „lehne diesen ab“. Führe
update <record_id> --set "Scheduled for=2026-11-20"oder--set Status=Rejectedaus. Wenn der Beitrag bereitsScheduledist, führe anschließendpython3 scripts/publish_approved.py --syncaus, damit sich die Kopie in Upload-Post ebenfalls ändert. - „Was geht diese Woche raus?“ Führe
list --from today --to +7aus 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“):
- Führe
python3 scripts/publish_approved.py --sync --reconcile --mode schedule --dry-runaus und zeige, was gesendet würde: Kanal, Datum und Uhrzeit, Medientyp, erste Textzeile. - Nach Bestätigung durch den Benutzer führe es ohne
--dry-runaus. Upload-Post übernimmt den Zeitplan und die Beiträge werden zuScheduled. - Wenn der Slot eines genehmigten Beitrags bereits verstrichen ist, erwähne es und biete
--mode nowan.
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.