PLUTUS

v0.4 · identity · live

Shopping, auto-generated in video.

PLUTUS — the AI Shopping Channel — is a self-hosted live shopping platform: a viewer submits a product URL, an AI host scripts it, keyframes are generated and interpolated into motion with ffmpeg, and the segment airs on the channel. No external video APIs, no vendor lock-in, no cloud account.

$ git clone https://github.com/innotelinc/plutus.git && cd plutus && cp .env.example .env && ./setup.sh
URL → videoone paste airs a segment
3 keyframes+ ffmpeg minterpolate
0external video APIs
5 servicesone docker compose up

v0.4 · identity · just shipped T2I keyframes air as full 10-second clips (JPEG/WebP frames normalized to PNG), demo playback is fully self-hosted, and CI runs a real browser playback check. Release notes

Channel-first, fallback-safe.

The safety of a broadcast schedule with the immediacy of a chat prompt — every submission has a path to air, even with no AI provider connected.

AI-generated clips

Submit a product URL and get back a video segment — script, keyframes, and motion, all generated.

Fully open source

No external video APIs, no vendor lock-in. T2I keyframes via OmniRoute + ffmpeg minterpolate.

Fallback studio

No image provider connected? Procedural keyframes keep the channel airing — never a dead screen.

Broadcast player

Event-driven clip switching, subtitles bound to clips, standby screen, live ticker, chat.

Real-time schedule

Convex subscriptions keep every viewer in sync with the channel clock — no polling loops.

Docker Compose stack

Backend, dashboard, web — one compose up, LAN-autodetected hosts, with the shared OmniRoute gateway.

A real channel, not a slide deck.

The v0.4 stack is runnable today: a self-hosted Convex backend, a Node action runtime with ffmpeg, T2I keyframes on air via the shared OmniRoute gateway, and sign-in through the shared Cerulean Authentik instance.

convex/pipeline.tsaction

Orchestrates every submission: scrape → script → keyframes → schedule → air, with retries and fallbacks.

convex/videoAction.tsnode

Generates keyframes (T2I or procedural PNG) and encodes clips with ffmpeg minterpolate — inside the container.

convex/channel.tsconvex

Channel state: schedule rotation, product lifecycle, rate limits, SSRF-guarded submission.

src/app/page.tsxreact

The broadcast UI: player, subtitles, standby screen, ticker, chat, submit box.

$ make push && make build && make up
✔ Convex functions ready (18.7s)
○ (Static) prerendered as static content
Container plutus-backend-1 Healthy
Container plutus-web-1 Started
 
$ make verify
[submit] submitting https://example.com
t=122s: YOU'RE ON AIR! 📺 PX-1009 just joined the rotation.
✅ CHECK PASSED

One platform, five doors.

Every surface hangs off its own host under plutus.innotel.us, wildcard TLS via Cerulean, routed by NPM Edge.

Appapp.plutus.innotel.usplanned
Backendapi.plutus.innotel.us · Convexplanned
Dashboarddash.plutus.innotel.us · Convex dashboardplanned
AI gatewayOmniRoute · 350+ providerslive
Pagesinnotelinc.github.io/plutuslive

Roadmap.

Milestone-driven and honest — the channel airs what exists today.

v0.1 — demo

Self-hosted stack: playback core, seeded schedule, submission pipeline, static export on nginx.

shipped
v0.2 — studio

PLUTUS rename, LAN-IP autodetection, ffmpeg 6.1 clip fixes, spec-correct fallback encoder, unit tests.

shipped
v0.3 — AI studio

Image provider wired through OmniRoute for T2I keyframes; scripted clips by default, procedural as fallback. Full 10s clips, self-hosted demo loop, CI e2e playback check.

v0.3.1 shipped
v0.4 — identity

Authentik SSO via Cerulean: signed plutus_session cookie, viewers table, ADMIN badge for the admin group, browser-verified login flow.

v0.4.0 shipped
v1.0 — release

Hardening, docs, billing via Magnate for featured slots, public release artifacts.

later