Muse Live Open Muse Live

How it’s built

One place to plan, stream and learn from every live event

Muse Live is an operations platform for live events that are both broadcast and streamed: the plan of record for every show, end-to-end stream health from encoder to viewer, blameless incident reports, a resource scheduler, and Muse, an AI agent that can read all of it and propose changes for a human to confirm.

Demo video — click to play in fullscreen at the highest available quality (up to 4K), captions off. Also on YouTube.

Hackathon build: new work since Oct 26, 2026

Judges start here. Everything below was built in the hackathon window: commits dated Oct 27, Oct 31, Nov 1, or Nov 2, 2026 — nothing backdated. Verify it yourself: git log --since=2026-10-26 reproduces the full in-window history (67 commits at time of writing). Nothing else in this demo is claimed as new.

Built with Muse Code (the agentic coding CLI, powered by Muse Spark): the agent wrote the code, ran the checks, and iterated against failing tests. Models via the Meta Model API; hosting on Cloudflare Pages + Functions with Workers KV, D1, and R2. Built on a 2015 13-inch MacBook Pro.

#What judges openKey filesDated commitsBuilt with / verified by
1Show Caller risk brief + fix proposals (open a show)js/muse-showcaller.jse5beea1 (Days 1–2)Deterministic rules engine; 14-scenario eval
2Approval + execution + glasses tally republish (“Approve & run” on a test-feed retry)js/muse-showcaller.js, functions/api/omni/bd1b44e (Day 3), ff34f64 (Day 7 freeze)Approval re-verifies the world first; e2e-covered
3Stream Check frame analysis (Streams wall → tile → theater, caption bar check)js/muse-streamcheck.js, functions/api/streamcheck.jsc40872e (Days 4–5), 04a3adeSAM 3.1 segmentation; errors report unavailable, never clean
4Chunked live captions + searchable transcript + SRT/VTT exportjs/muse-captions.js, functions/api/transcribe.jsc40872e, 35bc358, 953a6d1Muse Voice Transcribe 1.0, manual start only
5Muse drawer answers + SAM alerts + proactive briefsjs/muse-agent.js, js/muse-proactive.js, functions/api/museai.js35bc358, 650e6b6Muse Spark 1.3; every write a Confirm card; 40/40 model eval
6Omni Gmail/Slack per-show threadsfunctions/api/omni/, Omni viewbd1b44e, 1cfe9b3, 3a56898Fail closed (503 configured:false) — never simulated
7i18n: Functions strings + access gate in en/es/ptfunctions/_middleware.js, functions/_lib/034f158, ea8ca8eExternalized via Accept-Language
8D1 + R2 data layer: queryable transcripts (FTS), media blobs, audit log, D1 schemamigrations/, functions/_lib/27e4feb, f8a3e3cAudit entry written on every approval
92.0 ops pack: tasks + automations, asset register/CRM + graph + search, templates + picker, site survey, Site Gallery, CAD plans, 360° walkthroughjs/muse-tasks.js, js/muse-assets.js, js/muse-survey*.js, js/muse-templates.jsfcf158b, f8a3e3c, 8eec207, 46dd00cAsset history deterministic order; unit-tested
10Streams wall + theater: HLS-only transport, live telemetry of each stream, manual captions, external feeds, 4-feed cap, test-feeds-only walljs/muse-streaming.js, js/muse-testfeeds.js4aff047, 2e138e1, eefd638, 1cfe9b3, 953a6d1, 40b77c2, 1193c9aReal HLS feeds with telemetry; idle HLS suspends
11Dashboard density pass + 90%-zoom demo frames + rail badgesindex.html, js/muse-app-a/b.jseefd638, 08fb817, 650e6b6Tighter density; proactive-crash fix
12Sun & Shadow panels, Shadow Map, QC, rehearsal + signals, Techbook rebuilt with Show Bible appendixjs/muse-*.js, js/muse-export-gear.js31aa2de, 1cfe9b3, 35bc358Techbook exports live data
13Meta Ray-Ban Display companion content, login Meta marks, guided-tour removal, README/About rebuildglasses/, about.html, README.md6ee0f3f, 41591af, 79f9d17, 7f44da6Same sign-in; stale status says “Demo data” aloud
14Security hardening + final DEBUG pass (BUG-01..46), dark-mode fixeswhole app, functions/_middleware.js04a3ade, cc14043292 unit, 20/20 browser e2e, 0 axe violations
15Open-source release + license + deploy rotationLICENSE, THIRD_PARTY_NOTICES.md95f1c21 (GPL-3.0), 9897323, 6f2d6b7, 11b31b0Repo public; logged-out guest path verified 200
16UI follow-through: Omni drawer posts to real Slack, badge counts reconciled, Muse-noticed newest-first + conflict deep-link, sidebar Glasses entry, one favicon, finance bubble → AP → invoicejs/muse-app-b.js, js/muse-app-a.js, js/muse-showcaller.js, js/muse-schedule.js, js/muse-proactive.js, index.html, tests/unit/c1b7a89, 0ac185d, 2ff5abe, 4fb1b98Real POSTs with honest errors; 303 unit green; deployed + verified live
17One-button judge entry (read+write, no sign-in) + resolved notices auto-clear + finance per-tab counts + About map parityindex.html, functions/_middleware.js, js/muse-app-b.js, about.htmlea327df, 85be1a4, 3a6aa44, e0a6429Producer guest sessions; AP overdue red / AR open blue
18Every error, notice and conflict opens Muse with a fix request; streams wall lists live programs as rowsjs/muse-app-a/b.js, js/muse-streaming.js, js/muse-proactive.js, tests/unit/muse-ask.test.mjsdc0d18c, 564e226Fix-request convention pinned by tests
19Omni↔Slack two-way mirror: project channel + topic-as-thread, inbound sync on open + manual Syncfunctions/api/omni/slack.js, functions/api/omni/slack-thread.js, js/muse-app-b.js, js/muse-showcaller.jsf7cf70cBot-token threading; honest errors when unconfigured
20Wall count locked to one helper + Reset states; stream alerts clickable into Muse with live valuesjs/muse-streaming.js, css/muse.cssdf6cd26, 79dc6acKPI, rows and dashboard stat can't disagree
21Popups shift clear of the open drawer; Glasses under Dashboard; glasses Talk-to-Muse voice+text; monitors open the theater at one size with Ask Musecss/muse.css, js/muse-app-a.js, js/muse-streaming.js, glasses/faf75ea, e3b16a5Theater prompt carries telemetry + open issues
22Notices open their solution + delete from the panel; dashboard grid rebalanced; glasses ?incident= demo flow (Ask Muse → Approve failover → All clear)js/muse-proactive.js, js/muse-app-a.js, glasses-src/, glasses/, tests/unit/snapshot.test.mjsf4c89ea, da733e4331 unit green; fresh glasses bundles deployed
23@muse in Omni: ask Muse in the ops-room thread, then Everyone (mirrored to shared Slack + filed) or Only me (stays local)js/muse-app-b.js, tests/unit/omni-muse.test.mjs9764f13334 unit green; deployed + verified live
24Half-size Broadcast tiles; glasses ✕ exit (preview + in-app); schedule to Nov 10 with PCR 4 double-booking; Muse answers file back to the wikijs/muse-app-a.js, js/muse-schedule.js, glasses-src/, glasses/this commit339 unit green; fresh bundles deployed

