Titles without the extra magic.
Broadcast titles and animated graphics made with web technologies. An open alternative to vMix GT, built on NodeCG. The panel below works: flip a switch, change a name.
Live demo: the Control panel and an out
Nothing is on air
Main
1920×1080Data
What should we show first?
- Multiple outs30%
- Code titles48%
- REST API22%
140 votes
GT is struck through, so it is replaced.
notGT does the job of a title designer and its player. Three things did not come along.
-
Windows-only editor
The editor is a browser tab, on any machine on the network.
-
A licence to buy
MIT, like NodeCG. The source is yours to read and to change.
-
Its own file format
A title is a web page. Everything the web can do, a title can do.
Draw it. Or write it.
// Data only lays the text out, so a typo fixed
// on air does not replay the entrance.
onData(() => {
$("name").textContent = vars("speaker.name", "First Last");
$("role").textContent = vars("speaker.role", "Role");
});
onShow(() => {
plate.animate(WIPE_IN, { duration: 520, easing: OUT });
});
// The exit takes EXIT ms. notGT reads it here and starts
// the exit that much before the hold runs out.
const EXIT = 480;
onHide(() => {
plate.animate(WIPE_OUT, { duration: EXIT, fill: "forwards" });
}, EXIT);
vars, onData, onShow, onHide) and a live preview next to the code. It can also be a file in a folder, if you would rather write it in your own editor.- Alpha video
- Drop a ProRes or HEVC clip with transparency onto the editor and it is converted with ffmpeg to something a browser can play.
- Eleven titles to start from
- Lower thirds, a score bug, a guest from a list, a topic card, a logo bug, a live poll, a ticker, a countdown, a network clock and a weather card, all in one style.
- Or ask a model
- The repository carries a prompt that already knows the runtime contract. Describe the title, get the html, css and js of a code animation.
Change the value, not the title.
Names, scores and captions live in one data store. Change a value and it changes on air without replaying the entrance. Pick a row of a list and that guest goes on air.
- Excel as data
- Drop a workbook on the Data panel, or track one on the server. Each sheet becomes a list, the file is re-read when it is saved, and an edit in the dashboard is written back into it.
- Timed or held
- A title plays once and leaves by itself, or stays until it is switched off. The timers run on the server, so every out and every dashboard agree.
- As many outs as you need
- Each out is one transparent page at its own size, and one Browser Source. What is on air on which out is always in sight, in Lemon yellow.
One request away.
Whatever the dashboard does, a script can do: show, hide, toggle and trigger titles, write variables, manage outs and the library.
# show a title
curl -X POST http://localhost:9090/api/titles/lower-third/show
# change what it says, while it is on air
curl -X POST 'http://localhost:9090/api/data?mode=merge' \
-H 'content-type: application/json' \
-d '{"speaker": {"name": "Anna Reed", "role": "Expert"}}'
# play it once: it leaves by itself
curl -X POST http://localhost:9090/api/titles/lower-third/trigger
# take it off
curl -X POST http://localhost:9090/api/titles/hide
ws://<host>/api/ws
server → {"type":"hello","protocol":1,"bundle":"notGT","version":"0.8.0", …}
client → {"type":"login","id":1,"token":"<wsToken>"}
server → {"type":"reply","id":1,"command":"login","ok":true, …}
server → {"type":"state","state":{ … }}
client → {"type":"show","id":2,"templateId":"lower-third","out":"main"}
server → {"type":"reply","id":2,"command":"show","ok":true, …}
server → {"type":"state","state":{ … "activeVisible":true … }}
# connection: Generic HTTP Requests
Base URL http://<host>
Header X-API-Token: <token>
# a button that puts the title on and takes it off
POST /api/titles/lower-third/toggle
# what lights the button
GET /api/state
out.html?out=mainThe real dashboard, in 22 seconds.
- Sign-in
- The dashboard asks for a username and a password, and the API is not open to the whole network. It can be switched off for a closed show LAN.
- Team
- An administrator adds users and puts them in groups: VJ, streamer 1, streamer 2. A group has its outs and its own WebSocket keys, and every out has one OBS link that opens that out only.
- Yours to read
- The interface is in English and Russian, in a dark and a light theme.
On air in three steps.
-
Start the server
git clone https://github.com/fursyt12/notGT.git cd notGT docker compose up --build -dOpen
http://localhost:9090/dashboard/and sign in asadmin/admin. Change the password in the Team tab straight away. No reverse proxy and no.envare needed.Take the portable build from Releases, unpack it and run
Download the Windows buildnotGT Launcher.exe. Nothing has to be installed: the package carries its own Node.js. The launcher picks a network interface and a port, starts the server and opens the dashboard.npm ci npm run build cd bundles/notGT && npm install && npm run build && cd ../.. node index.jsNode.js 22 is needed. The bundle is not an npm workspace of the monorepo, so it is installed and built separately.
-
Add the out to OBS or vMix
A Browser Source in OBS, or a Web Browser input in vMix, at the size of the out.
http://<host>:9090/bundles/notGT/graphics/out.html?out=main -
Show a title
From the Control panel, from a Companion button, or from anywhere else.
curl -X POST http://localhost:9090/api/titles/lower-third/show