ismailntl/multiverse-cable

A 24/7 AI-generated television channel. Bid credits to program the next slot, and call every clip REAL or AI.

15

stars

55

commits

JavaScript

primary language

Sep 3, 2026

updated

multiversecable.com
ai-video
bedrock
generative-ai
live-streaming
nodejs

README

πŸ“Ί Multiverse Cable

multiversecable.com Β· AGPL-3.0 Β· Node, Postgres, no framework

A 24/7 AI-generated television channel. Not a feed β€” a channel: everyone watching sees the same broadcast at the same moment, off one server clock, and it never stops.

Three things make it more than a slop stream:

It's a game. Every clip is a call β€” real or AI? Genuine public-domain archival footage is mixed in with generated clips, and provenance is hidden until you commit, then revealed with a score and a streak. An AI clip is never allowed to finish playing unlabelled; that reveal is a legal constraint, not a design flourish.

You can buy the next slot. Bids collect in a timed window and only the winner generates, so GPU time is never spent on a clip that gets outbid five seconds later. Losing bids roll over. Credits move through SQL functions, so a balance and its ledger cannot disagree, and a CHECK constraint makes overdraft impossible under concurrency.

It tries not to get banned. Similar streams were pulled from Twitch and Kick over copyright. "Public domain" and "safe to broadcast" are different questions β€” those Betty Boop and Popeye prints are out of copyright but the characters are still live trademarks. So: trademark screening on every prompt, a public-domain-only archive, takedown that hides rather than deletes (an unauthenticated endpoint must not be able to erase a channel), and content moderation across 12 languages with nothing involving minors, enforced in five layers.

See docs/POLICY.md for the content rules, docs/COSTS.md for what it costs to run, docs/PRODUCT_ADS.md for the paid product-ad design, docs/BUSINESS.md for where this is going commercially, and docs/STREAMING.md for restreaming to Twitch/Kick.

How it works

 viewers ──POST /api/bid──▢ bid board (highest pending bid wins next slot)
                                 β”‚
 scheduler (every GEN_INTERVAL_SEC)
   β”œβ”€ concept  = winning bid idea  OR  random multiverse show
   β”œβ”€ prompt   = Claude show-writer (optional) OR template
   β”œβ”€ video    = backend: local GPU worker | MiniMax H3 API | ffmpeg mock
   └─ clip β†’ videos/ + playlist (data/state.json)
                                 β”‚
 broadcast clock: every viewer's player syncs to the same wall-clock
 position in the looping library (GET /api/now β†’ clip + offset)

Everything is plain Node (one dependency: @anthropic-ai/sdk, optional at runtime) + ffmpeg. State is a JSON file. No database, no build step.

Quick start (zero keys, zero GPUs)

npm install
npm run dev        # mock backend: ffmpeg test-pattern clips every 20s
# open http://localhost:4242

Generation backends

Priority: GEN_BACKEND env > LOCAL_WORKER_URL set β†’ local > MINIMAX_API_KEY set β†’ minimax > mock.

Runs open-weight text-to-video (LTX-Video family by default) on your own EC2 GPU instance. See gpu-worker/ and docs/COSTS.md β€” roughly $45/day on-demand (g6e.xlarge) vs $7–11k/day for continuous hosted-API generation.

# on the GPU box (Deep Learning AMI, g6e.xlarge):
bash gpu-worker/setup.sh                       # serves :8189

# on the platform box:
LOCAL_WORKER_URL=http://<gpu-ip>:8189 WORKER_TOKEN=<secret> npm start

2. minimax β€” MiniMax H3 (Hailuo 3.0) hosted API

Highest quality (native 2K + audio). POST /v2/video_generation with model MiniMax-H3, polled via /v2/query/video_generation/{task_id}. Cost scales with GEN_INTERVAL_SEC β€” see docs/COSTS.md before turning this on. Good as a premium tier (e.g. only bid-funded slots use H3).

MINIMAX_API_KEY=... VIDEO_RESOLUTION=768P GEN_INTERVAL_SEC=600 npm start

3. mock β€” ffmpeg test patterns

No keys, no GPU. Lets you develop/demo the full loop (bids, scheduling, broadcast sync) for free.

Spend guardrails

  • GEN_INTERVAL_SEC β€” one new clip per interval; the library loops between new clips, so the channel is always "on air" regardless of cadence.
  • DAILY_GEN_LIMIT β€” hard cap; when hit, the channel coasts on the library.
  • MAX_LIBRARY_CLIPS β€” old auto clips are pruned (bid-funded clips are kept).
  • Failed bid generations retry twice, then the bid is marked failed.

API

RouteDescription
GET /api/nowcurrent clip + playback offset (broadcast sync)
GET /api/statestats, bid board, next slot, recent clips
POST /api/bid{name, idea, amount} β€” place a bid (demo credits)
GET /videos/:fileclip files (HTTP Range supported)

Notes / roadmap

  • Bids are demo credits β€” no payments. Wire Stripe Checkout in front of POST /api/bid for real money (hold funds, capture on air, refund on fail).
  • MiniMax H3 open weights: announced but need ~80GB VRAM β€” revisit self-hosting H3 when quantized single-GPU builds land.
  • Frontend is one static file (public/index.html): CRT-styled synced player, bid form, bid board, stats.

License

AGPL-3.0-or-later β€” see LICENSE and NOTICE.

Use it, fork it, learn from it. Two conditions: if you run it (or a modified version) as a network service, you must publish your source; and keep the attribution in NOTICE. If you want to run it commercially without the source-disclosure obligation, open an issue.

Built by Ismail Nafaa β€” https://multiversecable.com

Contributors

ismailntl

55 commits

ismailntl/multiverse-cable