History mechanics, not features: 41786a6 reverts main to 034f158; ff34f64 then re-applies the Day 2–7 work. Not claimed: the Oct 15–19 base (rebrand, login shell, nav rail, seeded demo content) and any view untouched by the commits above. The same map lives in the README build map.

Who built it

Carlos Hurtado

Technical Manager for live-event production technology at NBCUniversal (Telemundo Enterprises), with 15+ years delivering large-scale live broadcasts — FIFA World Cup, Olympics, Latin Grammys, Billboard Awards — across IP (SMPTE ST 2110), fiber, satellite, REMI and bonded cellular. Muse Live distills that experience into working software: the streaming plans, signal flows, schedules and incident reports here are the artifacts of a real broadcast operation.

Designed and built every part of it: product, front end, edge functions, the Muse agent, tests and deployment.

GitHub

What you’ll see

Every screen runs on the same live data, and Muse can answer questions about any of it.

A show's live health panel: encode, contribute, ingest, package, deliver and watch stages with metrics, and sparklines for viewers, rebuffer ratio, SRT loss and CDN egress
StreamingEnd-to-end health per show: encoder → SRT contribution → MediaConnect/MediaLive → packaging → multi-CDN → player QoE. Each show also tracks a 99.9% availability SLO with its error budget.
Incident report for a SEV-2: primary SRT contribution lost, 38 seconds of viewer-visible rebuffering before failover, with impact numbers, summary and timeline
IncidentsBlameless post-mortems with impact, time to detect and mitigate, root cause, timeline and owned follow-ups.
Muse Schedule timeline of control rooms with bookings, utilization numbers and a conflicts panel offering one-click fixes
SchedulingRooms, circuits, encoders, trucks and crew on one timeline, with conflicts and labor rules checked as you book.

