Runs on its own clock
A show's cues fire on the server's clock from its schedule — with every browser closed, and through a restart. A cue more than five minutes late is marked missed, so a restart never replays a night.
A self-hosted overlay platform: one server that runs the show on its own clock and serves styled overlays to OBS browser sources. Scenes, title cards, the lineup and the night's cues, taken from a console on your phone — with chat, alerts and viewer counts from CTD Relay.
Overlay Show clock · cues One take · every overlay Early, and upfront about it. The platform, its admin pages and the CTD Relay connection work today, so chat, alerts and viewer counts already come in through Relay. Direct Twitch, Kick, YouTube, Spotify and OBS connections are the next steps in the plan. There's no tagged release yet: the container image follows the main branch.
Feedback on GitHubA show's cues fire on the server's clock from its schedule — with every browser closed, and through a restart. A cue more than five minutes late is marked missed, so a restart never replays a night.
A show puts overlays on air together, a horizontal and a vertical feed say. One take changes every member’s scene, and a trigger lands on all of them on the same frame.
Give it the lineup and it makes the cues: who’s on and a title card at each act, the headliner’s intro, now playing on a timer. Edit the lineup mid-show and the cues rebuild without replaying anything.
Live is the show-night console on a phone: scenes, title cards, who’s on, REC, the next cue with Trigger now and Skip, and the viewer count.
Install from a package, a URL or a GitHub release, preview with sample data first, and follow a repository: safe updates move overlays on their own, breaking ones wait for you.
Merged chat and alerts from every platform CTD Relay streams to, live status per stream, and a viewer count totalled across every platform.
Each overlay has a URL with its own key and the size to set; updates arrive over Server-Sent Events with a polling fallback.
With ffmpeg installed, phone video is converted to H.264 MP4 and HEIC photos to JPEG.
A setup code instead of a default password, owner, admin, operator and viewer roles, two-factor codes, API tokens for a Stream Deck, and secrets encrypted at rest.
Everything the admin pages do goes through API v1, described in OpenAPI at /api/v1/openapi.json.
By default it listens on its own machine only. Serving the local network (OBS on another PC, the console on a phone) or the internet over HTTPS is a setting you choose.
On the OBS PC with npm start, or on a NAS from the image. The first start prints a one-time setup code; use it to create the owner account. There's no default password.
Pick a template, preview it with sample data, make an overlay. Its page gives you the URL and the size: add it to OBS as a Browser source. Connect CTD Relay for chat and alerts.
Put the overlays in a show with the date, go-live time and lineup, let it build the night's cues, and run it from Live on your phone.
From the lineup: who's on and a title card at each act, the headliner's own intro where the template has one, the event intro five minutes in.
REC starts by itself at the first take of the live scene, or at go-live. Every overlay in the show changes on the same take.
Each act's cues fire on the server's clock. Fire one now or skip it from Live; fix a time mid-show and nothing that already happened goes out again.
Every ten minutes until the next act, by default. A timed scene only plays while the show is on its program scene, so it never pulls you off a BRB.
Data and the master key live in separate folders: keep the key, it decrypts the saved tokens. ffmpeg is optional, for converting phone video.
git clone https://github.com/ItsLimitlezz/ctd-overlay.git
cd ctd-overlay
npm start It listens on http://127.0.0.1:4848. For the console on a phone or OBS on another machine, start it with npm start -- --exposure lan.
docker run -d --name ctd-overlay -p 4848:4848 \
-e SKP_HOSTS=<nas-ip> \
-v ctd-data:/data -v ctd-config:/config \
ghcr.io/itslimitlezz/ctd-overlay:latest On TrueNAS: Apps → Discover Apps → ⋮ → Install via YAML with the repo's TrueNAS file. The setup code is in the app's logs.
Running guide →A self-hosted live-stream overlay platform: one server that runs the show on its own clock and serves styled overlays to OBS browser sources. Overlays are made from templates, put together in shows, and run from a phone-friendly console.
It's early. The platform, its admin pages and the CTD Relay connection work today. Direct connections to Twitch, Kick, YouTube, Spotify and OBS are the next steps in its plan, and there's no tagged release yet: the container image follows the main branch.
Either the PC that runs OBS (Windows, macOS or Linux) with Node.js 24 or newer — no npm install, it has no dependencies — or a NAS or any Docker host, using the public image ghcr.io/itslimitlezz/ctd-overlay (amd64 and arm64), with a ready-made TrueNAS SCALE YAML.
Make an overlay from a template and its page gives you its URL and size. Add a Browser source in OBS with that URL and size. Each URL carries the overlay's own key, and rotating the key retires the old URL.
Not yet. Today it gets chat, alerts, viewer counts and live status through CTD Relay, which already streams to those platforms. Direct Twitch and Kick connectors are next in the plan, with YouTube, Spotify and OBS after.
Connect it to CTD Relay with a code you approve in Relay's settings; one connection can follow every Relay profile, each a stream of its own. Through that connection it also shares the overlays it feeds with the CTD OBS plugin, which adds them to OBS as browser sources at the right size and canvas.
Yes. Operators run scenes, cues and the lineup but never see credentials; admins also install templates and read the audit log; viewers only look. Deleting and key changes sit behind a menu and ask first.
No. It runs on your own PC or NAS — CTD doesn't host it. Secrets are encrypted at rest with a master key kept in its config folder, separate from the data. By default it listens on its own machine only; serving the local network or the internet over HTTPS is a setting you choose.