Social Hub Publisher — Write once, approve once, publish everywhere.
Queue one announcement and publish it to X, Discord, Bluesky and Telegram without pasting it four times or sending something you did not approve. Everything is driven by one config.json; credentials stay in environment variables.
SKU: social-hub-publisher · Skills: social-hub-publisher-setup + social-hub-publisher · Tested: 24 unit tests including a leak scan
What It Does
- Gate 1 linter: per-channel length (X weights URLs as 23), link-domain allowlist, banned terms, hashtag/mention caps, duplicate detection.
approveHMAC-SHA256 signs the exact text with an expiry; Gate 2 in the dispatcher refuses edited, expired or unsigned items.- X: free 1-click Web Intent links by default. Optional API mode uses 2026 pay-per-use pricing: $0.015 per plain post, $0.20 per post that contains a link.
- Discord webhooks (mentions suppressed), Bluesky AT Protocol (link facets with byte offsets), Telegram Bot API.
- Dry run unless
--live; an ambiguous send is markedunknown_outcomeand never auto-retried. Python standard library only.
Sample session (fictional brand: Acme Cloud Tools)
Sample disclosure: this is a representative sample, not a customer report. It was produced against public or fictional test targets; account and credential values are placeholders or redacted (for example wck_<REDACTED>), and no private keys, seed phrases or secrets are ever shown. Your own report will differ in content and length.
# social-hub-publisher — sample session (fictional brand: Acme Cloud Tools)
Real output from the shipped code; HMAC secret and queue were throw-away.
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json add --channel x --id launch-x --text Acme Cloud Tools 2.0 is live: faster deploys, simpler pricing. Notes: https://acme-cloud.example/2-0 #release
added launch-x (x, 102/280)
[exit 0]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json add --channel discord --target announcements --id launch-dc --text Acme Cloud Tools 2.0 is out. Full notes: https://docs.acme-cloud.example/changelog
added launch-dc (discord, 82/2000)
[exit 0]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json add --channel bluesky --id launch-bsky --text Acme Cloud Tools 2.0 shipped today. Guaranteed zero downtime upgrades!!!
added launch-bsky (bluesky, 72/300)
[exit 0]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json add --channel telegram --id launch-tg --text Acme Cloud Tools 2.0 is out - changelog at https://evil.example/post
added launch-tg (telegram, 68/4096)
[exit 0]
## Gate 1 — lint
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json lint
launch-x [OK]
[INFO ] X_COST: API cost if posted via API: $0.200 (has link); Web Intent is free
launch-dc [OK]
launch-bsky [ERROR]
[ERROR] BANNED_TERM: banned term 'guaranteed'
[WARN ] PUNCTUATION: repeated exclamation marks
launch-tg [ERROR]
[ERROR] DOMAIN_NOT_ALLOWED: link host 'evil.example' is not in lint.allowed_domains
[exit 2]
## Approve (signs the exact text) — two items pass, two are refused
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json approve --id launch-x
launch-x APPROVED until 2026-11-03T04:46:09Z
[INFO ] X_COST: API cost if posted via API: $0.200 (has link); Web Intent is free
[exit 0]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json approve --id launch-dc
launch-dc APPROVED until 2026-11-03T04:46:09Z
[exit 0]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json approve --id launch-bsky
launch-bsky REFUSED (Gate 1 errors)
[ERROR] BANNED_TERM: banned term 'guaranteed'
[WARN ] PUNCTUATION: repeated exclamation marks
[exit 2]
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json approve --id launch-tg
launch-tg REFUSED (Gate 1 errors)
[ERROR] DOMAIN_NOT_ALLOWED: link host 'evil.example' is not in lint.allowed_domains
[exit 2]
## Free 1-click X Web Intent
$ python3 packages/social-hub-publisher/social_hub.py --config /tmp/shp/config.json intent --id launch-x
https://x.com/intent/post?text=Acme%20Cloud%20Tools%202.0%20is%20live%3A%20faster%20deploys%2C%20simpler%20pricing.%20Notes%3A%20https%3A%2F%2Facme-cloud.example%2F2-0%20%23release
# free, 1-click: open the URL, review, press Post. 2026 X API pay-per-use: $0.015 per plain post, $0.20 per post containing a URL. Web Intents are free and 1-click: you press Post yourself.
[exit 0]
## Gate 2 — dispatcher dry run (nothing is sent without --live)
$ python3 packages/social-hub-publisher/dispatcher.py --config /tmp/shp/config.json
launch-x DRY-RUN would send to x
launch-dc DRY-RUN would send to discord
[exit 0]
## Tamper test — edit approved text, Gate 2 refuses
$ python3 packages/social-hub-publisher/dispatcher.py --config /tmp/shp/config.json
launch-x DRY-RUN would send to x
launch-dc REFUSED text changed after approval
[exit 2]
What It Does Not Do
- Posts only to accounts you configure, only text you approved.
- No fake engagement, no duplicate-post spam, no bypassing the allowlist or banned terms.
- Never prints or stores your credentials in the queue.
Frequently Asked Questions
How can I automate multi-account X and Discord announcements without paying monthly SaaS fees like Buffer or Postiz?
How does the 9-rule pre-flight policy linter prevent cross-brand leaks, banned terms, and duplicate posts?
How do HMAC-SHA256 approval tokens and 1-click X web intents work together in the Social Hub?
What safety and refusal boundaries does the Social Hub Publisher enforce (no fake engagement or unapproved auto-posting)?
Licensing & Setup
One-time license, up to 3 workspace-reset rebinds. On Turn 1 the social-hub-publisher-setup skill verifies your agent key, binds your wcl_... code through the read-only license helper, and confirms the bot files are installed. The license code is never printed in chat.
One wcl_... key, two runtimes. Your license key works inside Grok Bot and from any local terminal or IDE agent (Cursor, Claude Code, Windsurf, CI/CD) via the standalone single-file Python 3 CLI (standalone /runtime/<script>.py CLI) — Python 3.10+ standard library only, zero pip install dependencies, with --json / --markdown output.