Skip to content

Commit 6a817c5

Browse files
gershamclaude
andcommitted
Bundle CLI ef95f12 and the wave-2 skill: uploaders, overlay triggers, skip, screen links, YouTube until
Merges the held skill commits of five lanes (uploaders and one-page changes, overlay triggers, screenrig.skip(), screen links for browsers without storage, advance.until video_end for YouTube pages), tightens the SKILL.md wording (uploader scope detail moves to references/playlists.md#change-one-page) and rebuilds the bundle from cli ef95f12, which adds playlist page add|replace|remove, screen link create|show|delete, triggers update|deliveries and overlay triggers, uploader invitations and service clients, and the skip() runtime. Budget before: repository 109 files, 3,431,988 bytes; plugins/screenrig 50 files, 2,396,469 bytes. Budget after: repository 109 files, 3,478,944 bytes; plugins/screenrig 50 files, 2,439,526 bytes (cli/dist/bin.js 1,557,752 of 1,572,864 bytes). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 9c32abd commit 6a817c5

6 files changed

Lines changed: 376 additions & 300 deletions

File tree

‎components.lock.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"state": "resolved",
44
"cli": {
55
"repository": "screenrig/cli",
6-
"commit": "fac3cc2181cdf95df32807cfe16b52a2aeea93c4",
6+
"commit": "ef95f123f2e4330340637ec3d73d9ab104bfa519",
77
"artifact": {
88
"file": "screenrig-cli.tgz",
9-
"sha256": "764a1eb7b132411c5fbfad75a4c6b4395238f424d4e2f7f08dd8770feba7ccb9"
9+
"sha256": "1991edc2b7654df1b1b4fe75bde91348cc4db9fc8189e6ce9498626b749296ee"
1010
}
1111
}
1212
}

‎plugins/screenrig/cli/dist/bin.js‎