The job, and where it lives in the app

What a streaming and broadcast engineer owns on a live event, mapped to the part of Muse Live that supports it.

ResponsibilityIn Muse Live
Deliver live events end to endPer-show streaming plan: destinations and ingest, contribution and redundancy (SRT primary, bonded cellular backup), packaging (HLS / LL-HLS / DASH), CDN, captions and loudness, pre-flight and go-live checklist.
Encoding and ABR laddersEncoding ladder per show, with rungs, codecs and bitrates on the plan of record.
Monitoring and quality of experienceLive Streams wall; per-hop health; hls.js monitors that post real QoE beacons (startup, rebuffer, bitrate switches, errors); adapters for AWS MediaLive / MediaConnect / CloudFront metrics and Mux Data; an availability SLO with error budget.
Incident response and post-mortemsIncident Reports: severity, viewer impact, time to detect and mitigate, timeline, root cause and action items, searchable and linked to each show.
Event production and broadcast planningProductions with department readiness, techbook PDF export, site surveys, venue drawings, power and fiber, gear and crew.
Resources: encoders, circuits, rooms, crewMuse Schedule with conflict detection, labor rules, crew self-service and ICS calendar feeds.
Budget and vendorsFinance: budget against actuals, purchase orders, invoices and vendor payments per show.
CommunicationOmni: every email, Teams chat and TOC alert linked to the show, purchase order or incident it is about.
Platforms: Facebook and Instagram LiveA server-side Graph API proxy for live video status and ingest stream health (token never reaches the browser).
Automation and toolingMuse, an agent with tools over all of the above; write actions always go through a human confirmation step.

Architecture

A static single-page app at the edge, a thin server layer for anything secret, and an agent loop where the model plans and the browser runs the tools.

Muse Live architecture The browser app talks over HTTPS to Cloudflare Pages. Pages Functions handle auth, the Muse agent step, shared storage and telemetry adapters. Functions call Workers KV, Meta Model API, AWS CloudWatch, Mux Data and the Facebook Graph API. BROWSER App shell + feature modules streaming · incidents · schedule productions · techbook · crew Muse agent (tools run here) reads the live plan of record, Confirm cards for every write hls.js monitors QoE beacons: startup, rebuffer, bitrate switches, errors MuseSync localStorage ⇄ KV, offline queue, last write wins HTTPS CLOUDFLARE PAGES (EDGE) _middleware HMAC sessions · roles · guest demo login throttle · CSP via _headers /api/museai one model step per call, streamed; rate limits + daily token caps /api/kv · /api/calendar · /api/audit shared state, ICS feeds, audit log /api/telemetry · /api/qoe · /api/fblive SigV4 CloudWatch, Mux Data, Graph API: keys stay server-side SERVICES Workers KVshared state, users, audit Meta Model APImuse-spark, tool calling AWS CloudWatch · Mux DataMediaLive, MediaConnect, CDN Facebook Graph APILive video + ingest health

On your face: the Meta Ray-Ban Display companion

The producer's view on Meta glasses — tally, alerts, and show status, live from the same backend as the dashboard.

  1. The desktop publishes a live status every 10 seconds: every show's state and health, open incidents, and what's next on air — or "unknown", never an invented next item.
  2. The glasses app (/glasses/, built on @wearables-ui-toolkit/mrbd) renders that status with the same sign-in as the main app.
  3. Publishing runs on a background cadence, so switching browser tabs never silently turns the glasses into a demo. If the status goes stale for over 60 seconds, the glasses label it "Demo data" instead of passing old numbers off as live.

How Muse answers a question

