The running order, built for theatre.
Productions, rehearsals, performances, calls, timesheets, leave. Written down, posted where the company can read it — drafted in the planning office, published to the building, signed off in the timesheet cycle. Built on Cloudflare Workers and D1 so the system stays up the morning the company opens it.
01 · What it is
The running order of a season, online.
runorder is the system the producer, planning office, and stage management open every morning. Productions and seasons up top, rehearsal blocks and call sheets below, timesheets and leave underneath. One place. One source of truth. One pin marking what matters today.
Order the season.
Productions, theatre seasons, rehearsal blocks, performances, externals. Every event sits in a typed slot with an owner, a room, a cost-centre, and a colour the company recognises at a glance.
Roster the room.
People, work types, vacation policies, role permissions. Conflict detection runs as you assign — overlapping bookings, leave collisions, unavailable resources surface before publish, not after.
Publish the week.
Edit in a draft, review the diff, publish to the company. Notifications batch into a single weekly digest. Call sheets export to PDF. iCal feeds for the people who live in their own calendar app.
Approve the timesheet.
Clock in / clock out, hour averaging across periods, leave requests, approval workflow. Hours land in cost-centres so the producer can read the week before payroll runs.
02 · The runorder view
What the planning office sees first thing Monday.
A three-pane working surface: productions on the left, the week in the middle, the selected event detail on the right. Today is the only Plan Blue cell. The week scrolls cleanly between drafts and the published view.
03 · Built for
People who own the calendar.
runorder is opinionated about live theatre. It refuses to dilute its language to fit hospitality rostering or generic project management — no "creative collaboration platform" framing, no kanban-for-the-arts.
"Tuesday at fourteen-hundred.
Room 2. Four crew."
- Producers PROD
Own the season. Read the week before payroll runs. Sign off the cost-centre report.
- Planning leads PLAN
Build the draft. Resolve the conflicts. Publish the runorder to the company.
- Stage Managers SM
Read today's calls. Open the call sheet from any device. Hand the day off cleanly.
- Technical Directors TD
Run the org. Set RBAC. Audit who pinned what, when, and from which device.
04 · Stack
The technical detail.
runorder runs at the edge: hosted Cloudflare with distributed resources for source of truth and exports. Self-hostable on the same stack for venues that need their own deployment.
React Router v7 on Cloudflare Workers.
SSR via @cloudflare/vite-plugin. Type-safe routes. Tailwind v4 with CSS variables for theme tokens — light, dark, high-contrast. Inter, Instrument Serif, JetBrains Mono.
D1 + Drizzle ORM.
Tables across organisations, RBAC, productions, events, calls, timesheets, drafts, audit log. Migrations versioned in the repo. Round-trip migration tests on every PR. Full Better Auth integration.
Queues, R2, iCal, audit.
Queue consumers for notifications (email, SMS, Teams) and call-sheet PDF generation, both with DLQs. R2 for exports and nightly D1 backups. iCal feeds for personal subscribers. Append-only audit log.
[2026-05-06 09:14:32.118] INFO org="trondheim-mainstage" scope="planner" [2026-05-06 09:14:32.402] PIN draft="wk19-rehearsal-block" events=14 people=9 [2026-05-06 09:14:38.000] PUB draft="wk19-rehearsal-block" notifications=9 latency=42ms [2026-05-06 09:14:42.501] WARN conflict=true // Jakob Lie · Wed 14:00–22:00 overlaps a vacation policy [2026-05-06 09:14:43.114] INFO audit="draft.publish"
05 · Roadmap
Where the build is.
runorder is shipped in phases against a published plan. Landed phases are in production and feature-complete. The current phase is in flight; queued phases have a scope but no firm date.
Order the week.
The running order, finally written for the building.