Hub de difusión para la red de acampadas (fork de trabajo del Tactical Media Broadcast Hub)
Find a file
hacklab d310385d29 feat: outreach contacts — track hand-written DMs per collective
A list of public accounts a collective wants to write to (artists,
collectives, public figures), with a drafted message per contact and the
state of the conversation: todo, sent, replied, declined.

The Hub does not send these messages. "Copy & open profile" puts the
draft on the clipboard and opens the profile; a person sends it from the
platform's own DM box and marks it sent. Unsolicited bulk DMs break the
terms of every commercial platform and get accounts restricted, and
Instagram's API cannot open a conversation at all.

API (OutreachModule):
- migration 041: outreach_contacts, RLS enabled + forced with WITH CHECK,
  unique per (workspace, platform, lower(handle)); permissions
  outreach.view (Owner/Admin/Editor/Moderator) and outreach.manage
  (Owner/Admin/Editor).
- GET/POST/PATCH/DELETE /outreach/contacts; bulk import up to 500 rows,
  known accounts skipped. Audit records list changes and status moves,
  never the message text.

Web: /outreach page (sidebar + More), CSV import, {name}/{handle}
template for pending contacts, status filters, a daily counter that
warns past 20 first messages.

Tests: service and request parsing with the DB faked; the migration and
every service query were also run against PGlite as the non-superuser
app role (tenant isolation, conflict skip, status timestamps).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:15:03 +02:00
.github/workflows Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
apps feat: outreach contacts — track hand-written DMs per collective 2026-10-15 14:15:03 +02:00
docs feat: wire the Instagram connector into connect and publishing 2026-10-15 14:15:03 +02:00
infra feat: enable oCIS public link sharing (folders can be shared publicly) 2026-10-15 09:56:25 +00:00
packages feat: wire the Instagram connector into connect and publishing 2026-10-15 14:15:03 +02:00
scripts e2e: brand palette guard — fails on blue-family colors in the embedded surfaces 2026-10-13 19:42:06 +00:00
.dockerignore Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
.editorconfig Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
.gitignore Track the files scaffold; sync deployed oCIS compose requirements 2026-10-11 07:51:59 +00:00
eslint.config.mjs Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
LICENSE Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
package.json Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
pnpm-lock.yaml feat: wire the Instagram connector into connect and publishing 2026-10-15 14:15:03 +02:00
pnpm-workspace.yaml Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
README.md docs: publish governance, governed boosts, receipts, OIDC phase 2, files SSO 2026-10-14 11:52:48 +00:00
tsconfig.base.json Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
turbo.json Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00

Tactical Media Broadcast Hub

Self-hosted multi-tenant social / video / livestream management platform with a generic connector system and a Virtual Channel / Auto Director subsystem.

Built for collectives that need to coordinate media across platforms without concentrating access in one person's hands. Every credential lives in an encrypted vault. Every editorial decision lands in a tamper-evident audit log. Every feature is multi-tenant with row-level security.

Features

  • Publishing pipeline — drafts → group approval → schedule → fenced dispatch → receipts. Per-connection publish governance: auto, one-admin, majority or consensus sign-off per account — boosts included. Multi-platform fan-out (Mastodon, Telegram, Bluesky, PeerTube, Facebook, Instagram, Threads, LinkedIn, Reddit, Twitch, Discord, Slack). DST-proof scheduling.
  • Files SSO — the Hub is the OIDC issuer for oCIS Drive: one sign-in, auto-provisioned personal drives, rotating refresh tokens that die with your Hub session (logout propagates).
  • Column wall — live multi-platform feed columns, TweetDeck-style. Safe rendering (hostile-HTML tested). Per-source cooldown + adaptive backoff.
  • Live Control Room — browser multiview, TAKE/CUT, preview/program, lower-thirds, scrolling chyrons, audio mixing, tally.
  • Auto-Director — priority rules switch sources automatically so the stream never dies mid-action.
  • Chat governance — bridged chats (Telegram/Twitch/Discord) into one overlay. Polls with configurable quorum. Approval gates on every post. Machine-readable reason codes.
  • Distributed transcode workers — laptops and GPUs join as render workers over Tailscale. Per-job sandboxed FFmpeg (UID/seccomp/no-network).
  • Archive — content-addressed encrypted S3, dedup, full-text search, CSV/JSON export. Deleted platform content stays citable.
  • Analytics — month-partitioned snapshots, current + previous month with deltas, per-provider breakdown.

Quickstart

pnpm install
pnpm lint && pnpm typecheck && pnpm build

# infrastructure
docker compose -f infra/docker-compose.yml up -d postgres redis temporal minio otel-collector prometheus grafana

# everything incl. media stub + mock live source + mock RTMP sink
docker compose -f infra/docker-compose.yml --profile dev up -d

# apps
pnpm dev            # api :3000, web :3001(adjust if colliding), scheduler, media-worker :3100
curl localhost:3000/healthz
curl localhost:3000/readyz

Documentation

Section Path
Engineering guide docs/engineering-guide.md
Admin guide docs/admin-guide.md
User manual docs/user-manual-v2.md
Design docs docs/design/
Streaming architecture docs/design/streaming-architecture.md
Deployment (occupymedia.cc) infra/occupymedia/DEPLOY.md

Deterministic live-source testing

pnpm --filter @tactical-media-broadcast-hub/media-worker soak -- --hours 8 --out

Security & trust model

Self-hosted, end to end — no corporate cloud, no accounts needed to run the system itself. Multi-tenant with row-level security; platform credentials in an encrypted vault the database never sees in plaintext; every editorial action in a hash-chained audit log; anonymous-infrastructure friendly (the host carries boxes, not content — storage is ciphertext).