The model never sees the database and never writes on its own.

  1. The browser builds a live snapshot: every show’s readiness, dates, stream health and open incidents.
  2. POST /api/museai adds the persona and tool schemas and makes one call to Meta Model API, so the key never leaves the server.
  3. If the model asks for tools (production, techbook, crew, schedule, streaming, incidents, weather…), the browser runs them against the plan of record and posts the results back. This repeats for up to 8 steps.
  4. Anything that would change data comes back as a Confirm card. A person decides, and Undo is offered.

How Meta AI was used

Three models, three distinct jobs — and a deterministic fallback that is never a silent substitute.

  • Muse Spark 1.3 — the Muse drawer: reasoning and tool calls over the live production snapshot (POST /api/museai). Every write returns as a Confirm card; the model never writes on its own.
  • SAM 3.1 — Stream Check frame segmentation (lower-third caption bar concept). Black frames are caught by pixel math, and any check that errors reports unavailable, never clean.
  • Muse Voice Transcribe 1.0 — chunked live captions, started manually only (playback never auto-starts billing), with a searchable transcript and SRT/VTT export. Failure shows “captions unavailable”, never invented lines.
  • Show Caller itself is deterministic rules, not a model call: it reads schedule, streams, incidents, crew, and equipment into a ranked brief with the source record behind every line, proposes a fix, and executes only after human approval re-verifies the world.
  • No image-generation model is called anywhere in this codebase; AI-generated survey photos are labelled illustrative in the app. If the Meta Model API is unreachable, built-in rules answer instead — degraded, never silent.

How it’s checked

From the test and eval suites in the repository and an axe accessibility audit.

40 / 40Muse accuracy eval on the real model, median answer 5.8 s
npm testunit tests (Node 22, node --test tests/unit/*.test.mjs): auth, sessions, guest access and AI spend limits, KV, sync, incidents, SigV4, build — count reported by the runner at run time
Playwrightend-to-end tests, including a crawl of every view and every show tab — count reported by the runner at run time
axeWCAG 2.1 AA checks on the main views, light and dark (tests/e2e/a11y.spec.mjs)

Decisions and trade-offs

Edge first, no servers to run

Static assets and Functions on Cloudflare Pages, state in Workers KV. Deploys in seconds, nothing to patch, and it is close to viewers everywhere.

Tools run in the browser

The plan of record lives client-side today, so the agent’s tools do too. The server only relays one model step at a time. As data moves into KV, tools can move server-side unchanged.

Simulated where it must be, real where it can be

Pipeline numbers are a seeded simulation, labeled “Demo”, until a stream is connected to CloudWatch, Mux or Facebook Live. Video monitors, QoE beacons and pre-flight checks are real.

Read-only by role, enforced on the server

Viewer sessions (including this guest demo) are refused by every write endpoint. Muse has separate rate limits and a daily token budget for guests.

Blameless by design

Incident reports focus on the system and the timeline, and every follow-up has an owner and a status, so the same failure can’t quietly happen twice.

Accessible from the start

Keyboard paths, focus management, screen-reader announcements and contrast checked in both themes.

Honest limits

  • Viewer counts, bitrates and other pipeline metrics are simulated unless a show is connected to real telemetry. Every simulated number is labeled “Demo”.
  • Stream monitors play public HLS sample streams, standing in for live program feeds.
  • Most views are string-template JavaScript from an earlier build. Newer modules are self-contained, and docs/MIGRATION.md plans the move to React and TypeScript.
  • Shared storage is last-write-wins per key. That is fine for a small team; a real deployment needs per-record merges or a database.
  • This is a concept demo, not an official Meta product.

Privacy

  • Google Analytics (G-35PR2RKJ51) is consent-gated: analytics storage defaults to denied and the tag is skipped entirely on localhost / 127.0.0.1. No analytics hit is sent until consent is granted.
  • First-party product telemetry (js/muse-observe.js → /api/observe) runs only for signed-in sessions. It counts errors, views and Muse questions (never question text) into daily aggregates (KV, 120-day expiry); admins read them at /ops/health.html.
  • Audio for captions and frames for Stream Check are sent to the Meta Model API only when you use those features. See Third-party notices.
  • The demo video above loads nothing from YouTube until you press play: the thumbnail is a static image, and the player (via youtube-nocookie.com) is created only on click. Playing it is subject to Google's Privacy Policy.