Tactical Media Broadcast Hub — initial release

Self-hosted multi-platform broadcast newsroom for activist collectives:
publishing pipeline with group approval and DST-proof scheduling, TweetDeck-style
column wall with hostile-content-safe rendering, live control room with Auto
Director, bridged chat governance with polls and quorum, distributed sandboxed
transcode workers, encrypted content-addressed archive, monthly analytics.

MIT licensed. See README.md and docs/.
This commit is contained in:
glass beadian 2026-10-10 11:56:42 +00:00
commit aa5e262f3a
880 changed files with 111042 additions and 0 deletions

View file

@ -0,0 +1,21 @@
{
"name": "@tactical-media-broadcast-hub/connector-example",
"private": true,
"version": "0.1.0",
"type": "module",
"main": "src/index.ts",
"scripts": {
"build": "tsc -p tsconfig.json",
"lint": "eslint src",
"typecheck": "tsc -p tsconfig.json --noEmit",
"test": "vitest run"
},
"dependencies": {
"@tactical-media-broadcast-hub/connector-sdk": "workspace:*",
"@tactical-media-broadcast-hub/core": "workspace:*"
},
"devDependencies": {
"typescript": "^5.5.4",
"vitest": "^2.0.5"
}
}

View file

@ -0,0 +1,27 @@
import { describe, expect, it } from "vitest";
import { createExampleConnector } from "./index.js";
import { connectorContractTests } from "@tactical-media-broadcast-hub/connector-sdk/testing";
import type { ConnectorConnection } from "@tactical-media-broadcast-hub/core";
const connection: ConnectorConnection = {
id: "conn-1",
workspaceId: "ws-1",
provider: "example",
channelId: "ch-1",
credentialId: { kind: "credential-ref", id: "cred-1" },
fields: {},
createdAt: new Date(),
};
connectorContractTests(createExampleConnector(), { connection });
describe("example connector specifics", () => {
it("refuses authorize honestly", async () => {
const connector = createExampleConnector();
await expect(connector.authorize({
redirectUri: "https://app.example/cb",
workspaceId: "ws-1",
state: "s",
})).rejects.toThrow("does not implement");
});
});

View file

@ -0,0 +1,63 @@
/**
* Reference connector: the minimal honest implementation. Every real
* connector copies this shape and fills in a provider API.
*/
import type {
ConnectorCapabilities,
ConnectorConnection,
NormalizedIdentity,
NormalizedPost,
Publication,
} from "@tactical-media-broadcast-hub/core";
import {
assertValidManifest,
type ConnectorManifest,
type PlatformConnector,
} from "@tactical-media-broadcast-hub/connector-sdk";
const CAPABILITIES: ConnectorCapabilities = {
publishText: true,
};
export function createExampleConnector(): PlatformConnector {
const manifest: ConnectorManifest = {
id: "example",
displayName: "Example (reference connector)",
capabilities: CAPABILITIES,
connectionFields: [
{ name: "apiToken", label: "API token", required: true, secret: true },
],
};
return {
manifest: () => {
assertValidManifest(manifest);
return manifest;
},
async authorize() {
throw new Error("example connector does not implement OAuth");
},
async getIdentity(connection: ConnectorConnection): Promise<NormalizedIdentity> {
return {
provider: manifest.id,
remoteId: connection.id,
handle: "example@example",
displayName: "Example Account",
};
},
async publish(connection: ConnectorConnection, post: NormalizedPost): Promise<Publication> {
return {
id: `pub-${post.text.length}`,
workspaceId: connection.workspaceId,
draftId: "direct",
connectionId: connection.id,
remoteId: `remote-${post.text.length}`,
publishedAt: new Date(),
providerMetadata: post.providerMetadata,
};
},
};
}

View file

@ -0,0 +1,8 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}