Hub de difusión para la red de acampadas (fork de trabajo del Tactical Media Broadcast Hub)
Find a file
glass beadian e7e703c105 Integrate group files: nullable room for uploads, archive class, claim idempotency, upload route
Wires the three parallel group-cloud tracks to one surface and fixes the
seams between them:

- chat_media_archive.room_id becomes nullable (direct web uploads have no
  Matrix room yet — the contract's null-event pattern extends to the room);
  core GroupFile.roomId and ArchiveEntryInput.roomId follow.
- mime_class gains 'archive' (zip) across the 029 CHECK, validation
  MIME_CLASSES and the bot classifier — one vocabulary everywhere.
- registerArchiveEntry claim keys are null-safe for room-less uploads.
- New: POST /files/groups/:groupId/upload — FileInterceptor (20 MiB) streams
  through magic-byte sniffing, library-safe naming, oCIS upload and the
  metadata index, behind group-membership ACL (Owner/Admin bypass).
- safeFileName/sniffMime promoted to packages/core (file-names.ts,
  file-mime.ts) so the bot and the api share one implementation; the bot's
  local modules become re-export shims; @types/node added to core.

Verified: api typecheck clean, group-files 22/22, bot 74/74, web typecheck
clean; 029 re-applied clean on a fresh scratch DB (room_id nullable,
archive class, claim_key unique all confirmed in the catalog).
2026-10-11 10:09:24 +00:00
.github/workflows Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
apps Integrate group files: nullable room for uploads, archive class, claim idempotency, upload route 2026-10-11 10:09:24 +00:00
docs Expand video-AI architecture doc to the full research report 2026-10-11 08:29:30 +00:00
infra Enable basic-auth WebDAV on the oCIS proxy (machine access for api/bot) 2026-10-11 08:49:27 +00:00
packages Integrate group files: nullable room for uploads, archive class, claim idempotency, upload route 2026-10-11 10:09:24 +00:00
scripts Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +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 Integrate group files: nullable room for uploads, archive class, claim idempotency, upload route 2026-10-11 10:09:24 +00:00
pnpm-workspace.yaml Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +00:00
README.md Tactical Media Broadcast Hub — initial release 2026-10-10 11:56:42 +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. Multi-platform fan-out (Mastodon, Telegram, Bluesky, PeerTube, Facebook, Instagram, Threads, LinkedIn, Reddit, Twitch, Discord, Slack). DST-proof scheduling.
  • 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).