Wie ich Bluesky-Posts ohne SaaS plane
Ich plane jeden Tag drei Bluesky-Posts mithilfe von GitHub Actions und einer JSONL-Datei. Ich verwende keinen externen Scheduling-Service.
Das System arbeitet mit einer einzigen Datei: content/bluesky-queue.jsonl.
Jede Zeile in dieser Datei ist ein JSON-Objekt.
- Noch nicht gepostete Zeilen enthalten nur Text.
- Gepostete Zeilen enthalten einen Zeitstempel und eine Post-URI.
Das Skript liest die Datei von oben nach unten. Es sucht die erste Zeile ohne Zeitstempel, postet sie und aktualisiert dann diese Zeile.
Warum ich JSONL anstelle einer Datenbank verwende:
- Änderungen lassen sich in Git leicht nachverfolgen.
- Jeder CI-Job kann eine neue Zeile an die Datei anhängen.
- Es hält das Setup einfach und kostenlos.
Umgang mit den Anforderungen der Bluesky-API Bluesky benötigt „Facets“ für Links und Hashtags. Man kann nicht einfach nur Text senden. Man muss die exakten Byte-Positionen für diese Elemente angeben.
Ich verwende ein Skript, um diese Positionen zu berechnen. Ich nutze TextEncoder, um die UTF-8-Byte-Offsets zu erhalten. Dies verhindert Fehler bei der Verwendung von Emojis. Zeichen und Bytes sind nicht dasselbe.
Optimierung von GitHub Actions GitHub Actions startet oft verspätet, wenn man Jobs genau zur vollen Stunde plant. Um dies zu beheben, verwende ich einen Minuten-Versatz. Statt 00:00 verwende ich 23:37. Das reduziert Verzögerungen.
Zudem füge ich vor dem Posten eine zufällige Verzögerung zwischen 0 und 5 Minuten hinzu. Dadurch wirkt das Posting-Muster menschlicher. Es vermeidet das exakte maschinelle Timing, das von einigen Algorithmen weniger bevorzugt wird.
Vermeidung von Endlosschleifen Wenn das Skript die Warteschlange aktualisiert, committet es die Änderung zurück in das Repository. Dies könnte den Workflow erneut auslösen.
Ich löse dies mit einer Schutzmaßnahme in der Commit-Nachricht:
- Das Skript fügt [skip bluesky-queue] zur Commit-Nachricht hinzu.
- Der Workflow prüft auf dieses Tag.
- Wenn das Tag vorhanden ist, wird der Workflow nicht ausgeführt.
Dieses System ist Teil eines langfristigen Experiments mit KI-kuratierten Seiten. Es bleibt schlank, kostengünstig und zuverlässig.