Lines changed: 288 additions & 277 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎plugins/screenrig/skills/screenrig/SKILL.md‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ never with `--json`. `screenrig status` reports service availability.
8686
separate `--config` (capabilities) or `login --no-wait --access manage`.
8787
- `screenrig dashboard open` opens the dashboard for the human;
8888
`invitations create --email ADDRESS` invites members.
89+
- An uploader (`invitations create --kind uploader` or `service-client create
90+
--uploader`) works only in its folders and playlists (`media upload --folder
91+
ID`, `playlist page add|replace|remove`); anything else is
92+
`outside_upload_scope` ([one page](references/playlists.md#change-one-page)).
8993

9094
## Interactive views
9195

@@ -116,7 +120,9 @@ instead of per-screen codes: its URL goes in a kiosk browser, in Android or
116120
Apple managed app configuration as `fleet_link` (`asset_id` names the screen),
117121
or in `/etc/screenrig/fleet-link` on Linux; `--expires-at` ends it. Its URL
118122
creates screens, so give it only to the person who configures the devices. A
119-
factory-reset Android 10+ device enrolls by QR code instead:
123+
browser that keeps no storage (vMix, OBS) opens the screen's own link
124+
(`screen link create SCREEN_ID`; rerunning it replaces the link). A
125+
factory-reset Android 10+ device enrolls by QR code:
120126
[Android device owner](references/android-device-owner.md).
121127

122128
`screen archive` darkens a screen but keeps its playlist and binding. Before
@@ -155,8 +161,10 @@ screen is archived as `replaced`; delete it, never unarchive it.
155161
Prefer a card to an application: a card draws natively on every Player, changes
156162
with `card data put` without republishing, and suits a rotating loop. App code
157163
must `await screenrig.waitUntilActive()` before `await screenrig.ready()` and
158-
make no SDK call while `readyState` is not `active`. Use screenRIG's `feeds` for
159-
weather, rates and other third-party data, never the providers.
164+
make no SDK call while `readyState` is not `active`. An app with nothing to show
165+
calls `screenrig.skip()` instead of `ready()`: the screen moves on and counts no
166+
play. Use screenRIG's `feeds` for weather, rates and other third-party data,
167+
never the providers.
160168

161169
`media upload` transcodes locally and needs `ffmpeg` and `ffprobe`; `doctor`
162170
names what is missing, so ask the user to install ffmpeg rather than installing
@@ -275,7 +283,7 @@ Reach for these when the task matches; `screenrig GROUP --help` has the rest.
275283

276284
| Group | Reach for it when | First command |
277285
| --- | --- | --- |
278-
| `triggers` | An emergency notification system (CAP 1.2) must take screens over by itself | `triggers create --name NAME --tag TAG`, then `triggers test ID` (a 60-second alert on the screens); the URL and password go only to that system's administrator; `--pull FILE` also has the platform read CAP sources |
286+
| `triggers` | An emergency system (CAP 1.2), Home Assistant, a sensor or an alerting tool must show something on screens by itself | CAP: `triggers create --name NAME --tag TAG` (`--pull FILE` also reads CAP sources); any other sender: `triggers create --name NAME --kind overlay --show bar\|takeover --tag TAG` ([overlay triggers](references/playlists.md#overlay-triggers)); then `triggers test ID`. The URL and secret go only to the sender's administrator |
279287
| `notifications` | A person should hear when a screen goes offline or fails (email, chat, pager), or another system should react (signed webhook) | `notifications list` first: every project already emails its owner when a screen is offline 10 minutes. Then `notifications create --email owner --conditions screen_offline,display_disconnected`, or `--webhook URL` (verify `ScreenRig-Signature`; `data.secret` is shown once), `--slack URL`, `--teams URL`, `--pagerduty KEY`, `--telegram TOKEN --telegram-chat ID`; prove it with `notifications test ID` and `notifications deliveries ID`. Other conditions: `running_hot`, `storage_full`, `content_stuck`, `not_playing`, `loop_stalled`, `glass_blank`, `glass_frozen`, `crashing`; `--tag TAG`, `--hold MINUTES`, `update ID --snooze 1h`. Channels, grouping and glass verdicts: [notifications](references/notifications.md). `webhooks` remains for raw event feeds |
280288
| `alerts` | The user asks what needs attention on the screens, or named screens will be down for maintenance | `alerts list` shows the open problems, one per screen and condition (`--state all` adds resolved; `crashing` is a notice, not an alert). `alerts ack ID` when someone is on it, or `alerts snooze ID --for 4h` to look again later; either skips a notice still in its hold. For maintenance the user names, `alerts mute --tag TAG --for 2h --note TEXT` (or `--screen-id ID`; under 30 days) keeps those screens out of notices and attention; `alerts unmute MUTE_ID` (ids from `alerts mutes`) ends it when the work is done. Changing alerts needs Manage access |
281289
| `kv`, `kv webhook` | An application keeps live state that the agent or an outside sender sets; the app reads it with `screenrig.kv.get` and hears changes through `screenrig.kv.onChange` | `kv set KEY --app-id app_ID --json-value JSON`; for a sender such as a point of sale or cron job, `kv webhook create KEY --app-id app_ID` (the secret is shown once); a card's webhook: [card webhooks](references/playlists.md#card-webhooks) |

‎plugins/screenrig/skills/screenrig/references/playlists.md‎

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,29 @@ screenrig kv webhook deliveries kvw_ID --card crd_ID # why each po
6565
five minutes. Secrets go to the sender's administrator, never into
6666
conversation, files or logs.
6767

68+
## Overlay triggers
69+
70+
Home Assistant, a sensor hub or an alerting tool shows words on screens with one
71+
HTTP POST: a bar over whatever plays, or a full-screen takeover.
72+
73+
```sh
74+
screenrig triggers create --name "Lobby" --kind overlay --show bar --tag Lobby # url and secret, shown once
75+
screenrig triggers test trg_ID # one-minute test; triggers clear trg_ID ends it
76+
screenrig triggers deliveries trg_ID # why each post was shown, ignored or refused
77+
```
78+
79+
- The sender posts JSON with `Authorization: Bearer SECRET`: `alert_id`, `label`,
80+
`title`, `message`, `note`, `duration` (`90s`, `10m`, `until_cleared`; default
81+
10m) and `clear` or a `state` of `off`, `closed`, `resolved`. One `alert_id` is
82+
one alert; the newest shows; each post holds its alert from now.
83+
- `--map FILE` builds the post from a tool's body (as card webhooks) and runs every
84+
post through it, so leave it off for a sender that posts the members itself.
85+
`--style FILE` sets theme and colours, `--signing` adds `ScreenRig-Signature`,
86+
`triggers update` changes any of it. A wrong url, a wrong secret and any GET
87+
answer the same 404; only `deliveries` says why. A clear is free. Secrets go
88+
only to the sender's administrator.
89+
- Home Assistant example and the full request: <https://screenrig.ai/docs/cli#overlay-triggers>.
90+
6891
## Per-screen values
6992

7093
Each screen carries its own `fields` (up to 32 lower-case names, values up to
@@ -101,6 +124,31 @@ Assigning it to a screen whose wall differs is refused
101124
aspect ratio within 4K, `content_fit: "fill"`, text off the seams):
102125
[video walls](https://screenrig.ai/docs/players.md#video-walls).
103126

127+
## Change one page
128+
129+
`playlist page add PLAYLIST_ID`, `page replace PLAYLIST_ID PAGE_ID` and `page
130+
remove PLAYLIST_ID PAGE_ID` change one page and leave the others as stored; the
131+
kept pages are validated again with the new one. `add --media MEDIA_ID` builds a
132+
full-canvas image or video page on the playlist's canvas (`--seconds`, `--fit`);
133+
`--file PAGE.json` takes any page. `add` puts the page at the end or in front of
134+
`--before PAGE_ID`; `replace --media` swaps the media and keeps the dates, and
135+
with neither `--media` nor `--file` only the dates change.
136+
137+
`--from` and `--until` set the page's `visibility`: `YYYY-MM-DD` or
138+
`YYYY-MM-DDTHH:MM` in each screen's timezone, `--until` exclusive, and a
139+
date-only `--until` covers that whole day. `replace --always` removes the dates
140+
and keeps a switch-off or weekly windows the project set.
141+
142+
Under Propose a page change is a review; your next page change of the same
143+
playlist joins your pending review, which also lets you replace or remove a page
144+
still waiting in it, and approving applies them together. Another proposer's
145+
pending page change makes yours wait (`resource_conflict`) until it is decided.
146+
147+
An uploader changes pages only of its playlists, and its page is an image or
148+
video of its folders only (a stinger transition's logo included);
149+
`outside_upload_scope` carries `upload_scope`, what it may use. Invite one with
150+
`invitations create --kind uploader --folder-id ID --playlist-id ID`.
151+
104152
## Playlist rules that validation will enforce
105153

106154
- A playlist is `name`, optional `audio`, and `pages`. A page has `id`, `canvas`
@@ -125,8 +173,14 @@ aspect ratio within 4K, `content_fit: "fill"`, text off the seams):
125173
`application`.
126174
- For YouTube, put the link the user gave (video, Shorts, live, playlist or
127175
`youtube.com/channel/UC…/live`) in an `iframe` `src`: the server stores an
128-
autoplaying, looping embed without YouTube's controls. Native Players play
129-
sound, the web Player plays muted; `mute=1` in the link mutes everywhere.
176+
autoplaying, looping embed without YouTube's controls. Every Player plays it
177+
with sound where the screen's browser allows sound (the Player web app mutes
178+
it when the browser refuses); `mute=1` in the link mutes everywhere. For a
179+
page that lasts as long as one video, set the page's advance to
180+
`{"mode": "duration", "after_ms": N, "until": "video_end"}`: the page ends
181+
when the video does, and `after_ms` is how long it shows when the screen
182+
cannot read the video's length. A page with a playlist, a live stream or more
183+
than one YouTube video rejects `until` at `advance.until`.
130184
A channel handle (`@name`) is rejected: ask for a video or channel-ID link.
131185
- For a Google Slides, Docs or Sheets file, or a PowerPoint, Word or Excel file
132186
on OneDrive or SharePoint, put the share link, Publish to web link or Embed

‎skills/screenrig/SKILL.md‎

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,10 @@ never with `--json`. `screenrig status` reports service availability.
8686
separate `--config` (capabilities) or `login --no-wait --access manage`.
8787
- `screenrig dashboard open` opens the dashboard for the human;
8888
`invitations create --email ADDRESS` invites members.
89-
- An uploader (a person, or `service-client create --uploader`) works only in
90-
its playlists and folders: `media upload --folder ID`, `playlist page
91-
add|replace|remove`. Anything else is `outside_upload_scope`, whose
92-
`upload_scope` lists what it may use. Set one up with `invitations create
93-
--kind uploader`; see [playlists](references/playlists.md#change-one-page).
89+
- An uploader (`invitations create --kind uploader` or `service-client create
90+
--uploader`) works only in its folders and playlists (`media upload --folder
91+
ID`, `playlist page add|replace|remove`); anything else is
92+
`outside_upload_scope` ([one page](references/playlists.md#change-one-page)).
9493

9594
## Interactive views
9695

@@ -121,9 +120,9 @@ instead of per-screen codes: its URL goes in a kiosk browser, in Android or
121120
Apple managed app configuration as `fleet_link` (`asset_id` names the screen),
122121
or in `/etc/screenrig/fleet-link` on Linux; `--expires-at` ends it. Its URL
123122
creates screens, so give it only to the person who configures the devices. A
124-
browser that keeps no storage (vMix, OBS) opens the screen's link instead:
125-
`screen link create SCREEN_ID` prints it; creating it again replaces it. A
126-
factory-reset Android 10+ device enrolls by QR code instead:
123+
browser that keeps no storage (vMix, OBS) opens the screen's own link
124+
(`screen link create SCREEN_ID`; rerunning it replaces the link). A
125+
factory-reset Android 10+ device enrolls by QR code:
127126
[Android device owner](references/android-device-owner.md).
128127

129128
`screen archive` darkens a screen but keeps its playlist and binding. Before
@@ -164,8 +163,8 @@ with `card data put` without republishing, and suits a rotating loop. App code
164163
must `await screenrig.waitUntilActive()` before `await screenrig.ready()` and
165164
make no SDK call while `readyState` is not `active`. An app with nothing to show
166165
calls `screenrig.skip()` instead of `ready()`: the screen moves on and counts no
167-
play. Use screenRIG's `feeds` for
168-
weather, rates and other third-party data, never the providers.
166+
play. Use screenRIG's `feeds` for weather, rates and other third-party data,
167+
never the providers.
169168

170169
`media upload` transcodes locally and needs `ffmpeg` and `ffprobe`; `doctor`
171170
names what is missing, so ask the user to install ffmpeg rather than installing
@@ -284,7 +283,7 @@ Reach for these when the task matches; `screenrig GROUP --help` has the rest.
284283

285284
| Group | Reach for it when | First command |
286285
| --- | --- | --- |
287-
| `triggers` | An emergency system (CAP 1.2), Home Assistant, a sensor or an alerting tool must show something on screens by itself | CAP: `triggers create --name NAME --tag TAG`; an overlay URL: `triggers create --name NAME --kind overlay --show bar --tag TAG` (a strip over whatever plays) or `--show takeover`; then `triggers test ID`; the URL and password go only to the sender ([overlay triggers](references/playlists.md#overlay-triggers)); `--pull FILE` also has the platform read CAP sources |
286+
| `triggers` | An emergency system (CAP 1.2), Home Assistant, a sensor or an alerting tool must show something on screens by itself | CAP: `triggers create --name NAME --tag TAG` (`--pull FILE` also reads CAP sources); any other sender: `triggers create --name NAME --kind overlay --show bar\|takeover --tag TAG` ([overlay triggers](references/playlists.md#overlay-triggers)); then `triggers test ID`. The URL and secret go only to the sender's administrator |
288287
| `notifications` | A person should hear when a screen goes offline or fails (email, chat, pager), or another system should react (signed webhook) | `notifications list` first: every project already emails its owner when a screen is offline 10 minutes. Then `notifications create --email owner --conditions screen_offline,display_disconnected`, or `--webhook URL` (verify `ScreenRig-Signature`; `data.secret` is shown once), `--slack URL`, `--teams URL`, `--pagerduty KEY`, `--telegram TOKEN --telegram-chat ID`; prove it with `notifications test ID` and `notifications deliveries ID`. Other conditions: `running_hot`, `storage_full`, `content_stuck`, `not_playing`, `loop_stalled`, `glass_blank`, `glass_frozen`, `crashing`; `--tag TAG`, `--hold MINUTES`, `update ID --snooze 1h`. Channels, grouping and glass verdicts: [notifications](references/notifications.md). `webhooks` remains for raw event feeds |
289288
| `alerts` | The user asks what needs attention on the screens, or named screens will be down for maintenance | `alerts list` shows the open problems, one per screen and condition (`--state all` adds resolved; `crashing` is a notice, not an alert). `alerts ack ID` when someone is on it, or `alerts snooze ID --for 4h` to look again later; either skips a notice still in its hold. For maintenance the user names, `alerts mute --tag TAG --for 2h --note TEXT` (or `--screen-id ID`; under 30 days) keeps those screens out of notices and attention; `alerts unmute MUTE_ID` (ids from `alerts mutes`) ends it when the work is done. Changing alerts needs Manage access |
290289
| `kv`, `kv webhook` | An application keeps live state that the agent or an outside sender sets; the app reads it with `screenrig.kv.get` and hears changes through `screenrig.kv.onChange` | `kv set KEY --app-id app_ID --json-value JSON`; for a sender such as a point of sale or cron job, `kv webhook create KEY --app-id app_ID` (the secret is shown once); a card's webhook: [card webhooks](references/playlists.md#card-webhooks) |

‎skills/screenrig/references/playlists.md‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,9 @@ screenrig triggers deliveries trg_ID # why each post was shown, ignored or r
8383
- `--map FILE` builds the post from a tool's body (as card webhooks) and runs every
8484
post through it, so leave it off for a sender that posts the members itself.
8585
`--style FILE` sets theme and colours, `--signing` adds `ScreenRig-Signature`,
86-
`triggers update` changes any of it. Wrong url, wrong secret and any GET answer the same 404; only
87-
`deliveries` says why. A clear is free. Secrets go only to the sender's administrator.
86+
`triggers update` changes any of it. A wrong url, a wrong secret and any GET
87+
answer the same 404; only `deliveries` says why. A clear is free. Secrets go
88+
only to the sender's administrator.
8889
- Home Assistant example and the full request: <https://screenrig.ai/docs/cli#overlay-triggers>.
8990

9091
## Per-screen values
@@ -142,8 +143,11 @@ Under Propose a page change is a review; your next page change of the same
142143
playlist joins your pending review, which also lets you replace or remove a page
143144
still waiting in it, and approving applies them together. Another proposer's
144145
pending page change makes yours wait (`resource_conflict`) until it is decided.
145-
An uploader's page is an image or video of its folders only (a stinger
146-
transition's logo included).
146+
147+
An uploader changes pages only of its playlists, and its page is an image or
148+
video of its folders only (a stinger transition's logo included);
149+
`outside_upload_scope` carries `upload_scope`, what it may use. Invite one with
150+
`invitations create --kind uploader --folder-id ID --playlist-id ID`.
147151

148152
## Playlist rules that validation will enforce
149153

0 commit comments

Comments
 (0)