A 24/7 AI-generated television channel. Bid credits to program the next slot, and call every clip REAL or AI.

15

stars

55

commits

JavaScript

primary language

Sep 3, 2026

updated

multiversecable.com
ai-video
bedrock
generative-ai
live-streaming
nodejs

README

πŸ“Ί Multiverse Cable

multiversecable.com Β· AGPL-3.0 Β· Node, Postgres, no framework

A 24/7 AI-generated television channel. Not a feed β€” a channel: everyone watching sees the same broadcast at the same moment, off one server clock, and it never stops.

Three things make it more than a slop stream:

It's a game. Every clip is a call β€” real or AI? Genuine public-domain archival footage is mixed in with generated clips, and provenance is hidden until you commit, then revealed with a score and a streak. An AI clip is never allowed to finish playing unlabelled; that reveal is a legal constraint, not a design flourish.

You can buy the next slot. Bids collect in a timed window and only the winner generates, so GPU time is never spent on a clip that gets outbid five seconds later. Losing bids roll over. Credits move through SQL functions, so a balance and its ledger cannot disagree, and a CHECK constraint makes overdraft impossible under concurrency.

It tries not to get banned. Similar streams were pulled from Twitch and Kick over copyright. "Public domain" and "safe to broadcast" are different questions β€” those Betty Boop and Popeye prints are out of copyright but the characters are still live trademarks. So: trademark screening on every prompt, a public-domain-only archive, takedown that hides rather than deletes (an unauthenticated endpoint must not be able to erase a channel), and content moderation across 12 languages with nothing involving minors, enforced in five layers.

See docs/POLICY.md for the content rules, docs/COSTS.md for what it costs to run, docs/PRODUCT_ADS.md for the paid product-ad design, docs/BUSINESS.md for where this is going commercially, and docs/STREAMING.md for restreaming to Twitch/Kick.

How it works

 viewers ──POST /api/bid──▢ bid board (highest pending bid wins next slot)
                                 β”‚
 scheduler (every GEN_INTERVAL_SEC)
   β”œβ”€ concept  = winning bid idea  OR  random multiverse show
   β”œβ”€ prompt   = Claude show-writer (optional) OR template
   β”œβ”€ video    = backend: local GPU worker | MiniMax H3 API | ffmpeg mock
   └─ clip β†’ videos/ + playlist (data/state.json)
                                 β”‚
 broadcast clock: every viewer's player syncs to the same wall-clock
 position in the looping library (GET /api/now β†’ clip + offset)

Everything is plain Node (one dependency: @anthropic-ai/sdk, optional at runtime) + ffmpeg. State is a JSON file. No database, no build step.

Quick start (zero keys, zero GPUs)

npm install
npm run dev        # mock backend: ffmpeg test-pattern clips every 20s
# open http://localhost:4242

Generation backends

Priority: GEN_BACKEND env > LOCAL_WORKER_URL set β†’ local > MINIMAX_API_KEY set β†’ minimax > mock.

Runs open-weight text-to-video (LTX-Video family by default) on your own EC2 GPU instance. See gpu-worker/ and docs/COSTS.md β€” roughly $45/day on-demand (g6e.xlarge) vs $7–11k/day for continuous hosted-API generation.

# on the GPU box (Deep Learning AMI, g6e.xlarge):
bash gpu-worker/setup.sh                       # serves :8189

# on the platform box:
LOCAL_WORKER_URL=http://<gpu-ip>:8189 WORKER_TOKEN=<secret> npm start

2. minimax β€” MiniMax H3 (Hailuo 3.0) hosted API

Highest quality (native 2K + audio). POST /v2/video_generation with model MiniMax-H3, polled via /v2/query/video_generation/{task_id}. Cost scales with GEN_INTERVAL_SEC β€” see docs/COSTS.md before turning this on. Good as a premium tier (e.g. only bid-funded slots use H3).

MINIMAX_API_KEY=... VIDEO_RESOLUTION=768P GEN_INTERVAL_SEC=600 npm start

3. mock β€” ffmpeg test patterns

No keys, no GPU. Lets you develop/demo the full loop (bids, scheduling, broadcast sync) for free.

Spend guardrails

  • GEN_INTERVAL_SEC β€” one new clip per interval; the library loops between new clips, so the channel is always "on air" regardless of cadence.
  • DAILY_GEN_LIMIT β€” hard cap; when hit, the channel coasts on the library.
  • MAX_LIBRARY_CLIPS β€” old auto clips are pruned (bid-funded clips are kept).
  • Failed bid generations retry twice, then the bid is marked failed.

API

RouteDescription
GET /api/nowcurrent clip + playback offset (broadcast sync)
GET /api/statestats, bid board, next slot, recent clips
POST /api/bid{name, idea, amount} β€” place a bid (demo credits)
GET /videos/:fileclip files (HTTP Range supported)

Notes / roadmap

  • Bids are demo credits β€” no payments. Wire Stripe Checkout in front of POST /api/bid for real money (hold funds, capture on air, refund on fail).
  • MiniMax H3 open weights: announced but need ~80GB VRAM β€” revisit self-hosting H3 when quantized single-GPU builds land.
  • Frontend is one static file (public/index.html): CRT-styled synced player, bid form, bid board, stats.

License

AGPL-3.0-or-later β€” see LICENSE and NOTICE.

Use it, fork it, learn from it. Two conditions: if you run it (or a modified version) as a network service, you must publish your source; and keep the attribution in NOTICE. If you want to run it commercially without the source-disclosure obligation, open an issue.

Built by Ismail Nafaa β€” https://multiversecable.com

Contributors

ismailntl

55 commits

Languages

JavaScript

53.6%

HTML

36.4%

Shell

3.6%

PLpgSQL

3.2%

Python

3.2%