Sovereign social media publication — platform admin manual. Last updated 2026-04-14.
A single sovereign control surface for publishing company-authored content across every channel where Village can reach new audiences. The hub turns one long-form article into many platform-native posts, holds them behind a Tractatus Guardian review, and lets you publish to real platforms — Mastodon, Village Federation, Substack, Facebook, X, LinkedIn, Reddit, HN, Medium, Threads — from one place.
Not this: A scheduler that automates your voice away.
But this: An inbox of drafts waiting for your approval, a Guardian protecting your brand voice, and a ledger proving every post.
1. INGEST → pull new publications from platform sources 2. EXTRACT → AI extracts ranked topic candidates from each publication 3. PROMOTE → you click a topic, generator produces platform variants 4. REVIEW → Guardian flags concerns, you approve / reject / edit 5. PUBLISH → API for sovereign/capable platforms, copy-assist for the rest 6. RECORD → for copy-assist posts, paste the final URL back so the ledger is accurate
Navigate to https://mdsl.mysovereignty.digital/media-hub.html and sign in as platform admin. You'll see a three-zone layout:
| Zone | Purpose |
|---|---|
| Zone 1 — Briefing | Plain-language AI summary of what's in the queue. 2-min cache. |
| Zone 2 — Action Queue | Drafts pending review, failed publishes, expiring credentials, connector errors. |
| Zone 3 — Watch Grid | Top topics, recent publishes, enabled connectors, stats. |
Click Ingest sources (or press i). The hub reads from platform content only:
docs/articles/AI_GOVERNANCE_SERIES_*.md)PlatformNewsPost collectionNEVER tenant content — this is a hard guarantee enforced at startup.
Click Extract topics (or press x). The hub calls the sovereign InferenceRouter on the home eGPU. For each new publication, the AI returns 3–8 topic candidates. A deterministic ranker scores each on 5 dimensions (novelty, strategic importance, audience fit, timeliness, controversy sensitivity) and produces a 0–1 composite. Top topics appear in Zone 3.
In Zone 3, click Promote next to a topic. The generator creates platform variants for every enabled platform (Mastodon + Village Federation + Substack by default). Each variant passes through MediaPostSafetyChecker. ~30–60 seconds end-to-end.
In Zone 2 you'll see the new draft as a card. The card surfaces everything you need to know before clicking in:
draft pending) and urgency badge[Mastodon] [Village Fed] [Substack 📄] means three variants, Substack is long-form copy-assist.Hover the card — it tints teal to confirm it's clickable. Click anywhere on the card (or press Enter when focused) to open the review modal.
The review modal shows:
Guardian verdicts:
| Verdict | Meaning | Action |
|---|---|---|
| passed | No rule violations | Approve + publish |
| flagged | Concerns noted, not blocking | Read flags, decide |
| critical | Banned claim / char overflow — blocks | Regenerate or edit |
Click Publish now (or schedule).
Cross-posting is the single highest-ROI outreach pattern for Village. Long-form on Substack drives engaged readers back to mysovereignty.digital; a short teaser on your Facebook personal profile (1.5K followers) amplifies reach to people who wouldn't find the Substack organically.
{{SOURCE_URL}} placeholder).ridingthetiger.substack.com/publish/home, hit Publish, copy the resulting URL, paste back into the hub's Record URL input.Each API-based connector needs a one-time developer app registration on the target platform. You only do this once per platform.
mastodon.social (German-hosted, largest instance, best EU reach, verified live) or eupolicy.social (community-run "EU bubble" instance, active as of 2026-04-14, Mastodon 4.5.8, best reach for Brussels-policy audience)social.network.europa.eu as an EU Commission Mastodon option. That was wrong — the EDPS EU Voice pilot was officially closed on 18 May 2024. No EU-institution Mastodon currently exists. Use eupolicy.social for the EU policy audience.write:statuses, read:statusesMediaHubSocialAccount via the account setup page (when built)MEDIA_HUB_FB_APP_ID / MEDIA_HUB_FB_APP_SECRETpages_manage_postsMediaHubSocialAccounttweet.read, tweet.write, users.read, offline.accesshttps://mdsl.mysovereignty.digital/api/media-hub/oauth/twitter/callbackMEDIA_HUB_X_CLIENT_ID / MEDIA_HUB_X_CLIENT_SECREThttps://mdsl.mysovereignty.digital/api/media-hub/oauth/linkedin/callbackw_member_social for personal sharing (starts immediately), or w_organization_social for Page sharing (needs Marketing Developer Platform review, ~2 weeks)MEDIA_HUB_LI_CLIENT_ID / MEDIA_HUB_LI_CLIENT_SECRETw_member_social). It's instant, no review needed, and reaches your LinkedIn network directly.
No dev account setup — these are copy-assist. The hub generates content, you paste manually.
MediaPostSafetyChecker runs 8 deterministic rules on every generated variant.
| Rule | Severity | What triggers it |
|---|---|---|
banned_claim | critical | "HIPAA compliant", "military-grade encryption", "unhackable", etc. |
brand_voice_violation | flagged | "revolutionary", "game-changing", "10x", "potentially", etc. |
banned_vendor_unflagged | flagged | Mentioning Google/AWS/FB/Stripe without sovereignty framing |
sensitive_topic | flagged | Te Tiriti, WAI 262, security incident, etc. |
character_overflow | critical | Draft exceeds platform char limit |
intensity_limit | flagged | Exclamation marks, ALL-CAPS, emoji density |
voice_marker_missing | flagged | Long draft without "Village" / "sovereignty" voice markers |
duplicate_hook | flagged | Same opening 10 words as a recent post |
Fail-open: if the Guardian errors internally, it treats the check as passed so a broken rule engine can't block legitimate content.
| Key | Action |
|---|---|
r | Refresh the hub |
i | Trigger ingest |
x | Trigger topic extraction |
s | Trigger scheduler tick |
Esc | Close draft modal |
| Flag | Default | Effect |
|---|---|---|
MEDIA_HUB_ENABLED | true | Master switch |
MEDIA_HUB_AUTO_PUBLISH_ENABLED | false | Leave false — human-gated is the safer default |
MEDIA_HUB_MASTODON | false | Enable once OAuth wired |
MEDIA_HUB_VILLAGE_FED | true | Sovereign, always on |
MEDIA_HUB_FB | false | Enable after dev account setup |
MEDIA_HUB_X | false | Enable after dev account setup |
MEDIA_HUB_LI | false | Enable after dev account setup |
API returned HTML (maintenance page) instead of JSON. The hub now detects this and shows "Server is in maintenance mode — try again in a minute". Reload after maintenance ends.
Yes. Substack is long-form; the body is the entire source article pasted between the generated hook and outro. That's by design.
That's the hedging-word rule firing. Either edit the word out before publishing, or accept the flag if the hedge is intentional. Flagged (not critical) is advisory.
Substack is copy-assist. Publish Now records intent and creates a FederatedPost with status=pending_external_publish, but does NOT push to Substack. You have to open Substack, paste the fields, click Publish there, and record the URL back in the hub.
mysovereignty.digital/ai-governance-NN.html (deployed with the platform)mysovereignty.digital/media-feed.html (FederatedPost collection on OVH)If any external mirror goes away, the canonical source and the sovereign mirror are unaffected. Village owns the content; external platforms are amplifiers.
Full markdown version at docs/MEDIA_HUB_OPERATOR_GUIDE.md. Last updated 2026-04-14.