Skip to content
Back to news
Venture

Cyberstudio: a broadcast studio built for one job

A native desktop broadcast studio for X Live, built in Electron and Swift because nothing off the shelf could run a long live broadcast with one operator.

Cyberstudio is a desktop application that runs live broadcasts on X. We built it because the first Vinyatan venture needed to go live from a moving vehicle for hours at a time, operated by one person, and nothing we tried could do that without a second operator and a rack of gear.

It is now the second Vinyatan venture in its own right. Today we are describing how it works and why it is built the way it is.

The requirement

The list was short and strict.

  • Go live to X with multiple cameras and switch between them without a second person.
  • Overlay live data from the campaign database: status, supporters, schedule, and messages.
  • Survive bad connectivity. Degrade quality before dropping the stream, and reconnect without operator action.
  • Run on a laptop in a vehicle for a full day without thermal throttling turning the stream to mud.
  • Be operable with one hand and no eyes for seconds at a time.

The last two ruled out most of the existing tools. General-purpose streaming software is built for a desk, a wired connection, and an operator who is watching the screen.

Why Electron and Swift

The interface, scene logic, overlays, and the connection to the campaign backend are Electron and TypeScript. That let us reuse components from the campaign site, share the realtime client, and iterate on the operator UI in hours. The parts that touch hardware are native Swift: camera capture, hardware-accelerated encoding, and the audio graph. The two halves talk over a small local protocol, and the native side keeps running if the UI process restarts.

This is not the fashionable choice. It is the one that let a small team ship a reliable capture pipeline without rewriting an interface we already had.

Capture/EncoderSession.swift (excerpt)
final class EncoderSession {    private(set) var targetBitrate: Int = 4_500_000    func adapt(to link: LinkQuality) {        switch link {        case .good:     targetBitrate = 4_500_000        case .degraded: targetBitrate = 2_000_000        case .poor:     targetBitrate = 800_000        }        applyBitrate()    }}

Designing for one operator

Every control in Cyberstudio is reachable in one keystroke or one large tap. Scenes are preset before the broadcast and switched with a single key. The overlay pulls its data automatically, so the operator never types during a stream. Alerts are audible, not visual, because the operator may not be looking. The status the operator most needs, whether the stream is up, is a colour that fills the whole window edge.

We tested this by having one person run a full rehearsal broadcast while doing something else with their other hand. Every control that failed that test was redesigned.

What is next

Cyberstudio was built for one job, and it did it. The question now is whether the same constraints, one operator, unreliable networks, live data overlays, describe enough other broadcasts to make it a product. We think they might. If you run live broadcasts on X and this sounds like your problem, we would like to talk.

Talk to us

Cyberstudio runs in production for our own broadcasts today. Tell us about yours at /contact, or DM @chancerobertson on X.

Build with Entatan

Software, agents, brand, and growth from one team. Scoped in a week, shipped in sprints.