04 / A
Real-time events from request-response APIs
Cinema platforms have no webhooks. The event bridge polls, diffs state changes, and delivers typed, HMAC-SHA256-signed webhooks. One failing endpoint never blocks the others.
Now showing · Open source
Type-safe SDKs, CLI tools, UI components, a real-time event bridge and analytics for cinema platform APIs. One API surface — TypeScript, C# and Python.
Logline
Cinema platforms process billions in annual transactions. The APIs are production-grade. The developer ecosystem around them is not.
No typed clients. No component libraries. No event systems. Every integrator starts from scratch — reading raw API docs, hand-building request types, re-solving the same problems. Theatrical is the missing developer-experience layer, built so you can go from documentation to a working booking flow in an afternoon.
Scene 01 — The set
┌─────────────────────────────────────────────────────────────────────┐
│ Your Application │
├─────────────┬──────────────┬──────────────┬─────────────────────────┤
│ @theatrical│ templates │ @theatrical │ @theatrical │
│ /react │ (CLI init) │ /analytics │ /events │
│ Components │ Starters │ Horizon │ Real-time Bridge │
├─────────────┴──────┬───────┴──────────────┴─────────────────────────┤
│ │ @theatrical/cli │
│ │ init · codegen · inspect │
├────────────────────┴────────────────────────────────────────────────┤
│ @theatrical/sdk (TS) · Theatrical.Sdk (C#) · theatrical (Py) │
│ Auth · HTTP · Retry · Rate Limiting · 8 Resources │
├─────────────────────────────────────────────────────────────────────┤
│ Cinema Platform APIs (OCAPI · GAS · Horizon) │
└─────────────────────────────────────────────────────────────────────┘
Scene 02 — Now showing
One API surface across languages. Same types, same tests, same NZ cinema mock data.
npm install @theatrical/sdk
dotnet add package Theatrical.Sdk
pip install theatrical
Call sheet — full package matrix
| Package | Role | Tests | License |
|---|---|---|---|
@theatrical/sdk | Type-safe client — auth, HTTP, 8 resource modules, Zod validation | 274 | MIT |
@theatrical/cli | Developer tools — init, codegen, inspect | 171 | MIT |
@theatrical/react | Cinema UI — SeatMap, SessionPicker, OrderSummary, Loyalty | 62 | BSL 1.1 |
@theatrical/analytics | Horizon client, fluent query builder, CSV/JSON/DataFrame export | 72 | BSL 1.1 |
@theatrical/events | Real-time event bridge — poll, diff, emit, HMAC-signed webhook | 71 | BSL 1.1 |
| Starter templates | React ticketing starter — living booking demo on the event bridge; scaffold with npx @theatrical/cli init | — | BSL 1.1 |
Scene 03 — Roll camera
Mock mode returns real NZ cinema fixtures — Embassy Theatre Wellington, Roxy Cinema, Rialto Auckland — so you can build complete flows with no API access.
import { TheatricalClient }
from '@theatrical/sdk';
const client =
TheatricalClient.createMock();
const films =
await client.films.nowShowing();
const { sessions } =
await client.sessions.list({
filmId: films[0].id,
});
const order = await client.orders.create({
sessionId: sessions[0].id,
tickets: [{ type: 'adult', seatId: 'H7' }],
});
using Theatrical.Sdk;
using Theatrical.Sdk.Types;
var client =
TheatricalClient.CreateMock();
var films =
await client.Films.NowShowingAsync();
var sessions =
await client.Sessions.ListAsync(
new SessionFilter {
SiteId = "site_embassy_wellington"
});
from theatrical import TheatricalClient
from theatrical.types import SessionFilter
client = TheatricalClient.create_mock()
films = await client.films.now_showing()
result = await client.sessions.list(
SessionFilter(site_id="site_embassy_wellington"),
)
Scene 04 — The twist
04 / A
Cinema platforms have no webhooks. The event bridge polls, diffs state changes, and delivers typed, HMAC-SHA256-signed webhooks. One failing endpoint never blocks the others.
04 / B
init scaffolds a wired-up project. inspect explores any endpoint interactively. codegen generates types from an OpenAPI spec. The tooling itself is the documentation.
04 / C
SeatMap with ARIA keyboard nav, wheelchair & companion markers. SessionPicker, OrderSummary, PaymentForm, Loyalty. Dark-mode-first, fully themeable via design tokens.
Scene 05 — Director's commentary
Five essays on the architecture, economics and future of cinema platform technology.
Why cinema technology needs a developer ecosystem, and what it takes to build one.
Lessons from the platform that turned payments infrastructure into a developer product.
Cinema-going as cultural infrastructure — why the ritual matters more than the technology.
The scale, economics and untapped potential of cinema platform transaction volume.
Real-time capabilities for platforms that were built for batch processing.
Subscribe to the feed and get new essays as they ship.
Long-form thinking on design, technology and the craft of building things — on designedbybruno.net.