=== Screenly Cast ===
Contributors: vpetersson
Tags: digital signage, kiosk, tv, screenly, anthias
Requires at least: 6.8
Tested up to: 7.1
Stable tag: 2026.8.1
Requires PHP: 8.2
License: AGPL-3.0-only
License URI: https://www.gnu.org/licenses/agpl-3.0.html

Turn WordPress posts, pages and images into digital signage for any TV, kiosk or notice board. Works with Screenly and Anthias.

== Description ==

Screenly Cast turns WordPress into a simple content creation tool for digital
signage, and for [Screenly](https://www.screenly.io) in particular.

It deliberately does not try to make WordPress into a digital signage CMS. There
are no zones, no feeds and no playlists. It does one thing: it takes a post, page
or image you have already published and renders it so it reads well on a screen
nobody is standing next to.

That covers most of what a screen on a wall is actually for: a digital notice
board in a school or an office, opening hours and a menu board in a café, a lobby
display, or a Raspberry Pi in kiosk mode showing whatever you published this
morning.

Point a screen at an ordinary page URL and it shows the signage view. Recognized
signage players are detected from their request and sent to the signage version
of whatever they asked for, so there is nothing to remember and nothing to edit.
Appending `?srly` still works, and still wins, which is what you want for
previewing on your own machine.

A signage render is the title, the date, a short body, and the featured image if
there is one. Everything that assumes a person with a mouse is removed:
navigation, sidebars, comments, links, sharing buttons.

**Your theme is never touched.** A signage request renders through the plugin's
own template and leaves your site's active theme exactly as it was. Earlier
versions of this plugin switched the whole site's theme when a signage URL was
requested; that is gone. See the changelog.

Some specifics, because they are the difference between "works" and "works on a
wall":

* **Fits the screen.** Content is trimmed to what actually fits, at the
  resolution the screen actually is. A screen cannot scroll and nobody is there
  to try.
* **Every resolution, both orientations.** Correct from an 800x480 Raspberry Pi
  Touch Display up to 4K, in landscape and portrait, with no configuration.
* **Works on old players.** Signage hardware is often years behind the desktop.
  The stylesheet is compiled down to a Chrome 87 baseline, and players below that
  get a reduced-motion mode rather than a broken layout.
* **No external requests.** Fonts are bundled with the plugin. Nothing is fetched
  from a CDN, which matters both for privacy and because a player is frequently
  offline.
* **Not indexed.** Signage renders are marked noindex, so they do not compete
  with your real pages in search results.

Works with [Screenly](https://www.screenly.io) and
[Anthias](https://anthias.screenly.io/) out of the box. Because a signage render
is just a URL, it works the same way on Yodeck, Xibo, OptiSigns, ScreenCloud,
Rise Vision, Signagelive, BrightSign, IAdea and any other player, wallboard or
Chrome kiosk that can open a web page. Those are other companies' products and
are not affiliated with Screenly; they are listed because the plugin genuinely
works with them.

The source code is on [GitHub](https://github.com/Screenly-Labs/Screenly-Cast-for-WordPress/). Contributions and bug reports are welcome.


== Installation ==

1. Install and activate the plugin.
2. Optionally, go to **Settings → Screenly Cast** and choose a logo to show in
   the corner of every render.
3. Open any post, page or image and append `?srly` to its URL.
4. Add that URL as content in Screenly, or whichever signage system you use.

== Frequently Asked Questions ==

= When do I use "?srly" and when do I use "&srly"? =

Use `?srly` when the URL has no other parameters:

* `https://www.mydomain.com/some-page?srly`

Use `&srly` when it already has some:

* `https://www.mydomain.com/?somevar=1&anothervar=2&srly`

The parameter needs no value. `?srly` on its own is enough.

= How are signage players recognized? =

From their request: the `X-Screenly-*` metadata headers a Screenly player can
send, the Android package name several other players identify themselves with,
and user agent tokens that name a player and nothing else: Screenly, Anthias,
BrightSign, IAdea, Slideshow and Unifi Connect.

Detection is deliberately cautious, because the two kinds of mistake are not
equally bad. A player it misses still works if you add `?srly`. A device it
wrongly claims would show a signage render to somebody who was just browsing,
with no explanation and no way back.

So a signal has to name a player and nothing else. Notably absent: LG webOS and
Samsung Tizen, which run signage displays *and* every LG and Samsung smart TV,
and QtWebEngine, which signage players embed *and* so does any desktop Qt
application. Search engines, signed-in users and meeting-room devices are
excluded too: a room calendar is not signage.

A detected player is sent to the same URL with `?srly` added rather than being
shown signage on the original URL, so that a page cache or CDN never has to serve
two different pages for one URL. Only the redirect itself is uncacheable.

Turn it off under **Settings → Screenly Cast** if you would rather add `?srly`
yourself, or use the `screenly_cast_is_signage_player` filter to widen or narrow
which requests count.

= Does this change my site's theme? =

No. A signage request renders through the plugin's own template for that one
request. Your active theme, and what every other visitor sees, is unaffected.

Versions up to 1.0.5 did switch the site's theme, and could leave a site stuck on
the bundled Screenly Cast theme. On upgrade this plugin detects that, switches
your original theme back, and tells you it has done so.

= How much text will be shown? =

Assume a couple of hundred characters will be comfortably read at a distance.
Longer content is trimmed to what fits rather than overflowing or scrolling.

If you need a different limit, filter it:

`
add_filter( 'screenly_cast_character_budget', fn() => 900 );
`

= Can I allow more HTML tags in signage content? =

Yes, via the `screenly_cast_allowed_tags` filter. The default set is small on
purpose, and links are reduced to their text because there is nothing to click on
a screen.

= Which image is used? =

The featured image if the post has one. Failing that, the first image in the post
content that comes from your media library, so adding a picture with the "Add
Media" button is enough, and you do not have to set a featured image as well.
Images hotlinked from other sites are ignored.

On an image's own media URL, that image is the subject of the render.

= Can I hide the date? =

Yes:

`
add_filter( 'screenly_cast_show_date', '__return_false' );
`

The line above the title then shows your site name instead, so the render still
says where it came from.

= Can I change the colors and typography? =

The design is built on CSS custom properties, so overriding a handful of them is
usually enough. Add your own stylesheet after ours by attaching it to the
`screenly-cast` handle:

`
add_action( 'wp_enqueue_scripts', function () {
  wp_add_inline_style( 'screenly-cast', ':root{--color-ground:#101820;}' );
}, 100 );
`

The tokens worth knowing are `--color-ground`, `--color-ink`,
`--color-ink-soft`, `--color-ink-dim` and `--color-brand`, plus `--root-min`,
`--root-gain` and `--root-max`, which together drive the whole type scale.

Over a photograph there are two more: `--srly-ground-deep-rgb`, the scrim color
written as `R G B` channels, and `--srly-text-shadow`.

= Why does my image media page work here but redirect normally? =

Since WordPress 6.4, attachment pages are disabled by default and redirect to the
image file itself. This plugin keeps them renderable for signage requests only,
so casting a media URL still works without re-enabling attachment pages for
ordinary visitors.

= Does it scroll long content automatically? =

No, by design. On a large, non-interactive display, fixed unmoving content reads
better than anything that moves.

== Support ==

For support, feature requests and bug reports, please use the
[GitHub Issues page](https://github.com/Screenly-Labs/Screenly-Cast-for-WordPress/issues).


== Screenshots ==

1. An ordinary post as a visitor sees it: navigation, byline, comments, next and
   previous links.
2. The same post rendered for a screen. Same content, nothing that assumes
   somebody is holding a mouse.
3. The same layout in portrait. Both orientations work from 800x480 up to 4K with
   nothing to configure.
4. The whole settings screen. A logo, and whether to recognize signage players.


== Upgrade Notice ==

= 2026.8.1 =

Nothing to do. This release changes only the wording of the plugin's own
documentation and directory listing; the plugin behaves exactly as 2026.8.0 did.

== Changelog ==

= 2026.8.1 =

No functional changes. Every file the plugin ships behaves as it did in 2026.8.0,
and the only edits inside them are to comments.

What this release exists for is the listing you are reading. WordPress.org serves a
plugin's description from the readme in its stable tag, so revised wording only
reaches the directory when a new version is published. This is that publish.

The full detail for every release is in changelog.txt.
