A tool for creating and editing rundowns in a demo environment of Sofie.
Sofie Rundown Editor requires that you have a working instance of Sofie Core release 53 with the demo blueprints uploaded to it. You do not need to install the spreadsheet-gateway.
Deploy the docker container using the docker-compose.yml, modify the port, volume mapping as needed. When migrating from a local install, the data.db file should be copied to the directory which the data volume points to otherwise the container will initialize a new database on the first run.
Once up and running in Rundown Editor go to Settings -> Core Connection and set the address and port of your Sofie instance. This is stored in your database file.
- Begin by navigating to the Settings page in the top right.
- Enter the URL and port of your Sofie instance (defaults to
127.0.0.1:3000). - Click "Save".
- Download and import piece types from the sofie megarepo (right click and "Save link as...") on the Settings page — or run nested under the megarepo and use Reload type manifests.
- Before continuing, open the Sofie Core interface, navigate to the Settings page, click on your Studio, and attach
sofie-rundown-editoras a Device by clicking the plus sign (+) under "Attached Devices". - Back in Rundown Editor, navigate to the Rundowns page in the top right.
- Download and import this demo Rundown (right click and "Save link as...")
- Click on the Rundown and ensure that the "Sync to Sofie" box is checked. Be sure to click Save if you changed the setting.
- Open the Rundown in Sofie.
💡 If at any point you need to re-ingest a rundown (for example, to pick up changes to the blueprints), perform the following procedure:
yarn install
In one terminal
yarn dev
The frontend with hot-reloads will be available at http://localhost:5173/
yarn build
yarn lint
yarn workspace @sofie-rundown-editor/backend test
Type manifests and the smoke rundown live in the sofie megarepo
(tojemoc/sofie → assets/):
sofie-rundown-editor-piece-types.jsonsofie-rundown-editor-part-types.jsonsofie-rundown-editor-segment-types.jsonspravy-v3-smoke-rundown.json(external idspravy-v3-smoke)
Edit them there only. When this repo is nested as sofie/rundown-editor/, the backend
loads them automatically; otherwise set SOFIE_MEGAREPO_ASSETS.
Standalone CI and Docker run bash scripts/fetch-sofie-megarepo-assets.sh, which pins an
immutable sofie commit SHA and verifies SHA-256 checksums (not mutable main /
cursor/… refs). Override with SOFIE_ASSETS_REF only when updating checksums in lockstep.
See sofie MEGAREPO-ASSETS-FETCH.md.
After upgrading, open Settings → Connection and click Reload type manifests from assets to upsert built-in piece/part/segment types without removing custom types.
Stage clips under:
<INGEST_MEDIA_ROOT>/spravy/<rundownId>/clips/<file>.mp4
Set INGEST_MEDIA_ROOT in backend/.env, or override it in Settings → Connection. Paths in piece payloads use POSIX form: spravy/<rundownId>/clips/<file>.mp4.
Preview iframes load templates from PREVIEW_BASE_URL (default http://localhost:3010/demo-assets). Override in Settings → Connection for production template hosts.
The build copies lightweight preview HTML stubs into frontend/dist/demo-assets/ so they ship with the static bundle. Each piece type with previewTemplate loads:
{previewBaseUrl}/{previewTemplate}/index.html?{payload query params}
Production behind nginx: if nginx serves frontend/dist directly, add a location so /demo-assets/ does not fall through to the SPA index.html (which causes MIME type errors on ./assets/*.js):
# Serve GFX preview stubs before the SPA catch-all
location /demo-assets/ {
alias /path/to/frontend/dist/demo-assets/;
try_files $uri =404;
}
location / {
root /path/to/frontend/dist;
try_files $uri $uri/ /index.html;
}
# API and sockets still proxy to the Node backend on 3010
location /api/ {
proxy_pass http://127.0.0.1:3010;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:3010;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}Alternatively, proxy all traffic to the Node backend (yarn start on port 3010) and skip serving dist from nginx.
For full-fidelity previews (real Vue templates), run yarn serve from sofie-demo-assets and set the preview base URL to that host (e.g. http://192.168.1.115:8080).
Pieces exported to Sofie use:
{
"objectType": "<pieceType>",
"objectTime": 0,
"attributes": { "...payload": "...", "adlib": false }
}Undefined start is treated as timeline position 0, not AdLib.
- Merge everything for the release in main
- Wait for release-please to open a PR for the changes
- Make sure the changelog and new version number it proposes are sensible. If not, release-please has some commands to adjust that.
- Merge the PR
- Wait for the release-please workflow to create the new tag
- Wait for the workflows to
Create GitHub Releaseaction to finish - Go to the releases page and publish the draft release

