# Screenly documentation > The complete Screenly docs and community tutorials in one file. Each page begins with a level-one heading and its canonical URL. Generated from the same source as https://www.screenly.io/docs/ and https://www.screenly.io/community/. # After your first screen Source: https://www.screenly.io/docs/get-started/first-screen/after-your-first-screen/ > The five things worth doing once one screen works, in the order that saves the most rework later. The walkthrough took you to one screen playing content. This is what to do next, in the order that costs least to change now and most to change later. ## 1. Settle a naming convention Before the second screen, not after the twentieth. Name for where a screen is, not what it shows. What it shows changes; where it is does not. Give names a shared shape, such as `Site, room, position`, and searching for a site then lists everything in it. Renaming later is possible but tedious, and half-renamed fleets are worse than consistently badly named ones. See [Name, location, and notes](/docs/screens/setup/name-location-and-notes/). ## 2. Set up labels before you need them With one screen, assigning a playlist directly is fine. At five it is annoying, and at fifty it is the main thing standing between you and a content change. Label by facts that do not change: `frankfurt`, `plant-floor`, `reception`, `24h`. A screen carries several, so you get the combinations free without inventing `frankfurt-reception`. Resist campaign labels. `summer-promo` needs removing from twenty screens in September, and it never gets removed. Put the campaign in the playlist's schedule and let it expire on its own. See [Labels](/docs/labels/). ## 3. Turn on alerts that reach someone An offline screen keeps playing cached content, so nothing looks wrong until it does. Email alerts are on by default and go to workspace members; Slack and PagerDuty are worth wiring up if a dark screen is somebody's job. Send them somewhere of their own rather than into a busy channel. See [Alerts](/docs/screens/monitoring/alerts/). ## 4. Invite members, and set the owner correctly Everyone in a workspace sees everything in it, so decide early whether one workspace covers your whole organization or whether teams need their own. Transferring ownership takes a minute while the owner is still here. Recovering a workspace whose owner has left and whose mailbox is closed takes days. See [Roles and permissions](/docs/workspaces/people/roles-and-permissions/). ## 5. Check the screen from the dashboard, not the room Once a screen is working, confirm you can tell it is working without walking to it: a screenshot on its Overview tab, a clean Details tab, and the right content on Now playing. If you cannot answer "is it fine?" from the browser, the fleet does not scale past the screens you can see from your desk. See [Monitoring](/docs/screens/monitoring/). ## Then, when you need it Live data on a screen means an [app](/docs/apps/) or an [integration](/docs/integrations/). Content behind a login means [authenticated pages](/docs/content/web-pages/authenticated-pages/). Doing any of this in bulk means the [API](/docs/developers/). --- # Assign your playlist to a screen Source: https://www.screenly.io/docs/get-started/first-screen/assign-your-playlist/ > Pick the screens a playlist plays on, either directly or with a label, and it arrives on the next check-in. One step left: telling the screen you connected which playlist to play. There are two ways to do it, and you can mix them. You can pick the specific screens a playlist should play on. That is the simplest option, and the right one when you have a handful of screens. Or you can use a label. Put a label on a playlist and on some screens, and every screen with that label plays it. That is what you want once a group of screens should stay in step without you maintaining a list. ## Assign it For your first screen, picking it directly is the fastest route. 1. Open your playlist and go to its **Screens** tab. 2. Add the screen you connected earlier. 3. Save. That is the whole assignment. Your screen is now live. ## When to reach for labels instead Direct assignment means revisiting the playlist every time your screens change. Labels remove that. Give twelve screens the label "Warehouse", put the same label on a playlist, and all twelve play it. Connect a thirteenth next month, give it the same label, and it joins on its own with nothing else to update. A screen can carry several labels, and so can a playlist, which is how a screen ends up showing a site-wide announcement alongside content meant only for its own floor. > [!TIP] > Worth deciding on a labeling scheme before you have dozens of screens to go back over. Location and purpose both work well, and many teams use both. You do not have to choose now. Start by picking screens directly, and move to labels when keeping the list up to date starts to feel like work. ## When it appears Nothing is pushed to your screen. Each screen checks in with Screenly on its own and downloads whatever is waiting for it. Expect it to pick up the change within a minute or two on a healthy connection. It downloads in the background while continuing to play whatever it had before, then switches over once it has everything. > [!NOTE] > This is also why a screen that loses its connection keeps playing. It already has its content, and it quietly catches up on anything it missed once it reconnects. ## Next [Verify your screen is playing](/docs/get-started/first-screen/verify-your-screen/), which is the last step. --- # Connect your first screen Source: https://www.screenly.io/docs/get-started/first-screen/connect-your-first-screen/ > Get a device showing a pairing code, enter it in the dashboard, and bring the screen under Screenly's management. Connecting a screen brings it under Screenly's management: you can assign it content and a schedule, watch its status, and control it remotely, all from the dashboard. Every route ends the same way. The device shows a pairing code, you enter that code in the dashboard, and the screen appears in your list. What differs is how you get the device to that point, and that depends on what it runs on. ## Connect it [Connect a screen](/docs/screens/setup/connect-a-screen/) asks what the screen runs on and gives you the steps for that device, then the code to enter. Come back here when it shows up in your list. > [!TIP] > You can have a screen running in the next minute without touching any hardware. Open Screenly Anywhere [in a browser tab](/anywhere/) and a pairing code appears in the tab, which pairs like any other screen. Use it to see the whole thing working before you spend time setting up a real device, and everything you build carries over when you do. ## What connecting does It consumes one license from your plan's pool. If you are out of licenses, the connection fails and the dashboard tells you so. Nothing else is set up, and nothing else is needed: the screen is ready to be given a playlist in [step 6](/docs/get-started/first-screen/assign-your-playlist/). ## Next Your screen is connected and waiting, with nothing to play yet. Next, [put something in your content library](/docs/get-started/first-screen/upload-your-first-content/). --- # Create your first playlist Source: https://www.screenly.io/docs/get-started/first-screen/create-your-first-playlist/ > A playlist is the running order a screen loops through. Create one, add your content, and set how long each item shows. A playlist is what a screen actually plays: an ordered list of content it loops through, along with how long each item stays on screen. Screens play playlists rather than individual items, so you need one even for a single image. ## Create it 1. In the dashboard, open **Playlists**. 2. Click **+ New Playlist**. 3. Give it a title. This is the only thing it asks for; content, timing, and screens all come after. 4. Click **Create**. You land directly on the new playlist's **Content** tab. ## Add your content Add the item you uploaded in the previous step. Then, if you want to see the rotation actually rotate, add a second one. Two things you can adjust per item: - Duration, how long an item stays on screen before the next one. Images and web pages need one because they have no natural length. Video plays to its end by default. - Order, the sequence items play in. Drag to reorder. The playlist loops. When it reaches the end it starts again from the top, and it keeps doing that for as long as its schedule says it should be playing. > [!TIP] > Keep a first playlist to two or three items. It is much easier to tell whether things are working when you can watch a full loop in under a minute. ## About scheduling A playlist carries its own schedule. There is no separate schedule object to create and attach, which is the single most common thing to unlearn if you have used other signage software. For now, leave the schedule alone. A new playlist is set to play whenever it is assigned, which is what you want for a first test. Once you are past setup, scheduling is where a lot of Screenly's value sits: playing different content by time of day, restricting a playlist to weekdays, or giving an urgent message priority so it interrupts everything else. > [!NOTE] > A playlist can hold up to 1,024 items, but long before that a playlist that has grown unwieldy is a sign it should be split into two. ## Next Your playlist exists but is not going anywhere yet. Next, [assign it to your screen](/docs/get-started/first-screen/assign-your-playlist/). --- # Sign up and create your workspace Source: https://www.screenly.io/docs/get-started/first-screen/create-your-workspace/ > Create your Screenly account and name your workspace. Two minutes, no card, no password. Everything in Screenly lives inside a workspace: your screens, your content, your playlists, and the people who work on them. Creating one is the first step, and it takes about two minutes. ## Sign up [Create an account](https://login.screenlyapp.com/sign-up) with your email address. It starts a 14-day free trial and does not ask for a card. There is no password to choose. You sign in with a one-time code sent to your email, a passkey, or an existing Google, GitHub, or Microsoft account. ## Create your workspace When you sign in for the first time, Screenly offers to create a workspace. 1. Click **Create workspace**. 2. Give it a name. Your company or team name is the usual choice. 3. Click **Create**. You land in the new workspace, ready to connect a screen. Inviting teammates can wait until there is something to show them: [Invite members](/docs/workspaces/people/invite-members/) covers it, and [Roles and permissions](/docs/workspaces/people/roles-and-permissions/) explains what each role can do. > [!NOTE] > One workspace is the right answer for almost everyone starting out. If you think you will need several, for separate business units or clients, [One account, many workspaces](/docs/workspaces/overview/one-account-many-workspaces/) explains when that makes sense. You can add more at any time. ## Next [Connect your first screen](/docs/get-started/first-screen/connect-your-first-screen/). --- # Upload your first content Source: https://www.screenly.io/docs/get-started/first-screen/upload-your-first-content/ > Add a file to your library, or point Screenly at a live web page or stream instead. Your screen is connected but has nothing to show. A playlist needs something to play, so the next step is getting at least one item into your content library. ## Add something to your library 1. In the dashboard, open **Content**. 2. Click **Add content**. 3. Drag in a file, or browse for one. Upload finishes in the background, and the item appears in your library when it is ready. For a first run, an image is the fastest thing to test with. A 1920 x 1080 JPEG or PNG will fill a standard screen exactly. > [!TIP] > Match your content to the screen's resolution and orientation. A portrait image on a landscape screen gets letterboxed with bars down both sides. ## What you can upload Screenly accepts more than images and video: | Type | Notes | |---|---| | Images | JPEG, PNG, GIF, WebP | | Video | Re-encoded on upload so every screen gets a format it can play | | Audio | Plays over HDMI or the device's analog output | | PDF | Each page becomes its own item, so a multi-page PDF turns into a sequence | | Presentations | PowerPoint, Google Slides, Keynote, exported before they are uploaded | | Documents and spreadsheets | Word, Excel, and their Google and Apple equivalents, exported before they are uploaded | > [!NOTE] > A deck or a document is not uploaded as its original file. You export it first, as images, a PDF, or a video, which is two or three menu items in the app you made it in. [Presentations and documents](/docs/content/types/presentations-and-documents/) and [Spreadsheets](/docs/content/types/spreadsheets/) have the steps for each app, and explain what you gain from each format. Video is worth a note. We re-encode it centrally when you upload, so you do not have to think about codecs or containers, and every device gets something it can decode. That processing takes a little time on upload and saves you trouble later. ## Or skip uploading entirely Not everything has to be a file. Two of the most useful kinds of content are not uploaded at all. A web page is a live URL that the screen loads and displays. Point it at an internal dashboard, a status board, or a page your team already maintains, and it stays current without anyone touching Screenly. Screenly can reach pages behind a login, and can inject JavaScript to hide navigation or scale a layout to fit. An app pulls live data and re-renders itself: a clock, a weather widget, an RSS feed, a Grafana or Power BI dashboard. Browse the [App Store](/apps/) and add one in a couple of clicks. > [!NOTE] > A web page or app is not a snapshot. It keeps updating on the screen without you republishing anything, which is what makes it useful for dashboards and live figures. ## Next With something in your library, you can [build a playlist](/docs/get-started/first-screen/create-your-first-playlist/). --- # Verify your screen is playing Source: https://www.screenly.io/docs/get-started/first-screen/verify-your-screen/ > Check the screen's status, confirm it is in sync, and see what it is showing right now without standing in front of it. Your playlist is assigned. The last step is confirming it actually arrived, which you can do from the dashboard without going anywhere near the display. ## Check the status Open **Screens**. Your screen should show two things: - Online, meaning it is reachable and checking in. - In sync, meaning it has downloaded everything currently assigned to it. Online and in sync together mean the screen has your playlist and is playing it. Here is what each status means and what to do about it: | Status | What it means | What to do | |---|---|---| | Online | Reachable and checking in normally | Nothing | | Pending sync | Reachable, still downloading | Wait. Large video takes longer | | Offline | Not checking in | See [common setup issues](/docs/screens/setup/setup-issues/) | | Disabled | Turned off in the dashboard, and not using a license | Re-enable it to bring it back | > [!NOTE] > Pending sync is not an error. A screen that was given new content moments ago is expected to sit there briefly while it downloads. It keeps playing its previous content throughout. ## See what it is showing Status tells you the screen is healthy. To confirm it is showing the right thing, take a remote screenshot. 1. Open the screen in the dashboard. 2. Request a screenshot. The device captures what is on the display and sends the image back, so you can confirm your content is up, correctly oriented, and not sitting behind an error. This is the fastest way to check a screen in another building, and the only way that does not depend on someone being there to look. > [!IMPORTANT] > Remote screenshots can be turned off per device with Privacy Mode, for screens that display sensitive information. If screenshots are unavailable on a screen, check whether Privacy Mode is enabled on it. ## If something is wrong A few things are worth checking before you go digging: If the screen is online but showing nothing, the playlist is probably not reaching it. Check that the screen you picked, or the label you used, matches what is on the playlist. If the content is stretched or has black bars, its shape does not match the display's. Change the screen's scaling setting, or re-export the content to match. If the screen never came online at all, work through [common setup issues](/docs/screens/setup/setup-issues/). ## You are set up That is the full loop: a workspace, a connected screen, content, a playlist, and an assignment joining the last two together. Everything else in Screenly is a deeper version of one of those steps. [After your first screen](/docs/get-started/first-screen/after-your-first-screen/) is the five things worth doing before the second one, in the order that saves the most rework. Beyond that: - Curious what else the product does: [What you can do with Screenly](/docs/get-started/overview/features/). - Putting live data on screen: browse the [App Store](/apps/). - Choosing a plan before the trial ends: [Plans for Screenly](/docs/get-started/plans/plans-for-screenly/). --- # What you need Source: https://www.screenly.io/docs/get-started/first-screen/what-you-need/ > A display, something to run Screenly on, and an internet connection. Plus the network details to pass on to your IT team. Three things: a display to show your content on, something to run Screenly on, and an internet connection. You do not need a server, anything installed on your own computers, or anything opened up on your network. ## A screen Whatever you already have. A smart TV, an ordinary television, a computer monitor, a commercial display made for signage, or the laptop on your desk. The brand does not matter, and there is no special signage screen you have to buy. Most displays need a small device plugged into them, which connects with an HDMI cable in the same way as a streaming stick or a games console. Some do not need anything plugged in at all, because they have a computer inside them already. That covers many commercial displays and smart TVs, and it also covers a laptop or an office PC, which runs Screenly in its browser. [Supported platforms](/docs/anywhere/overview/supported-platforms/) lists the ones we support. ## Something to run Screenly on Something has to run the Screenly software and drive the display. On many business displays that is the display itself, because it has a computer built in. Otherwise it is a small device you connect to it. You have three routes. Existing Scala players can be converted too: see [Scala players](/docs/screenlyos/hardware/scala-players/). [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) covers the difference in full. ### Screenly Player Our own hardware, which arrives ready to use. Plug it into the display and the network, turn it on, and it shows a pairing code. There is nothing to install and nothing to set up. The Screenly Player shows content at up to 1080p. The Screenly Player Max is the more powerful model and goes up to 4K. This is the most capable route, because we look after the whole device. ### Your own Raspberry Pi A Raspberry Pi can run [ScreenlyOS](/docs/screenlyos/), the same software our own hardware uses. You download the image and copy it onto an SD card. A Raspberry Pi shows content at up to 1080p, and behaves the same as a Screenly Player in almost every way. Note: A Raspberry Pi running our software is not a Screenly Player. That name means the hardware we sell, which matters when you are reading hardware-specific pages. ### Hardware you already own [Screenly Anywhere](/docs/anywhere/) is an app you add to a device that already has its own system: an Android device or Android TV, an Amazon Fire TV, a Samsung commercial display running Tizen, an LG webOS television, an Amazon Signage Stick, a ChromeOS Flex device, or a browser tab on any computer, Windows included. Managing content works exactly the same way. What you give up is depth, because the device's own system is still running alongside ours. A browser tab is the fastest way to try Screenly without buying anything. ## An internet connection Screens need internet access, the same as a phone or a computer. Wi-Fi or a network cable both work. Screens only ever connect out to us. Nothing connects in to them, so there is nothing to open up, forward, or expose on your network. > [!IMPORTANT] > If someone tells you Screenly needs a port forwarded, a fixed public address, or a screen placed outside your firewall, that is not something we need. One thing worth passing on: screens need to be able to check the time automatically. Scheduling runs on each screen's own local time, so a screen with the wrong clock shows the wrong thing at the wrong hour. If your network is restricted, [IT requirements](/docs/it-requirements/) has what your IT team will ask for: the hostnames and ports to allow, and the fact that screens only ever connect outbound. ## How much data it uses Not much. Content downloads once and then plays from the device itself, so a screen looping the same playlist all day is not downloading it over and over. The one thing to expect is a burst the first time you send new content out, particularly video. If you are bringing a dozen screens online at one site at once, they will each pull down their first playlist together. ## A web browser The dashboard runs in any current version of Chrome, Edge, Firefox, or Safari. There is nothing to install and nothing to keep updated. You do not need to be on the same network as your screens. Managing a screen in another building works exactly like managing one in the next room. ## A Screenly account [Signing up](https://login.screenlyapp.com/sign-up) takes an email address and starts a [free trial](/docs/get-started/plans/free-trial/) with no card required. There is no password to choose. [Sign up and create your workspace](/docs/get-started/first-screen/create-your-workspace/) lists the sign-in options. ## Next [Create your workspace](/docs/get-started/first-screen/create-your-workspace/) and connect your first screen. --- # What you can do with Screenly Source: https://www.screenly.io/docs/get-started/overview/features/ > A short tour of the whole product: screens, content, playlists, apps, access, and security. Get started covers putting content on one screen. This page is a quick look at everything else, so you know what is there when you need it. ## Screens - Status at a glance: online or offline - Whether a screen has the latest content and schedule, or is still downloading them - Alerts when a screen drops off - Remote screenshots, to see what a display is showing without visiting it - Remote reboot and diagnostics - Orientation for portrait or landscape, and scaling to fit the display - Keeps playing if the internet drops, and catches up when it returns. [What offline actually means](/docs/screens/overview/screenlyos-or-screenly-anywhere/) has the detail Screens check in on their own every few minutes and report how they are doing, which is what keeps all of the above current. A problem usually shows up in your dashboard before anyone standing in front of the screen notices it. ## Content Images, video, audio, PDFs, presentations, documents, spreadsheets, live streams, and web pages. Two kinds update themselves once they are on screen. A web page is a live URL the screen loads and keeps current, including pages behind a login. An app shows live data that refreshes on its own, such as a dashboard, a calendar, or a news feed. Video is re-encoded when you upload, so every device gets a format it can play. Storage is unlimited on every plan. ## Playlists and scheduling - An ordered, looping rotation, with a duration per item - Schedules live inside the playlist: by hour, by day, or by date range - Every screen evaluates its schedule against its own local time, so 9am means 9am in each city - Priority playlists interrupt everything else on a screen while their schedule is active ## Apps Browse the [App Store](/apps/) for dashboards, calendars, news, weather, and more. If nothing fits, you can build your own. ## Workspaces and access - Roles that control what each person can do - Passwordless sign-in by default - SSO through your own identity provider - Linked workspaces, which share billing and licenses while staying operationally separate ## Security On [ScreenlyOS](/docs/screenlyos/), the device is locked down: nobody can log into it remotely, updates are verified before they install and undo themselves if they fail, and it works with the kind of network security larger organizations require. If your IT or security team wants the specifics, they are in [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/). ## For developers Everything in the dashboard is also available through an API, a command-line tool, and an MCP server for driving Screenly from an AI assistant. See the [developer documentation](https://developer.screenly.io/). You can skip this entirely if it is not your job. ## Next [Connect your first screen](/docs/get-started/first-screen/). The [Glossary](/docs/get-started/overview/glossary/) defines any term above that is new to you. --- # Glossary Source: https://www.screenly.io/docs/get-started/overview/glossary/ > Definitions for the terms used across Screenly docs: screens, devices, pairing codes, playlists, labels, workspaces, roles, and licenses. A few words come up again and again in Screenly. Here is what each one means, and where two of them are easy to mix up, we say so. ## The essentials ### Screenly Us, and the thing you sign in to. Screenly is where you decide what your screens show. ### Dashboard Where you do the work. Open a browser, sign in, and everything is there. ### ScreenlyOS Our own software for the device itself. It does one thing, runs your screen, and we look after it. ### Screenly Anywhere Screenly as an app, for a device that already has software of its own. Your smart display or streaming stick becomes a screen. ### Screenly Player Our own signage hardware, which ships with ScreenlyOS installed. Player Max is the higher-performance model. ### App Store Where you find apps to put on your screens, from clocks and calendars to live dashboards. ## What is on the wall ### Screen A display under Screenly's management, and the unit you work with in the dashboard. ### Device The hardware running the Screenly software. Sometimes a separate device connected to the display, sometimes the display's own built-in computer. ### Pairing code The code a device shows on first boot, which you enter in the dashboard to connect it. Sometimes called a PIN. ### In sync The screen has downloaded everything assigned to it. Online but out of sync means it is still catching up. ## What plays, and when ### Content Whatever you want people to see. An image, a video, a PDF, a web page, an app, a live stream. ### Playlist The ordered, looping rotation a screen plays, with a duration per item. ### Schedule When a playlist is allowed to play. It lives inside the playlist rather than as a separate object. ### Label A tag you put on both screens and playlists to connect the two. A playlist labeled "Warehouse" plays on every screen labelled "Warehouse". ### App Content that pulls live data and re-renders on its own, such as a dashboard or a calendar. ### Privacy Mode A per-device setting that turns off remote screenshots, for screens showing something sensitive. ## People and plans ### Account Your personal login. One account can belong to several workspaces. ### Workspace Your team's space in Screenly. Your screens, your content, and the people you work with all live in one. > [!NOTE] > Account and workspace are the easiest pair to mix up. Signing in is an account concern. Everything you then do is a workspace concern. ### Role What a member can do in a workspace. Screenly has four: Owner, Admin, Billing Manager, and User. ### License What lets one screen play content. Your plan includes a pool, and each connected screen takes one. ### Linked workspaces Separate workspaces sharing billing and a license pool while staying operationally independent. --- # The dashboard Source: https://www.screenly.io/docs/get-started/overview/the-dashboard/ > What the dashboard is, what each item in the navigation does, and which jobs live somewhere other than the browser. The dashboard is the web app at [login.screenlyapp.com](https://login.screenlyapp.com/). It runs in a browser and needs nothing installed. It is the only place most people ever touch. Your screens are managed from here whether they run ScreenlyOS on a Screenly player, or Screenly Anywhere on an Android box, a smart display, or a browser. The devices differ; the dashboard does not. ## The navigation | | | | --- | --- | | Home | Where you land. Fleet status at a glance, quick actions for the four things you do most, and product news | | Screens | Your fleet, their health, their settings, and their labels | | Playlists | The rotations, each with its own content, schedule, and screens | | Content | Everything uploaded or added: images, video, audio, PDFs, web pages, streams | | Apps | Your configured app instances, and the App store you install them from | | Settings | The workspace: members, integrations, notifications, security, linked workspaces | | Help Center | Support, in a new tab | Billing sits apart from that list and is visible only to Owners and Billing Managers. The four quick actions on Home are add a screen, create a playlist, upload content, and install an app, which is a fair summary of what the dashboard is for. ## What is not done here Setting up a device belongs to the device. Getting hardware or a platform running, and diagnosing one that will not connect, is covered by [ScreenlyOS](/docs/screenlyos/), [Screenly Anywhere](/docs/anywhere/), or [Screenly players](/docs/screenly-players/). Once a screen is paired it is managed from here like any other. Anything scripted happens elsewhere too. The dashboard is one client of the Screenly API with no special access, and everything here is available from the API, the CLI, and the MCP server, which is what [Developers](/docs/developers/) covers. ## Who can see what Everyone in a workspace sees all of its screens, content, and playlists; roles decide who can change people and who can see billing. [Roles and permissions](/docs/workspaces/people/roles-and-permissions/) has the detail, including why "some people must not see some screens" means a separate workspace. ## Signing in, and the lobby There is no password. You sign in with a one-time email code, a passkey, a Google, GitHub, or Microsoft account, or your own identity provider over SAML. See [Signing in](/docs/account/signing-in/ways-to-sign-in/). If your account belongs to more than one workspace, or you have an invitation waiting, you land on a workspace picker rather than straight in a workspace. It asks you to pick one to continue, and has a second tab for pending invitations where you accept or decline each one. You can also create a new workspace from there. With exactly one workspace and nothing pending, you skip it entirely, which is why most people never see it. --- # What Screenly is Source: https://www.screenly.io/docs/get-started/overview/what-is-screenly/ > Cloud-based digital signage: what it does, what you do with it, and what runs on the screen. Screenly is cloud-based digital signage. You manage what plays on your screens from a browser, and the screens keep playing on their own. One display or thousands, in one building or across sites, from the same dashboard. You never need to be near the hardware. ## What you do with it Five words carry most of the meaning. **Content** is a file you uploaded, a web page, a live stream, or an app. A **playlist** is an ordered, looping rotation of content with a duration per item. A **schedule** says when that playlist may play. A **screen** is a display plus the device driving it. A **workspace** holds all of it, plus the people who can see it. content → playlist → schedule → screen 1. Add your content, or pick an app. 2. Build a playlist, the running order a screen loops through. 3. Choose which screens it plays on. 4. Those screens pick it up on their next check-in. Changing something later works the same way. Edit the playlist, and every screen showing it updates itself. [Set up your first screen](/docs/get-started/first-screen/) walks through the whole sequence. ## What the cloud does The cloud does three jobs. ### Content management What plays, in what order, and when. See [content management](/features/content-management/). ### Device management Reboot, update, and diagnose the hardware running each screen without a site visit. See [device management](/features/device-management/). ### Monitoring Which screens are online, which are up to date, and what each one is showing right now. See [monitoring](/features/monitoring/). ## What runs on the screen Every screen needs something running the Screenly software. Often that is a small device plugged into the display. Many business displays have a computer built in and run it themselves, with nothing extra to connect. Either way, that software is one of two things: [ScreenlyOS](/docs/screenlyos/), our own operating system, or [Screenly Anywhere](/anywhere/), an app that runs on the system a device already has. The dashboard is identical either way. [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) covers the difference and when each one fits. ## Next [Connect your first screen](/docs/get-started/first-screen/), or see [what you can do with Screenly](/docs/get-started/overview/features/) first. --- # Free trial Source: https://www.screenly.io/docs/get-started/plans/free-trial/ > What the trial includes, what it does not require, and what happens when it ends. Every new workspace starts on a free trial that runs for 14 days. It does not ask for a card, and it does not start a subscription you have to remember to cancel. ## What you get The trial is the real product, not a limited preview. You can connect screens, upload content, build playlists, schedule them, install apps, and invite teammates. Use it to answer the questions that matter before you commit: does your content look right on your displays, does Screenly reach the internal dashboard you want to put on screen, and does the hardware you already own work with [Screenly Anywhere](/anywhere/). > [!TIP] > You do not need hardware to start. Set up [Screenly Anywhere in a browser tab](/anywhere/) and you can evaluate most of Screenly right in your browser while your players are still shipping. ## What it does not require No credit card, and no sales call. [Sign up](https://login.screenlyapp.com/sign-up) with an email address and you are in. Screenly is passwordless by default, so there is no password to choose either. See [Sign up and create your workspace](/docs/get-started/first-screen/create-your-workspace/) for the sign-in options. ## When it ends Pick a plan before day 14 and everything carries over untouched: your screens stay connected, your content stays in the library, and your playlists keep their schedules. Nothing is rebuilt and nothing is migrated. Starter is the usual starting point, and the reasons to move up are specific: more than five screens, more than two users, or a need for 4K. Moving up has no migration cost either; only the plan and its licenses change. See [Plans for Screenly](/docs/get-started/plans/plans-for-screenly/) to choose one, and the [pricing page](/pricing/) for current rates. > [!NOTE] > Enterprise requires a minimum of 25 screens and includes things a trial cannot show you on its own, such as a support SLA and SSO through your identity provider. If that is where you are heading, [talk to us](/get-demo/) during the trial rather than after it. --- # Plans for Screenly Source: https://www.screenly.io/docs/get-started/plans/plans-for-screenly/ > Starter, Business, and Enterprise compared side by side, with what each includes and how to pick one. Three plans, billed per screen. Each one includes everything in the plan below it. ## What each plan includes | | Starter | Business | Enterprise | |---|---|---|---| | Screens | Up to 5 | Unlimited | Unlimited, 25 minimum | | Users | Up to 2 | Unlimited | Unlimited | | Resolution | Up to 1080p | Up to 4K | Up to 4K | | Content storage | Unlimited | Unlimited | Unlimited | | Playlists | Unlimited | Unlimited | Unlimited | | Images, video, streams, web pages, apps | Yes | Yes | Yes | | Scheduling and dayparting | Yes | Yes | Yes | | Offline playback | Yes | Yes | Yes | | Custom user permissions | - | Yes | Yes | | SSO through SAML | - | - | Yes | | Linked workspaces | - | - | Yes | | Shared playlists | - | - | Yes | | Consolidated billing | - | - | Yes | | Priority support SLA | - | - | Yes | | Implementation and training | - | - | Yes | See the [pricing page](/pricing/) for current monthly and annual rates. ## Which one do you need | If you | Pick | |---|---| | Have 5 screens or fewer, and 2 people managing them | Starter | | Need more screens, more users, or 4K | Business | | Need SSO, linked workspaces, consolidated billing, or an SLA | Enterprise | > [!NOTE] > Moving up costs nothing to migrate. Your screens, content, and playlists carry over untouched, and only the plan and its licenses change. ## Licenses One connected screen uses one license, drawn from a pool your plan provides. Disabling a screen returns its license to the pool. A license covers a device rather than a panel. A multi-display board driven as one continuous picture from a single device counts once, whatever the panel count. Users are counted only on Starter, which allows two. Business and Enterprise have no user limit. ## What is included The software running on your screens costs nothing extra. Both [ScreenlyOS](/docs/screenlyos/) and [Screenly Anywhere](/docs/anywhere/) come with your subscription, updates included, on every plan. There is no operating system license, no per-device software fee, and no charge when a new version ships. A screen license covers the screen and everything running on it. ## Next Start with the [free trial](/docs/get-started/plans/free-trial/), which runs 14 days and needs no card. If you are heading for Enterprise, [talk to us](/get-demo/) while you are still evaluating. --- # Device certificates Source: https://www.screenly.io/docs/screens/managing/certificates/ > Download a screen's own certificate, or the Screenly CA certificate, for services that need to authenticate the device. On the **Actions** tab of a ScreenlyOS screen: **Download certificate** for that device's own certificate, and **Download CA certificate** for the authority that signed it. ## What they are for Every ScreenlyOS device holds a client certificate, which is how it proves who it is to us. You can use the same certificate to let the device prove who it is to **your** services, so an internal dashboard can require a certificate rather than a shared password. That is the mutual TLS setup described in [Authenticated pages](/docs/content/web-pages/authenticated-pages/), which has the server-side configuration and has to be enabled per content item. ## Verify on the device, not just the CA > [!IMPORTANT] > Every Screenly device shares the same certificate authority. A service that only checks that a client certificate chains to the Screenly CA is trusting **any** Screenly player in the world, not just yours. Check the certificate's common name as well. On a device certificate the common name is that device's own id, so your service can allow the specific players you mean and refuse the rest. The CA certificate is the one your service needs in order to validate the chain at all. The device certificate is what tells you which device it is. --- # Copy settings between screens Source: https://www.screenly.io/docs/screens/managing/copy-settings/ > Clone one screen's settings, labels, and playlist assignments onto another. It overwrites the target completely. From the screens list, open the menu on a screen's row and choose **Copy**, then pick the target. It carries three things across: the display settings, the labels, and the playlist assignments. Which means the target screen ends up showing exactly what the source screen shows, configured exactly the same way. > [!IMPORTANT] > The target's existing settings, labels, and assignments are replaced, not merged. Anything that was only on the target is gone. ## What it is for Setting up the fifth screen in a room. The first one takes a while to get right: rotation, overscan, the labels, the playlists. The rest are one action each. It is also the fastest way to replace a failed player. Pair the new device, copy from a screen in the same room, and it comes up configured. Do this before deleting the old one if the old one is still in the list, since it is the better source. ## What it does not carry The name, the location, and the notes stay as they are on the target. Those describe the physical installation and are exactly what should not be cloned. --- # Enable and disable Source: https://www.screenly.io/docs/screens/managing/enable-and-disable/ > Disabling a screen frees its license and keeps everything else. What that does and does not affect. The switch is on the screen's **Actions** tab. A disabled screen stays in the workspace but stops displaying content and stops using a [license](/docs/billing/licenses/). ## What survives Everything except playback. Settings, labels, notes, location, and playlist assignments are all still there, so re-enabling puts the screen back exactly as it was. There is no rebuild and no re-pairing. ## When to use it - A screen out of service: a display being repaired, a site closed for refurbishment, a seasonal location. Disabling returns the license to the pool for something else and gives it back when you re-enable. - Freeing a license in a hurry: if a new screen will not pair because the pool is full, disabling something you are not using is faster than changing the plan. - A screen you are not sure about: disabling is reversible in a way that deleting is not. If you are tidying up and cannot remember what a screen is, disable it and see whether anyone notices. ## Enabling after a transfer A screen moved from another workspace arrives disabled. Open it, enable it, and it starts playing. A transfer that appears to have done nothing has usually just done this. --- # Reboot and delete Source: https://www.screenly.io/docs/screens/managing/reboot-and-delete/ > Restarting a screen remotely, why there is no scheduled reboot, and what deleting a screen actually does. ## Reboot On the screen's **Actions** tab, available on ScreenlyOS screens that are currently online. It restarts the device. It is worth trying when a screen is online, in sync, and still showing something wrong, which usually means the player rather than the content. It will not help a screen that is offline, because the command cannot reach it. Screenly Anywhere screens cannot be rebooted from the dashboard, because Screenly is an app on someone else's operating system there and cannot restart the device. Reloading the app or the page is the equivalent. ## There is no scheduled reboot Deliberately. Booting is the riskiest thing a device does. It is where a marginal power supply shows up, where a corrupted card stops being readable, and where a player that had been running fine for months fails to come back. A screen rebooting nightly takes that risk 365 times a year, and one that does not come back needs somebody to drive to it. An occasional manual reboot is fine. A screen that needs regular reboots to keep working has a fault worth reporting, not a schedule worth automating. The [Details tab](/docs/screens/monitoring/health-and-diagnostics/) will usually name it. ## Delete Also on the Actions tab. It removes the screen from the workspace permanently and cannot be undone. The device itself is not wiped. It returns to showing a pairing code and can be connected again, to this workspace or another. Before deleting, consider whether you want [disable](/docs/screens/managing/enable-and-disable/) instead. Disabling frees the license too, keeps everything, and is reversible. Delete when the device is genuinely gone. --- # Move a screen to another workspace Source: https://www.screenly.io/docs/screens/managing/transfer-a-screen/ > Transfer a screen between workspaces, what comes with it, and the two things that catch people out. From the screen's **Actions** tab, choose **Transfer**, pick the destination workspace, and confirm. ## What you need Owner or Admin in **both** workspaces. The destination list only shows workspaces where you have one of those roles, so a workspace you cannot see in the list is one you do not have rights in. You also need a spare license in the destination. ## What comes with it Settings come across. **Playlist assignments do not.** That is the thing worth planning for. A transferred screen arrives configured but with nothing to play, so line up its playlists in the destination workspace before you move it rather than after. > [!NOTE] > The screen also arrives **disabled**. Open it in the new workspace, enable it, and it starts playing. ## Why you would Workspaces are isolated: content and screens in one are invisible from another. Moving a screen is how you hand a display to a different team, or split a growing fleet into regions. If you find yourself transferring screens back and forth often, that is usually a sign the workspaces should be [linked](/docs/workspaces/linked-workspaces/what-they-are/) or that a [shared playlist](/docs/workspaces/reference/sharing-between-workspaces/) would solve the actual problem. --- # Alerts Source: https://www.screenly.io/docs/screens/monitoring/alerts/ > Getting told when a screen goes offline, by email, Slack, or PagerDuty, and how to keep the alerts worth reading. The event Screenly notifies on is **a screen going offline**, and its recovery. That is the one that needs a person. There is no alert for content failing to process, a schedule ending, or a member joining. Those appear in the dashboard's notification bell. ## Choosing where alerts go Under **Settings**, then **Notifications**, in your workspace settings. **Email** is on by default and goes to workspace members. **Slack** posts into a channel you choose. **PagerDuty** raises an incident, which is right when a dark screen is something somebody is on call for. Slack and PagerDuty need connecting first under [Integrations](/docs/integrations/). You can use more than one at once. ## Keeping them worth reading A screen on a flaky connection will flap, and a channel that cries wolf gets muted, which is worse than having no alerts because it feels like having them. Two things help. Send screen alerts somewhere of their own rather than into a busy channel. And reserve PagerDuty for the screens that genuinely justify waking someone: a display in a plant control room is not the same as one in a corridor. Recovery notifications matter as much as failures. Most offline screens come back on their own within minutes, and knowing that is what stops someone driving to a site unnecessarily. --- # Health and diagnostics Source: https://www.screenly.io/docs/screens/monitoring/health-and-diagnostics/ > The Details tab turns a device report into a ranked list of problems, each with what caused it and what to do. What it checks and what the thresholds are. The **Details** tab on a ScreenlyOS screen is the device's own report, read for you. Rather than a wall of numbers, it gives a verdict, then a list of problems ordered worst first, each with the measurement behind it and the thing to do about it. ## The verdict | Headline | Meaning | | --- | --- | | No issues detected | Every check in the last report came back clean | | Working, with notes | Something to know about, nothing to fix | | Degraded | At least one warning | | Needs attention | At least one critical problem | | Nothing reported yet | The screen has not sent a report | Under it is a line naming what still works, because a list of warnings should not read as a dead screen. Content already on the player keeps playing while you work through them. ## What it checks ### Power The Raspberry Pi firmware raises an under-voltage flag when the supply dips, and it stays latched after the event. Brownouts crash playback and are the most common cause of a corrupted card, so this is treated as serious even when it has recovered. The fix is nearly always the supply: use the official one, and take the player off extension leads and unpowered hubs. ### Cooling Warns above 70 °C and calls it overheating above 80 °C. The firmware drops clock speeds to protect the board, which the audience sees as stuttering video. Clear the vents and move the player out of direct sun. ### Storage Warns below 3 GB free and turns critical below 1 GB, which is the point where the player starts deleting cached files that are not in the current playlist to make room. On a Raspberry Pi it also watches the SD card's own error counters and its read-only flag: a card that has gone read-only does not come back and needs replacing. On a Player Max it reads the drive's SMART data and warns at 80 percent of rated endurance. ### Memory Warns above 90 percent in use, where the kernel starts killing processes and the viewer can restart mid-item. Heavy web content in a playlist is the usual cause. ### Connectivity Four checks: can it reach its gateway, our API, the hosts your content is downloaded from, and a time server. A gateway failure is reported on its own with the rest listed underneath, since one broken route explains all of them. Wi-Fi signal below 40 percent is flagged separately, because downloads stall and restart at that level and large files may never finish. ### Clock A failing time check means schedules run against a drifting clock, so content appears at the wrong time. See [Configure time servers](/docs/screenlyos/networking/guides/configure-time-servers/). ### Security Notes when a player is authenticating with its shared secret rather than a client certificate. It still works; it is the weaker of the two paths. ### Reporting A report older than 45 minutes is flagged, because everything else on the page comes from that report and may no longer describe the player. ## What else is on the tab Alongside the issues are the raw cards they come from: Resources, Network, Network checks, SD card or Disk, Security, and Player. That is where you find a screen's IP and **MAC address**, its Wi-Fi signal and frequency, its hardware model and serial number, its ScreenlyOS version, its local time, and its [Tailscale](/docs/integrations/network/private-network-access/) state if it is on your private network. ## Reading it well Symptoms are folded into whatever explains them. A failing power supply that is also causing CPU throttling reads as one power problem, not three unrelated ones, and the throttling is listed underneath as a consequence. So work from the top. The first item is usually the cause of several of the ones below it. --- # Screenshots Source: https://www.screenly.io/docs/screens/monitoring/screenshots/ > Seeing what a screen is actually showing, why a screenshot is sometimes unavailable, and how to turn capture off entirely. ScreenlyOS screens send a screenshot about every five minutes. They appear as thumbnails in the screens list and full size on each screen's Overview tab. This is the only way to confirm what a display is really showing without standing in front of it. Status tells you a screen is healthy. A screenshot tells you the content is right, the rotation is right, and nothing is sitting on top of it. > [!NOTE] > Screenly Anywhere screens do not support screenshots. The card says so rather than sitting empty. ## When there is no image | What you see | What it means | | --- | --- | | No screenshots yet | The screen has not captured anything yet. Normal on a screen set up minutes ago | | This screen is offline | With the last captured screenshot still viewable, if there is one | | This screen is disabled | Enable it to resume playback and capture | | This screen is protected | Privacy mode is on | | Screenshots unavailable | A Screenly Anywhere screen, which cannot take them | | Couldn't load screenshot | Usually temporary. Try again | ## Privacy mode Some screens should not be captured at all: one in a secure area, one showing personal data, one where a photograph of the display would itself be a disclosure. **Privacy mode**, on the screen's Actions tab, stops screenshots of that screen being captured or stored. It is per screen, so you can protect the few that need it without giving up visibility of the rest. You lose the ability to check that screen remotely, which is the whole trade. Status, health, and Now Playing all still work, so you are not blind, just without the picture. --- # Status and sync Source: https://www.screenly.io/docs/screens/monitoring/status-and-sync/ > How often a screen checks in, what online and pending sync actually mean, and why a command sometimes takes a few minutes to land. Connection and content are tracked separately, because they fail separately. ## How often a screen checks in A ScreenlyOS screen pings us roughly every 30 seconds, with a random delay of up to six minutes added on top. The spread is deliberate: it stops a whole fleet calling home in lockstep. It also sends a full health report every 15 minutes. A report older than 45 minutes is flagged as stale on the screen's Details tab. A Screenly Anywhere screen pings every 30 seconds, checks its playlist every 5 minutes, and sends its configuration and report every 15 minutes. ## Why a command is sometimes not instant When a screen is online it usually holds an open connection to us, and commands like a reboot or a settings change arrive immediately. When that connection is closed, commands wait for the next ping instead. Nothing is lost, it just takes up to a few minutes. The Details tab says so explicitly when this is happening, rather than leaving you to wonder. This is why the advice on settings is to allow around fifteen minutes before deciding a change did not work. ## Online and in sync are different **Online** means we heard from it. **In sync** means it has everything it is supposed to be showing. They fail separately, so a screen can be in any of four states. | Online | In sync | What that means | | --- | --- | --- | | Yes | Yes | Healthy and current | | Yes | No | Downloading, and still showing the previous content meanwhile | | No | Yes | Offline, but playing exactly the right thing | | No | No | Offline, and will catch up when it reconnects | The third row is the one people find surprising, and it is the point of the design. A screen that is online but not in sync is downloading. It keeps playing what it already had throughout, so the audience sees no interruption, and video takes considerably longer than images. A screen that is offline and out of sync will catch up on its own when it reconnects. There is nothing to press. ## When a screen goes offline Content already on the device keeps playing. Files you uploaded are stored locally and schedules are held on the device, so a screen carries on showing the right thing at the right time through an outage. What stops is anything that needs the network: web pages and apps pulling live data are skipped while they cannot reach their source, and rejoin the rotation when the connection returns. That property is the reason an offline screen is often not urgent. It is also the reason nobody notices for a week, which is what [alerts](/docs/screens/monitoring/alerts/) are for. --- # ScreenlyOS or Screenly Anywhere Source: https://www.screenly.io/docs/screens/overview/screenlyos-or-screenly-anywhere/ > The two ways Screenly runs on a device: what differs in practice, what each Anywhere platform asks of you, and why the choice decides how long a screen lasts. Screenly itself runs one way, in our cloud. The choice is what runs on the hardware driving each screen, whether that is a device you connect to a display or a business display with a computer built in. There are two options, and any given device uses one or the other. - ScreenlyOS takes over the device completely. It becomes a screen player and does nothing else, and we look after it, including its updates. - Screenly Anywhere is an app you add to a device that already has its own system, such as a commercial display, a smart TV, an Android box, or a spare computer. Same dashboard, same content, same playlists either way. You can use both in the same workspace, and mixed estates are normal. [What a screen is](/docs/screens/overview/what-a-screen-is/) covers what the dashboard can control on each. > [!TIP] > If you already have the hardware, this is decided for you and you do not need this page to get a screen running. A Screenly Player, a Sharp display that shipped with it, a Raspberry Pi, or a Scala player runs ScreenlyOS, and other hardware runs Screenly Anywhere. [Connect a screen](/docs/screens/setup/connect-a-screen/) asks what you have and gives you the steps for it. ## Which one to use Neither is something you buy. ScreenlyOS is a free operating system: our players and Sharp displays arrive with it installed, and you can put it on a Raspberry Pi, a Scala player, or other hardware once we have tested the model. Anywhere is a free app for hardware you already have. What you pay for either way is a [license](/docs/billing/licenses/) per screen, and the device itself if you need one. If you are buying a device for this, buy a [Screenly Player](/players/). It arrives running ScreenlyOS, which is the setup we can look after end to end, and it is the right answer for screens somewhere with strict IT rules: the section for IT and security teams at the bottom of this page is the one to send on. A [Raspberry Pi](/docs/screenlyos/hardware/raspberry-pi/) runs the same ScreenlyOS if you would rather put a player together yourself. If you already own a commercial display, a smart TV, an Android box, or a spare computer, Screenly Anywhere runs on it and there is no hardware to buy at all. You do not have to decide before you try it either. Anywhere runs [in a browser tab](/anywhere/) with nothing to buy and nothing to install, and you can move a screen onto ScreenlyOS when hardware arrives. Everything you build carries over, because it lives in the cloud rather than on the device. ## What is actually different Five things you will notice. ### Interruptions On ScreenlyOS nothing else runs on the device, so nothing appears on top of your content. On Anywhere, the device's own system is still doing its own job. It can install its own updates, restart itself, or put its own messages in front of what you are showing. ### Updates On ScreenlyOS we update the whole device, and a failed update undoes itself automatically. On Anywhere, the device manufacturer updates the system on their schedule, not ours. ### Apps On ScreenlyOS, apps run on the device itself. On some Anywhere platforms, apps are drawn on our servers and sent to the screen as pictures instead. ### What we can fix without visiting On ScreenlyOS we can restart the device, take a diagnostic screenshot, and see how it is doing. On Anywhere, we can only reach inside our own app, so how much we can help depends on the device. ### How long it keeps working Anywhere depends on the device's own system staying supported. A commercial display or a smart TV gets updates on its manufacturer's schedule, and when that schedule ends, the browser or app on it stops moving forward too. The panel can be in perfect condition and the screen still ages out, because the software on it did. ScreenlyOS separates those two things. Put a device running ScreenlyOS in front of that same display and the panel becomes only a display, which is the part that lasts. The software side is ours to keep current, so the life of a screen is no longer set by when its manufacturer loses interest. This is a common reason an estate ends up mixing the two. Anywhere gets a display working today, and a ScreenlyOS device keeps it working after the display's own software has stopped being updated. ## What offline actually means Both keep playing without an internet connection. Neither goes dark. Files you uploaded, such as images, video, and PDFs, play from the device's own storage. Schedules are saved on the device too, so your content still changes on time through an outage rather than freezing on whatever was last showing. What cannot survive is anything that has to fetch something. A web page, or an app pulling in live figures, is skipped while it cannot reach its source, and comes back into the rotation once the connection returns. > [!NOTE] > Losing internet is not the same as losing your whole network. A screen showing something from your own building, such as an internal dashboard, keeps working through an internet outage, because that content never had to leave the building. Screenly Anywhere also plays saved content offline. What it can do varies by platform, because Anywhere is a different build on each one rather than a single piece of software running everywhere. ## Comparing the two | | ScreenlyOS | Screenly Anywhere | |---|---|---| | Dashboard, content, playlists, labels | Identical | Identical | | Who looks after the device's system | We do | The device manufacturer | | Something appearing over your content | Cannot happen | Possible | | Where apps are drawn | On the device | On our servers, on some devices | | Display settings | Rotation, resolution, overscan, audio and video output | Rotation and object fit | | Remote reboot | Yes | No | | Diagnostic screenshots | Yes | No | | Health reporting | Power, temperature, storage, network checks | Basic | | Private network access | Yes, over [Tailscale](/docs/integrations/network/private-network-access/) | No | | Offline playback | Yes, content and schedules saved on the device | Yes, with limits that vary by platform | | How long it stays current | As long as we support it | Follows the device manufacturer's support window | ## What each Anywhere platform asks of you Anywhere is a different build on each platform rather than one piece of software running everywhere, so the work of getting a screen running unattended varies more than the playback does. | Platform | How Screenly gets on the device | The catch | |---|---|---| | [Samsung Tizen](/docs/anywhere/platforms/samsung-tizen/) | Installed from the display's own settings menu, using a custom app URL | Commercial displays only, because consumer sets do not allow custom app installation. The display also runs its own power schedule, independent of Screenly | | [LG webOS](/docs/anywhere/platforms/lg-webos/) | Opened in the television's built-in browser, nothing installed | Consumer sets only; webOS Signage on business displays is not supported yet. The sleep timer and auto-off both have to be changed | | [Android and Android TV](/docs/anywhere/platforms/android/) | Installed from the Google Play Store | Two device settings decide whether a screen comes back after a power cut, and both are off by default on many devices. Some consumer televisions block an app from starting on boot at all | | [Amazon Fire TV](/docs/anywhere/platforms/amazon-fire-tv/) | Installed from the Amazon Appstore | It is a television accessory, so it ships configured to sleep and to show a screensaver. Both have to be turned off | | [Amazon Signage Stick](/docs/anywhere/platforms/amazon-signage-stick/) | No app at all: you add the stick in Amazon's Signage console and choose Screenly as the CMS provider | Dedicated hardware you buy, so it is not a way to reuse something you own. In exchange there is nothing to un-configure, because it ships without sleep timers or screensavers | | [ChromeOS Flex](/docs/anywhere/platforms/chromeos-flex/) | Added by URL as an auto-launching kiosk app in the Google Admin Console | Needs Google Workspace with Chrome device management, and a policy and an enrollment before the first screen runs. Not the route for getting one screen up quickly | | [Browser](/docs/anywhere/platforms/browser/) | Open a web address, nothing installed | A general-purpose computer sleeps, shows a screensaver, and puts notifications over your content until you tell it not to. This is also how Windows runs Screenly, since there is no separate Windows app | Two of those are worth reading twice. Samsung and LG are inverses of each other, so check which line a model belongs to rather than assuming the pattern holds across brands. And a Fire TV Stick is not an Amazon Signage Stick: they are different products with different setup paths and very different amounts of configuration. ## What ScreenlyOS runs on | Hardware | Resolution | How it gets ScreenlyOS | |---|---|---| | [Screenly Player](/players/) | Up to 1080p | Preinstalled, arrives ready | | [Screenly Player Max](/players/) | Up to 4K | Preinstalled, arrives ready | | Sharp large-format displays | Depends on the panel | Preloaded by Sharp | | [Raspberry Pi](/docs/screenlyos/hardware/raspberry-pi/) 4 or 5 | Up to 1080p | You write the image to an SD card | | [Scala players](/docs/screenlyos/hardware/scala-players/) | Depends on the model | Image from support, and it replaces what is on the device | | Other amd64 hardware | Depends on the device | Once we have tested the model, so [get in touch](https://support.screenly.io/hc/en-us/requests/new) with what you have | ## For IT and security teams <details> <summary>Why the operating system is the real decision</summary> Digital signage is three layers, and most vendors own only one of them. | Layer | What it covers | Who usually owns it | |---|---|---| | Content | Authoring, scheduling, publishing | The signage software vendor | | Device management | Monitoring, control, provisioning, diagnostics | A separate vendor, or nobody | | Operating system and device | Boot, drivers, patching, hardening, lifecycle | Microsoft, Google, or the display manufacturer | The bottom two rows are where signage deployments get expensive. An operating system nobody is answerable for still needs patching, imaging, and a site visit when it misbehaves, and none of that appears in a signage budget. </details> <details> <summary>ScreenlyOS security and network capabilities</summary> ScreenlyOS is built on Ubuntu Core in partnership with Canonical, and hardened down to a single job. - The operating system and the playback software update together, over the air, cryptographically signed and transactional. A failed update rolls back on its own. - No remote login and no open ports. Encrypted storage where the hardware supports it. - 802.1X on wired and wireless, including static IP from the on-screen setup wizard. - Mutual TLS client certificates, so a screen can authenticate to internal services. - On hardware with a TPM, such as the Screenly Player Max, credentials for protected dashboards and internal services are stored in the chip rather than in ordinary storage. - Remote reboot, remote diagnostic screenshots, and CPU, memory, and network health from the dashboard. Signage players you already own can often run it too, which is the last row of the hardware table above. </details> <details> <summary>What Screenly Anywhere means for security</summary> We manage what happens inside our application, but not the system around it, so updates and security depend partly on the host. On some platforms apps render on our servers and are sent to the screen as images rather than running on the device. The platforms themselves, and what each one asks of you, are in the table above. </details> ## What we do not do Two limits worth knowing before you plan around them. Screenly is not device-agnostic. Anywhere exists for hardware we cannot own, and the platforms it covers differ from each other in what they can do. We also do not sell the layers separately. You cannot run ScreenlyOS underneath a different content management system, and there is no self-hosted version of the cloud. ## Next [Connect a screen](/docs/screens/setup/connect-a-screen/) asks what the screen runs on and gives you the steps for that device. --- # A screen's own page Source: https://www.screenly.io/docs/screens/overview/the-screen-page/ > The five tabs on a screen: Overview, Details, Settings, Now Playing, and Actions, and which one answers which question. Clicking a screen opens its own page, in five tabs. ## Overview The at-a-glance answer. A screenshot of what it is showing, a health summary, which device it is, where it is, and its local time. The local time card is worth more than it looks, because [schedules run in each screen's own time zone](/docs/scheduling/time/time-zones/). A screen showing the wrong content at the wrong hour is often a screen with the wrong time zone. ## Details The full report from the device: power, temperature, storage, network checks, and what the player is running. See [Health and diagnostics](/docs/screens/monitoring/health-and-diagnostics/). ## Settings Name, location, notes, labels, and everything about the display. See [Settings](/docs/screens/settings/). ## Now Playing The playlist items currently active on this screen, and a **Preview** button that plays them back in the browser. This is the page that answers "why is it showing that". If an item you expect is missing here, the problem is the schedule or the assignment rather than the device. ## Actions The one-off operations: enabling and disabling, privacy mode, reboot, certificates, transferring to another workspace, and deleting. See [Managing screens](/docs/screens/managing/). --- # The screens list Source: https://www.screenly.io/docs/screens/overview/the-screens-page/ > Reading the four status cards, the two status columns, and how search and sorting behave once there are more screens than fit on a page. **Screens** in the main navigation lists every screen in the workspace, with a thumbnail of what each is showing. ## The four cards Along the top are counts by state. Clicking one filters the list to those screens. | Card | Meaning | | --- | --- | | Online | Checking in normally | | Pending sync | Still downloading content or schedules | | Offline | Not checking in | | Disabled | Turned off in the dashboard, and not using a license | These overlap on purpose. A screen can be both online and pending sync, and it will be counted in both. ## The two status columns **Status** is about the connection. An online screen says **Online**. One that is not says when it was last seen instead, which is more useful than the word Offline: **Last seen 12 minutes ago** and **Last seen Mar 4, 9:15** are different problems. **Content status** is about whether the screen has what it should be showing. | Content status | Meaning | | --- | --- | | All content is up to date | Everything is displaying as expected | | Syncing content | Still downloading, and showing the last synced content meanwhile | | Updates pending | Offline, and will sync once it reconnects | The two are independent. A screen can be perfectly online and still showing yesterday's playlist because today's has not finished downloading, and that is a normal state a few minutes after you change something rather than a fault. ## Finding a screen The search box matches screen names and label names, so typing a label name lists everything carrying it. It does not match notes, locations, or content, so a room written in the notes field will not be found this way. Sorting by **Status** puts online screens first, then the rest ordered by how recently they were seen, which puts the screen that has been dark longest at the bottom. That is usually the one to look at first. Sorting by **Content status** groups everything that is not showing what it should, whether or not it is online. Every screen, playlist, and settings tab has its own URL, so a link to a specific screen's Details tab works when pasted into a ticket or a chat. ## Working on several at once **Edit**, at the top right, turns on checkboxes. Select the screens you want, choose **Labels**, and apply or remove labels across all of them in one go. **Finish** turns it off again. That is the fastest way to bring a batch of new screens into an existing playlist: label them all at once, and every playlist already targeting that label picks them up. See [Labels](/docs/labels/). --- # What a screen is Source: https://www.screenly.io/docs/screens/overview/what-a-screen-is/ > One display, one device, one license, one thing playing at a time. A screen is one display and the device driving it, managed as a single thing. It has a name, a location, settings, labels, and a health report of its own. What it plays comes from a [playlist](/docs/playlists/) assigned to it, which is how content reaches any screen. It also holds one [license](/docs/billing/licenses/) for as long as it is enabled. ## One device, one screen The count is devices, not panels. A player driving a four-panel video wall as one continuous picture is one screen and one license, because there is one device and one thing being shown. Two players in the same room are two screens even if they show the same playlist. ## Two kinds Every screen is managed from the same dashboard, appears in the same list, and takes the same playlists. What differs is how much of the device Screenly controls: on ScreenlyOS it is the whole device, so the dashboard can reboot it, screenshot it, and set resolution and overscan, and on Anywhere it is our app inside someone else's system, so it cannot. Neither is a lesser screen. Anywhere trades depth of control for running on hardware you already own, which is usually the right trade until it is not. [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) has the row-by-row comparison and what each platform asks of you. ## One thing at a time A screen shows one item at a time, and there is no way to split it into zones. Part of the reason is technical, and the bigger part is that multi-zone layouts do not work well: people look at a screen for a few seconds, and a layout divided into a video, a ticker, and a sidebar spends those seconds competing with itself. If you want several things on one display, build them into one piece of content, a single web page or app laid out the way you want, which the screen then shows as one item. ## Playback only A screen plays what is assigned to it. Touch input is not supported. --- # Pairing codes Source: https://www.screenly.io/docs/screens/reference/pairing-codes/ > What a pairing code is made of, which characters it never contains, how long it stays valid, and the reasons the dashboard refuses one. A pairing code is what a device shows on its display when it is running Screenly but does not belong to a workspace yet. Typing it into the dashboard is what turns the device into a screen. [Connect a screen](/docs/screens/setup/connect-a-screen/) covers the steps; this page is the facts about the code itself. ## What it is made of Eight lowercase characters, and it deliberately leaves out the ones people misread across a room. | Never in a code | Because it is mistaken for | | --- | --- | | `0` | the letter `o` | | `1` | the letters `l` and `i` | | `i` `l` | each other, and the digit `1` | | `m` `n` | each other | | `o` | the digit `0` | | `v` `w` | each other | So if a character looks like one of those, it is something else. Read it again rather than guessing. ## How long it lasts A code is good for 30 days. After that the device needs a fresh one, which it gets by being connected to the internet and left to pick one up. There is nothing to reset on the device, and rebooting it shows the current code. ## Why a code is refused - It has expired, or a character was misread. Reboot the device and read the current code again. - You are in the wrong workspace. You can belong to several, and a screen joins whichever one you are looking at when you enter the code. - You have no license free. Connecting a screen takes one [license](/docs/billing/licenses/) from your pool, and the dashboard says so when the pool is empty. --- # Advanced Source: https://www.screenly.io/docs/screens/settings/advanced/ > Two switches on ScreenlyOS screens: certificate verification, and exposing device metrics for your own monitoring. Both appear on ScreenlyOS screens, on Raspberry Pi based players and the Player Max. ## Verify SSL certificates Off by default. When on, the player refuses to load a web page whose certificate does not validate. Turn it on if your policy demands it and every page in your playlists has a valid certificate. Leave it off if a page you need is served with a self-signed or internal certificate, which is common on an intranet. The trade-off is real either way, so make it deliberately rather than by accident. ## Node Exporter Off by default. When on, the player exposes hardware and system metrics in Prometheus format, so your own monitoring can scrape them alongside everything else you run. Turn it on if you already run Prometheus and want screens in the same dashboards as your servers. If you do not, leave it off: the [Details tab](/docs/screens/monitoring/health-and-diagnostics/) already surfaces the things that go wrong, in plain language, with no setup. --- # Display Source: https://www.screenly.io/docs/screens/settings/display/ > Rotation, resolution, overscan and object fit: the settings that decide how your content sits on the panel. Settings live on the screen itself, on its **Settings** tab, and apply to that screen only. Save at the bottom. Which settings you see depends on the device: a Raspberry Pi based screen has the most, a Player Max has fewer because it needs fewer, and a Screenly Anywhere screen has only the two that a browser or an app can control. ## Rotate display Four values: **0°**, **90°**, **180°**, **270°**. Available on every kind of screen. Choose to match how the panel was physically mounted rather than what your content is. A portrait display mounted with its controls at the bottom usually wants 90°, and one mounted the other way wants 270°. Getting it wrong is common, and costs another round trip to the device. ## Resolution **Framebuffer width** and **framebuffer height**, on Raspberry Pi based screens, force the resolution the player renders at. Leave both empty unless you have a reason. Empty means the player takes the resolution the display reports, which is right almost always. Set them when a display reports something wrong, or when it reports nothing at all and the picture comes out at some default you did not want. ## Overscan A black border around your content, with the picture not quite reaching the edges of the panel, is overscan. It comes from the display rather than from Screenly, and it is a legacy of television rather than a fault. On Raspberry Pi based screens, **Disable overscan** is the control, and its wording is worth reading twice: setting it to **On** disables overscan, which is what removes the border. That is the setting almost everyone wants. If a border remains, set **Disable overscan** to **Off** to hand control back, then use **Overscan scale** to trim the picture until it fits. > [!NOTE] > The border often shows on images and web pages but not on video, because video reaches the display by a different route. A screen where only the video looks right still has an overscan problem. ## Object fit On Screenly Anywhere screens only, **Object fit** decides what happens when content and display disagree about shape. | Option | What it does | | --- | --- | | Original size | No scaling at all. May overflow the display, or leave space around itself | | Scale down | Shrinks content that is too big, leaves smaller content alone | | Scale up | Grows content to fit | | Fill | Covers the whole display, cropping whatever does not fit | | Stretch | Covers the whole display by distorting the aspect ratio | **Fill** is the usual choice for photography and video, where losing a little from the edges matters less than a black band. **Scale down** is the safer choice for anything with text or a layout, where cropping loses meaning. **Stretch** is almost never right. It makes everything slightly wrong in a way people notice without being able to say why. The fix that beats all five is producing content at the display's own aspect ratio, at which point the setting stops mattering. --- # HDMI settings Source: https://www.screenly.io/docs/screens/settings/hdmi/ > The low-level HDMI controls on Raspberry Pi based screens: what each one is for, and why you should not touch them unless a display is misbehaving. > [!IMPORTANT] > Leave these alone unless you have a display problem you cannot solve any other way. Every one of them defaults to letting the player and the display negotiate, which is right nearly always. The commonest way to break a working screen is to set one of these to a value the display cannot do. These appear on Raspberry Pi based screens when video output is HDMI. ## HDMI group and mode **HDMI group** decides which set of resolutions the player picks from. **EDID** is the default and means "ask the display what it supports". **CEA** is the television set of modes, **DMT** the computer monitor set. Choosing either of the latter then enables **HDMI mode**, a numbered list within it: mode 16 is 1080p at 60 Hz in CEA, mode 82 is 1080p at 60 Hz in DMT. Set these only when a display reports its capabilities wrongly, which shows up as a picture at the wrong resolution or no picture at all. ## HDMI drive **Auto**, **HDMI mode**, or **DVI mode**. DVI mode sends no audio, by design. If a screen has a picture but no sound and everything else looks right, this is the setting to check. ## HDMI boost A signal strength from **0** to **7**. Raising it can rescue a picture that breaks up or drops out over a long or poor-quality cable. Try a shorter or better cable first. Boost compensates for a bad run; it does not fix one. ## Pixel encoding **Auto**, or one of four explicit combinations of RGB and YCbCr at limited or full range. The symptom that points here is a picture where blacks look grey and whites look dull, or the opposite, where dark detail is crushed to solid black. That is a range mismatch between player and display. Forcing **RGB full (0-255)** or **RGB limited (16-235)** to match what the display expects fixes it. ## Force hotplug Makes the player output video whether or not it detects a display. Turn it on when a screen shows nothing because the display was powered on after the player, or because a signal extender or matrix switch between them hides the display from the player. ## HDMI timings A raw timing string for a display that fits none of the standard modes. If you need this you already know the values, and if you do not have them from the display's manufacturer, this is not the setting to experiment with. --- # Video and audio output Source: https://www.screenly.io/docs/screens/settings/video-and-audio-output/ > Sending video over HDMI or composite, and sound over HDMI or the 3.5 mm jack. ## Video output On Raspberry Pi based screens, **Video output** chooses between **HDMI** and **Composite/RCA**. HDMI is the default and what you want. Composite exists for older displays that have no digital input at all, and choosing it also asks for a **Mode**: **PAL** or **NTSC**, matching the region the display was built for. Composite is standard definition, so expect it to look like standard definition. Selecting composite switches audio to the 3.5 mm jack at the same time, since composite carries no sound. ## Audio output **Audio output** chooses between **HDMI** and the **3.5 mm jack**, on Raspberry Pi based screens and on the Player Max. HDMI is the default, and it is right whenever the display has speakers you want to use. Choose the jack when sound goes to a separate amplifier, a soundbar, or ceiling speakers. The setting is not available when video output is composite, because composite has already forced the jack. ## When there is no sound Check these in order, because the last one catches most cases. 1. The content has audio at all. Video uploaded from a silent source stays silent. 2. This setting matches where the speakers actually are. 3. The display's own volume, and its mute. A display muted at the panel produces exactly the same symptom as a misconfigured player. ## HDMI carrying no sound If a Raspberry Pi based screen shows a picture over HDMI but plays nothing, look at **HDMI drive** in the [HDMI settings](/docs/screens/settings/hdmi/). Set to DVI mode, it deliberately sends no audio. --- # After connecting Source: https://www.screenly.io/docs/screens/setup/after-connecting/ > What a healthy new screen looks like in the dashboard, what happens when its connection drops, and what to check when something looks wrong. Your screen is connected. Here is what normal looks like, and what to check if it does not look like that. ## Confirm it is working Open **Screens**. The new screen should show as online, and as in sync once it has downloaded what you assigned it. Pending sync is not an error. It means the screen is still downloading, and video takes longer than images. It keeps playing whatever it had before until it has everything. To see what is on the display without walking over to it, request a screenshot from the screen's page. On ScreenlyOS the screenshot is captured from the device's own display output, so it shows exactly what is on the screen. On Screenly Anywhere it shows what our app is drawing rather than the whole device. > [!IMPORTANT] > Remote screenshots can be turned off per device with Privacy Mode, for screens showing sensitive information. If screenshots are unavailable on a device, check whether Privacy Mode is on. ## What happens when the connection drops The screen keeps playing. Files you uploaded and the schedule are held on the device, so content keeps playing and scheduled changes still happen on time. What stops is anything that has to fetch something. A web page, or an app pulling live figures, is skipped while it cannot reach its source, and returns once the connection is back. Losing internet is not the same as losing your whole network. A screen showing something from your own building, such as an internal dashboard, keeps working through an internet outage, because that content never had to leave the building. On Anywhere, how much survives an outage varies by platform, because Anywhere is a different build on each one. Check the behavior on the platform you are deploying before you rely on it. ## If something looks wrong [Common setup issues](/docs/screens/setup/setup-issues/) covers a display showing nothing, a screen that never comes online, content that never arrives, and content that looks wrong on the display, with what to check for each. ## On ScreenlyOS There is nothing to patch on the device, nothing to log into, no antivirus to install, no reboot schedule to maintain, and no imaging process to keep current. Every night between 3am and 5am local time the device checks for a new version and installs it, and a failed update undoes itself. If a device stops behaving, remote reboot and diagnostics come first, and a site visit is the last resort rather than the first. ## On Screenly Anywhere The device is still running its own system, so two things are worth doing before you mount it somewhere awkward to reach. Turn off its sleep timer, screensaver, auto-off schedule, and power-saving mode. The device's own power settings are the single most common cause of a blank Anywhere screen, and a television in particular will often power itself down after a few hours with no remote input. Each platform guide has a page on it. Expect the host to interrupt occasionally. It can install its own updates and restart, or show its own messages over your content. For most screens that is fine. For a screen where an unexpected restart would be a real problem, [ScreenlyOS](/docs/screenlyos/) removes the possibility, because there the device does nothing else. ## Next The screen has nothing to play until a playlist reaches it. [Upload your first content](/docs/get-started/first-screen/upload-your-first-content/) is the next step of the walkthrough, or go straight to [Playlists](/docs/playlists/) if you have content already. --- # Connect a screen Source: https://www.screenly.io/docs/screens/setup/connect-a-screen/ > Get Screenly running on your device, read the code it shows, enter the code in your dashboard, and know what to check if it will not connect. Connecting a screen is how you tell Screenly that a display is yours. It takes about a minute once the device is running, and it works the same way whatever the hardware is. ## How it works 1. You get Screenly running on the device. This is the only part that depends on what the device is, and the picker below gives you the steps for yours. 2. The device shows a short code on the display. We call it a pairing code. 3. You type that code into your dashboard. The display stops showing the code, and the screen appears in your list, ready to be given something to play. ## Before you start Have the device connected to a display and on the network, and have your dashboard open on a computer or phone, because the code shown on the screen has to be typed into the dashboard. If you have no device yet, a second browser tab on this computer is one. If you do not have a workspace yet, [sign up](https://login.screenlyapp.com/sign-up) first: it takes a minute and the trial needs no card. ## Get Screenly running on your device Pick what the screen runs on, or that you have nothing yet, and you get only the steps for that. Every route ends with a code on the display. **What is going to drive the screen?** The display itself, whatever is plugged into it, or nothing yet. Pick what you already have, or what you are about to buy. ### Nothing yet, or just trying it No hardware to point at. A browser tab on this computer becomes a screen. *Screenly Anywhere. About 2 minutes.* A browser tab is a screen. You can do the whole walkthrough without buying anything. 1. Open a second browser tab and go to [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com). 2. Wait for the pairing code to appear in that tab. Everything you build carries over to real players when they arrive, because it lives in the cloud rather than on the device. - [Digital signage in a web browser](/docs/anywhere/platforms/browser/overview/digital-signage-in-a-browser/) - [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) ### A Screenly player Screenly Player, Player Max, or a Sharp display that shipped with Screenly on it. *ScreenlyOS. About 5 minutes.* It arrives ready. There is nothing to install and no image to write. 1. Connect the player to the display over HDMI, and to the network by cable or Wi-Fi. On a Sharp display there is nothing to connect, because the player is inside the panel. 2. Power it on. On Wi-Fi the player asks for the network first, which you can answer with a USB keyboard or with a `network.yaml` from the [Network Config Generator](/os/network-config-generator/) on a USB drive. 3. Wait for the pairing code to appear on the display. - [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) - [Screenly players](/docs/screenly-players/) ### A Raspberry Pi A Pi 4 or Pi 5, either one you already have or one bought for this. *ScreenlyOS. About 20 minutes, most of it writing the card.* ScreenlyOS goes on the SD card, and the Pi becomes a player and nothing else. 1. Install [Raspberry Pi Imager](https://www.raspberrypi.org/software/) on your computer and put the Pi's microSD card in a card reader. 2. In Imager, pick your model under **Choose Device**, then **Choose OS** > **Freemium and Paid-For OS** > **Digital Signage OS** > **ScreenlyOS**. 3. Write the image, eject the card safely, and put it back in the Pi. 4. Connect the Pi to the display over HDMI, power it on, and give first boot a few minutes. Use a good quality SD card. A partly written or failing card is the most common reason a Pi never starts. - [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/) - [Supported boards](/docs/screenlyos/hardware/raspberry-pi/reference/supported-boards/) ### A Scala player An x86 Scala media player you already have mounted. *ScreenlyOS. Starts with a conversation.* ScreenlyOS installs onto Scala players directly, so a fleet that is already mounted keeps its hardware and swaps only the software. 1. [Contact support](https://support.screenly.io/hc/en-us/requests/new) with the models you have. The ScreenlyOS image for Scala players is not a public download; we confirm which models are supported and send you the image and the steps for them. 2. Write the image to the player and boot it. Installing ScreenlyOS replaces what is on the device, including any content stored on it and its Scala configuration. 3. Wait for the pairing code to appear on the display. Confirm you can rebuild the schedule in Screenly before you begin, because nothing held only on the player survives the install. - [Scala players](/docs/screenlyos/hardware/scala-players/) - [Supported models](/docs/screenlyos/hardware/scala-players/reference/supported-models/) - [Get the image](/docs/screenlyos/hardware/scala-players/guides/get-the-image/) ### A commercial display or smart TV A panel with a computer built in, running the content itself with nothing behind it. **Which panel is it?** Samsung and LG are inverses of each other here, so check which line your model belongs to rather than assuming. Anything else with Android built in takes the Android route. #### Samsung commercial display The Smart Signage Platform range, usually written SSSP. *Screenly Anywhere. About 10 minutes.* Screenly installs onto the panel from its own settings menu, so no player gets mounted behind it. 1. On the display, go to **Settings** > **System** > **Play Via** > **Custom App**. 2. Go to **App Management** > **Install Custom App**, enter `https://tizen.srly.io`, and press **Go**. 3. Wait for the pairing code to appear. Consumer Samsung televisions do not allow custom app installation. For those, use a stick or a box over HDMI instead. - [Install the app](/docs/anywhere/platforms/samsung-tizen/guides/install-the-app/) - [Supported models](/docs/anywhere/platforms/samsung-tizen/overview/supported-models/) #### LG webOS television A consumer LG set with the Web Browser app. *Screenly Anywhere. About 5 minutes.* The television's own browser runs Screenly, so there is nothing to install. 1. On the TV, open the **Web Browser** app. 2. Go to [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com). 3. Wait for the pairing code to appear. LG support covers consumer sets. webOS Signage on LG business displays is not supported yet. - [Open it and pair the screen](/docs/anywhere/platforms/lg-webos/guides/open-it/) - [Keep it running unattended](/docs/anywhere/platforms/lg-webos/guides/keep-it-running/) #### Android smart TV or Android display A television or commercial panel running Android or Android TV. *Screenly Anywhere. About 10 minutes.* The app comes from the Play Store on the panel itself, so nothing is plugged in behind it. 1. On the display, open the Google Play Store and search for Screenly. 2. Install the app and open it. 3. Wait for the pairing code to appear. The app launches itself on boot, but two device settings have to allow it first, and both are off on many devices. The display also runs its own power schedule, independent of Screenly. - [Install the app](/docs/anywhere/platforms/android/guides/install-the-app/) - [Launch the app automatically on power on](/docs/anywhere/platforms/android/guides/auto-launch-on-power-on/) #### Another panel, or one with only HDMI A panel that cannot install apps of its own. *Your choice. Depends on what you plug in.* Then the panel is only a display, which is the part that lasts, and something else drives it over HDMI. 1. For a permanent installation, use a [Screenly Player](/players/), which runs ScreenlyOS and is the setup we can look after end to end. 2. For hardware you already own, a Fire TV Stick or an Android box runs Screenly Anywhere over HDMI. 3. Either way, the device shows a pairing code once it is running. - [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) - [Screenly players](/docs/screenly-players/) ### A Fire TV or Android box A streaming stick or set-top box on the display's HDMI port. **Which kind of device?** #### Amazon Fire TV A Fire TV Stick or a Fire TV box. *Screenly Anywhere. About 10 minutes.* The app comes from the Amazon Appstore on the device itself. 1. On the device, open the Amazon Appstore and search for Screenly. 2. Install the app and open it. 3. Wait for the pairing code to appear. Fire TV devices sleep by default, and that is the usual reason a Fire TV screen goes dark. - [Install the app](/docs/anywhere/platforms/amazon-fire-tv/guides/install-the-app/) - [Keep it running unattended](/docs/anywhere/platforms/amazon-fire-tv/guides/keep-it-running/) #### Android or Android TV An Android box or an Android TV streaming device. *Screenly Anywhere. About 10 minutes.* The app comes from the Play Store, and the device keeps its own system. 1. On the device, open the Google Play Store and search for Screenly. 2. Install the app and open it. 3. Wait for the pairing code to appear. The app launches itself on boot, but two device settings have to allow it first, and both are off on many devices. - [Install the app](/docs/anywhere/platforms/android/guides/install-the-app/) - [Launch the app automatically on power on](/docs/anywhere/platforms/android/guides/auto-launch-on-power-on/) ### An Amazon Signage Stick Amazon's purpose-built signage stick, paired from Amazon's console rather than by installing an app. *Screenly Anywhere. About 10 minutes.* Screenly is selected as the CMS provider in Amazon's console rather than installed by hand. 1. Connect the stick to the display over HDMI and power it on. 2. Complete the on-screen setup, choosing language and network. 3. In the [Amazon Signage console](https://console.signage.amazon.com/), add the stick and select Screenly as the CMS provider. - [Pair the stick](/docs/anywhere/platforms/amazon-signage-stick/guides/pair-the-stick/) ### A computer I already have A PC, a Mac, a mini-PC behind the display, or a Chromebook. **How do you want to run it?** #### Open it in a browser Windows, macOS, Linux, or ChromeOS. Nothing installed. *Screenly Anywhere. About 2 minutes.* This is the Windows route as well. There is no separate Windows app, because Windows uses a browser in kiosk mode. 1. On the device you want to use as a screen, open a browser and go to [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com). 2. Wait for the pairing code to appear. A general-purpose computer behaves like one until you tell it not to. It sleeps, it shows a screensaver, and it puts notifications over your content. - [Open it and pair the screen](/docs/anywhere/platforms/browser/guides/open-it/) - [Run it unattended](/docs/anywhere/platforms/browser/guides/run-unattended/) #### As a managed ChromeOS Flex kiosk A fleet of repurposed machines, enrolled through the Google Admin Console. *Screenly Anywhere. About 20 minutes for the first device.* Set the policy before enrolling the device, so it restarts straight into Screenly. 1. In the Google Admin Console, go to **Devices** > **Chrome** > **Apps and Extensions** > **Kiosks**, and add Screenly Anywhere by URL. 2. Set it as the auto-launch kiosk app for that policy. 3. Install ChromeOS Flex on the device, enrolled to the same organizational unit. 4. The device restarts into Screenly Anywhere and shows a pairing code. - [Deploy the kiosk app](/docs/anywhere/platforms/chromeos-flex/guides/deploy-the-kiosk-app/) #### Wipe it and run ScreenlyOS Turn the machine into a player that does nothing else. *ScreenlyOS. Starts with a conversation.* ScreenlyOS runs on other amd64 hardware, including signage players you already own, once we have tested the specific model. 1. [Contact support](https://support.screenly.io/hc/en-us/requests/new) and tell us the make and model. 2. We confirm whether that model is supported, and send you the image and the steps for it. 3. Write the image and boot the device, and it shows a pairing code. Installing ScreenlyOS replaces what is on the device. Anything held only on that machine is gone once the install starts. - [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) - [Scala players](/docs/screenlyos/hardware/scala-players/) ## Enter the code in your dashboard This half is the same for every device. 1. Open **Screens**. 2. Click **Connect screen**. On an empty Screens page the same button sits in the middle. 3. Type the code shown on the display. 4. Give the screen a name you would recognize in a list of hundreds, such as the room or the site, rather than "Screen 1". 5. Click **Connect**. The screen appears in your list within a minute or two and the display stops showing the code. It has nothing to play yet, which is expected: content reaches a screen through a playlist, and [Set up your first screen](/docs/get-started/first-screen/upload-your-first-content/) takes you through that. ## About the code A code is eight lowercase characters, good for 30 days, and it leaves out the characters people misread across a room. [Pairing codes](/docs/screens/reference/pairing-codes/) lists them, and every reason the dashboard refuses a code. ## If it will not connect A rejected code has either expired or had a character misread, and rebooting the device shows a current one. No code on the display means the device is not online, or it has not finished its first round of updates. Give a new device fifteen minutes before deciding something is wrong. Nothing on the display at all is a display or a cable problem before it is a Screenly problem. [Setup issues](/docs/screens/setup/setup-issues/) covers the usual causes, including captive portals and a device clock wrong enough to break the connection. --- # Name, location, and notes Source: https://www.screenly.io/docs/screens/setup/name-location-and-notes/ > The three text fields on a screen, and why the ones that look like paperwork are the ones that save a site visit. Name and location are both required. Notes are optional and worth filling in anyway. ## Name The name is how the screen appears everywhere: the list, search, alerts, and the label created when it was paired. Name for where the screen is, not for what it shows. What it shows changes; where it is does not. `Frankfurt reception left` survives a rebrand. `Q3 campaign` does not survive Q4. Consistency matters more than cleverness. If names share a shape, `Site, room, position`, then searching for a site lists everything in it. ## Location An address, chosen from suggestions as you type, which also stores coordinates. It matters for two reasons beyond record-keeping: it is what tells you where a screen physically is when someone has to go to it, and it is how the screen's time zone is understood when you are reading its local time against a schedule. ## Notes A free text field, visible to everyone in the workspace. This is for the things that are true of the physical installation and recorded nowhere else. Which cupboard the player is in. That the socket is switched at the wall. Who has the key. Which display input it is on. The test is whether it would save someone a phone call at the site. If so, it belongs here. --- # Common setup issues Source: https://www.screenly.io/docs/screens/setup/setup-issues/ > Fixes for a screen that shows nothing, a code that will not work, a screen that never comes online, content that never arrives, and a display that looks wrong. Almost every problem with a new screen is one of a handful of things. Find the one that matches what you are seeing. ## The screen shows nothing at all > [!TIP] > On a Screenly Player, the small indicator lights tell you whether the problem is power, storage, or network, which saves guessing. 1. Check the display is set to the right input. An HDMI socket showing nothing looks exactly like a device that has failed to start. 2. Give it longer. The first start-up does more work than later ones, and on a Raspberry Pi it can take a few minutes. 3. Check the cable at both ends, and that the device has power. 4. Check the device can reach the internet. It cannot show a pairing code without one. 5. On a Raspberry Pi, re-seat the SD card and check the image copied across completely. A half-written card is a common cause. > [!CAUTION] > Re-copying the SD card wipes the device, including any content it had downloaded and its connection to your workspace. You will need to connect it again with a new pairing code, and the old screen will stay in your list until you remove it. ## The pairing code will not work A code is good for 30 days, and [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, which is the first thing to check when one is refused. Two more things to check: 1. You are in the right workspace. You can belong to several, and a screen joins whichever one you are currently looking at. 2. You have a license free. If you have used them all, the code is refused for that reason instead, and the dashboard tells you so. ## The screen connected but never comes online The screen shows up in your list but never reports back. This is nearly always the internet connection. Things to check, in order: 1. Is it actually on the network? Wi-Fi credentials are the most common culprit. 2. Is it on a guest network with a sign-in page, the kind that shows a "click here to accept" page in a browser? A screen cannot click through one of those, so put it on a network that does not use one. 3. Is the network restricted? Many offices only allow approved traffic out. This is the most common cause in larger organizations, and it is a quick fix for whoever runs your network. > [!IMPORTANT] > If you need to hand this to your IT team, everything they need is in [IT requirements](/docs/it-requirements/). The short version: screens only make outgoing connections, and nothing needs to be opened up. If you are the one fixing the network, [IT requirements](/docs/it-requirements/) has the hostnames and ports to allow and the two less obvious causes: a captive portal that lets a device join but never reach the internet, and a clock so wrong the device cannot complete a TLS handshake. ## The screen is online but shows nothing new The screen looks healthy but your content has not appeared. First, check whether it says out of sync. If it does, it is still downloading, and video takes longer than images. Wait and watch for it to change. If it says in sync but is showing the wrong thing, the playlist is not reaching it. Nine times out of ten this is a label that does not match: 1. Open the playlist and look at the labels on its **Screens** tab. 2. Open the screen and look at its labels. 3. Check that at least one label appears in both, spelled exactly the same way. "Warehouse" and "warehouse" are not the same label. Also check the playlist's schedule. A playlist set to weekday office hours will not play on a Sunday, and that looks exactly like a broken assignment. > [!NOTE] > If another playlist is set to priority and its schedule is currently running, it takes over the screen and hides everything else. That is what priority is for, and it is easy to forget you turned it on. ## The content looks wrong on screen ### Black bars down the sides or across the top Your content is a different shape from the display. Either re-export it to match, or change the screen's scaling setting. ### Sideways or upside down Set the screen's orientation to match how the display is actually mounted. ### Blurry The content is a lower resolution than the display. For 4K you need both a device capable of it and a Business plan or higher. [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) lists which devices reach 4K. ### Edges cut off The display is zooming in slightly, a setting usually called picture size, screen fit, or overscan. This is on the display itself, so check there before changing anything in Screenly. ## Still stuck [Contact support](https://support.screenly.io/hc/en-us/requests/new). You can collect the device's logs from the dashboard without visiting it, and sending those along usually turns a long back-and-forth into a single reply. --- # Adding content Source: https://www.screenly.io/docs/content/adding/ > Four ways in: upload a file, add a URL, point at a stream, or install an app. **New content** has three tabs: **Upload**, **Web**, and **Streaming**. An app arrives by a different route, through the [App store or the CLI](/docs/content/adding/install-an-app/), and lives under **Apps**, not in **Content**. --- # Add a live stream Source: https://www.screenly.io/docs/content/adding/add-a-stream/ > RTSP from a camera or encoder, and local capture from a device plugged into the player. Neither is cached, so plan for the source dropping. Choose **New content**, then the **Streaming** tab. ## RTSP streams RTSP is what most IP cameras, network video recorders, and broadcast encoders output. A production line camera for a floor manager, an entrance feed in an operations room, a live broadcast source. Enter the stream URL. It usually looks like this, and your camera's own admin interface will tell you the exact form: ```text rtsp://192.168.1.100/stream ``` Credentials, if the camera needs them, go in the URL: ```text rtsp://username:password@192.168.1.100/stream ``` The player has to be able to reach the source, which for a camera on your own network means being on that network. ## Local capture For a device physically connected to the player, `v4l2://` reads from a capture input rather than the network. A laptop presenting in a meeting room, a camera pointed at a work area, a connected monitoring device. The signal goes from cable to display without touching the network: no URL to configure and no dependency on anything outside the room. ## Neither one is cached A stream is not stored on the device. If the source becomes unreachable, there is no local copy to fall back on and the screen has nothing to show for that slot. Put static content in the same playlist alongside the stream. The screen then keeps showing something when the feed drops, instead of going dark, and the rotation carries on. ## Duration A stream takes a duration like any other playlist item, since a live feed has no natural end. See [How long things play](/docs/content/overview/how-long-things-play/). --- # Add a URL Source: https://www.screenly.io/docs/content/adding/add-a-url/ > One field, two outcomes: a URL serving a file is fetched into your library, a URL serving a page becomes a live web page. Choose **New content**, then the **Web** tab, and paste a URL. ## What Screenly does with it It looks at what the URL actually serves. **A page** becomes a live web page in your library. Nothing is stored: the screen loads it fresh each time it plays. That is the right outcome for a dashboard, an intranet page, or anything that should always be current. See [Web pages](/docs/content/web-pages/). **A file**, if the URL points directly at a supported image, video, or PDF, is fetched and stored in your library like an upload. This saves downloading it to your machine and uploading it again. The distinction is what the server returns, not what the URL looks like. A link to a page *containing* an image gives you the page, not the image. ## When a URL will not verify If we cannot reach the URL, you get **Content could not be verified** and an **Add anyway** option. That is not always an error. A page on your own network is unreachable from our servers but perfectly reachable from the screen, which is on that network. Add it anyway and it works. It is an error when the URL is simply wrong, or the page needs a login. For the second case, see [Authenticated pages](/docs/content/web-pages/authenticated-pages/). ## URLs behind a login Fetching a file from a URL happens once, at the moment you add it, using nothing but the URL. If the file is behind authentication the fetch fails. Download it and upload it directly, or use the API. ## YouTube and Vimeo Paste the video page URL. Screenly handles the playback rather than downloading the file. --- # Install an app Source: https://www.screenly.io/docs/content/adding/install-an-app/ > Pick one from the App store, or deploy one you built with the CLI. Either way it appears under Apps, not in Content. There are two ways to add an app. The usual one is the **App store**. The other is the [CLI](/docs/developers/cli/), which is the advanced route for an app you have built yourself. Neither one goes through **New content**. The app appears under **Apps**. It does not appear in **Content** with your images and videos. ## From the App store Open **Apps** and go to the **App store**. Browse by category, or search. You can also browse the [full catalogue on our site](/apps/) before signing in. 1. Open the app and choose **Install**. 2. Give it a name. This is what you will look for under **Apps** later, so name it for what it shows rather than what it is: `Frankfurt weather` beats `Weather`. 3. Fill in its settings. What you see depends on the app: a location for weather, a dashboard for a business intelligence tool, sometimes nothing at all. 4. Choose **Install** again. It appears under **Apps**. ## From the CLI This is the advanced route. If you have built an app yourself, the CLI deploys it to your workspace, and an instance of it appears under **Apps**, the same as one from the store. ```bash screenly edge-app deploy ``` See [Build and deploy](/docs/developers/edge-apps/guides/build-and-deploy/) for the full loop, and [Build your own](/docs/apps/extending/build-your-own/) for what an app is made of. ## What happens next Add it to a [playlist](/docs/playlists/building/add-and-order-content/), give it a duration, and assign the playlist to screens. Give it a generous duration. An app fetching live data has to load before it can show anything, so a dashboard on screen for ten seconds may spend most of that loading. Thirty or forty seconds is more realistic. See [How long things play](/docs/content/overview/how-long-things-play/). Naming, settings, and secrets are covered in [Setting up an app](/docs/apps/setting-up/). How an app behaves once it is in a playlist is in [Apps](/docs/content/types/apps/). --- # Upload files Source: https://www.screenly.io/docs/content/adding/upload-files/ > Drag files in or pick them, upload straight into a folder, and what happens while a file is processing. ## Getting files in - Drag one or more files onto the content library. They land wherever you drop them, in the root of the library or in an open folder. - Choose **New content**, stay on the **Upload** tab, and browse. You can select several files at once. - Upload programmatically. The CLI and API upload the same way the dashboard does, which is the route for a bulk import or a pipeline. See [Developers](/docs/developers/). ## While it uploads Each file in a batch shows its own progress, and you can cancel one without affecting the others. ## After it uploads Screenly validates the file and processes it, which for video means re-encoding it centrally so it plays across a mixed fleet. See [Supported formats](/docs/content/overview/supported-content/). An image is ready almost immediately. A large video takes a while. You can rename a video while it is still processing rather than waiting. If processing fails, the notification bell names the specific item and links to it, rather than leaving you to work out which of thirty uploads did not make it. ## Uploading into a folder Open the folder first, then drop files into it. That saves moving them afterwards, which matters more than it sounds once a library is large. See [Folders](/docs/content/library/organizing-with-folders/). --- # What the library tells you Source: https://www.screenly.io/docs/content/library/asset-details/ > Dimensions, duration, resource type, status, and the URL, read from the file itself so nobody has to type them. Each item carries details pulled from the file when it was added. Nothing here is entered by hand. | Field | What it tells you | | --- | --- | | Dimensions | Pixel size, for images and video | | Duration | Length, for video and audio | | Resource type | What Screenly decided this is | | Status | Whether it finished processing | | URL | Where a web page or stream points | ## Why look before scheduling Dimensions catch the mistakes that are obvious on a wall and invisible on a laptop. A portrait image heading for a landscape screen, or a 640-pixel-wide graphic destined for a 4K display, is easier to spot here than after someone photographs the result. Duration is how you time a rotation. If a playlist has to fit a known window, the video lengths in the library add up without opening each file. Status is the first thing to check when an item will not appear in a playlist. Content that has not finished processing cannot be added yet, and a video showing no duration at all never finished. --- # Deleting content Source: https://www.screenly.io/docs/content/library/deleting-content/ > Deleting from the library pulls an item from every playlist at once. Removing it from a playlist does not. ## Two different actions **Delete from the library** removes the item everywhere: out of every playlist it belonged to, off every screen showing it. One action, whole network. **Remove from a playlist** takes it out of that rotation only. The item stays in the library and keeps playing in any other playlist it is part of. Use the first when the content should be gone. Use the second when it should stop on some screens and continue on others. ## How to delete From **Content**, open the menu next to the item, choose **Delete**, and confirm. Screens stop showing it on their next sync, which is usually within a few minutes. There is no need to visit each playlist first. ## What deleting does not do It does not remove the file from devices that already downloaded it. The player marks it as no longer needed and clears it during its next storage cleanup, which happens when space runs low rather than on a schedule. See [Where content lives](/docs/content/overview/where-content-lives/). It also does not give you the file back. See [Getting your content back](/docs/content/library/getting-your-content-back/). > [!IMPORTANT] > Deletion cannot be undone, and we cannot restore a deleted file for you. Keep your originals in your own storage. --- # Getting your content back Source: https://www.screenly.io/docs/content/library/getting-your-content-back/ > Every asset carries a source_url you can fetch yourself with the CLI or the API. Keep your originals in your own storage. Screenly is a distribution layer, not an archive. A file you delete cannot be recovered by support. Keep your originals in your own storage: a file server, cloud storage, or whatever asset management your organization already runs. ## Retrieving what is there Every asset has a `source_url` pointing at the original file, and both the CLI and the API return it. With the [CLI](/docs/developers/cli/): ```bash screenly asset list --json | jq -r '.[] | {title, source_url}' ``` With the [API](/docs/developers/api/), the assets endpoint returns the same field. For a handful of files, fetch them by hand. For a library, script it. ## Before you cancel Do this while the subscription is still active. Take the export first, then cancel. See [Managing your subscription](/docs/billing/managing/). --- # Folders Source: https://www.screenly.io/docs/content/library/organizing-with-folders/ > Group content by campaign, site, or team. Folders organize the library and have no effect on what plays. ## Creating and using one Choose **New folder**, give it a name, and it appears in the library ready for content. Move items in by dragging them, or by selecting several with the checkboxes and choosing **Move content**. Uploading straight into an open folder saves a step. Rename and delete from the menu next to the folder name. > [!NOTE] > Deleting a folder does not delete what is inside it. The content moves back to the root of the library. To remove content, delete the content. See [Deleting content](/docs/content/library/deleting-content/). ## Folders do not affect playback This is the thing worth being clear about. A folder is a way to find things, nothing more. Content in a folder goes into playlists exactly like content in the root, and a screen has no idea which folder anything came from. So folders cannot be assigned to screens, and there is no such thing as playing a folder. That is what [playlists](/docs/playlists/) and [labels](/docs/labels/) are for. ## Choosing a structure Group by whatever you actually search by. Site and team hold up well. Campaign holds up while the campaign runs and then leaves you with a folder nobody dares delete. If you find yourself wanting one item in two folders, that is a sign the structure is fighting you, and search will serve you better than more folders. --- # How long things play Source: https://www.screenly.io/docs/content/overview/how-long-things-play/ > Each playlist item has a duration. Images and pages default to ten seconds; video and audio play for their own length. Duration is set per item, in the playlist rather than on the content, so the same image can run for five seconds in one playlist and thirty in another. ## Defaults and limits An item defaults to **10 seconds**. You can set anything from 1 second to 24 hours. Video and audio are the exceptions. They play for their own length, and the duration cannot be edited. If a video shows no duration at all, the upload did not finish processing, so delete it and upload it again. ## Choosing a duration Ten seconds suits an image someone glances at in passing. A dashboard or an [app](/docs/content/types/apps/) needs longer, both to be read and to finish loading. A heavy dashboard may need 30 or 40 seconds before it has even rendered, and a page that is still loading when its turn ends never gets seen at all. If a web page or an app looks blank on screen, try giving it more time before assuming it is broken. Longer is not automatically better. A rotation where each item sits for a minute is a rotation most people never see the end of. --- # Supported formats Source: https://www.screenly.io/docs/content/overview/supported-content/ > Every image, video and audio format Screenly accepts, what it does to them on upload, what it rejects, and apps, which do not come from a file. Upload what you have. Screenly checks the file and, for video, re-encodes it so it plays on every kind of device in your fleet. ## Images JPG and JPEG, PNG, BMP, TIFF, WebP, HEIC, and GIF. > [!NOTE] > Animated GIFs do not animate as uploaded images; only the first frame shows. To play one, put it on a web page and add that page instead. ## Video MP4, MKV, MOV, AVI, MPG and MPEG, WebM, OGG, FLV, M4V, WMV, and ASF. YouTube and Vimeo URLs work as content too: paste the video URL rather than downloading the file. ## Audio MP3 at up to 320 kbps, and FLAC. ## Documents PDF only. See [PDFs](/docs/content/types/pdfs/). Word, Excel, PowerPoint, and their Google and Apple equivalents are rejected on upload. Export them first; [Presentations and documents](/docs/content/types/presentations-and-documents/) and [Spreadsheets](/docs/content/types/spreadsheets/) cover how, and which export format suits which case. ## Web pages and streams Any URL for a web page. Stream URLs beginning `rtsp://`, `rtp://`, or `v4l2://`. ## Apps Apps are a content type that does not come from a file. You install one from the App store, or deploy one with the CLI, and it appears under **Apps**; there is nothing to upload into **Content**. Many play live from a source, though that depends on the app. See [Apps](/docs/content/types/apps/). ## What happens on upload The file is validated, and video is re-encoded centrally so that one upload serves a mixed fleet of Screenly players, Player Max devices, and Screenly Anywhere screens without you preparing separate files. You do not need to check codecs, transcode anything, or produce multiple versions. Upload the source file. Processing takes a moment for an image and considerably longer for a large video. The item appears in the library straight away and becomes available to playlists once processing finishes. A video that never shows a duration did not finish processing: delete it and upload it again. ## Recommended settings If you are producing content specifically for signage, this encodes best: | Setting | Value | | --- | --- | | Resolution | 1920x1080, or 1080x1920 for portrait | | Frame rate | 30 fps maximum | | Codec | h264, profile high, level 4.1 | | Quality | CRF 20 | | Audio | MP3 | Files outside these settings still play. Performance varies more by device. ## Limits No limit on the number of files, no limit on the size of any one of them, and no limit on how many playlists you build. Fair use in our terms of service is the only constraint. Resolution is capped by plan rather than by file: 1080p on Starter, and 4K on Business and Enterprise when the device can do 4K. --- # What content is Source: https://www.screenly.io/docs/content/overview/what-content-is/ > The ten kinds of thing you can put on a screen, and the one difference that matters: whether it is stored on the device or loaded live. Content is one item in your library. A photograph, a video file, a page of a PDF, a URL, a camera feed. Each one has a name, a type, and settings of its own, and each goes into a [playlist](/docs/playlists/) to reach a screen. [Apps](/docs/content/types/apps/) also go in a playlist, but they are not stored in **Content**. They live under **Apps**. ## What you can show | Type | What it is | | --- | --- | | [Images](/docs/content/types/images/) | JPG, PNG, WebP, HEIC, TIFF, BMP, and static GIF | | [Videos](/docs/content/types/videos/) | MP4, MKV, MOV and the rest, plus YouTube and Vimeo URLs | | [Audio](/docs/content/types/audio/) | MP3 and FLAC, played alongside something visual | | [PDFs](/docs/content/types/pdfs/) | Each page becomes its own item | | [Presentations and documents](/docs/content/types/presentations-and-documents/) | Exported from Slides, PowerPoint, Keynote, Docs, Word, Pages | | [Spreadsheets](/docs/content/types/spreadsheets/) | Exported, or connected live from Google Sheets | | [Web pages](/docs/content/web-pages/) | Any URL, including pages on your own network | | [Live streams](/docs/content/adding/add-a-stream/) | RTSP from a camera or encoder | | [Local capture](/docs/content/adding/add-a-stream/) | A device plugged into the player | | [Apps](/docs/content/types/apps/) | Live, self-updating content, managed under Apps | ## The one distinction that matters Some content is **downloaded and stored on the device**: images, video, audio, PDF pages. It plays from local storage, which is why a screen keeps working through an internet outage. Some content is **loaded live every time it plays**: web pages, streams, and many apps. It is always current. A web page or stream disappears from the rotation while its source is unreachable; an app's behavior in that case depends on the app. Almost every surprise about Screenly's behavior comes back to which side of that line a piece of content sits on. See [Where content lives](/docs/content/overview/where-content-lives/). ## What is not content A playlist is not content; it is the rotation content sits in. A schedule is not content; it belongs to the playlist. --- # Where content lives Source: https://www.screenly.io/docs/content/overview/where-content-lives/ > Uploaded files are downloaded to the device and played from local storage. Web pages, streams, and apps are not. That difference decides what happens offline. Nothing streams from us during playback. A screen downloads what it needs and plays from its own storage. ## Getting there Screens check in, notice there is something new, and download it in the background. A screen does not wait for a whole playlist before showing anything. If a new playlist has five items and only the first has finished downloading, the screen starts showing that one and loops it, adding the others as they arrive. Each file is downloaded once and kept. This is why a change takes a few minutes rather than being instant, and why video takes longer than images. ## When the connection drops A screen with everything already downloaded keeps playing, and its schedule is held locally too, so content still changes on time through an outage. What it cannot do is show something it never received. Content added while a screen was offline plays once the screen reconnects and fetches it. Web pages and streams are the exception: they need their source, so they are skipped while it is unreachable and rejoin the rotation when it comes back. [Apps](/docs/content/types/apps/) often fetch live data too, but what they do when that source is unreachable depends on the app. ## When storage fills up The device manages its own storage. Once free space falls below **1 GB**, it starts deleting cached files that are not in the current playlist to make room for new downloads. Two consequences. Deleting content in the dashboard removes it from playlists immediately but does not wipe it from devices that already have it. That copy stays cached until the space is needed or the device is reflashed. And because the device decides what to evict, a player asked to hold more content than it has room for will re-download things it has already had. A screen that seems to be permanently downloading is usually overloaded rather than broken. A shorter playlist or larger storage both fix it. ## Content goes through your workspace There is no FTP, no USB pickup, and no way to hand a file to a player directly. Everything reaches a device through your workspace, which is what makes a fleet manageable rather than a set of individual machines. Content that never passed through Screenly was never validated or re-encoded, which is the other half of the reason. A page on your own network is the exception, because the screen fetches it rather than us. See [Local and intranet pages](/docs/content/web-pages/displaying-a-web-page/). --- # Apps Source: https://www.screenly.io/docs/content/types/apps/ > Live, self-updating content, managed under Apps rather than in Content. It takes a duration, and its settings live on the instance. An app is a small program that shows information which keeps changing: a dashboard, a calendar, a weather panel, a news feed. Install one from the App store, or deploy one you built, and it lives under **Apps**. It does not appear in **Content** with your images and videos. To a playlist there is still nothing special about it: it takes its turn, holds the screen for its slot, and hands over to the next item. What an app is, where it runs, and how credentials stay safe lives in [Apps](/docs/apps/). This page is what matters when you put one in a rotation next to files and pages. ## How it arrives An app does not come through **New content**, and it does not appear in **Content**. Install one from the **App store**, or deploy one you built with the CLI. It then appears under **Apps**, ready for a playlist. See [Install an app](/docs/content/adding/install-an-app/). ## Duration Give it more time than an image. An app fetching live data has to load before it can show anything, so ten seconds often spends most of the slot on a spinner. Thirty or forty seconds is more realistic for a dashboard. Duration is set on the playlist item, not on the app. See [How long things play](/docs/content/overview/how-long-things-play/). ## If it needs a source Many apps fetch live data while they play: a dashboard, a news feed, a calendar. What happens when that source is unreachable depends on the app. Some skip the slot and rejoin the rotation when it comes back. Others show a fallback, a last-known view, or an error on screen. Check that app's own documentation for how it behaves. See [Where an app runs](/docs/apps/overview/where-an-app-runs/) for where the code actually executes, and [Where content lives](/docs/content/overview/where-content-lives/) for how live content differs from files stored on the device. ## Where its settings live Installing an app creates an **instance**: the app plus your settings. The instance is what you manage under **Apps**. Open it to change a city, a dashboard, or a calendar, and every screen showing it follows on the next sync. Settings and anything sensitive belong on the instance, not in a playlist. See [Instances](/docs/apps/using/instances/) and [Settings and secrets](/docs/apps/setting-up/settings-and-secrets/). --- # Audio Source: https://www.screenly.io/docs/content/types/audio/ > MP3 and FLAC, scheduled like anything else. Where the sound comes out, and what to show while it plays. Audio is scheduled through the same playlists as everything else: add it, and schedule it to the right screens at the right times. It suits the cases where sound carries the message and a picture supports it. A safety procedure playing while the steps are shown. A shift announcement that fires at a set time with nobody starting it. ## Formats MP3 at up to 320 kbps, and FLAC. ## Duration Like video, audio plays for its own length. You do not set a duration. ## What is on screen while it plays Put something visual in the same playlist. Audio on its own leaves the display showing whatever came before it. ## Where the sound comes out HDMI by default, so it goes to the display's own speakers. To send it to an amplifier or ceiling speakers instead, switch the screen to the 3.5 mm jack. That is a per-screen setting, not a per-item one. See [Video and audio output](/docs/screens/settings/video-and-audio-output/). ## Silent by design If a screen is in a space where sound is not wanted, the reliable fix is the display's own volume or mute rather than the content. A screen muted at the panel stays muted whatever plays on it. --- # Images Source: https://www.screenly.io/docs/content/types/images/ > The fastest content to get on a screen. Formats, the size to export at, and why a photo from a phone sometimes appears sideways. An image is the quickest thing to put on a screen and works on every device and plan without setup. Upload it, add it to a playlist, set how long it stays up. When the content changes, re-upload and every assigned screen follows. That makes images practical for anything on a regular cycle: weekly notices, rotating safety messages, updated figures. ## Formats JPG and JPEG, PNG, BMP, TIFF, WebP, HEIC, and GIF. Animated GIFs do not animate. Only the first frame shows. To play one, put it on a web page and add that page as content. ## What size to export Match the screen's **aspect ratio** first. That matters more than the pixel count. An image at the screen's aspect ratio fills the display edge to edge whatever its resolution. An image at the wrong aspect ratio leaves black bars down the sides or across the top and bottom, however many pixels it has. | Orientation | Target | | --- | --- | | Landscape | 1920x1080, 16:9 | | Portrait | 1080x1920, 9:16 | Higher resolution looks sharper up to what the display can actually show, and no further. There is nothing to gain from a 6000-pixel-wide image on a 1080p screen, and it costs download time on every device. ## When an image appears rotated A photo from a phone or camera can arrive sideways or upside down. Phones store the rotation as metadata rather than rotating the pixels, and Screenly reads the pixels. The camera knows the photo is rotated; the file does not. Fix it at the source: open the image in any editor, rotate it so it looks right, and save. That writes the rotation into the pixels. Re-upload and it displays correctly. Exporting from a design tool rather than using the camera file directly avoids this entirely. --- # PDFs Source: https://www.screenly.io/docs/content/types/pdfs/ > Upload a PDF and choose which pages play. Each enabled page becomes its own playlist item, and can be renamed or rotated. A PDF is not shown as a document. You choose which pages you want, and each becomes a content item you can put in a playlist. ## Enabling pages 1. Upload the PDF. 2. Open it from **Content**. 3. Choose **Add Pages**. 4. Use the **+** button to enable the pages you want. 5. Choose **Done**, then **Save**. Only enabled pages can be added to playlists. A page you have not enabled does not exist as far as the playlist is concerned. Enabled pages can be renamed, rotated, and previewed, which is worth doing if the source document is landscape and the screen is not. ## Why PDFs rather than an export A PDF preserves layout, fonts, and formatting exactly as designed, which is what you want for anything approved: compliance notices, regulatory text, branded material. What the document looks like in the original application is what appears on the wall. It is also a single file to update. Re-upload it and every page you enabled follows, rather than replacing a set of exported images one by one. ## Where PDFs play PDFs need either a [Screenly Player Max](/docs/screenly-players/models/player-max-mk3/) or a Raspberry Pi 4 based player, running player client 3.8.1 or newer. They are not supported on the Raspberry Pi 3. > [!NOTE] > The player client has its own version number, separate from the ScreenlyOS release. A device on ScreenlyOS 26.x is well past player client 3.8.1. They also work on [Screenly Anywhere](/docs/anywhere/), where a smaller file matters more because the page is rendered on our side. ## Keep the file small Large PDFs render slowly. Keep them compressed and modest in size, on the order of a few megabytes rather than tens. Videos embedded in a PDF do not play. --- # Presentations and documents Source: https://www.screenly.io/docs/content/types/presentations-and-documents/ > PowerPoint, Slides, Keynote, Word, Docs and Pages cannot be uploaded. Four ways to export them, and which one to pick. Office files are rejected on upload. That is deliberate: they are authoring formats, they depend on fonts and an application to render, and there is no sensible way for a screen to page through one. Export first. The export takes under a minute, and which format you choose decides how the content behaves on screen. ## Which export to choose | Export as | Choose it when | | --- | --- | | Images | Slides differ in importance and you want per-slide control | | PDF | The deck changes often and you want one file to manage | | Video | Animations, transitions, or builds carry the message | | A live link | The content updates and you do not want to re-export | ## As images Each slide or page becomes a separate item, so each gets its own duration, can be reordered in a playlist, skipped, or mixed with other content. A title slide can hold for five seconds while a figures slide holds for thirty. - Google Slides: File, Download, then JPEG or PNG. - PowerPoint: File, Save As, then PNG or JPEG. It asks whether to export the current slide or all of them. - Keynote: File, Export To, Images. For Word, Docs and Pages, which have no direct image export, paste the page into the matching presentation app and export from there. A screenshot cropped to the page works for one page. ## As a PDF The whole deck stays one file. Screenly then lets you enable the pages you want, each becoming a playlist item with its own duration. - Google Slides and Docs: File, Download, PDF Document. - PowerPoint: File, Export, Export to PDF. - Word: File, Export, Create PDF/XPS, where you can set a page range. - Keynote and Pages: File, Export To, PDF. See [PDFs](/docs/content/types/pdfs/). ## As a video The right choice when motion is part of the design. Everything plays back exactly as built, and it loops like any other video. The trade is that timing is baked in and cannot be changed afterwards. - Google Slides: File, Download, MP4 video, setting the slide duration first. - PowerPoint: File, Export, Create a Video, setting seconds per slide and resolution. - Keynote: File, Export To, Movie. See [Videos](/docs/content/types/videos/). ## As a live link Google Slides can publish to the web, and the published URL goes into Screenly as a web page. Edit the deck and the screens follow, with nothing to re-export. 1. In Google Slides, go to **File**, **Share**, **Publish to web**. 2. Choose **Link**, set an auto-advance interval, and copy the URL. 3. Add that URL as content. Good for a weekly briefing or a rotating set of announcements. It is a live page, so it needs the network at play time. See [Web pages](/docs/content/web-pages/). --- # Spreadsheets Source: https://www.screenly.io/docs/content/types/spreadsheets/ > Excel, Sheets and Numbers cannot be uploaded. Export a snapshot, or publish a live link when the numbers change through the day. Spreadsheets hold much of what operations teams need on a wall: production counts, shift figures, KPIs, inventory. Like other office formats they cannot be uploaded, so the question is how the data behaves rather than which file to send. **Data that changes weekly** is fine as an exported image or PDF. **Data that changes through the day** wants a live link, or it will be wrong more often than it is right. ## As an image A clean, controlled snapshot of exactly the view you want. Re-export when the data changes. - Google Sheets: File, Download, PNG downloads the current view. A cropped screenshot also works. - Excel: select the cells, then Home, Copy, Copy as Picture, and paste into an image editor. - Numbers: File, Export To, Images where available, otherwise a cropped screenshot. Good for summary tables where the layout matters as much as the numbers. ## As a PDF Preserves column widths, fonts, and print layout, and lets you show several pages from one file. - Google Sheets: File, Download, PDF Document, configuring layout, scale, and which sheets to include. - Excel: File, Export, Export to PDF/XPS. Set the print area first, or the output will not match what you expect. - Numbers: File, Export To, PDF. See [PDFs](/docs/content/types/pdfs/). ## As a live link Publish the sheet to the web and add the published URL as content. The screen loads it fresh each time it plays, so changes appear without anyone touching Screenly. 1. In Google Sheets, go to **File**, **Share**, **Publish to web**. 2. Choose the sheet and the output format, then copy the URL. 3. Add that URL as content. This is the right answer for a live production count or a figure that moves during a shift. Two things to be aware of. Only the published range appears, so publish deliberately rather than sharing a whole workbook. And it is a live page, so it needs the network at play time and will be skipped while the source is unreachable. See [Web pages](/docs/content/web-pages/). > [!TIP] > If the same data already exists in a tool with a proper dashboard, an [app](/docs/apps/) will usually look better on a wall than a spreadsheet. Screenly has ready-made apps for Salesforce, Power BI, Grafana and Airtable. --- # Videos Source: https://www.screenly.io/docs/content/types/videos/ > Video is downloaded and played from the device, so it never buffers. Formats, encoding settings, 4K, and audio. Video holds attention in a way a static image does not, and it is the most forgiving content to deploy, because the file is downloaded to the device before it plays. That means no buffering, no dependence on connection quality, and playback that carries on if the network drops mid-rotation. ## Formats MP4, MKV, MOV, AVI, MPG and MPEG, WebM, OGG, FLV, M4V, WMV, and ASF. YouTube and Vimeo URLs work too: paste the video page URL instead of downloading the file. ## You do not need to transcode Screenly re-encodes video centrally on upload, so one file serves a fleet mixing Screenly players, Player Max devices, and Screenly Anywhere screens. Upload what your camera or editor produced. There is no codec check to do and no need for a version per device. ## Encoding for best results If you are producing video specifically for signage: | Setting | Value | | --- | --- | | Resolution | 1920x1080 | | Frame rate | 30 fps maximum | | Codec | h264, profile high, level 4.1 | | Quality | CRF 20 | | Audio | MP3 | Anything outside this still plays. Performance varies more by device. ## Duration A video plays for its own length, and that cannot be edited. It is the one content type whose duration you do not set. A video showing no duration in the library never finished processing. Delete it and upload it again. ## 4K 4K needs both halves: a device that can do 4K, meaning a [Player Max](/docs/screenly-players/), and a Business or Enterprise plan. Upgrading the plan does not make a 1080p device show 4K, and a Player Max on Starter still plays at 1080p. See [Plans for Screenly](/docs/get-started/plans/plans-for-screenly/). ## Size There is no file size limit, but a large file takes longer to reach every device on its first sync. Compressing before upload usually costs nothing visible on a display and saves real time across a fleet. --- # Pages behind a login Source: https://www.screenly.io/docs/content/web-pages/authenticated-pages/ > Three ways to show a page that needs authentication: the browser extension, JavaScript injection, and client certificates for enterprise networks. A screen has no keyboard and nobody sitting at it, so a page that expects someone to log in needs one of these. They escalate. Start at the top. ## The browser extension For a page with an ordinary username and password form, or basic auth. Install the [Screenly browser extension](/community/save-web-pages-with-browser-extensions/) and link it to your workspace. Log in to the page as yourself, then add it as content through the extension, and **tick Save Authentication**. That step is the whole point: without it you have added an unauthenticated URL. Three limits worth knowing before you rely on it: It stores what the site gave it and does not refresh anything. When the site expires or rotates the token, you log in again. It survives a player reboot, as long as the stored session and the site's cookie both hold. It cannot get past multi-factor authentication or SSO, because neither can be completed on a player. ## JavaScript injection For a page that needs shaping rather than authenticating: dismissing a banner, hiding navigation, scrolling to one panel, or filling a simple login form. Screenly can run JavaScript against the page as it loads. There is no dashboard control for it: it is set through the API, the CLI, or the MCP server. See [JavaScript injection](/docs/developers/web-pages/javascript-injection/), and the worked examples in the [Screenly Playground](https://github.com/Screenly/Playground/tree/master/javascript-injectors). ## Client certificates For internal dashboards where IT would rather the device proved its identity than held a password. Each screen holds its own certificate. The page is served only to devices presenting one, so there is no shared password anywhere and access is revoked by removing a certificate. This needs ScreenlyOS 26.2.0 or newer. It is not available on [Screenly Anywhere](/docs/anywhere/). 1. Open the screen's **Actions** tab and choose **Download certificate**. The file is named after the device, such as `srly-y358c2nss7i40ly.pem`. Repeat for each screen that needs access. 2. On the same tab, choose **Download CA certificate**. This is the authority that signed every device certificate, and your server needs it to validate the chain. 3. On the content item, open **Advanced** and turn on **Allow sending client certificate**, then save. 4. Configure your web server to require and verify a client certificate. ## Trusting the right thing Every Screenly device certificate is signed by the same Screenly certificate authority. That gives you two ways to configure the server, and the difference matters. The first way is to trust the CA and match on the common name. Point your server at the CA certificate, then check that the presented certificate's common name is one of your device ids. The name is the device's own hostname, the `srly-` string in the filename. > [!IMPORTANT] > Verifying the chain alone is not enough. Because every Screenly device shares that authority, a server that only checks the chain accepts a certificate from any Screenly player anywhere. The common name is what identifies **your** fleet. The second is to trust the device certificates directly. Skip the CA and give the server only the `.pem` files for the screens you want, which is an allowlist rather than a chain check: ```bash cat srly-device1.pem srly-device2.pem > screenly_trusted_devices.pem ``` This is tighter and needs no name matching, at the cost of updating the bundle whenever you add or replace a screen. It suits a small, stable set of screens; the CA route suits a fleet that changes. Either way, NGINX, Apache, HAProxy and Caddy all support this, as do Cloudflare Access and most API gateways if you would rather terminate it at the edge. > [!NOTE] > If the same host also serves people, do not require certificates on all of it. Put the signage feed on its own subdomain with strict certificate checking, and leave the human-facing side on normal TLS and SSO. --- # Displaying a web page Source: https://www.screenly.io/docs/content/web-pages/displaying-a-web-page/ > How a page is rendered, where it is rendered, what it needs to do to display at all, and how pages on your own network work. Add a URL and the device opens it in a browser built for signage: full screen, no tabs, no address bar, no navigation. Unlike an uploaded file, a page is **not stored on the device**. It loads live from its source each time it plays, so screens always show the current version. It also means a page whose source is unreachable does not display at all, and the screen moves on to the next item. ## Where the page is rendered **Site rendering method**, on the content item under **Advanced**, decides this. **Render on player** is the default and what hardware players always do. The device fetches the URL, runs its JavaScript, and shows the result live. Requests come from the device's own IP address, so a page restricted by IP has to allow the device, and anything on your local network is reachable. **Screenshot from server** is available on Screenly Anywhere screens only. We load the page on our infrastructure, screenshot it, and send the image. Requests then come from our servers, not the device, so anything on your local network becomes unreachable and IP allowlists need to name us instead. Use the second when a page will not load reliably on lower-power hardware. Do not use it for anything that has to be live to the second: a screenshot refreshes on an interval rather than updating continuously. ## What a page has to do It has to load in a reasonable time. A page heavy with JavaScript renders slowly on a low-power device, and a page still loading when its slot ends never gets seen. Give a heavy dashboard 30 or 40 seconds rather than the default 10. On **Screenly Anywhere**, two further requirements, and a page failing either will not display: - It has to be served over HTTPS, because plain HTTP does not load. - It has to allow being framed, because a site whose `Content-Security-Policy` forbids embedding cannot be shown. ## Local and intranet pages A page on your own network works, and this is the route for content that must not leave your premises. Add its address, for example `http://192.168.1.50/dashboard`. Our servers cannot reach it, so you will get **Content could not be verified**: choose **Add anyway**. The screen fetches it directly over the local network, and the content never passes through us. Two conditions. The player has to be on a network segment that can reach the server, so a player on another VLAN or at a remote site cannot. And the source must be an HTML page: to show a local image or PDF, wrap it in a minimal page and point Screenly at that. Locally served content is not cached either. If the server goes down, the content stops appearing. For something that must survive an outage, upload it as a file instead. ## When a page looks wrong **Zoom level**, under Advanced, scales the page from 25% to 500%, with 100% being its natural size. This is the fix for a page designed for a laptop that reads as tiny across a room, and it needs player client 4.1.0 or newer, which is separate from the ScreenlyOS release number. Cookie banners and navigation furniture cannot be dismissed by a setting. Publish the content another way, or use [JavaScript injection](/docs/developers/web-pages/javascript-injection/) to remove them on load. --- # Keeping a page current Source: https://www.screenly.io/docs/content/web-pages/refreshing/ > A page reloads each time it comes round in the playlist. When that is not enough, and when forcing a refresh makes things worse. By default a page loads fresh every time it cycles back in the playlist. For most pages that is the whole answer: a page that builds its content on load picks up the latest data on every cycle without any setting. ## When the playlist cycle is not enough If a page holds the screen for a long time and its data can go stale while it sits there, the cycle is too slow. A logistics board on screen for twenty minutes, querying live data only on load, is showing twenty-minute-old numbers by the end. The old trick for this was adding the same URL twice with a different query string. That still works and is occasionally useful, but the settings below are the direct route. ## Pages that update themselves Many dashboards refresh their own data over a websocket or a polling connection, and keep updating while they sit on screen. Those need nothing. > [!IMPORTANT] > Forcing a reload on a self-updating page makes it worse. Every reload interrupts the live connection and restarts the page's own update logic. If a dashboard refreshes itself, leave it alone and set the playlist duration to how long it should be visible. ## Screenshot settings These apply when a page is rendered on our side rather than on the device, which is the Screenly Anywhere path. **Screenshot cache timeout** controls how long a captured screenshot is reused before a new one is taken, from 60 seconds to 24 hours. Raise it for content that rarely changes and lower it when the page needs to be current. Every capture costs time, so this is a real trade rather than a free dial. **Screenshot delay** is how long we wait after the page loads before capturing. A page that assembles itself after the initial load, which is most dashboards, arrives half-empty without this. If a captured page is missing its charts, this is the setting to raise. ## Choosing a duration instead Often the right fix is neither. A page that should be current is a page that should be on screen briefly and come round often, rather than one held up for twenty minutes and refreshed behind the scenes. See [How long things play](/docs/content/overview/how-long-things-play/). --- # Sending screen details to a page Source: https://www.screenly.io/docs/content/web-pages/sending-screen-details/ > Turn on Send metadata and the player identifies itself in HTTP headers, so one URL can show different content per location. One dashboard URL, twenty sites, and each screen should show its own site's numbers. Without help that means twenty URLs to maintain. **Send metadata**, on the content item under Advanced, solves it. The player adds headers to its request identifying itself, and your page reads them and returns the right content. ## What is sent ```json { "X-Screenly-hostname": "srly-jmar75ko6xp651j", "X-Screenly-screen-name": "dizzy cherry", "X-Screenly-location-name": "Cape Town", "X-Screenly-hardware": "x86", "X-Screenly-version": "v2", "X-Screenly-lat": "-33.925278", "X-Screenly-lng": "18.423889", "X-Screenly-tags": "srly-jmar75ko6xp651j,custom-label" } ``` `X-Screenly-tags` carries the screen's [labels](/docs/labels/), which is usually the most useful one: label your screens by site and your page can branch on the label rather than on a list of screen names. ## Using it Read the headers server-side and return content accordingly. Because they are request headers rather than query parameters, they do not appear in the URL, are not cached by anything keyed on the URL alone, and do not end up in browser history or a shared link. ## Two things to get right Do not trust these for access control. They identify the screen conveniently, but they do not authenticate it, and anything sensitive needs real authentication. See [Authenticated pages](/docs/content/web-pages/authenticated-pages/). They also only reach the page when the device makes the request. A page rendered on our side, the Screenly Anywhere screenshot path, is fetched by our infrastructure rather than by the player. ## Off by default Existing content is unaffected until you turn it on, and there is no reason to enable it for a page that does not read the headers. --- # Add content and put it in order Source: https://www.screenly.io/docs/playlists/building/add-and-order-content/ > Add items from the library, drag to reorder, and set a duration per item. Order matters more than it looks. ## Adding items 1. Open the playlist and stay on the **Content** tab. 2. Choose the **+** button. 3. Browse or filter by type, and use **+** next to each item you want. 4. Choose **Done**, then **Save**. Items land in the order you added them. Everything in your [library](/docs/content/library/) is available, whatever its type. ## Reordering Drag items into the order you want, then save. Order matters more than it looks. A rotation is read in passing by someone who arrives at a random moment, so the item most likely to be seen is the one that follows whatever holds attention longest. Put the thing you most want read straight after the video, not straight before it. The playlist loops from the top, so there is no last item in practice; there is only the item before the one people are already watching. ## Durations Each item carries its own duration, defaulting to **10 seconds** and settable from 1 second to 24 hours. Video and audio are the exceptions: they play for their own length and the duration cannot be edited. A dashboard or a heavy web page needs longer than an image, both to be read and to finish loading. See [How long things play](/docs/content/overview/how-long-things-play/). ## Removing items Remove an item and save. It stops playing on the next sync, and it stays in your content library, still available to every other playlist. That is different from deleting from the library, which removes it everywhere at once. See [Deleting content](/docs/content/library/deleting-content/). ## Saving Changes are not live until you save. Once saved, every screen assigned to the playlist picks them up on its next check-in and downloads anything new, usually within a few minutes. You never reassign a playlist after editing it. The assignment is to the playlist, not to its contents. --- # Create a playlist Source: https://www.screenly.io/docs/playlists/building/create-a-playlist/ > A new playlist needs only a title, and starts empty, enabled, and unscheduled. From **Playlists**, choose **New playlist**, give it a title, and save. That is the whole form. Everything else, content, screens, schedule, transitions, is set afterwards on the playlist's own tabs. ## What a new playlist starts as Empty, so nothing plays until you add content. Enabled, so it will play as soon as it has content and screens. **Unscheduled**, which means always active. It plays whenever it is assigned, until you narrow that with a [schedule](/docs/scheduling/). **Not a priority playlist**, so it shares the screen with anything else eligible. ## Naming The title is what you search by, what the screens list shows under Plays on, and what decides the order when several playlists share a screen. Name for what the playlist is for rather than when it was made. `Reception rotation` survives; `Playlist 3` and `New playlist (copy)` do not. If you want deliberate control over rotation order, put a number at the front: playlists on a screen play in alphabetical order by title. See [When several playlists are eligible](/docs/playlists/playback/when-several-are-eligible/). --- # Delete a playlist Source: https://www.screenly.io/docs/playlists/managing/delete-a-playlist/ > Deleting a playlist leaves its content untouched. What it does affect is every screen that was playing it. From the playlist's **Actions** tab, or the menu on its row in the list. It cannot be undone. ## What it removes The playlist, its order, its durations, its schedule, and its assignments. ## What it does not remove Every content item stays in your [library](/docs/content/library/) and in any other playlist it belongs to, because a playlist holds references rather than files. Screens that were not assigned this playlist are unaffected. ## What happens on the screens Screens assigned to it stop playing it on their next sync. If it was the only playlist they had, they have nothing to show and go blank, so check what else those screens are assigned before deleting. Cached files stay on the devices until space is needed. See [Where content lives](/docs/content/overview/where-content-lives/). ## Consider disabling instead [Disabling](/docs/playlists/managing/enable-and-disable/) achieves the same visible result, keeps everything, and is reversible. Delete when you are certain the playlist will never be wanted again. --- # Duplicate a playlist Source: https://www.screenly.io/docs/playlists/managing/duplicate-a-playlist/ > Copy a playlist with its content, schedule, transition, and labels. The copy arrives disabled so it cannot surprise anyone. From **Playlists**, open the menu on a playlist's row and choose **Duplicate**. ## What comes across The copy is named `<original> (copy)` and carries the content in the same order with the same durations, the schedule, the priority setting, the transition, and the labels. Which means it is a working playlist, not a shell. That is also why it arrives **disabled**. > [!IMPORTANT] > The copy keeps the original's labels and schedule. Enable it before changing those and you have two playlists competing for the same screens at the same times. Rename it, adjust the targets, then enable. ## What it is for - A variant for a different site: duplicate, swap two or three items, and retarget the label. - A safe edit: duplicate before restructuring a playlist that is live on a hundred screens, work on the copy, then swap the labels over. The original keeps playing throughout. - A seasonal template: keep last year's version disabled, duplicate it, and update the dates. ## When not to duplicate When the content is the same and only the audience differs. That is one playlist with two labels. Two copies of the same content will drift, and the day someone updates one and not the other is the day it matters. See [Across many screens](/docs/playlists/where-it-plays/across-many-screens/). --- # Enable and disable Source: https://www.screenly.io/docs/playlists/managing/enable-and-disable/ > Take a playlist out of service without dismantling it. The reversible alternative to deleting. The switch is on the playlist's **Actions** tab. When disabled, the playlist does not play on any screen. Everything else stays: its content, its order, its schedule, and its screens. Re-enable it and it resumes exactly as it was. ## When to use it - Seasonal content: a winter rotation can sit disabled through summer rather than being rebuilt each year. - Something that turned out to be wrong: disabling stops it on every screen at once, which is faster and safer than editing under pressure. - Anything you are unsure about: disabling is reversible and deleting is not. When tidying up and you cannot remember what a playlist is for, disable it and see whether anyone notices. ## Spotting a disabled playlist The list shows **Disabled** in its status column, and the playlist's own page carries a banner on every tab except Actions. That is deliberate: it stops someone editing a playlist for ten minutes before realising why nothing is appearing. A disabled playlist assigned to screens is the most common reason for content that looks correct and is not playing. --- # Share with another workspace Source: https://www.screenly.io/docs/playlists/managing/share-with-another-workspace/ > Let another workspace schedule your playlist onto their screens without being able to change what is in it. Workspaces are isolated: content and screens in one are invisible from another. Sharing a playlist is the deliberate exception. Shared playlists are an **Enterprise** feature. ## What sharing does The receiving workspace can assign the playlist to their own screens and labels, and control where it plays. They cannot change what is in it, rename it, or alter its transition. The content stays hosted by the sharing workspace. Update the playlist once and every workspace showing it follows. That is the arrangement for brand-controlled content across regions, a central team feeding local teams, or an agency running screens for a client. ## Sharing one You need Admin or Owner rights in **both** workspaces. 1. Go to **Playlists**. 2. Open the menu next to the playlist and choose **Share**. 3. Pick the target workspace and confirm. It appears in the receiving workspace's playlist list, where searching for `shared` finds it. ## On the receiving side Assign it to screens exactly like your own playlists. Its content tab is read-only, and the settings that belong to the owner are locked. ## Stopping Unshare from the same menu. The playlist stops being available to that workspace, and their screens stop playing it on the next sync. ## The alternative If both teams should be able to edit, they want the same workspace or [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/), not a shared playlist. Sharing is deliberately one-way. --- # The playlists list Source: https://www.screenly.io/docs/playlists/overview/the-playlists-list/ > What each column tells you, what total duration is for, and what search matches. **Playlists** lists everything in the workspace with a thumbnail of its first item. | Column | What it tells you | | --- | --- | | Title | The playlist name | | Plays on | The screens and labels it targets | | Duration | How long one full pass through it takes | | Status | Enabled or Disabled | ## Duration is the loop length The duration column adds up every item, which answers the question that matters on a wall: how long before someone standing there sees the same thing twice. A four-minute rotation in a lift lobby is wrong, because nobody stands there for four minutes. Sorting by duration finds the playlists that have quietly grown past what their location can support. ## Status **Disabled** means assigned but never playing. It is the fastest way to take a playlist out of service without dismantling it, and the first thing to check when a playlist that looks correct is not appearing. A disabled playlist shows a banner across its own page, so you cannot edit one for ten minutes without noticing. ## Search Search matches the title, the status, and the names of labels the playlist targets. Typing a label name lists every playlist aimed at it, which is how you find out what a given group of screens is actually showing. Typing `shared` lists playlists shared into this workspace from another. See [Share with another workspace](/docs/playlists/managing/share-with-another-workspace/). --- # What a playlist is Source: https://www.screenly.io/docs/playlists/overview/what-a-playlist-is/ > An ordered list that loops, mixing any content types, carrying its own schedule and its own set of screens. A playlist is what you already think it is: an ordered list of items that plays through and loops back to the start. What makes it the centre of Screenly is everything attached to it. A playlist carries its own [schedule](/docs/scheduling/) and its own set of [screens](/docs/playlists/where-it-plays/assign-to-screens/), so it is not just a list of content but a complete instruction: this content, in this order, for this long, on these screens, at these times. ## What can go in one Any content type, mixed freely: images, video, audio, PDF pages, web pages, live streams, local capture, and apps. A live KPI dashboard, a safety notice, a company announcement, and a camera feed can sit in the same playlist and rotate one after another. There is no reason to separate content by type, and grouping by purpose is almost always more useful. ## The five tabs Open a playlist and it has five tabs. | Tab | What it does | | --- | --- | | Content | What is in the playlist, in what order, and for how long | | Schedule | When it is allowed to play, and whether it is a priority playlist | | Screens | Which screens play it, directly or by label | | Settings | The title, and the transition between items | | Actions | Enable and disable, share, and delete | ## What a playlist is not It is not where content is stored. Items in a playlist are references to things in your [content library](/docs/content/library/), so the same image can be in ten playlists, and deleting a playlist leaves the content untouched. It is not owned by a screen either. A playlist reaches many screens, and a screen plays many playlists. --- # How a screen decides what to play Source: https://www.screenly.io/docs/playlists/playback/how-a-screen-decides-what-to-play/ > Four conditions decide whether a playlist reaches a screen. Knowing them in order turns 'why is it showing that' into a two-minute check. A playlist plays on a screen when four things are all true at once. Nothing else is involved. 1. **The playlist is enabled.** A disabled playlist stays assigned but never plays. 2. **The screen is in its target.** Either named directly, or carrying a label the playlist targets. 3. **The screen is enabled.** A disabled screen holds no license and shows nothing. 4. **The schedule matches right now**, in that screen's local time. ## When several qualify at once They share the screen, cycling in alphabetical order of title, unless one is a priority playlist, which takes the screen for as long as its schedule is active. [When several playlists are eligible](/docs/playlists/playback/when-several-are-eligible/) and [Priority override](/docs/playlists/playback/priority-override/) cover both. ## Why this list is worth memorizing Almost every "why is it showing that" question is one of those four, and they fail in a specific order of likelihood: schedule first, then the label not matching, then the playlist being disabled. Two shortcuts settle it faster than reasoning about it. The **Now playing** tab on a screen lists what is active on that screen right now. The **effective schedule summary** on a playlist says in plain language when it will play. ## Case matters in labels `Warehouse` and `warehouse` are two different labels. This is the most common cause of a playlist that is correctly built, correctly enabled, and quietly playing on nothing. Deeper: [Assign to screens](/docs/playlists/where-it-plays/assign-to-screens/) for targeting, and [Troubleshooting labels](/docs/labels/designing/troubleshooting/) for the label case. --- # Priority override Source: https://www.screenly.io/docs/playlists/playback/priority-override/ > Priority override gives a playlist exclusive control of its screens while its schedule is active, and hands back automatically when it ends. Normally several eligible playlists share a screen in turn. Priority override stops that. While its schedule is active, a priority playlist takes the screen exclusively and nothing else plays. When the schedule ends, the other playlists resume on their own. ## Turning it on Open the playlist, go to **Advanced**, enable **Priority Override**, and save. ## What to use it for Content that is pointless if it is only seen sometimes. A closure notice, an evacuation message, an announcement that has to land today. The alternative, deleting or unassigning everything else, is a change somebody has to remember to undo. Priority reverts on its own. ## Two priority playlists at once They do not fight. If more than one priority playlist is active, they play consecutively, sharing the screen between themselves while still excluding everything non-priority. ## The mistake to avoid Priority is exclusive for exactly as long as its schedule says. A priority playlist with **no** schedule is always eligible, so it takes the screen permanently and everything else silently stops. If a screen has stopped showing everything but one playlist, that is the first thing to check. --- # Transitions Source: https://www.screenly.io/docs/playlists/playback/transitions/ > How one item gives way to the next: push, fade in, or dissolve. A playlist can move between items with a transition rather than a hard cut. | Transition | Effect | | --- | --- | | Push | The next item slides in over the last. | | Fade in | The next item fades up. | | Dissolve | One item cross-fades into the next. | ## Choosing one A hard cut is fine and often better. Transitions cost a fraction of a second of screen time each, and on a rotation of short items that adds up. They earn their place where the cut itself is distracting: between images of very different brightness, or on a screen someone sits near for a long time. Pick one and use it throughout. A playlist that changes transition between items looks like a mistake rather than a choice. --- # When several playlists are eligible Source: https://www.screenly.io/docs/playlists/playback/when-several-are-eligible/ > A screen plays all of them, in alphabetical order by title, unless one is a priority playlist. Nothing stops two playlists being eligible on the same screen at the same time, and it happens more often by accident than by design. ## They share the screen The screen cycles through every eligible playlist, giving each its turn, then comes back to the first. That is often what you want. A permanent playlist of company notices and a temporary playlist for an event both run, and the screen alternates without either being switched off. ## The order is alphabetical Playlists on a screen play in order of **title**. That is the only lever you have over rotation order, and it is a real one. If order matters, number the titles: `1 Welcome`, `2 Safety`, `3 Notices`. Without that, `Announcements` plays before `Welcome` because of how the alphabet works, not because anyone decided it. > [!NOTE] > This makes renaming a playlist a scheduling change on a screen showing several. Worth remembering before tidying up names. ## Priority does not share A playlist marked priority takes the screen exclusively while its schedule is active, and everything else waits. See [Priority override](/docs/playlists/playback/priority-override/). ## When nothing is eligible A screen with no eligible playlist has nothing to show. A screen that goes blank at 18:01 is a schedule ending, not a fault, so check the schedules before checking the device. ## Keeping this simple Overlap is a legitimate tool and a common source of confusion. The two arrangements that stay understandable are one playlist per screen with a schedule that switches content, or several playlists deliberately sharing, with numbered titles. The arrangement that causes trouble is several playlists overlapping by accident because their schedules were written separately. The effective schedule summary on each playlist is the way to catch it. See [Scheduling](/docs/scheduling/). --- # Across many screens Source: https://www.screenly.io/docs/playlists/where-it-plays/across-many-screens/ > One playlist, a whole fleet. Labels turn a content change into one edit instead of two hundred. The point of assigning by label is that the number of screens stops mattering. ## The pattern 1. Label the screens by something that does not change: `frankfurt`, `plant-floor`, `reception`. 2. Assign the playlist to the label. 3. Edit the playlist whenever the content changes. Every screen carrying the label picks up the change on its next sync. You never touch a screen, and you never reassign the playlist. A new screen joins by being given the label, which means bringing a site online is a labelling job rather than a content job. See [Labels](/docs/labels/). ## Several labels on one playlist A playlist can target more than one label, and plays on any screen carrying any of them. That lets the same content serve different parts of the organization without duplicating the playlist. Duplicating a playlist to reach a second group is usually a mistake. Two copies drift, and the day someone updates one and not the other is the day it matters. ## When to duplicate instead Duplicate when the **content** genuinely differs, not when only the audience does. Same content in two places is one playlist with two labels. Different content is two playlists. See [Duplicate a playlist](/docs/playlists/managing/duplicate-a-playlist/). ## Across workspaces Labels do not cross workspace boundaries. To run the same playlist in a workspace you do not control, share it. See [Share with another workspace](/docs/playlists/managing/share-with-another-workspace/). --- # Assign to screens Source: https://www.screenly.io/docs/playlists/where-it-plays/assign-to-screens/ > Target individual screens or a label, see everything the playlist reaches, and stop it playing without deleting anything. Content reaches a screen through a playlist. You put content in a playlist, assign the playlist to screens, and those screens play it, so assigning is something you do from the playlist rather than from the screen. Open the playlist, go to the **Screens** tab, and choose **Select screens**. The dialog offers both options, and states the choice plainly: select individual screens, or assign a label to include every screen that has it. ## Screens or labels **Individual screens** targets exactly those, and nothing changes unless you come back and edit it. Right for a handful, and for a playlist that genuinely belongs to one display. **A label** targets every screen carrying it, now and in future. A screen given that label next month starts playing without anyone opening the playlist. Every screen also has a label matching its own name, created when it was paired. That is what makes targeting one specific screen work, and it is why renaming a screen does not break an existing assignment. Once you are past a handful of screens, labels are the answer. See [Labels](/docs/labels/). ## Seeing what it reaches The Screens tab lists every screen the playlist reaches, however it reaches them, so a label assignment and a direct assignment look the same here. That is the quickest way to confirm an assignment did what you meant, rather than what you typed. ## More than one target A playlist can carry several labels and several direct screens at once. It plays on any screen matching **any** of them, so the targets add up rather than narrowing each other. ## Removing it from screens Remove the label or the screen from the Screens tab and save. Those screens stop playing it on their next sync, and clear any content files no longer needed by another playlist. Nothing else is affected: the playlist itself is untouched, and every other screen it targets carries on. ## When it does not arrive In this order: is the playlist **enabled**, is its **schedule** active right now in that screen's local time, does the screen carry the **exact** label including capitals, and has the screen finished **syncing**. See [How a screen decides what to play](/docs/playlists/playback/how-a-screen-decides-what-to-play/). --- # Worked examples Source: https://www.screenly.io/docs/labels/designing/examples/ > Four fleets, the labels they use, and what each one makes easy. ## A single office, twelve screens Two dimensions are enough. ```text reception canteen meeting-room corridor finance hr operations ``` A screen carries one of each: the space it is in, and the team that owns its content. HR updates its own screens without touching anyone else's, a building-wide notice targets nothing at all and goes on **All Screens**, and adding a meeting room is one label. ## Twenty sites, four screens each Site is the dominant dimension, so it goes first. ```text frankfurt manchester lyon ... reception warehouse canteen 24h ``` A country-wide campaign targets nothing site-specific and reaches all eighty, and a single site's screens are one label. Screens that never switch off are `24h`, so a schedule for overnight content targets them without listing them. Resist `frankfurt-reception`. Frankfurt plus reception already expresses it. ## A manufacturing plant Here the useful dimension is not geography, it is who is looking. ```text plant-floor control-room canteen entrance safety production hr portrait ``` A safety notice reaches `plant-floor` immediately without anybody deciding which screens those are. Orientation is a label because content is authored differently for it, and a portrait playlist targeting `portrait` never lands on a landscape wall. ## An agency running screens for clients Clients belong in separate [workspaces](/docs/workspaces/), not separate labels. Isolation is the point, and labels do not provide it. Inside each client's workspace, label by that client's own geography and space types. A [shared playlist](/docs/playlists/managing/share-with-another-workspace/) is how the agency's own content reaches all of them. ## The pattern underneath all four Between two and four dimensions. Every screen carries one label from each. No combinations. No campaigns. --- # What to label by Source: https://www.screenly.io/docs/labels/designing/naming-schemes/ > Label by facts that do not change. Why campaign labels rot, and the four dimensions most fleets actually need. ## Label by facts, not by intentions **A fact** is where a screen is, what kind of place it is in, or how it is used. `frankfurt`. `plant-floor`. `reception`. `24h`. **An intention** is what you currently want it to show. `summer-promo`. `q3-campaign`. `new-menu`. Facts stay true. Intentions expire, and the label outlives them, because removing a label from twenty screens is a job somebody has to remember to do and nobody ever does. Put the intention in the playlist's [schedule](/docs/scheduling/) instead. A campaign with an end date turns itself off; a campaign label does not. ## The dimensions most fleets need Between two and four, and a screen carries one from each: | Dimension | Examples | | --- | --- | | Where | `frankfurt`, `manchester`, `plant-2` | | What kind of space | `reception`, `plant-floor`, `canteen`, `meeting-room` | | Who owns it | `facilities`, `hr`, `operations` | | How it runs | `24h`, `office-hours`, `portrait` | Three dimensions across a hundred screens gives you every grouping you are likely to want, from about a dozen labels. ## Do not encode combinations The trap is creating `frankfurt-reception` because you want to target Frankfurt's reception screens. You already can: a screen carrying both `frankfurt` and `reception` is reachable by a playlist targeting either. Combination labels multiply, so ten sites and five space types becomes fifty labels instead of fifteen, and every new site means five more. ## Be consistent about form Pick one and hold to it. Lowercase with hyphens is the easiest to type and the hardest to get subtly wrong. Consistency matters more than the specific convention. `Plant Floor`, `plant-floor` and `plantfloor` in the same workspace are three labels and two bugs. ## What a name may contain Letters, digits, spaces, and most punctuation. Not a comma, a colon, or a double quote, and not a tab or a line break. Up to 255 characters, though a label anyone has to read across a room in a picker should be considerably shorter. ## Sanity check the scheme Two questions. Can you name the label for a request without looking it up? "Put this on the Frankfurt reception screens" should map to labels you can guess, and if it needs a lookup table, the scheme is not doing its job. Does a new screen get its labels from facts you already know, such as site, room, and purpose? If labelling a new screen requires knowing what campaigns are running, the scheme has intentions in it. --- # When a label is not working Source: https://www.screenly.io/docs/labels/designing/troubleshooting/ > A playlist targeting a label and reaching nothing has a short list of causes. Work down it. A playlist that looks correct and plays on nothing is nearly always one of these. ## 1. The names differ The commonest cause by far, and the hardest to see. Read both character by character. `warehouse` and `warehosue` look identical at a glance and are two labels. So is a trailing space, and so is `plant floor` against `plant-floor`. Search the label name in the screens list. If nothing comes back, the label on the screens is not the label you typed. ## 2. The screen does not carry it Open the screen's Settings and read its Labels field. It is faster than reasoning about it. ## 3. The playlist targets something else The playlist's **Screens** tab lists every screen it reaches, however it reaches them. If the screen is not in that list, the assignment is wrong regardless of what the labels look like. ## 4. The label is right and something else is wrong Labels only decide **whether** a playlist reaches a screen. If the screen is in the playlist's list and still shows nothing, the cause is further along: - Is the playlist **enabled**? - Is its **schedule** active right now, in that screen's local time? - Is the screen **enabled** and **online**? - Has the screen finished **syncing**? [How a screen decides what to play](/docs/playlists/playback/how-a-screen-decides-what-to-play/) is that list in order. ## The check that settles it fastest The **Now playing** tab on the screen lists what is active on that screen right now. If the playlist is there, labels are fine and the problem is elsewhere. If it is not, it is an assignment problem. --- # How assignment works Source: https://www.screenly.io/docs/labels/overview/how-assignment-works/ > Every assignment is a label underneath, including the ones that look like you picked a screen. When you assign a playlist, the dialog offers individual screens and labels side by side. They look like two different mechanisms. They are one. ## Picking a screen is picking a label Every screen gets its own label when it is paired, named after the screen. Choosing that screen in the dialog attaches the playlist to that label. Two consequences worth knowing. Renaming a screen breaks nothing, because the screen's label takes its name from the screen. Both change together and the assignment holds. There is also no such thing as a direct screen-to-playlist link. If you are wondering why a playlist is reaching a screen, the answer is always a label, and it is visible on both. ## All Screens A built-in label carried by every screen in the workspace, including ones connected later. Useful for something genuinely universal, such as an emergency notice. Worth being careful with for anything else: a playlist on **All Screens** is a playlist you will forget is there, on screens nobody remembers assigning. > [!NOTE] > Older workspaces may still carry a default playlist attached to every screen. New ones do not. If you have one you cannot remove, [ask support](https://support.screenly.io/hc/en-us/requests/new). ## The order things reach a screen Labels decide **whether** a playlist reaches a screen. They do not decide **when** it plays or **what order** several play in. When decides itself: [scheduling](/docs/scheduling/). Order is alphabetical by playlist title, and priority overrides it: [when several playlists are eligible](/docs/playlists/playback/when-several-are-eligible/). --- # What a label is Source: https://www.screenly.io/docs/labels/overview/what-a-label-is/ > A tag on both sides of a connection. Why screens and playlists never reference each other directly, and what that buys you. Labels exist because of a problem that shows up around the fifth screen. Without them, a playlist would have to name the screens it plays on. Add a screen and you edit every playlist that should reach it. Retire one and you edit them again. With twenty screens and ten playlists that is two hundred relationships somebody has to maintain by hand. A label breaks that. A playlist says "I play on `warehouse`". A screen says "I am `warehouse`". Neither knows the other exists. playlist → label → screen ## What it gets you - Adding a screen is one action: give it the label, and every playlist targeting that label reaches it with nothing else edited. - Retiring a screen is one action: take the label off, or delete the screen. - Changing what a group shows is one action: point a different playlist at the label. - The relationship is visible from both ends. A screen shows its labels, a playlist shows what it targets, and searching a label name in either list shows everything carrying it. ## A screen can carry several That is the part people underuse. A screen in reception at the Frankfurt site can be `frankfurt` **and** `reception` at once. You then get the combinations without inventing them: a playlist for `frankfurt` reaches it, a playlist for `reception` reaches it, and both can be true at the same time. Two labels on a hundred screens describes far more groupings than a hundred bespoke ones. ## The three kinds | Kind | Where it comes from | | --- | --- | | Custom | You create it. This is what "label" usually means | | Screen | Created automatically for every screen, named after that screen | | System | Built in. **All Screens** is the one you will see | Only custom labels are yours to create, rename, and delete. The other two exist so that "this one screen" and "every screen" are expressible in the same way as any group, rather than being special cases. See [Kinds of label](/docs/labels/reference/kinds-of-label/). ## Where labels are not used Labels connect **screens and playlists**. They are not folders for your content library, which has [folders](/docs/content/library/organizing-with-folders/) of its own, and they do not group people, workspaces, or apps. --- # Kinds of label Source: https://www.screenly.io/docs/labels/reference/kinds-of-label/ > Custom, screen, and system labels: where each comes from, what you can do to it, and where it appears. Three kinds exist. Only one of them is yours to manage. | Kind | Created by | Named | Rename | Delete | | --- | --- | --- | --- | --- | | Custom | You | By you | Yes | Yes | | Screen | Automatically, per screen | After the screen | Rename the screen | With the screen | | System | Built in | Fixed | No | No | ## Custom What "label" ordinarily means. You create them, apply them to screens and playlists, rename and delete them. They appear on the **Custom** tab of the label dialog, which is the tab it opens on. ## Screen Every screen gets one when it is paired, and it takes its name from the screen. Rename the screen and the label's name changes with it, which is why renaming a screen never breaks an assignment. They live on the **Screen** tab, and they are hidden from a screen's own list of labels, because a screen carrying a label named after itself would be noise on every row. You do not create or delete these. Deleting the screen removes its label. ## System Built-in labels. Today that is **All Screens**, carried by every screen in the workspace including ones connected later. They are on the **System** tab and cannot be renamed or deleted. ## Why the three exist So that "this one screen", "this group", and "every screen" are all expressible the same way. A playlist has one mechanism for reaching screens: labels. If per-screen targeting were a separate feature, everything downstream, the API, the MCP tools, the screens tab on a playlist, would need to handle two cases. It handles one. --- # Labels in the API Source: https://www.screenly.io/docs/labels/reference/labels-in-the-api/ > Labels are first-class in the API and the MCP tools, which makes them the lever for scripted fleet changes. Labels are a resource of their own, with one endpoint for label-to-screen links and another for label-to-playlist links. ## Endpoints | Path | What it holds | | --- | --- | | `/v4.1/labels` | The labels themselves | | `/v4.1/labels/screens` | Which labels are on which screens | | `/v4.1/labels/playlists` | Which labels target which playlists | A label carries `id`, `name`, `human_name`, and `type`. `type` uses the API's own names for the three [kinds of label](/docs/labels/reference/kinds-of-label/): `manual` is a **Custom** label, `screen` is the automatic per-screen one, and `all-screens` is the **All Screens** system label. `human_name` is the one to read when displaying a label: for a screen label it resolves to the screen's current name, while `name` is the stored value. Attaching is a POST to the relevant join table with a `label_id` and either a `screen_id` or a `playlist_id`. See [Get started](/docs/developers/api/overview/get-started/) and the [v4.1 API reference](https://developer.screenly.io/api_v4_1/). ## MCP tools Eight of the MCP tools are label tools, more than for any other resource: ```text label_list label_create label_update label_delete label_link_screen label_unlink_screen label_link_playlist label_unlink_playlist ``` That weighting is not an accident. Screens are **read-only** through MCP, so linking a label is how an assistant changes what plays where. "Find every screen labelled warehouse and assign the safety rotation to them" is `label_list` then `label_link_playlist`. See [Tool reference](/docs/developers/mcp/reference/tools/). ## Scripting a fleet change The pattern that makes labels worth the trouble at scale: 1. List screens matching whatever condition you care about. 2. Attach a label to each. 3. Point one playlist at that label. Step three is one call however many screens step two touched. That is the same property the dashboard gives you, available to a script. --- # Create and apply Source: https://www.screenly.io/docs/labels/using/create-and-apply/ > There is no separate step for creating a label. Type a name that does not exist and it is made. The same dialog appears wherever labels do, on screens and on playlists, so everything here applies to both. ## On one screen Open the screen, go to **Settings**, and use the **Labels** field. ## On one playlist Open the playlist, go to its **Screens** tab, and choose **Select screens**. ## On many screens at once From the screens list, choose **Edit**, tick the screens you want, then **Labels**. Apply or remove across all of them in one go, and **Finish** when done. This is the one to use for anything beyond a couple of screens. Labelling ten screens individually is ten trips through a settings page. ## Creating one There is no separate create step. Type a name that does not exist yet in the dialog and it is created and applied together. That is deliberate, and it has a consequence: **a typo becomes a label**. `warehosue` will be created as happily as `warehouse`, and a playlist targeting the correct spelling then reaches nothing. If a label seems to have stopped working, read it character by character before anything else. ## The three tabs **Custom** is the default and holds your own labels. **Screen** holds the automatic per-screen labels, for targeting one specific display. **System** holds the built-in ones, currently **All Screens**. ## Applying across a mixed selection Select several screens where some already carry a label and some do not, and the label shows as partially applied. Acting on it applies it to all of them, so you can bring a mixed selection into line in one action rather than working out which is which. ## Removing one Take it off a screen from that screen's Settings, or off several from the screens list in edit mode. Remove it from a playlist from the playlist's Screens tab. Removing a label from a screen does not delete the label, and does not affect any other screen carrying it. --- # Rename and delete Source: https://www.screenly.io/docs/labels/using/renaming-and-deleting/ > What a rename touches, what a delete takes with it, and how to check before you do either. ## Renaming A custom label can be renamed, and it stays attached to everything carrying it. Nothing needs reassigning. Screen labels cannot be renamed directly. Rename the **screen** and its label follows. ## Deleting From the label dialog, which has a delete control against each label. Deleting removes it from **every screen and playlist carrying it**. Any playlist that was reaching screens only through that label stops reaching them, immediately and quietly: no error, no warning on the playlist, just screens that stop showing something. ## Check before deleting Search the label name in the **screens** list to see which screens carry it, then in the **playlists** list to see which playlists target it. If the second list is not empty, deleting the label takes those playlists off those screens. Retarget them first. ## Tidying up Labels accumulate. Campaign labels from last year, a site that closed, a typo nobody removed. Two rules make the clean-up safe. Delete a label only when the playlists list for it is empty. And treat a label carried by no screens as a candidate rather than a certainty, because a playlist may still be targeting it and waiting for a screen that has not arrived yet. --- # Complex schedules Source: https://www.screenly.io/docs/scheduling/advanced/complex-schedules/ > Why a schedule can be too complex to save, why except dates cost more than they look, and what read-only means on the Schedule tab. You do not need any of this for ordinary scheduling. It matters when a schedule gets large, or when you are building one through the API. The rule editor covers what a schedule usually needs. Two things happen past that point. ## Read-only schedules A schedule built through the API can be more complicated than three sections and a list of rules can express. When one is, the dashboard shows it **read-only** and says so, and it stays editable through the API. Nothing is broken and nothing is lost. The playlist plays exactly as the predicate says. You just cannot edit it by clicking. The same applies to a shared playlist: its schedule belongs to the workspace that owns it. ## Too complex to save Very large schedules are rejected on save as too complex to compile. The reason is worth knowing because it is not obvious. A rule with **except dates** cannot be expressed as one range: skipping Christmas Day turns "all of this year" into "1 January to 24 December, or 26 to 31 December". Each excluded date splits the range again, and the pieces multiply when combined with other rules. A handful of holidays is fine. A year of public holidays across five countries in one rule is not. ## Working around it Split the intent across several simpler rules rather than one elaborate one. Use several playlists where the excluded dates differ by region. A rule per country in one playlist is exactly the shape that explodes, while a playlist per region, each targeting that region's [label](/docs/labels/), stays small and is easier to read besides. Reach for a date range instead of exceptions where you can. "Closed for two weeks in August" is one gap, not fourteen except dates. ## Where the limit comes from The schedule is compiled to a small program that runs on the device, and the device has a fixed ceiling on how large that program can be. The cap exists so a schedule cannot be built in the dashboard that a screen then fails to run. --- # Predicates Source: https://www.screenly.io/docs/scheduling/advanced/predicates/ > The expression underneath every schedule. What the dashboard generates, and what to write when building a schedule through the API. Every playlist has a **predicate**: a boolean expression that is true when the playlist is eligible to play. The rule editor is a friendly way to write one, and the schedule you build there is compiled into it. You only need this when building schedules through the [API](/docs/developers/api/) or the [CLI](/docs/developers/cli/). ## The evaluation model The predicate lives on the device and is evaluated continuously against the current moment, in that screen's local time. Nothing is polled and nothing waits for a sync: when the expression becomes true, the playlist becomes eligible. The simplest predicate is `TRUE`, which is what a playlist with no rules carries. ## The variables | Variable | What it holds | | --- | --- | | `$TIME` | Milliseconds since local midnight, so 08:00 is `28800000` | | `$DATE` | A calendar day as an epoch timestamp in milliseconds | | `$WEEKDAY` | Day of week, 0 for Monday through 6 for Sunday | ## The operators `$DATE` takes `<=`, `=`, and `>=`. `$TIME` takes `<=`, `>=`, and `BETWEEN {start, end}`, which is inclusive at both ends. `$WEEKDAY` takes `IN {…}` and `NOT … IN {…}`. Expressions combine with `AND` and `OR`, where `AND` binds more tightly than `OR`. ## What the dashboard generates A schedule compiles to a chain opening with a literal: ```text TRUE AND ($WEEKDAY IN {0, 1, 2, 3, 4}) AND ($TIME BETWEEN {28800000, 61200000}) ``` That is weekdays, 08:00 to 17:00. Several rules become an `OR` chain of such groups, since any one rule matching is enough. ```text FALSE OR (...) OR (...) ``` Anything expressible in that shape can be read back into the rule editor. Anything else shows as read-only. See [Complex schedules](/docs/scheduling/advanced/complex-schedules/). ## Writing one Through the CLI, when creating a playlist: ```bash screenly playlist create "Office Hours" 'TRUE AND ($WEEKDAY IN {0, 1, 2, 3, 4})' ``` Through the API, as a string field on the playlist. > [!NOTE] > Check the [v4.1 API reference](https://developer.screenly.io/api_v4_1/) for the playlist schema before writing predicates by hand. ## A caution A predicate written by hand is a schedule nobody can edit in the dashboard, and one that no warning will tell you never matches. If the rule editor can express what you want, use it. --- # Common patterns Source: https://www.screenly.io/docs/scheduling/overview/common-patterns/ > Office hours, dayparting, campaigns that expire, holidays, and the weekend exception. How each one is actually built. Most schedules are one of these. ## Office hours One rule: **Weekdays**, **07:00 to 19:00**. Outside that window the playlist is not eligible, so the screen shows whatever else is assigned, or nothing. ## Dayparting Different content at different times of day, built with **several playlists rather than one schedule**. A breakfast playlist scheduled 06:00 to 11:00 and a daytime playlist scheduled 11:00 to 18:00 hand over between themselves. The screen needs no telling. Each playlist is eligible during its own window, and the screen plays what is eligible now. Leave no gap unless you want one: a screen with nothing eligible has nothing to show. ## A campaign that expires One rule with a **start and end date**. The playlist begins and stops on its own, with nobody remembering to turn it off. This is the fix for the campaign label that never gets removed. Put the dates in the schedule and the problem solves itself. ## Different hours at the weekend Two rules, not one: | Rule | Days of week | Time of day | | --- | --- | --- | | 1 | Weekdays | 07:00 to 19:00 | | 2 | Weekend | 10:00 to 16:00 | One playlist, one set of content, two windows. See [Combining rules](/docs/scheduling/rules/combining-rules/). ## Skipping holidays Add the holiday dates as **except** dates on the rule. The playlist keeps its range and skips those days. Worth knowing: each except date splits the range into more pieces, so a long list of them can make a schedule too complex to save. A handful is fine; a year of public holidays across five countries is not. See [Complex schedules](/docs/scheduling/advanced/complex-schedules/). ## Something that has to interrupt everything That is not a schedule question. A **priority** playlist takes the screen exclusively while its schedule is active. See [Priority override](/docs/playlists/playback/priority-override/). ## An announcement at the same moment everywhere Schedules run in each screen's local time, so a 09:00 rule fires at 09:00 in each city rather than simultaneously. For a synchronised moment, set every screen involved to the same time zone. See [Time zones](/docs/scheduling/time/time-zones/). --- # How scheduling works Source: https://www.screenly.io/docs/scheduling/overview/how-scheduling-works/ > A schedule is a list of rules on the playlist. What it can restrict, what happens with no rules at all, and what it does not decide. A schedule belongs to the playlist, not to the screen. Assign that playlist to five screens and all five inherit its timing, each evaluating it against its own local clock. There is no separate schedule object to create and attach. The **Schedule** tab on the playlist is the whole thing. ## What a rule can restrict Three things, and a rule can set any combination of them. - Dates: a start, an end, or both, plus individual dates to skip. - Time of day: all day, or specific hours. - Days of week: individual days, or the presets Every day, Weekdays, and Weekend. Anything you leave alone stays unrestricted. See [Writing a rule](/docs/scheduling/rules/writing-a-rule/). ## With no rules at all A playlist with no rules is **Always active**: eligible whenever it is assigned. That is what a new playlist starts as, and it is the right answer for the single playlist a screen shows all day. Adding a rule narrows that. It never widens it. ## What a schedule does not decide - Whether the playlist plays at all. A disabled playlist never plays, whatever its schedule says. - Which screens it reaches. That is the [Screens tab](/docs/playlists/where-it-plays/assign-to-screens/), a separate question. - What happens when two playlists are eligible at once. The screen plays both, in alphabetical order by title, unless one is a priority playlist. See [When several playlists are eligible](/docs/playlists/playback/when-several-are-eligible/). ## When it takes effect Saving a schedule sends it to every assigned screen on its next check-in, and the screen stores it locally. From then on the screen evaluates the schedule itself, with no network involved, which is why scheduled content still changes on time through an outage. --- # Combining rules Source: https://www.screenly.io/docs/scheduling/rules/combining-rules/ > Inside one rule everything must match. Across rules, any one is enough. That is the whole model. ## Inside a rule Everything has to match at once. Weekdays **and** 09:00 to 17:00 gives you office hours, and neither half plays on its own. ## Across rules The playlist plays whenever **any** rule matches. Rules do not narrow each other; each one is its own independent window. That is the entire model. There are no operators to pick, no groups to nest, and no ordering between rules. ## Different hours on different days The main reason to have more than one rule. | Rule | Days of week | Time of day | | --- | --- | --- | | 1 | Weekdays | 07:00 to 09:00 | | 2 | Weekend | 10:00 to 16:00 | One playlist, two windows. The alternative is two playlists holding the same content, and remembering to change both. ## The mistake to avoid An **unrestricted rule sitting alongside others** makes them pointless. It already matches all the time, so the narrower rules add nothing and the playlist simply always plays. This happens when someone adds a rule to experiment, leaves every section untouched, and forgets it. The editor warns you when a schedule is in that state, and the warning is worth believing. ## When to use two playlists instead Combining rules keeps one playlist on one set of content. If the **content** differs between the two windows, that is two playlists, not one schedule. Same content at different times is one playlist with several rules. Different content is different playlists. --- # Reading the rule list Source: https://www.screenly.io/docs/scheduling/rules/reading-the-rule-list/ > The four rule statuses, why they are worked out across every time zone, and the summary that describes the whole schedule. Each rule in the list carries a status. | Status | Meaning | | --- | --- | | Active | Matching now, somewhere | | Pending | Its window has not started yet | | Expired | Its window has passed | | Never plays | The combination can never match | ## Why "somewhere" Screens run on their own clocks, so a rule can be active in Singapore and finished in San Francisco at the same instant. The statuses are worked out across every time zone rather than yours. A rule is only **Expired** once it has passed everywhere in the world, and stays **Pending** only while it is still ahead everywhere. That is deliberately conservative: it will not tell you something has finished while a screen somewhere is still playing it. See [Time zones](/docs/scheduling/time/time-zones/). ## Never plays The rule contradicts itself, and it is a warning rather than a save error, so a rule can sit there doing nothing until somebody notices. The usual causes: except dates that cover the whole range, a Wednesday-only rule inside a range that contains no Wednesday, or a time window that ends before it starts. The list shows these warnings without you opening each rule. ## The effective schedule summary Above the list, a plain-language description of what all the rules add up to. Read it before saving. Each rule can be individually correct while the set of them is not, and this is the only place that shows the combination. A playlist meant to run on weekday mornings that summarises as "always active, on every screen, every day" has an unrestricted rule in it somewhere. ## When nothing can match If no rule can still match, the list says so directly: the playlist will never play. Usually that means every rule has expired, and the playlist wants either new dates or [disabling](/docs/playlists/managing/enable-and-disable/). --- # Writing a rule Source: https://www.screenly.io/docs/scheduling/rules/writing-a-rule/ > The three sections of a rule: dates, time of day, and days of week. What each accepts and what leaving one alone means. On a playlist's **Schedule** tab, choose **Add a rule**. A rule has three sections. ## Dates **Any date**, or a start and an end. You can also add **except** dates: individual days the rule skips. Holidays, a shutdown week, a day the building is closed. Leaving this as Any date means the rule has no start and no end. ## Time of day **All day**, or **specific hours** with a start and an end. A time window is inclusive at both ends, and it cannot end before it starts. The editor refuses to save one that does. ## Days of week Individual days, or the presets **Every day**, **Weekdays**, and **Weekend**. A rule has to include at least one day. Deselecting them all is refused rather than silently producing a rule that never matches. ## Leaving a section alone Anything you do not restrict stays unrestricted, which is the thing most likely to surprise you. A rule that only sets 09:00 to 17:00 means those hours **on every day, forever**. If you meant weekdays, say weekdays. The rule does not infer it. ## The summary under the rule As you edit, the dialog shows what the rule means in plain language. Read it before saving. It catches the case where every field is individually right and the combination is not. ## Saving Rules are not live until you save the playlist. Once saved, they reach every assigned screen on its next check-in. --- # Clock accuracy Source: https://www.screenly.io/docs/scheduling/time/clock-accuracy/ > A schedule is only as good as the clock evaluating it. How screens get the time, and the one case where a player comes back wrong. Screens evaluate their schedules locally, against their own clock. A screen whose clock is wrong runs your schedule at the wrong time, and nothing in the dashboard looks broken while it does. ## How a screen gets the time Over the network, from a time server, using NTP on UDP port 123. That is why NTP appears in the [network checks](/docs/screens/monitoring/health-and-diagnostics/) on a screen's Details tab, and why a failing time check is reported as a scheduling problem rather than a networking curiosity. If outbound NTP is blocked, point the screens at an internal time server instead. See [Configure time servers](/docs/screenlyos/networking/guides/configure-time-servers/). ## The Raspberry Pi has no battery clock A Raspberry Pi based [Screenly Player](/docs/screenly-players/) has no hardware real-time clock, so it does not keep time while powered off. On boot it has no idea what time it is until it reaches a time server. Normally that is a few seconds and nobody notices. It matters when a player **reboots while the network is down**: it comes back with no reliable time and cannot evaluate schedules correctly until the connection returns. The [Player Max](/docs/screenly-players/) has a real-time clock and keeps the correct time through a reboot with no network at all. That is a genuine reason to prefer a Player Max on a site where power is less reliable than it should be. ## When the clock breaks more than scheduling A clock wrong by more than a few minutes also breaks TLS, because certificates are only valid between two dates. A device that thinks it is 2019 cannot connect to us at all, and presents as a screen that will not come online rather than as a clock problem. See [Common setup issues](/docs/screens/setup/setup-issues/). ## Checking a screen's time A screen's Overview tab shows its **local time**. That is the fastest check when scheduled content appears at the wrong hour: compare it against what the clock on the wall next to it says. A screen an hour out is usually in the wrong time zone rather than genuinely wrong. See [Time zones](/docs/scheduling/time/time-zones/). --- # Time zones Source: https://www.screenly.io/docs/scheduling/time/time-zones/ > Every screen evaluates its schedule against its own local time, so 9am means 9am in each city. How to change a screen's time zone, and when not to. Every screen evaluates its schedule against its own local time. Schedule a playlist for 09:00 and it starts at 09:00 in each city it is assigned to, not simultaneously everywhere. For most signage that is exactly right, and it means you do not think about time zones at all. ## Where a screen gets its time zone From its setup. A screen keeps that time zone until you change it, and you can change it if the screen moves. ## When you want the opposite Occasionally the point is that everything happens at once: an all-hands, a countdown, a company-wide announcement timed to the minute. For that, set every screen involved to the same time zone. They then share one clock, and a schedule fires everywhere together regardless of where the screens are. Doing it per screen rather than globally means you can have both: a synchronised set for the announcement, and everything else still running on local time. ## Clocks have to be right A screen keeps its clock over the network, and a screen whose clock is wrong runs your schedule at the wrong time. See [Configure time servers](/docs/screenlyos/networking/guides/configure-time-servers/) if a screen cannot reach one. --- # Build your own Source: https://www.screenly.io/docs/apps/extending/build-your-own/ > An app is a web app plus a manifest. What you get from packaging it as an app rather than pointing a screen at a URL. If nothing in the store fits, build it. A custom app runs on Screenly like any other content, and the logic and the look are yours. ## What one is A standard web application, an `index.html` with its CSS and JavaScript, plus a `screenly.yml` manifest describing its name, its settings, and its secrets. ```text my-app/ index.html screenly.yml styles.css app.js ``` You write it the way you would write any web page. It runs in a browser on the player. ## Why bother, rather than pointing a screen at a URL Everything around the code. - Configuration in the dashboard. The manifest declares the fields, and a non-technical colleague sets it up without touching anything you wrote. - Secrets. An API key goes in encrypted and never appears in the page source. See [Settings and secrets](/docs/apps/setting-up/settings-and-secrets/). - Versioned deploys across a fleet, where one command updates every screen running it. - A CORS proxy, so apps can fetch from APIs that would otherwise block a browser request, with no proxy of your own to run. - Branding. The app reads your workspace logo and colors rather than having them hard-coded. If you need none of those, a web page is simpler and perfectly legitimate. ## The workflow ```bash screenly edge-app validate screenly edge-app run --generate-mock-data screenly edge-app deploy ``` Build locally, run against mock data without deploying, then deploy. It is non-interactive, so it drops into GitHub Actions or any other pipeline, and the whole app is plain text that commits cleanly to git. ## Where the detail is The manifest schema, the JavaScript API available to your app, the branding values, and the deploy model are all in [Edge apps](/docs/developers/edge-apps/) and at [developer.screenly.io](https://developer.screenly.io/edge-apps/). --- # Request an app Source: https://www.screenly.io/docs/apps/extending/request-an-app/ > What customers ask for is what gets built next. How to ask, and what makes a request more likely to land. There is a **Request App** button next to your apps, and you can also ask through the [support portal](https://support.screenly.io/hc/en-us/requests/new). ## What to include Say what you would put on screen and why, not just which product you want connected. "A Jira board" is a product; "the current sprint's blocked tickets, on a wall in the engineering area" is a use case, and the second is far more useful to us. Where it would run, and how many screens, helps too. So does saying whether it needs to be live to the minute or whether a refresh every few minutes is fine, because that changes what we would build. > [!NOTE] > A request is not a commitment. We review them all and prioritise by what customers across industries are asking for. If something you asked for is being built, we can tell you. ## While you wait Two things often cover the gap. A web page is the first. If the tool already has a display or kiosk view, point a screen at that URL. See [Web pages](/docs/content/web-pages/). Zapier is the second. If the data has to move rather than be displayed live, Zapier can push content into Screenly when something happens elsewhere. See [Going further](/docs/integrations/beyond/zapier-and-the-api/). --- # Secrets and where code runs Source: https://www.screenly.io/docs/apps/overview/secrets-and-where-code-runs/ > Why the same app runs on the device on one screen and on our servers on another. The deciding factor is whether the device can hold a secret. An app often needs a credential: an API token, a password, a private dashboard URL. Handing that to a screen is handing it to a computer standing in a public space, sometimes one you do not own. Where an app runs is decided by that, not by how capable the hardware is. ## A ScreenlyOS device can hold a secret Secrets are encrypted **to the individual device**, using a public key that device published when it was paired. A player with no key gets no secrets at all. The playlist a ScreenlyOS device receives therefore carries a secrets section only that device can decrypt. The plaintext exists nowhere else: not in the playlist as it travels, not in another device's copy, not in the dashboard. Decryption happens on the device and the key never leaves it. On a [Player Max](/docs/screenly-players/) that key lives in a Trusted Platform Module, a chip that holds it in hardware and will not surrender it even to someone with the device open on a bench. On other ScreenlyOS hardware it is a device-specific certificate on disk. Two properties follow, and they are the point: - A secret encrypted for one device cannot be decrypted on another, so stealing a player does not get you the fleet. - Nobody can read a secret back, including you. They are write-only once saved. See [Settings and secrets](/docs/apps/setting-up/settings-and-secrets/). That is possible because ScreenlyOS is ours end to end. The operating system is locked down, there is no shell to drop to, and no way to run something alongside the player that watches what it does. ## A browser cannot Screenly Anywhere runs as a web application on an operating system we do not control: an Android box, a smart display, a laptop somebody also uses for other things. In that environment, anything the page holds is reachable. Developer tools show the source, the storage and every request it makes. Another app on the device may be able to read what the browser stores. The person who owns the device is, quite reasonably, an administrator of it. So a credential delivered there is a credential disclosed. Not because Anywhere is badly built, but because a browser tab is not a place a secret can be kept from the person at the keyboard. ## What we do instead The playlist an Anywhere screen receives contains no secrets at all. There is no encrypted section, because there is nothing safe to put in one. Instead, the app runs on **our** infrastructure, where the credential can be used without being exposed, and the screen is sent an image of the result. The screen shows the right thing and it stays current. What it never receives is the token that produced it. ## What this buys beyond the secret Rendering on our side moves the whole execution out of the device, which tightens more than credential handling. The app has no access to the device's local network. It cannot reach anything on the network the screen sits on, which matters when that screen is in a customer's building or on a network you do not own. **It has no access to the device's filesystem** or to anything else running on it. **Requests come from our infrastructure**, not from the screen. An API restricted by IP address allows us, once, rather than every screen's changing address. That is a stricter isolation boundary than running locally, not a weaker one. ## The trade, stated honestly A screenshot is a picture. It refreshes on an interval rather than updating continuously, so anything that animates, or reacts to the moment rather than to the data, will not do so. For the content this affects, dashboards, calendars, news, menu boards, the difference is invisible: they are pictures of data that changes every few minutes anyway. For an app built around motion, run it on ScreenlyOS. ## The same reasoning elsewhere **Web pages** on Anywhere can be rendered either way, and the same logic applies to the choice. See [Displaying a web page](/docs/content/web-pages/displaying-a-web-page/). **Client certificates** are ScreenlyOS only for exactly this reason: the certificate is the device's identity, and an identity a browser tab could export is not an identity. See [Authenticated pages](/docs/content/web-pages/authenticated-pages/). **Tailscale** is ScreenlyOS only on the same grounds. Joining your private network is a capability you grant a device you trust. See [Reaching your private network](/docs/integrations/network/private-network-access/). ## Choosing with this in mind If an app carries a credential that matters, put it on ScreenlyOS. You get local execution and a hardware-backed secret in the same decision. If the content is public, or the app reads from something you are content to have rendered centrally, Anywhere is a perfectly good answer and costs you nothing you will notice. --- # What an app is Source: https://www.screenly.io/docs/apps/overview/what-an-app-is/ > A small program built for a screen, showing data that changes on its own. What separates it from a web page and from an uploaded file. An image is fixed once you make it. An app is the opposite: a small program that shows information which keeps changing, without anyone touching it. A dashboard that refreshes through the day, a calendar filling with the day's meetings, a weather panel, a news feed, a clock. You give it a few details and it stays current. ## Not just a web page You could point a screen at a URL and get something similar. Two things make an app different. An app is built to be shown rather than used. A web page is made for a person at a laptop: small text, menus, a layout that assumes someone is close enough to click. An app is laid out to fill a display and be read across a room, with nothing to interact with. An app is also packaged for configuration. It declares what it needs, so the dashboard gives you a form: which dashboard, which calendar, which city. A web page gives you a URL and leaves the rest to you. See [Web pages](/docs/content/web-pages/) for when a URL is the better answer, which is often, particularly for something you already built. ## An app plays like content To a screen there is nothing special about an app. It sits in a [playlist](/docs/playlists/) beside your images and videos, takes its turn, holds the screen for its slot, and hands over to the next item. It follows the same schedule rules and plays on the screens you choose. You manage it under **Apps**, not in **Content**. Everything you know about playlists and scheduling still applies. ## What it costs Nothing beyond your subscription. Apps are included on every plan, however many you use. ## Categories in the store The store groups apps into Utilities, Productivity, News, Dashboards, Just For Fun, Messaging & Content, HR, and Finance, with an **Other** bucket for anything uncategorized. Several of the news apps are the same underlying reader pointed at a different publication, so if the feed you want is not listed, the RSS Reader takes any feed URL. --- # Where an app runs Source: https://www.screenly.io/docs/apps/overview/where-an-app-runs/ > On ScreenlyOS an app runs on the device. On Screenly Anywhere it renders on our servers, so no credential ever reaches the screen. Most of the time this does not matter. When an app behaves differently on one screen than another, this is usually why. ## On the device On ScreenlyOS the app runs on the player itself: real code in a real browser engine, refreshing on its own schedule, reacting to whatever it is showing. ## On our servers On Screenly Anywhere, the app runs on our infrastructure and the screen is sent an image of the result. That is a security decision rather than a capability one. Anywhere runs as a web application on an operating system we do not control, and anything a browser tab holds is readable by whoever has the device. So the playlist an Anywhere screen receives carries **no secrets at all**: the app runs where its credential can be used without being exposed, and the screen gets a picture. The screen still shows the right thing and it still stays current. What it never receives is the token that produced it. [Secrets and where code runs](/docs/apps/overview/secrets-and-where-code-runs/) explains the mechanism, and why client certificates and private network access follow the same rule. ## What this means in practice A dashboard, a calendar, a news feed, a menu board all look the same either way, because they are pictures of data that changes every few minutes. An app with motion in it, or one that reacts to the second, wants a device that runs it locally. See [Supported platforms](/docs/anywhere/overview/supported-platforms/) for what each platform does. --- # Connected services Source: https://www.screenly.io/docs/apps/setting-up/connected-services/ > Connect Salesforce, Power BI, Grafana, Airtable, a calendar or Slack once, and apps that use it stop asking for tokens. Some apps read from a service that needs a login. Rather than pasting a token into every app, you connect the service once for the workspace and the apps use that connection. ## What changes An app backed by a connected service shows you **your own things** instead of a credential field. The Power BI app offers your reports; the Grafana app offers your dashboards; a calendar app offers your calendars. The access token itself is handled behind the form and never rendered. There is nothing to copy, nothing to paste, and nothing to rotate by hand in each app. ## Which services Salesforce, Airtable, Power BI, Grafana, Google Calendar, Outlook Calendar, and Slack. Connect them under **Settings**, then **Integrations**. Owners and Admins can connect them, and the connection is then available to everyone in the workspace. See [Connecting an integration](/docs/integrations/overview/connect-and-disconnect/). ## When an app stops showing data Usually the connection rather than the app. A revoked authorization, a rotated credential on the provider's side, or an expired grant all present the same way: the app installs fine and shows nothing. Check the integration first, before reinstalling the app. ## When there is no integration An app can still ask for a credential directly, as a [secret](/docs/apps/setting-up/settings-and-secrets/). That is the right route for a service we do not have a built-in connection to. --- # Install an app Source: https://www.screenly.io/docs/apps/setting-up/install-an-app/ > Pick one from the store, name it, fill in its settings, and it appears under Apps. ## Finding one Open **Apps** and go to the **App store**. Browse by category, or search. Every app shows what it displays. Opening one gives you its detail page, with its author, its version, and what it needs from you. You can also browse the [full catalogue on our site](/apps/) before signing in. ## Installing 1. Open the app and choose **Install**. 2. Give it a name. This is what you will look for under **Apps** later, so name it for what it shows rather than what it is: `Frankfurt weather` beats `Weather`. 3. Fill in its settings. What you see depends on the app: a location for weather, a dashboard for a business intelligence tool, sometimes nothing at all. 4. Choose **Install** again. It appears under **Apps**. It does not appear in **Content** with your images and videos. ## Naming matters more than it looks The name is the only thing distinguishing two instances of the same app in a playlist editor. A workspace with `Weather`, `Weather (1)` and `Weather (2)` in it will eventually put the wrong city on the wrong wall. Name for the configuration, not the app: `Frankfurt weather`, `Plant 2 throughput`, `Reception calendar`. ## What happens next The app is ready for a playlist from here. Add it to a [playlist](/docs/playlists/building/add-and-order-content/), give it a duration, and assign the playlist to screens. Give it a generous duration. An app fetching live data has to load before it can show anything, so a dashboard on screen for ten seconds may spend most of that loading. Thirty or forty seconds is more realistic. See [How long things play](/docs/content/overview/how-long-things-play/). --- # Settings and secrets Source: https://www.screenly.io/docs/apps/setting-up/settings-and-secrets/ > The kinds of field an app can ask for, and why anything sensitive belongs in a secret rather than a setting. An app declares what it needs and the dashboard renders a form from it. That is why setup is a few fields rather than a configuration file. ## The kinds of field | Type | What it is | | --- | --- | | Text | A single line | | Text area | Several lines | | Number | A numeric value | | URL | A link, validated as one | | Yes or no | A toggle | | Select | A list of choices | | Date and time | A picker | | Image | An upload, for a logo or a background | | Secret | A sensitive value, write-only once saved | The image field matters more than it sounds. An app that needs a logo used to require hosting the file somewhere and pasting a URL; now it takes an upload. Some apps also expose fields backed by a connected service, which become dropdowns of your own dashboards or calendars rather than fields you fill in by hand. See [Connected services](/docs/apps/setting-up/connected-services/). ## Secrets A secret is for anything that should not be readable afterwards: an API token, a password, a private URL. Store credentials as secrets rather than settings. An ordinary setting is visible to anyone with access to the workspace, and a secret is not, including to administrators. ### How a secret is protected It is encrypted as soon as you save it, and never stored in plain text. It reaches the device still encrypted, and only the device that owns that app instance can decrypt it. The decryption key never leaves the device. On a **Player Max**, decryption uses the device's Trusted Platform Module: a dedicated chip holding the key in hardware, bound to that physical device and not extractable even with direct access to its storage. On other hardware, it uses a device-specific certificate on disk, so a secret encrypted for one device cannot be decrypted on another. ### Write-only > [!IMPORTANT] > Once saved, a secret cannot be read back, through the dashboard or the API. You can overwrite it; you cannot retrieve it. If you lose the value, regenerate the credential in the service it belongs to and save the new one. ## Apps are isolated from each other Each app runs in a sandbox and cannot read the files, settings, or secrets of another app on the same device. One compromised app has no path to another's data. Where an app is rendered on our infrastructure rather than on the device, isolation is stricter still: it has no access to the device's local network or filesystem at all. See [Where an app runs](/docs/apps/overview/where-an-app-runs/). --- # Branding in apps Source: https://www.screenly.io/docs/apps/using/branding/ > Apps pick up your workspace logo and colors automatically. Set them once and every app follows. Apps read your workspace branding when they load, so they show your logo and your colors rather than generic defaults. Set once, at the workspace level. There is no branding to configure per app. ## Setting it Under **Settings**, then **Workspace**, in the branding section. You upload a light logo and a dark logo, and set three colors: accent, light, and dark. Two logos, because backgrounds vary and a logo with dark lettering disappears on a dark background. See [Name and branding](/docs/workspaces/settings/name-and-branding/). ## Before you set it If you have not uploaded anything, we attempt to detect your brand from your domain. That means a newly installed app often looks approximately right straight away. Approximately is the operative word. It is a guess from public information, so check it before assuming it is what you want on a wall. ## For developers A custom app can read the same branding values, so an app you build yourself matches everything else without you passing colors in as settings. The available values are in the [developer documentation](https://developer.screenly.io/edge-apps/#global-branding-settings). --- # Instances Source: https://www.screenly.io/docs/apps/using/instances/ > One app, many configurations. The same weather app can run three times with three cities, and each is a separate item. Installing an app creates an **instance**: the app plus your settings. The instance is what goes in a playlist, not the app itself. One app can have as many instances as you need. The same weather app runs three times with three cities; the same dashboard app runs against three different reports. ## Where they live Your instances are listed under **Apps**, separate from the store you install them from. They do not appear in **Content** with your images and videos. Search and the **Recently added** grouping both work on that list, which starts mattering around the point you have a dozen. ## Editing one Open the instance and change its settings. Everything showing it follows on the next sync, exactly like editing any other content. Editing an instance changes it **everywhere it is used**. If two screens should show the same app configured differently, that is two instances, not one edited back and forth. ## Different app, same idea This is the same relationship content has with playlists. An instance lives under **Apps**; the playlist references it. Deleting a playlist leaves the instance alone. ## Removing one **Delete app** removes the instance. It comes out of every playlist that used it, on every screen, on the next sync. Deleting an instance does not uninstall anything from a device and does not affect other instances of the same app. It also does not touch the connected service it was reading from. --- # Licenses and billing in a group Source: https://www.screenly.io/docs/workspaces/linked-workspaces/licenses-and-billing/ > Where the pool is visible, what a child can and cannot do, and how to find out who is holding the licenses. ## Where to look Both the parent and its children see the pool, on the billing page: total, assigned, and available, plus a table of every workspace sharing it. In the **parent**, the assigned count includes screens in every child, not just its own. A parent showing more assigned licenses than it has screens is normal and is the point of the arrangement. See [The license pool](/docs/billing/licenses/the-license-pool/) for what each counter means. ## What a child can do See the pool, and connect screens against it while licenses are available. ## What a child cannot do Change the subscription, the plan, the screen count, or the payment method. Its billing page carries a banner saying billing, payment methods, and subscription management are handled by the parent, and there is no button. To change anything, switch to the parent workspace. ## Running out The pool is shared and first come, first served. There is no per-child quota and no reservation, so one region rolling out fifty screens can leave another unable to connect one. Two consequences worth planning around. Tell the parent before a large rollout, not during it. And when the pool is full, the fix is either buying more licenses at the parent or [disabling](/docs/screens/managing/enable-and-disable/) screens somewhere, since nothing can be reallocated. ## Finding out who is holding them The workspaces table sorts by licenses used, and **Export** gives you a CSV with each workspace's name, domain, licenses used, and its role in the group. That export is the useful artefact when asking teams to give some back. Sorted by licenses used, it names the two workspaces holding most of them in about ten seconds, which is a better conversation than an all-round request. --- # Setting up a group Source: https://www.screenly.io/docs/workspaces/linked-workspaces/setting-up/ > Creating a child, linking it to the parent, unlinking, and the one case the dashboard cannot handle. ## Creating a child From the **workspace switcher**, choose to create a new workspace and name it. You become its Owner. A workspace created this way starts with no subscription of its own, which is exactly what you want: it is about to draw on the parent's. ## Linking it From the **parent** workspace: 1. Go to **Settings**, then **Linked workspaces**. 2. Choose **Link workspace**. 3. Select the workspace and confirm. It appears in the parent's list and starts drawing on the shared pool immediately. ## The case the dashboard cannot handle > [!IMPORTANT] > A workspace that **already has its own subscription** cannot be linked from the dashboard. That includes any workspace someone set up and paid for separately, which is the common real-world case. > > [Contact support](https://support.screenly.io/hc/en-us/requests/new) and we will do it. Expect to say which workspace becomes the parent and what should happen to the existing subscription. Plan for this if you are consolidating workspaces that grew up independently. It is not a self-service migration. ## Order of operations Link **before** connecting screens in a child, not after. A child with its own subscription and screens already running is the awkward case above. A child created empty and linked immediately is a two-minute job. ## Unlinking From the same page, through the workspace's row menu. The workspace stops drawing on the parent's pool. It does not become free: it needs a subscription of its own, and its screens stop when it has neither. Arrange the new subscription before unlinking rather than after. ## Who can do this Owner or Admin of the parent. See [Roles and permissions](/docs/workspaces/people/roles-and-permissions/). --- # What linked workspaces are Source: https://www.screenly.io/docs/workspaces/linked-workspaces/what-they-are/ > One subscription and one license pool across several workspaces, with everything operational still separate. Linking solves one specific problem: an organization that genuinely needs separate workspaces, and does not want separate subscriptions. A **parent** holds the subscription, the payment method, and the license pool. **Children** draw licenses from that pool and are otherwise ordinary workspaces. ## What is shared - The subscription: one plan, one payment method, one invoice. - The license pool: a license a child is not using is available to another child, and nothing is allocated in advance. That is the whole list. ## What is not shared Everything else. Screens, content, playlists, labels, and members all stay inside their own workspace, exactly as they would if the workspaces were unrelated. Linking is a **billing** relationship, not an access one. Being the parent gives you the invoice, not a way into a child's screens: to see a child's screens you have to be a member of that child. That surprises people, so it is worth stating plainly. A parent Owner is not automatically an Owner of the children. ## When it fits A group where the workspaces must stay separate but the money should not: Regions or brands that should not see each other's screens, under one finance function. A franchise operation. An organization whose facilities each run their own signage. An agency with a client per workspace, billing centrally. ## When it does not Teams who should collaborate are the common mistake. If the reason for splitting was access, and it turns out they need each other's content, they wanted one workspace with [labels](/docs/labels/) rather than two linked ones. Sharing content across the group is not something linking does. A [shared playlist](/docs/workspaces/reference/sharing-between-workspaces/) does, and it works between any two workspaces whether or not they are linked. Cost saving on its own is not a reason either. Licenses cost the same in a pool, so what you gain is one invoice and licenses that move without a purchase, rather than a discount. ## Availability Enterprise, on both sides. --- # Working across a group Source: https://www.screenly.io/docs/workspaces/linked-workspaces/working-across-a-group/ > Moving between workspaces, moving a screen, and getting the same content onto screens in several of them. Linking changes billing. Day to day, the workspaces behave exactly as they did before, which is what most of this page is about. ## Moving between them The workspace switcher, and the [lobby](/docs/account/signing-in/the-lobby/) when you sign in. You only see the workspaces you are a member of, so being an Owner of the parent does not put the children in your list. If you administer the whole group, you have to be a member of each one. That is deliberate, and it means adding somebody to the group is still a per-workspace invitation. ## Moving a screen between them Supported, with the usual caveats: you need Owner or Admin in both, settings come across, **playlist assignments do not**, and the screen arrives disabled. Linking does not change any of that. See [Move a screen to another workspace](/docs/screens/managing/transfer-a-screen/). The license side is simpler in a group, though. Both workspaces draw on the same pool, so moving a screen does not free a license in one place and consume one somewhere it might not be available. ## Getting the same content into several workspaces This is the thing people expect linking to solve, and it does not. Use a [shared playlist](/docs/workspaces/reference/sharing-between-workspaces/). One workspace owns the content, shares the playlist, and each other workspace decides which of its own screens play it. Update it once and every workspace showing it follows. That works between any two workspaces on Enterprise, linked or not. It is the right tool for brand-controlled content across regions. ## What still has to be done per workspace Members and roles. Branding. Integrations. Notification destinations. Labels. None of these inherit from the parent. A new child is a blank workspace with a funded license pool, so budget setup time per workspace rather than assuming the group carries its configuration. --- # One account, many workspaces Source: https://www.screenly.io/docs/workspaces/overview/one-account-many-workspaces/ > Your account is your login and follows you everywhere. Switching between workspaces, and what a new one starts as. Your **account** is personal: your email address, your passkeys, your two-factor setup. A **workspace** is shared. You sign in with the account, then work inside a workspace. One account can belong to as many workspaces as you have been invited to or created. Each is entirely independent, and switching between them is like switching organizations. Signing in is an account concern; everything you then do is a workspace concern. See [Your account](/docs/account/). ## Switching Use the workspace switcher at the top of the sidebar. If you belong to more than one workspace, or have an invitation waiting, signing in lands you on a workspace picker first: a list to choose from, and a tab for pending invitations. With exactly one workspace and nothing pending, you skip it. See [The dashboard](/docs/get-started/overview/the-dashboard/). Each workspace also has its own address, so you can bookmark one directly and go straight there. You still have to be a member. ## Creating another From the workspace switcher, choose to create a new workspace. You become its Owner. A new workspace starts empty and, in most cases, without a trial: the free trial is once per person, so if you already belong to a workspace, or have a pending invitation to one, a workspace you create afterwards does not come with another. See [Free trial](/docs/get-started/plans/free-trial/). ## Joining one If you sign up by following an invitation link, you join that workspace directly. No new workspace is created for you and no trial starts, because you are entering someone else's workspace rather than starting your own. ## Leaving one Remove yourself from the members list. Your Screenly account is untouched and your other workspaces are unaffected. The Owner cannot do this. Ownership has to be transferred first. See [Managing members](/docs/workspaces/people/manage-members/). --- # What a workspace is Source: https://www.screenly.io/docs/workspaces/overview/what-a-workspace-is/ > An isolated container for screens, content, playlists and members. What isolation buys you, and what it costs. A workspace is a self-contained environment. Screens, content, playlists, labels, and members all belong to one, and none of it is visible from another. Isolation is the default and it is not adjustable. Knowing a workspace's address is not enough to reach it; you have to be a member. ## What that gets you It is the only real access boundary in Screenly. A contractor working on one site cannot see screens at another. A regional team cannot touch head office displays. A hospital technician cannot reach another facility's screens. This matters because [roles](/docs/workspaces/people/roles-and-permissions/) do not do this job. Every member of a workspace sees every screen, playlist, and piece of content in it, whatever their role. Roles decide who can change **members and billing**, not who can see which screens. > [!IMPORTANT] > If some people must not see some screens, that is a separate workspace. There is no per-screen or per-playlist permission, and no role that provides one. ## What it costs Isolation cuts both ways, and the costs are worth knowing before you split things up. - Content does not move between workspaces. The same video in two workspaces is two uploads. - Labels mean nothing across the boundary. A `reception` label in one workspace has no relationship to a `reception` label in another. - There is no cross-workspace search. Finding a screen means knowing which workspace it is in and looking there. **A screen moved between workspaces loses its playlist assignments** and arrives disabled. See [Move a screen to another workspace](/docs/screens/managing/transfer-a-screen/). Two deliberate exceptions exist: a [shared playlist](/docs/workspaces/reference/sharing-between-workspaces/) can cross the boundary in one direction, and [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) share billing and a license pool while staying operationally separate. ## How many you need Most organizations want one. Splitting is a real cost and should answer a real question. Split when different people must not see each other's screens, when separate legal entities need separate billing, or when an agency runs screens for unrelated clients. Do not split by content type, by campaign, or because a fleet feels large. [Labels](/docs/labels/) organize a fleet inside one workspace far better than workspaces do, and without any of the costs above. --- # Invite members Source: https://www.screenly.io/docs/workspaces/people/invite-members/ > Invitations go by email, carry a role and an optional expiry date, and can be resent or cancelled while pending. Under **Settings**, then **Members**, in the **Invitations** section. Choose **Invite member**. You give an email address, a role, and optionally an **Active until** date. Owner and Admin can invite; nobody else sees the section. ## What the invitee gets An email with a link. Following it and signing in adds them to this workspace directly. No new workspace is created for them, and no free trial starts. Invitations come from **hello@screenly.io**. If one has not arrived, that is the address to look for in a spam folder, or to have IT allow. ## The role Choose from **Admin**, **Billing Manager**, or **User**. It defaults to User, which is the right answer more often than not, and it can be changed later without re-inviting. Owner is not an invitable role. Ownership moves by transfer, to somebody who is already a member. See [Managing members](/docs/workspaces/people/manage-members/). An Admin doing the inviting can only offer Billing Manager or User. ## Active until An optional date after which their access ends automatically. See [Temporary access](/docs/workspaces/people/temporary-access/). ## Pending invitations The section lists everything not yet accepted, and lets you **resend** or **cancel**. An invitation that has passed its window shows as **Expired**; send a fresh one. Cancelling an invitation is instant and takes nothing away from anyone, since an unaccepted invitation grants nothing. ## Seat limits On **Starter**, a workspace has two seats. Above it, unlimited. Creating an invitation is refused if it would take you past the limit, so free a seat first, or move up a plan. Disabled members do not count. See [Plans for Screenly](/docs/get-started/plans/plans-for-screenly/). --- # Manage members Source: https://www.screenly.io/docs/workspaces/people/manage-members/ > Change a role, disable somebody without removing them, remove them entirely, and transfer ownership. The members list is under **Settings**, then **Members**. Each row has a menu. ## Change a role Pick the new role and save. It applies immediately, and nothing they made is affected. You cannot change the Owner's role from here, cannot change someone holding the same role as you, and cannot change your own. An Admin can only assign Billing Manager or User. ## Disable An access switch, not a deletion. A disabled member cannot sign in to the workspace, and everything they made stays exactly where it is. Re-enabling is immediate: no new invitation, and no waiting for them to accept one. This is the right action for somebody on leave, a contractor between phases, or anybody whose access should stop today and may resume. It also frees a seat on Starter, where disabled members do not count against the limit. Status is colour-coded in the list: green for active, orange with a date for a member whose access expires, red for disabled. ## Remove Revokes access immediately and takes the person out of the workspace. Their Screenly account is untouched and their other workspaces are unaffected. You can remove yourself, unless you are the Owner. Disabling is usually the better first move. It is reversible in one click; removing means a fresh invitation and waiting for them to accept. ## Transfer ownership There is exactly one Owner, so transferring means giving it up. 1. Open the member's row menu and choose **Change role**. 2. Select **Owner**. 3. Type the workspace name to confirm. The confirmation step is deliberate, because the action cannot be reversed by you afterwards. Your own role becomes Admin, and only the new Owner can transfer it back. > [!IMPORTANT] > Do this before somebody leaves, not after. Recovering a workspace whose Owner is gone takes two to five days of identity verification, with no guaranteed maximum. See [Support PIN and account recovery](/docs/account/support/support-and-recovery/). --- # Roles and permissions Source: https://www.screenly.io/docs/workspaces/people/roles-and-permissions/ > Four roles: Owner, Admin, Billing Manager, User. What each can do, and the thing roles deliberately do not control. Every member has one role, set when they are invited and changeable at any time without re-inviting them. | | Owner | Admin | Billing Manager | User | | --- | :---: | :---: | :---: | :---: | | Screens, content, playlists, apps | Yes | Yes | Yes | Yes | | Billing and subscription | Yes | Yes | Yes | No | | Invite, remove, and change members | Yes | Yes | No | No | | Workspace settings | Yes | Yes | No | No | | Create another Admin | Yes | No | No | No | | SAML single sign-on | Yes | No | No | No | | Transfer ownership | Yes | No | No | No | ## What roles do not control Roles have nothing to do with which screens you can see. Every role sees every screen, playlist, and piece of content in the workspace, and there is no per-screen or per-playlist permission. What differs is who can change **members**, **billing**, and **workspace settings**. If the requirement is that some people must not see some screens, the answer is a separate [workspace](/docs/workspaces/overview/what-a-workspace-is/). ## Owner Exactly one per workspace, and it is whoever created it. The Owner can do everything, and two things only the Owner can do: **assign the Admin role**, and **configure SAML single sign-on**. Ownership should sit with someone permanently in the organization, not a contractor or a consultant. Recovering a workspace whose Owner has left and whose mailbox is closed is an identity verification process that takes days. See [Support PIN and account recovery](/docs/account/support/support-and-recovery/). ## Admin Everything the Owner can do except transferring ownership, configuring SAML, and creating other Admins. An Admin managing members can only assign **Billing Manager** or **User**. Promoting somebody to Admin requires the Owner. Right for IT managers and operations leads who need to run the whole deployment. ## Billing Manager A User, plus billing. They can manage screens, content and playlists, and can also handle the subscription, licenses, and invoices. They cannot invite or remove members, or change workspace settings. Right for finance or operations people who own the subscription alongside ordinary work in the workspace. ## User Screens, content, playlists, and apps. No billing, no member management, no workspace settings. The default when inviting somebody, and the right answer for most people: a communications lead refreshing lobby displays, a supervisor updating an operations screen. ## Changing a role Roles change from the members list and take effect immediately. Nothing a person made is affected: content, playlists, and screens they created stay exactly as they are. Three things you cannot do, whatever your role: change the Owner's role directly, change somebody who holds the same role as you, or change your own. --- # Temporary access Source: https://www.screenly.io/docs/workspaces/people/temporary-access/ > Give somebody access that ends on a date you set, at invitation time or afterwards. Access expires on its own. **Active until** is a date after which a member's access ends automatically. It defaults to **Always**, meaning access does not expire. Set it when inviting somebody, or later from any member's row menu. The date has to be in the future, and access ends when that day ends. ## What it is for Anybody whose access has a known end: a contractor on a fixed engagement, an agency running a campaign, an auditor, a temporary member of staff, a supplier setting up a site. The reason it matters is that removing access is the step that gets forgotten. A date set now happens whether or not anyone remembers. ## What happens when it expires The member is disabled, not deleted. They cannot sign in to the workspace, everything they made stays where it is, and the seat is freed on Starter. Re-enabling later is immediate, with no new invitation. ## Seeing who is on a clock The members list colours status: green for active, **orange with a date** for a member whose access expires, red for disabled. A glance at the list is an access review. Worth doing that glance occasionally anyway. Members with **Always** and no obvious reason are the ones that accumulate. --- # Sharing between workspaces Source: https://www.screenly.io/docs/workspaces/reference/sharing-between-workspaces/ > Workspaces are isolated. A shared playlist is the one deliberate exception, on Enterprise. Workspaces are isolated by default: content and screens in one are invisible from another. That isolation is the point, and it is why a shared playlist is the single exception to it. ## What crosses the boundary A playlist, and only in one direction. The receiving workspace can put it on their screens and decide where it plays. They cannot change what is in it, and the content stays hosted by the workspace that shared it. So one team keeps control of the material while another decides where it appears. Update it once and every workspace showing it follows. That fits brand-controlled content across regions, a central team feeding local teams, or an agency running screens for a client. ## What does not cross Screens, content, labels, and members are all workspace-local. A label in one workspace means nothing in another, and there is no cross-workspace search. If two teams both need to edit the same thing, they want one workspace, or [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) if the reason for splitting them is billing rather than access. ## Doing it Sharing is a playlist action and needs Admin or Owner rights in both workspaces. See [Share with another workspace](/docs/playlists/managing/share-with-another-workspace/). Shared playlists are an Enterprise feature. --- # Name and branding Source: https://www.screenly.io/docs/workspaces/settings/name-and-branding/ > Rename the workspace, and set the logos and colors Screenly uses in place of its own. Workspace settings are under **Settings** in the main navigation, and the tabs are for Owners and Admins. Billing Managers reach Settings too, but only for the **Billing & Subscription** button on it. On the **Workspace** tab. ## Name What people see in the workspace switcher, and what appears in invitations. Rename it whenever; nothing depends on it. The name is also what you type to confirm a [transfer of ownership](/docs/workspaces/people/manage-members/), which is the one moment it matters. ## Branding Your logo and colors, held against the workspace so that where Screenly would show its own, it shows yours. You set **two logos** and **three colors**, because backgrounds vary: | Setting | Used on | | --- | --- | | Light logo | Dark backgrounds | | Dark logo | Light backgrounds | | Light color | Dark backgrounds | | Dark color | Light backgrounds | | Accent color | Highlighting important elements | ### Logo requirements SVG, PNG, WebP, or JPEG, no larger than **1 MB**. A bitmap must be exactly **512 by 512 pixels**. An SVG only has to be square. Use the SVG if you have one. It stays sharp at any size and is usually the smallest file. A PNG with transparency is the next best thing, since it sits correctly on both the light and dark backgrounds. ### Getting it right Upload the light and dark logos as an actual pair, not the same file twice. The point of having both is that a logo with dark lettering disappears on a dark background, and the failure is invisible until somebody sees the wrong one. Check the accent color for contrast rather than picking it straight from a brand palette. Brand accents are chosen for print and for large areas, and some are unreadable as small text. --- # Security settings Source: https://www.screenly.io/docs/workspaces/settings/security/ > What lives on the Security tab, who can reach each part of it, and what belongs to your account instead. Three things live on the **Security** tab, and they have less in common than the grouping suggests. | Section | What it is | Who can use it | | --- | --- | --- | | Tokens | API tokens for the API, CLI, and MCP server | Owner and Admin | | SAML SSO | Sign-in through your own identity provider | Owner only | | Tailscale on screens | Putting your screens on your private network | Owner and Admin | ## API tokens A token authenticates to the API, the CLI, and the MCP server, and carries the permissions of the account that created it. It is shown once and never again. See [API tokens](/docs/developers/overview/api-tokens/). ## SAML single sign-on Enterprise, Owner only. See [Single sign-on](/docs/workspaces/settings/single-sign-on/). ## Tailscale on screens Despite living under Security rather than Integrations, this is about what your **devices** can reach rather than what the dashboard connects to: it puts screens on your own Tailscale network so they can display internal dashboards and intranet pages. ScreenlyOS only. See [Reaching your private network](/docs/integrations/network/private-network-access/). ## What is not here **Passkeys and two-factor authentication** are personal, under your account settings rather than the workspace. They are how *you* sign in, and they work across every workspace you belong to. **Privacy mode** is per screen, on that screen's Actions tab, not a workspace setting. --- # Single sign-on Source: https://www.screenly.io/docs/workspaces/settings/single-sign-on/ > Connect your own identity provider over SAML so people sign in with your organization's account and your policies apply. SAML single sign-on puts Screenly behind your own identity provider. People sign in with the account they already have, and your rules on multi-factor, device posture, and session length apply without Screenly needing to know about any of them. Deprovisioning is the practical reason to bother. When someone leaves and you disable their account centrally, they lose Screenly along with everything else, rather than depending on somebody remembering to remove them from a workspace. SAML is an Enterprise feature. It is configured in your **workspace settings**, on the **Security** tab. ## Providers Any SAML 2.0 provider works. We have setup guides for Auth0, Okta, Microsoft Entra ID, and Google Workspace. ## Without SAML Everyone else signs in with a one-time email code, a passkey, or a Google, GitHub, or Microsoft account. Those are on every plan and need no setup. See [Signing in](/docs/account/signing-in/ways-to-sign-in/). --- # What an account is Source: https://www.screenly.io/docs/account/overview/what-an-account-is/ > A key ring, not a filing cabinet. Your account holds your identity and your workspace memberships, and nothing else. Your account holds your email address, how you sign in, and the list of workspaces you belong to. That is all it holds. Screens, content, playlists, labels, and apps do not belong to your account. They belong to [workspaces](/docs/workspaces/). ## Why the distinction matters Leaving an organization does not delete your account. If your membership of a workspace is removed, the account still exists and your other workspaces are untouched. Nothing you made in the workspace you left is affected either, because it belonged to the workspace rather than to you. Your settings follow you. Passkeys, two-factor, and your time zone are all personal, and all work in every workspace you belong to. Somebody else's account cannot be borrowed. There are no shared logins to hand over, because there are no passwords. Everyone gets their own account and is invited to the workspace. ## Account settings versus workspace settings Two different places, and this is the single most common reason for looking in the wrong one. | Yours, under your avatar menu | The workspace's, under Settings | | --- | --- | | Name, email, company, time zone | Workspace name and branding | | Passkeys and two-factor | API tokens, SAML, Tailscale | | Your personal support PIN | Members, integrations, notifications | --- # Your profile Source: https://www.screenly.io/docs/account/overview/your-profile/ > Name, email, company, and the time zone that decides how every date and time in the dashboard is shown to you. Under your avatar menu, on the **Account** tab. ## Profile First name, last name, and company. These identify you in the members list of every workspace you belong to, which is the practical reason to fill them in: a members list of email addresses is hard to read. ## Email Your email address is your identity. It is where one-time sign-in codes go, where invitations arrive, and how account merging works. Changing it requires confirming with a code sent by email, so you need access to the mailbox to make the change. > [!IMPORTANT] > Keep this an address you can actually reach. Passwordless sign-in and account recovery both depend on it, and a departed colleague's closed mailbox is what turns a five-minute change into a multi-day recovery process. ## Time zone Every date and time in the dashboard is shown and entered in this time zone, and the page shows your current local time so you can check it is right. This is **yours**, not the workspace's and not a screen's. Two people looking at the same playlist in different countries each see it in their own time. It does not affect playback. [Schedules run in each screen's own local time](/docs/scheduling/time/time-zones/), which is set per screen. Your profile time zone changes how you read a schedule, never when content plays. Worth setting correctly anyway. A schedule that looks like it starts at 09:00 to you and 03:00 to a colleague is a conversation nobody enjoys. --- # Passkeys Source: https://www.screenly.io/docs/account/securing/passkeys/ > Sign in with your face, fingerprint, or device PIN instead of a code. Adding one, using several, and what to do when a device is lost. A passkey is stored by your device or password manager and unlocked with biometrics or a PIN. It cannot be phished or reused, and there is nothing to type. Available since June 2026, and built on WebAuthn, which every current Chrome, Safari, Edge, and Firefox supports. ## Adding one 1. Open your avatar menu to reach your **account settings**, then go to **Security**. 2. In **Passkeys**, choose to add one. 3. Give it a name that identifies the device. The field suggests `MacBook Touch ID`, which is exactly the right shape. 4. Confirm with your biometrics or PIN. Then sign in with **Sign in with Passkey**. ## Naming matters The name is the only way to tell your passkeys apart later, and the moment you need to tell them apart is when a device has been lost and you are deciding which entry to delete. `MacBook Touch ID` and `iPhone` are useful. `Passkey 1` and `Passkey 2` are not. ## Where one can live A biometric device: Touch ID, Face ID, a fingerprint reader, Windows Hello. A hardware key such as a YubiKey. A password manager: iCloud Keychain, Google Password Manager, a Chrome profile. A passkey in a password manager syncs across your devices, which is convenient and means the security of your Screenly account rests on that manager. A passkey on a hardware key does not sync, which is less convenient and harder to compromise remotely. ## Several is the point There is no limit, and one per device is the usual arrangement. Add one on your laptop and one on your phone, and losing either leaves you with a working route in. The section lists them all, searchable by name, and any can be deleted. ## When a device is lost Sign in with a one-time email code, delete the passkey for the lost device, and add a new one on its replacement. You are not locked out: the email code always works. That is also the reason the email address on your account has to be one you can reach. --- # Two-factor authentication Source: https://www.screenly.io/docs/account/securing/two-factor/ > An authenticator app code on top of your usual sign-in, with backup codes, for organizations whose policy requires it. Two-factor adds an authenticator app code on top of whichever method you sign in with. It is off by default and not required. ## Whether you need it Think about what it adds on top of what you already have. **On a one-time email code**, it adds a real second factor: somebody with your mailbox alone cannot get in. **On a passkey**, it adds much less. A passkey is already something you have plus something you are, and it cannot be phished. Turning on two-factor here mostly adds friction. **With SAML single sign-on**, do it at the identity provider instead. That is the whole point of SSO: one policy, applied everywhere, rather than per application. So the honest answer is that it earns its place for organizations with a policy requiring it, and for anyone whose main route in is an email code. ## Setting it up From your **account settings**, under **Security**, in the two-factor section. Scan the QR code with your authenticator app, enter the code it generates, and save. You are then given **backup codes**. Store them somewhere that is not the phone holding the authenticator, because the situation they exist for is that phone being lost. ## Signing in with it Your usual method, then the code from the app. A backup code goes in the same field. ## Turning it off Disabling asks for a code emailed to you **and** a code from the authenticator. Both, deliberately: turning off a second factor should be at least as hard as using it. ## If you lose the authenticator Use a backup code, sign in, and set it up again on the new device. With no backup codes and no authenticator, this becomes an account recovery matter. See [Support PIN and account recovery](/docs/account/support/support-and-recovery/). --- # The lobby Source: https://www.screenly.io/docs/account/signing-in/the-lobby/ > The workspace picker you land on when your account belongs to more than one workspace, or to none yet. After signing in, you sometimes land on a workspace picker instead of in a workspace. It is a chooser rather than a dashboard, and it appears only when there is a choice to make. The screen carries no title of its own, so there is nothing to look for: you either land on it or you do not. With exactly one workspace and nothing pending, you skip it entirely, which is why most people never see it. ## Workspaces A list of every workspace you belong to. Pick one to go in. There is a search box, which stops mattering at three workspaces and starts mattering at thirty. Nothing here shows what is inside a workspace: [isolation](/docs/workspaces/overview/what-a-workspace-is/) applies in the lobby too, so this is a list of names. You can also skip the lobby by going straight to a workspace's own address, which is worth bookmarking if you work in one far more than the others. ## Invitations A second tab, listing invitations you have not answered yet. Each can be accepted or declined. Accepting puts you in that workspace with the role you were given. Declining removes the invitation; somebody has to send a new one if you change your mind. The tab reads **No pending invitations** when there is nothing waiting, so an invitation somebody says they sent and which is not here has gone to a different address. ## Creating a workspace **Create a workspace** takes a name and makes you its Owner. A workspace created this way normally comes without a trial. The free trial is once per person, so if you already belong to a workspace, or have an invitation pending, a new one does not start another. See [Free trial](/docs/get-started/plans/free-trial/). ## When you belong to nothing A new account with no workspace and no invitation gets a short guide instead of a list: **You're not part of any workspace yet**, with the option to create one, and a reminder of which address a colleague should send an invitation to. That address matters. Most "I never got the invite" cases are an invitation sent to a different address from the one the account uses, and the lobby is where you can see which address you actually signed in with. ## Signing out From the account menu in the lobby, without needing to enter a workspace first. --- # Ways to sign in Source: https://www.screenly.io/docs/account/signing-in/ways-to-sign-in/ > A one-time email code, a passkey, Google, GitHub or Microsoft, or your organization's identity provider. Four routes, and you can use more than one. ## One-time email code Enter your email address and a short code arrives. Type it in the same browser tab. The code expires quickly, is bound to the browser session that requested it, and is discarded once used. Repeated wrong entries invalidate it, and you request a fresh one. The session binding is worth understanding: somebody who reads the code over your shoulder cannot use it from their own device. That is stronger than an authenticator app code, which works anywhere. This method works for every account however it was created, which makes it the universal fallback. If you cannot remember how you signed up, use this. ## A passkey Your device's biometrics or a hardware key. Nothing to type and nothing to phish. See [Passkeys](/docs/account/securing/passkeys/). ## Google, GitHub, or Microsoft You are redirected to the provider, authenticate there, and return. Your credentials are handled entirely by the provider and never seen or stored by us. The security of your Screenly account then depends on the security of that account, so strong authentication there protects Screenly too. If you lose access to the provider, a one-time email code still gets you in. ## Your organization's identity provider SAML single sign-on, on Enterprise. Your organization's credentials, session policies, and multi-factor rules apply automatically, and removing somebody in the identity provider removes their Screenly access at the same moment. Configured per workspace by the Owner, not per account. See [Single sign-on](/docs/workspaces/settings/single-sign-on/). ## Using more than one Sign in a second way with the **same email address** and Screenly offers to merge the accounts. After merging, every method associated with that address works, so you can use Google one day and a code the next. Merging is by email address. If your Google address differs from your Screenly address, no merge is offered and you get a second, separate account. Methods are per person, not per workspace. One colleague can use Google, another Microsoft, another a code, in the same workspace. ## Why there are no passwords Most account compromises come down to a password reused, guessed, or leaked somewhere else. Removing them removes that entire class: there is nothing to stuff, nothing to phish, and nothing to write down. The trade is that email becomes the trust anchor. That was already true, since email was always the password reset path, so passwordless removes a credential rather than adding an exposure. If you want to strengthen it, strengthen the mailbox. --- # Support PIN and account recovery Source: https://www.screenly.io/docs/account/support/support-and-recovery/ > Your personal support PIN identifies you to Screenly support, and what happens when a workspace owner is unreachable. ## Your support PIN Support asks for a personal PIN to confirm who you are before discussing a workspace. Find it in your **account settings**, under **Security**, in the **Personal Support PIN** section. Choose **Show**, then **View** to reveal it in full. Give it when you [open a ticket](https://support.screenly.io/hc/en-us/requests/new). It saves a round trip. ## When an owner is unreachable Some situations cannot be fixed from inside the dashboard: the owner has left and their mailbox is closed, or the owner's email domain has changed and nobody can receive the code. These go through account recovery, which is an identity verification process rather than a support request. [Open a ticket](https://support.screenly.io/hc/en-us/requests/new) titled **Owner Account Recovery Needed**. Two things to expect. It takes **two to five days** on average, with no guaranteed maximum, because it exists to make impersonating an owner difficult. And if any activity is seen on the owner's account while the request is open, the request is rejected and closed, on the reasonable assumption that the owner is reachable after all. Opening more tickets does not make it faster. > [!NOTE] > Transferring ownership before someone leaves takes about a minute. See [Roles and permissions](/docs/workspaces/people/roles-and-permissions/). --- # Request an integration Source: https://www.screenly.io/docs/integrations/beyond/request-an-integration/ > There is a form. What to put in it, and what to do while you wait. If the integration you want feels like it belongs in the built-in set, ask. There is a request form linked from the Integrations tab, and you can also go through the [support portal](https://support.screenly.io/hc/en-us/requests/new). ## What makes a request useful Say what you want on screen, not just which product to connect. "Connect Jira" is a product. "The current sprint's blocked tickets, on a wall in the engineering area, updating through the day" tells us what to build. Two other things help. How many screens it would run on, and whether it needs to be live to the minute or whether a refresh every few minutes is fine, because that changes the design. What customers ask for is what gets built next. A request is not a commitment, and we prioritise by what is being asked for across industries. ## While you wait - A web page. If the tool has a dashboard, kiosk, or TV view, point a screen at that URL. It is often already exactly what an integration would have produced. See [Web pages](/docs/content/web-pages/). - A published link. Google Sheets and Google Slides both publish to the web, and the published URL goes straight in as content. - A secret in an app. If an app can take an API key directly, store it as a [secret](/docs/apps/setting-up/settings-and-secrets/) rather than waiting. - Zapier, or the API. See [Zapier and the API](/docs/integrations/beyond/zapier-and-the-api/). --- # Zapier and the API Source: https://www.screenly.io/docs/integrations/beyond/zapier-and-the-api/ > Two ways to connect Screenly to something we do not integrate with: no code, or all code. ## Zapier Zapier connects Screenly to thousands of other tools without code. The published actions are **uploading an asset** and **cleaning up content Zapier created**, which shapes what it is good for: "something happened over there, put it on the screens" rather than deep two-way sync. Assets created this way carry the label `created_via_zapier`, which makes them easy to find and easy to clear out. That matters more than it sounds, because an automation that uploads on every trigger will fill a library quickly if nothing prunes it. ## The API Everything the dashboard does is available through the API, because the dashboard is itself an API client with no special access. That is the route when the shape you need is specific: provisioning screens from an inventory system, syncing content from a CMS, or pulling your own content back out. Start with an [API token](/docs/developers/overview/api-tokens/), then [the API](/docs/developers/api/). The schema is at [developer.screenly.io/api_v4_1](https://developer.screenly.io/api_v4_1/). > [!IMPORTANT] > API v3 stops responding on **1 October 2026**. There is no partial shutdown and no grace mode. Anything still on v3 should move to v4.1. ## Which to reach for **Zapier** when a person is configuring it and the job is moving content in on an event. **The API** when a system is doing it unattended, when you need more than uploading, or when the logic is yours. The [CLI](/docs/developers/cli/) sits between them: scriptable, but driven by a person or a pipeline rather than by an event. --- # Data integrations Source: https://www.screenly.io/docs/integrations/for-apps/data-integrations/ > Salesforce, Airtable, Power BI, Grafana, calendars and Shopify: what each one unlocks, and what to know before connecting it. Each of these backs one or more apps in the [App store](/docs/apps/). Connect it under **Settings**, then **Integrations**, and the app's setup form changes: instead of a token field, you get a list of your own things to pick from. ## Salesforce Dashboards and reports on a screen. Requires our **managed package** installed in your Salesforce org first, and the connection is scoped read-only. There is a Sandbox variant for testing against a sandbox org. Reports are adapted to the screen: detail rows become a table, grouped reports become a chart, and a single aggregate becomes a KPI card. ## Airtable A base view on a screen, as a grid or a Kanban board. When authorising, you choose between granting access to everything you can see or picking specific bases. Picking specific bases is the better habit, and it means adding a base later needs re-authorisation. > [!IMPORTANT] > A maximum of **100 records** are fetched per refresh. A view with more than that is truncated, silently, so filter the view in Airtable rather than relying on Screenly to show everything. ## Power BI Reports and dashboards on a screen, authorised through Microsoft. There are two Power BI apps. The current one uses this integration. A **legacy** app still exists that wants an Azure AD client ID and secret, a tenant ID, a group ID and a report ID entered by hand. Use the current one unless you have a reason not to. ## Grafana Dashboards on a screen. This is the one that is not OAuth: you generate a service account token in Grafana and paste it in. See [Grafana](/docs/integrations/for-apps/grafana/). ## Google Calendar and Outlook Calendar The day's meetings on a screen, in a room or by a door. Connecting lets a calendar app offer your calendars by name. Without it, calendar apps can still work from a published iCal address, which is the route when the calendar belongs to someone who will not authorise anything. ## Shopify Asks for your **store domain** before authorising, because the authorisation address is built from it. ## Slack Slack is here too, and it also drives offline alerts. One connection covers both. See [Slack](/docs/integrations/notifications/slack/). ## If a service is not listed An app can still ask for a credential directly, stored as a [secret](/docs/apps/setting-up/settings-and-secrets/). Or ask us to build the integration: see [Request an integration](/docs/integrations/beyond/request-an-integration/). --- # Grafana Source: https://www.screenly.io/docs/integrations/for-apps/grafana/ > Grafana connects with a service account token rather than OAuth. Creating one, and why the Viewer role is the right choice. Grafana has no OAuth flow for this, so you create a token in Grafana and paste it into Screenly along with your Grafana URL. That difference is worth understanding rather than working around: the token is a credential you control, revocable in Grafana without touching Screenly. ## Creating the token In Grafana, signed in as an administrator: 1. Go to **Administration**, then **Users and access**, then **Service accounts**. 2. Choose **Add service account**. 3. Name it something identifiable, such as `Screenly Integration`. 4. Set its role to **Viewer**. 5. Choose **Add service account token**, then **Generate token**. 6. Copy the token. Grafana shows it once. Then in Screenly, under **Settings**, **Integrations**, paste the token and your Grafana URL. ## Why Viewer A signage integration reads dashboards. It never needs to create, edit, or delete one. Giving it **Viewer** means a leaked token cannot change anything in Grafana, and an accidental misconfiguration cannot either. Editor or Admin buys you nothing here and costs you that safety. ## Reaching your Grafana Screenly has to be able to reach the URL you give it. A Grafana behind your firewall with no public address will not connect. Two routes if that is your situation. Expose the specific Grafana host, or put the screens on your network with [Tailscale](/docs/integrations/network/private-network-access/) and point them at a dashboard URL as a [web page](/docs/content/web-pages/) rather than using the integration. ## Rotating and revoking Delete the service account token in Grafana and the connection stops working immediately, wherever it was used. That is the fast way to cut access without touching Screenly. To rotate, generate a new token and paste it in. Nothing else needs reconfiguring. --- # Reaching your private network Source: https://www.screenly.io/docs/integrations/network/private-network-access/ > Put your screens on your own Tailscale network so they can show internal dashboards and intranet pages, configured once for the fleet. Some of what a screen needs to show is not on the public internet: an internal dashboard, an intranet page, a service behind the firewall. Screenly connects screens to your own [Tailscale](https://tailscale.com/) network so they can reach those the way your own machines do, without exposing anything publicly. > [!NOTE] > This runs on ScreenlyOS only. Screenly Anywhere screens cannot join a Tailscale network. ## Setting it up Do this in order. Some of it cannot be changed afterwards. 1. In your Tailscale ACL policy, add the tag you want the screens to carry. It has to exist before the next step, and it cannot be added to the OAuth client afterwards. 2. In the Tailscale admin console, create an OAuth client with the **auth key creation** scope, which is the only scope it needs, and assign it that tag. 3. In your **workspace settings**, go to **Security** and find **Tailscale on screens**. Enter the client ID, the client secret, and the tag, then save. 4. Turn Tailscale on for the screens that need it. Each one joins the network on its own. ## Checking it worked Each screen's detail page shows its Tailscale state under hardware information. **Active** means it is on the network. **Sign in required** means the device is waiting for something on the Tailscale side. The usual cause of the second is device approval: the auth keys Screenly generates are reusable but not pre-authorized, so if your tailnet requires approval, players sit pending until you approve them in the Tailscale console. ## What it does not do It does not give anyone a route into your screens. The screen reaches out to your network; nothing reaches in. It also applies per screen rather than per device certificate, so if you need particular screens on particular networks, that is separate tailnets rather than separate keys within one. --- # What Screenly notifies on Source: https://www.screenly.io/docs/integrations/notifications/notification-events/ > Two events, three destinations. What is covered, what is deliberately not, and how to keep alerts worth reading. Notifications are under **Settings**, then **Notifications**. Email works with no setup; Slack and PagerDuty need connecting first. Two events, each with its own switch: **Screens go offline.** **Screens come back online.** The second matters as much as the first. Most offline screens recover on their own within minutes, and knowing that is what stops somebody driving to a site unnecessarily. ## Three destinations **Email** is on by default and goes to workspace members. Nothing to set up. **Slack** posts into a channel you choose. See [Slack](/docs/integrations/notifications/slack/). **PagerDuty** raises an incident, which is right when a dark screen is somebody's job at three in the morning. See [PagerDuty](/docs/integrations/notifications/pagerduty/). You can use all three at once, and each event is switched independently per destination. ## What is not notified Content that fails to process, a schedule ending, a member joining, storage filling up. Those appear in the dashboard's **notification bell** rather than being pushed anywhere. The bell is worth glancing at after a bulk upload, because a video that failed to encode is invisible everywhere else until somebody notices a gap in a rotation. ## Keeping them worth reading A screen on a flaky connection will flap, and a channel that cries wolf gets muted, which is worse than having no alerts because it feels like having them. Two things help. Send screen alerts somewhere of their own rather than into a busy channel. And reserve PagerDuty for the screens that genuinely justify waking someone: a display in a plant control room is not the same as one in a corridor. If a particular screen flaps constantly, that is a fault to fix rather than an alert to tune. Its [Details tab](/docs/screens/monitoring/health-and-diagnostics/) will usually name it, and weak Wi-Fi is the common answer. --- # PagerDuty Source: https://www.screenly.io/docs/integrations/notifications/pagerduty/ > Raise a PagerDuty incident when a screen goes offline. Creating the service, and deciding which screens deserve it. PagerDuty is for when a dark screen is something somebody is on call for. ## Connecting Under **Settings**, then **Notifications**, choose **Connect to PagerDuty** and authorise. You then either pick an existing service or create one. Creating from Screenly asks for a **service name** and gives you an **integration key** using PagerDuty's **Events API V2**. Give it a service of its own rather than attaching to one that already exists for something else. Screens have a different urgency profile from an application outage, and separating them means the escalation policy can differ too. ## Deciding what belongs here The temptation is to route every screen. Resist it. PagerDuty wakes people. A screen in a corridor going offline at 2am does not justify that; a screen in a plant control room might. Route the ones that matter and leave the rest on email or Slack. If everything pages, nothing does, and the first thing an on-call engineer learns is to ignore Screenly. ## Recovery The **Screens come back online** event resolves the picture, and it is worth enabling alongside the offline one. Most screens recover on their own within minutes, and without the recovery event somebody is investigating a problem that has already fixed itself. ## Disconnecting From the Integrations tab, or by revoking Screenly in PagerDuty. Incidents stop being raised; anything already open stays open. --- # Slack Source: https://www.screenly.io/docs/integrations/notifications/slack/ > One Slack connection, two uses: offline alerts posted to a channel, and apps that read from Slack. Slack is the one integration that spans two purposes. Connect it once and both work. ## Alerts into a channel Under **Settings**, then **Notifications**, choose **Connect to Slack** and authorise. Then pick the channel. Until you pick one, the configuration shows **No channel selected** and nothing is posted. That is the most common reason for a Slack connection that appears set up and never says anything. Pick a channel of its own rather than a busy one. Screen alerts among deploy notifications and standup reminders get muted along with everything else. ## Apps that read from Slack The same connection lets an app pull from a Slack channel, so what a team is posting can appear on a screen. That is a different job from alerting, and it is worth being deliberate about the channel: anything posted there is on a wall. ## Workspace-level, not personal The connection belongs to the Screenly workspace, not to whoever authorised it. Before July 2026 it was per person. Workspaces where several people had each connected their own kept exactly one after the change, so if your Slack alerts stopped around then, this is why. Reconnect once for the workspace. ## Disconnecting From the Integrations tab. Alerts stop and any app reading from Slack stops showing data. You can also revoke Screenly from the Slack side, which has the same effect. --- # Connecting and disconnecting Source: https://www.screenly.io/docs/integrations/overview/connect-and-disconnect/ > Who can manage integrations, what happens when you disconnect, and why an app can stop showing data without anything looking broken. ## Who can Owners and Admins. Everyone else sees the tab without being able to change anything, and the dashboard says so rather than failing silently. That is the point of a workspace-level connection: one person authorises it, and nobody else needs the credentials. ## Connecting Most are a single **Connect** button that redirects you to the provider, asks you to authorise Screenly, and returns. Three are not: **Grafana** wants a service account token you generate yourself, because Grafana has no OAuth flow for this. See [Grafana](/docs/integrations/for-apps/grafana/). **Shopify** asks for your store domain first, since the authorisation address is built from it. **Tailscale** wants an OAuth client ID and secret you create in Tailscale, and lives under **Security**. See [Reaching your private network](/docs/integrations/network/private-network-access/). **Salesforce** additionally needs our managed package installed in your Salesforce org before the connection is useful. If it is already installed, skip that step. ## Per workspace, not per person A connection belongs to the workspace. Everyone in it can build apps on top of it without ever seeing the credential. Slack and PagerDuty used to be per person. Since July 2026 they are workspace-level, and a workspace where several people had connected their own kept exactly one. ## Disconnecting From the same page. It revokes Screenly's access at the provider. Anything relying on it stops working, so check what is using it first. An app configured against a Salesforce dashboard does not fall back to anything; it simply shows nothing. ## When something stops working The usual cause of an app that installs fine and shows nothing is the connection rather than the app. Access can end without anyone disconnecting it here: revoked from the provider's side, a rotated credential, an expired grant, or a service account deleted in Grafana. Screenly finds out the next time it tries to refresh, so the dashboard can still show the integration as connected for a while. Check the integration before reinstalling the app. --- # What an integration is Source: https://www.screenly.io/docs/integrations/overview/what-an-integration-is/ > Three different jobs under one settings tab: data for apps, alerts to your tools, and network access for screens. Integrations live under **Settings**, then **Integrations**, which makes them look like one feature. They are three. ## Data for apps The largest group. You connect a service once, and [apps](/docs/apps/) that read from it stop asking anyone for credentials: the app's setup form offers **your** dashboards, reports, bases, or calendars instead. Salesforce, Airtable, Power BI, Grafana, Google Calendar, Outlook Calendar, Shopify. See [Data integrations](/docs/integrations/for-apps/data-integrations/). ## Alerts to your tools Screenly tells you when a screen goes offline, and comes back. Rather than only emailing, it can raise a PagerDuty incident or post into a Slack channel. See [Notification events](/docs/integrations/notifications/notification-events/). ## Network access for screens Tailscale is not about data or alerts at all. It puts your **screens** on your own private network so they can display internal dashboards and intranet pages. That is why it sits under **Security** rather than Integrations, which catches people out. See [Reaching your private network](/docs/integrations/network/private-network-access/). ## The full list | Provider | What it is for | How you connect | | --- | --- | --- | | Salesforce | Data for apps | OAuth, after installing our managed package | | Airtable | Data for apps | OAuth | | Power BI | Data for apps | OAuth through Microsoft | | Grafana | Data for apps | A service account token, not OAuth | | Google Calendar | Data for apps | OAuth | | Outlook Calendar | Data for apps | OAuth | | Shopify | Data for apps | OAuth, with your store domain | | Slack | Alerts, and an app | OAuth | | PagerDuty | Alerts | OAuth | | Tailscale | Network access for screens | OAuth client ID and secret, under Security | ## Slack does both Worth calling out because it is the one provider that spans two of the three jobs. One Slack connection serves both offline alerts and any app that reads from Slack. Connect it once. See [Slack](/docs/integrations/notifications/slack/). ## What is not an integration **Zapier** is external: it talks to Screenly's API rather than being connected here. **The browser extension** authenticates with an [API token](/docs/developers/overview/api-tokens/). **TradingView** and similar apps that use a public embed need no account and no connection at all. --- # How licenses work Source: https://www.screenly.io/docs/billing/licenses/how-licenses-work/ > One connected screen uses one license, drawn from a pool. Disable a screen and the license comes back. A license is one screen's place on Screenly. Connecting a screen takes one from your pool; disabling that screen returns it. You license screens. Content, playlists, apps and, on Business and above, people are not counted. A hundred playlists cost nothing. ## What counts as a screen Any display driven by a Screenly player, a Screenly Anywhere instance, or an app instance. A multi-display setup driven as one continuous picture from one device counts once, whatever the panel count. Four panels showing one image from one player is one license. See [Multiple displays](/docs/screenlyos/overview/multiple-displays/). ## Running out Connecting a screen with no license free fails, and the dashboard says so rather than leaving you to work it out. Two ways past it: add licenses, or free one up by disabling a screen you are not using. A disabled screen keeps its settings, its labels, and its playlist assignments, so re-enabling it later is not a rebuild. ## Moving licenses around A license is a seat, not a tag on one particular device. Retire a screen and its license goes back to the pool for the next one. Swap a failed player for a new one and nothing about your subscription changes. On Enterprise, [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) share a single pool held by the parent, so a license one team is not using is available to another. --- # The license pool Source: https://www.screenly.io/docs/billing/licenses/the-license-pool/ > One pool per subscription, shared across linked workspaces. Reading the workspaces table, and exporting it. Your licenses are a pool rather than a set of permanent tags. Connecting a screen takes one; disabling that screen returns it. ## Across linked workspaces On Enterprise, [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) share a single pool held by the parent. A license one team is not using is available to another, so a group of regions or brands draws from one set rather than buying separately. The **Assigned** counter in a parent workspace includes screens in every child, not just its own. A parent showing more assigned licenses than it has screens is normal. ## The workspaces table Under **Workspaces sharing this license pool**, one row per workspace with its name and how many licenses it is using. Sortable by either, and searchable, which starts mattering past a dozen. Rows are labelled. **Parent** marks the workspace that owns the subscription. **Current** marks the one you are looking from. A workspace can carry both. ## Exporting it **Export** gives you a CSV with four columns: Name, Domain, Licenses Used, and Type, where Type is Parent, Current, or Child. That is the quickest answer to why a pool is full, and the thing to attach when asking a group of teams to give some back. Sorting the export by licenses used names the two workspaces holding most of them in about ten seconds. ## Rebalancing There is nothing to reassign. A license is not allocated to a workspace in advance; it is consumed by connecting a screen and released by disabling one. So freeing licenses means disabling screens somewhere, not moving quota around. The export tells you where to ask. --- # Cancelling Source: https://www.screenly.io/docs/billing/managing/cancelling/ > Cancel at any time, keep playing until the period ends, and take your content out first. 1. Open **Settings**, then **Billing & Subscription**. 2. Choose **Manage subscription**. 3. Choose **Cancel subscription**, then confirm. ## What happens The subscription runs to the end of the period you have already paid for, and your screens keep playing throughout. Status shows **Canceled** while it is still running, which is normal rather than a fault. After that date, screens stop receiving content and stop playing. Nothing is deleted at that moment. Content, playlists, screens, and settings are all preserved, so subscribing again restores playback without rebuilding anything. ## Refunds Refunds are governed by our [terms of service](/terms-of-service/). If a renewal went through before you managed to cancel, [open a support ticket](https://support.screenly.io/hc/en-us/requests/new) and we will look at it. ## Take your content first Do this before you cancel, while the subscription is still active. Every asset carries a `source_url` you can fetch through the CLI or the API, which is how you export a library without downloading it a file at a time. See [Getting your content back](/docs/content/library/getting-your-content-back/). ## The alternative to cancelling If you are cutting cost rather than leaving, reducing the screen count keeps the workspace and its content alive. See [Change your plan or screen count](/docs/billing/managing/change-plan-or-screens/). --- # Change your plan or screen count Source: https://www.screenly.io/docs/billing/managing/change-plan-or-screens/ > Add or remove licenses at any time, and what happens to the money in each direction. Owners, Admins, and Billing Managers can do this. 1. Open **Settings**, then **Billing & Subscription**. 2. Choose **Manage subscription**. 3. Choose **Update subscription**. 4. In **Quantity**, enter the **total** number of screens you want, then **Continue**. 5. Review and **Confirm**. The quantity field is a total, not an increment. To go from 10 screens to 12, enter 12. ## Adding licenses Licenses are available immediately, so a screen you connect afterwards has one waiting. Billing for the change follows our [terms of service](/terms-of-service/). Add before a rollout rather than during it. Connecting a screen with no license free fails outright rather than queueing. ## Removing licenses Free the licenses first. Removing a license from the subscription does not disconnect a screen; the count simply drops below what is assigned. [Disable](/docs/screens/managing/enable-and-disable/) the screens you are giving up, check the **Available** counter, then reduce. ## Changing plan Same portal. An upgrade takes effect immediately, and everything carries over untouched. Two things to check before downgrading. Seats first. Starter has two, and dropping to it disables the excess members automatically, with no say from you over which ones. Remove the members you mean to remove before you downgrade. See [Manage members](/docs/workspaces/people/manage-members/). Then the features you are relying on. SAML, linked workspaces, shared playlists, and audit logs are Enterprise, and 4K is Business and above. A downgrade stops them. ## Minimums still apply Enterprise bills for 25 screens whatever quantity you enter. Reducing below that minimum does not reduce the bill below it. Starter and Business have no minimum beyond 1 screen. --- # Payment and invoices Source: https://www.screenly.io/docs/billing/managing/payment-and-invoices/ > Changing the card, fixing the address invoices go to, and finding past ones. All in the billing portal, from **Manage subscription**. ## Payment method Under **Payment method**, choose **Change**, then **Add new card**, and enter the details. Remove the old card only after the new one is confirmed. A subscription with no valid card fails at the next renewal, and a failed renewal eventually stops your screens. ## Billing contact details Under **Billing information**, choose **Update information**. This is where the invoice email address lives, along with the company name, address, and tax details that appear on the invoice. > [!IMPORTANT] > Check this early. The default is whoever signed up, which is usually not the finance address, and invoices going quietly to a personal mailbox is how a renewal gets missed. ## Invoices Sent automatically to the billing email after each charge, and past invoices are downloadable from the portal's invoice history. ## Purchase orders and other arrangements Purchase orders, annual invoicing, a different billing entity, or consolidated billing across [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) are all possible and none of them are self-service. [Contact support](https://support.screenly.io/hc/en-us/requests/new) and we will set it up. Custom billing arrangements are an Enterprise feature. --- # How billing works Source: https://www.screenly.io/docs/billing/overview/how-billing-works/ > Per screen, per workspace, one plan for everyone in it. The three things that decide what you pay. Three numbers decide the bill: which **plan**, how many **licenses**, and **monthly or annual**. Nothing else counts. Content, playlists, apps, storage, and, above Starter, people are all uncounted. Screenly scales on one thing: how many screens you run. ## Per workspace Billing belongs to the workspace, not to your account. Belong to three workspaces and you are looking at three subscriptions, each with its own plan, payment method, and license pool. The exception is [linked workspaces](/docs/workspaces/linked-workspaces/what-they-are/) on Enterprise, where a parent holds one subscription and one pool for a group. ## One plan for everybody in it A plan applies to the whole workspace. Every license in it runs on the same plan, and everyone in it gets the same features. You cannot mix. That has a practical consequence worth knowing before you buy: if one screen needs 4K, the whole workspace goes to Business. ## Minimums are billed whether or not you use them Enterprise bills for **25** screens regardless of how many you have connected. Running 20 screens on Enterprise costs the same as running 25. Starter and Business have no minimum beyond 1 screen. ## 4K needs both halves A Business plan **and** a device that can do 4K. Upgrading the plan does not make a 1080p player show 4K, and a [Player Max](/docs/screenly-players/) on Starter still plays at 1080p. ## When the trial ends Pick a plan and everything carries over untouched: screens stay connected, content stays in the library, playlists keep their schedules. If it expires first, screens stop playing. Nothing is deleted, and subscribing restores playback with no setup. The trial no longer converts into a paid subscription on its own; it simply ends. See [Free trial](/docs/get-started/plans/free-trial/). ## Who can see billing Owners, Admins, and Billing Managers. Everyone else does not see the billing page, and the button that leads to it is disabled with an explanation rather than hidden. See [Roles and permissions](/docs/workspaces/people/roles-and-permissions/). --- # The billing page Source: https://www.screenly.io/docs/billing/overview/the-billing-page/ > Your plan, next billing date, billing email, and the three license counters. What each one is telling you. Reached from **Settings**, then the **Billing & Subscription** button. It is a page rather than a settings tab. ## The summary **Your plan**, for example Starter Plan Monthly. **Status**: Active, Trialing, or Canceled. A cancelled subscription keeps running until the end of the period you paid for, so Canceled and still playing is a normal combination. **Next billing**, the date of the next charge. **Billing email**, the address invoices go to. Worth checking that it is a finance address rather than whoever happened to sign up, since that is who receives every invoice. ## The three license counters | Counter | What it means | | --- | --- | | Total license pool | What your subscription includes | | Assigned licenses | In use by active screens | | Available licenses | Free to connect a screen with | **Available** is the number to look at before a rollout. Connecting a screen with none free fails, and the fix is either buying more or [disabling](/docs/screens/managing/enable-and-disable/) a screen you are not using. If a pool looks fuller than expected, look for disabled-but-not-really screens: a screen that is enabled and offline still holds its license. ## Managing the subscription **Manage subscription** opens the billing portal, where plan changes, license count, payment method, invoices, and billing details all live. See [Change your plan or screen count](/docs/billing/managing/change-plan-or-screens/). ## If you are a child workspace A banner says billing, payment methods, and subscription management are handled by the parent workspace, and there is no Manage subscription button. The counters and the workspaces table still show, so you can see the shared pool and how it is distributed. To change anything, switch to the parent. See [The license pool](/docs/billing/licenses/the-license-pool/). --- # Boot and pair the device Source: https://www.screenly.io/docs/screenlyos/first-device/boot-and-pair-the-device/ > From unboxing or flashing to a paired screen, and what the first boot does. Whichever route you took, setup ends the same way: the device shows a pairing code, you enter it in your dashboard, and the screen joins your fleet. ## Get the device running ### Screenly hardware 1. Connect the player to the display over HDMI. 2. Connect it to the network, by cable or Wi-Fi. 3. Power it on. If you are on Wi-Fi rather than a cable, the player shows a network setup screen before it shows a pairing code. You can complete it with a USB keyboard, or skip the keyboard by putting a `network.yaml` from the [Network Config Generator](/os/network-config-generator/) on a USB drive. There is nothing to install and no image to write. It arrives ready. ### Raspberry Pi 1. Download the ScreenlyOS image. 2. Write it to an SD card with the Raspberry Pi Imager. 3. Put the card in the Pi, connect it to the display over HDMI, and power it on. 4. If the device needs network credentials and has no keyboard, put a `network.yaml` from the [Network Config Generator](/os/network-config-generator/) on a USB stick and plug it in. The device picks it up from removable storage and applies it. First boot does more work than later ones and can take a few minutes. Use a good quality SD card; a partially written or failing card is the most common cause of a device that never starts. ### Sharp display 1. Connect the display to the network. 2. Power it on. The computer is built into the panel, so there is nothing to connect and nothing to flash. ## Pair it Once the device shows a code, enter it in the dashboard under **Screens** > **Connect screen**. [Connect a screen](/docs/screens/setup/connect-a-screen/) has that half in full, and [Pairing codes](/docs/screens/reference/pairing-codes/) the characters a code never contains. The screen appears in your list within a few seconds and the display stops showing the code. ## What first boot set up The device came up on the current ScreenlyOS release, and will keep itself there. Updates arrive over the air, signed, and roll back on their own if one fails. There is nothing for you to schedule or apply. ## Next [After connecting](/docs/screens/setup/after-connecting/) covers what to check and what to expect from a live device. --- # Build your own player Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/guides/build-your-own-player/ > The parts you need to assemble a Raspberry Pi into a ScreenlyOS player, which case and power supply to choose, and how to put it together. You can buy a [Screenly Player](/docs/screenly-players/) ready to run, or assemble one yourself from a Raspberry Pi. Self-building works well, and it asks for some comfort with hardware and some care over the parts. Most of the reliability of a self-built player comes down to three choices: the board, the case, and the power supply. The rest is assembly. ## What you need ### A Raspberry Pi A Raspberry Pi 5 or 4 B with 2 GB of memory or more. More memory is better. See [Supported boards](/docs/screenlyos/hardware/raspberry-pi/reference/supported-boards/) for which generations we recommend. ### A case with ventilation A Raspberry Pi runs hot, and a screen runs for years without anyone opening the case. Heat is what shortens that life. Pick a case with real ventilation, fitted heatsinks, or an aluminium body that acts as one heatsink. We do not recommend the official case from the Raspberry Pi Foundation, because it has no ventilation holes. Running without a case at all is possible and not a good idea. The board is fragile and gets hot. ### The official power supply Use the official Raspberry Pi power supply for your model. Many third-party supplies deliver power inconsistently, which shows up later as a screen that reboots or freezes at random and looks like a software fault. The Pi 5 and Pi 4 B use USB-C. Older boards use micro USB. ### A microSD card Class 10 or better, 16 GB or larger. See [SD cards](/docs/screenlyos/hardware/raspberry-pi/reference/sd-cards/) for the card we ship in our own players. ### A card reader and an HDMI cable You need a way to write the card from your computer, and a cable to reach the display. Many computers have a card slot built in, and a USB reader works otherwise. You do not need a display to build the player, but you need one to pair it. ## Put it together 1. Write ScreenlyOS to the microSD card. [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/) has the steps. 2. Insert the card into the slot on the underside of the board. 3. Fit the board into its case. 4. Connect the player to the display over HDMI. 5. Connect the power supply last, so the display is already attached when the player boots. The player boots and shows a pairing code. [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) covers what happens next. ## Powering over ethernet The Pi 4 B and 3 B+ can be powered over ethernet with the appropriate hardware, which gets a player down to a single cable. That is worth considering for a screen where the power outlet is awkward and a network drop is not. > [!NOTE] > A Raspberry Pi you assembled is not a Screenly Player. That name means the hardware we sell, which matters when you are reading hardware-specific pages. --- # Flashing problems Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/guides/troubleshooting/ > The card reporting the wrong size, a card that will not format, and a Pi that will not boot after writing ScreenlyOS. A few things come up often enough to be worth stating plainly. ## The Pi 4 or Pi 5 will not boot A Raspberry Pi 4 stuck on a white screen, or a Pi 5 on a black screen with a blinking cursor, usually needs a bootloader update rather than a different image. See [Update the bootloader](/docs/screenlyos/hardware/raspberry-pi/guides/update-the-bootloader/). ## The card shows a much smaller capacity afterwards A 16 GB card reporting 31 MB is expected. We format the card in a way Windows and macOS do not display correctly. The storage is all still there. ## The card is locked or read only Full-size SD adapters have a physical write-protect switch on the side. Slide it away from the lock position and the card becomes writable again. --- # Update the bootloader Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/guides/update-the-bootloader/ > Fix a Raspberry Pi 4 stuck on a white screen or a Pi 5 on a blinking cursor by updating the EEPROM bootloader, using the Raspberry Pi Imager or the terminal. A Raspberry Pi 4 stuck on a white screen, or a Raspberry Pi 5 showing a black screen with a blinking cursor, usually has an out-of-date bootloader rather than a bad image. The bootloader lives in the EEPROM on the board itself, not on the SD card, so rewriting the ScreenlyOS image does not change it. It has to be updated separately, once per device. This applies only to the Raspberry Pi 4 and Raspberry Pi 5. ## With Raspberry Pi Imager Use this if you have a spare SD card and another computer. It writes a small update tool to the card, which the Pi runs once at boot. 1. Download [Raspberry Pi Imager](https://www.raspberrypi.org/software/) and open it. 2. Click **Choose Device** and select your model, Raspberry Pi 4 or Raspberry Pi 5. ![Raspberry Pi Imager with the device selection open, showing the Raspberry Pi 4 and Raspberry Pi 5 options](/assets/images/docs/screenlyos/eeprom-imager-choose-device.webp) 3. Under **Choose OS**, select **Misc utility images**. ![The operating system list in Raspberry Pi Imager with Misc utility images highlighted](/assets/images/docs/screenlyos/eeprom-imager-misc-utility-images.webp) 4. Select **Bootloader**, for the Pi 4 or Pi 5 family to match your device. ![The Misc utility images list in Raspberry Pi Imager with the Bootloader option selected](/assets/images/docs/screenlyos/eeprom-imager-bootloader.webp) 5. Choose **SD Card Boot**. ![Raspberry Pi Imager showing the boot mode options with SD Card Boot selected](/assets/images/docs/screenlyos/eeprom-imager-sd-card-boot.webp) 6. Under **Choose Storage**, select your SD card, then click **Write**. 7. Put the card into the powered-off Raspberry Pi and turn it on. 8. Wait at least ten seconds. A steadily blinking green activity LED and a green screen on the display mean the update worked. 9. Power the Pi off and take the card out. Now write ScreenlyOS to the card as usual. See [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/). ## From the terminal Use this if you have no second SD card, or you would rather work on the device itself. 1. Write the latest 64-bit Raspberry Pi OS to a card with Raspberry Pi Imager. 2. Put the card in the Pi, boot it, and complete the first-run setup. 3. Open a terminal and check for an update: ```bash sudo rpi-eeprom-update ``` If one is available, the output names the current and latest versions: ```text *** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Tue Apr 26 10:24:28 UTC 2022 LATEST: Wed Jan 11 17:40:52 UTC 2023 ``` 4. Install it: ```bash sudo rpi-eeprom-update -a ``` Once it finishes, write ScreenlyOS to a card and continue with [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/). > [!NOTE] > The bootloader update is stored on the board, so you only do this once per device. A Pi that has been updated keeps the new bootloader through every later ScreenlyOS reinstall. --- # Write the image Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/ > Write ScreenlyOS to a microSD card with the Raspberry Pi Imager, or with any flashing tool from a downloaded image, and pair the screen. Most Raspberry Pi units keep the microSD card in a slot on the underside of the board. If yours is in a case, open it and take the card out before you start. You need the card, a card reader if your computer has no slot, and a tool to write the image. [Raspberry Pi Imager](https://www.raspberrypi.org/software/) is the one we suggest, because it downloads the image for you. > [!IMPORTANT] > On a Raspberry Pi 4 or Pi 5 that has never been updated, [update the bootloader](/docs/screenlyos/hardware/raspberry-pi/guides/update-the-bootloader/) before you write the image. A board with an old bootloader will not start ScreenlyOS however cleanly the card was written. ## With Raspberry Pi Imager 1. Download and install the latest version of Raspberry Pi Imager. 2. Power off the Raspberry Pi, open the case if it has one, remove the SD card, and insert it into your computer's card reader. 3. If Windows offers to format the card, format it as FAT32. 4. Open Raspberry Pi Imager. 5. Under **Choose Device**, select your model: Raspberry Pi 4 or 5. The Pi 3 is also selectable, though it is [not what we recommend for a new screen](/docs/screenlyos/hardware/raspberry-pi/reference/supported-boards/). 6. Under **Choose OS**, select **Freemium and Paid-For OS**, then **Digital Signage OS**, then **ScreenlyOS**, and pick the image. 7. Under **Choose Storage**, select your SD card. 8. Click **Next** to start writing. The defaults are correct, so no customization is needed if you are prompted. 9. When it finishes, eject the card safely and remove it. 10. Put the card back in the slot on the Raspberry Pi, reassemble the player, and power it on. ## From a downloaded image If you would rather not use Raspberry Pi Imager, download the image and write it with any flashing tool. 1. Download the latest image: [screenly-latest-pi64-stable.img.zip](https://disk-images.screenlyapp.com/screenly-latest-pi64-stable.img.zip). 2. Install a flashing tool. [balenaEtcher](https://etcher.balena.io/) is a common choice, though any image writer works. 3. Open the tool and select the downloaded ScreenlyOS image as the source. 4. Select your SD card as the target. 5. Start writing and wait for it to finish. 6. Eject the card safely, put it in the Raspberry Pi, and power it on. ## Pair the screen Whichever method you used, the device shows a pairing code on the display when it boots. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) covers what first boot does and what to expect. ## How much space it takes The install itself is around 1 GB, though that moves as we extend the operating system. The rest of the card is working space for the content a screen caches, which is why the 16 GB minimum on [SD cards](/docs/screenlyos/hardware/raspberry-pi/reference/sd-cards/) is about your playlists rather than about the install. ## Always write the latest image ScreenlyOS updates itself once it is online, so an older image will catch up on its own. Starting from the latest image skips that first round of updates and gets the screen playing sooner. ## Building a player from parts If you are assembling a player from scratch, [Build your own player](/docs/screenlyos/hardware/raspberry-pi/guides/build-your-own-player/) covers the parts to buy and how to put them together. --- # What it can do Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/overview/what-it-can-do/ > A Raspberry Pi running ScreenlyOS shows content at up to 1080p and is managed like any other Screenly screen, with the hardware limits that come with the board. A Pi running ScreenlyOS shows content at up to 1080p, and behaves the same as a Screenly Player in almost every respect. It updates itself, reports its health, and is managed entirely from your dashboard with no login on the device. ## Where the limits are For 4K, or for the TPM and Secure Boot that stricter environments ask for, you need the Screenly Player Max instead. Those are properties of the hardware, so no software setting adds them to a Pi. Driving two displays as one joined surface is confirmed on the Player Max and on a Scala Player-SP. We have not confirmed it on a Raspberry Pi, so treat a Pi as a single-display device unless you have talked to us. Everything else that makes ScreenlyOS what it is applies here: the device runs nothing but Screenly, updates apply and roll back on their own, and there is no shell to log into. > [!NOTE] > A Raspberry Pi running our software is not a Screenly Player. We use that name for hardware we sell, which matters when you are reading hardware-specific pages. --- # SD cards Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/reference/sd-cards/ > Which microSD card to use in a Raspberry Pi running ScreenlyOS: Class 10 or better, 16 GB or larger, and the industrial grade card we ship in our own players. Card quality varies enormously, and not only between brands. Two cards from the same vendor can behave very differently, so the card is worth choosing deliberately rather than using whatever came with the board. ## What to buy Use a Class 10 card. Anything slower will hurt playback. Use 16 GB or larger. We ship SanDisk Industrial grade cards in our pre-built players, part number `SDSDQAF3-016G`. If you want to match what we run, that is the card. ## Why grade matters more than capacity A signage player writes to its card continuously, for years, with no one watching. That is the workload consumer cards handle worst, and a card that is fine in a camera can fail in a screen within months. A failed card is a site visit. On a screen that is awkward to reach, the difference in price between a consumer card and an industrial one is recovered the first time you do not have to drive to it. ## If a card fails Write a fresh image to a new card and pair the device again. Nothing is stored only on the device, so a screen rebuilt from a new card comes back with the same content and schedule. [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/) has the steps. --- # Supported boards Source: https://www.screenly.io/docs/screenlyos/hardware/raspberry-pi/reference/supported-boards/ > Which Raspberry Pi models run ScreenlyOS, and which one to pick for a new screen or a conversion. Three generations can run ScreenlyOS, and each is selectable when you write the image. Two of them are what we would put a new screen on. ## Boards | Board | Status | Wi-Fi | Notes | | --- | --- | --- | --- | | Raspberry Pi 5 | Supported | 2.4 and 5 GHz | The most capable of the three, and the one to pick for a new build. | | Raspberry Pi 4 | Supported | 2.4 and 5 GHz | The common choice, and what our own standard player is built on. | | Raspberry Pi 3 | End of life | 3B+ dual band, 3B 2.4 GHz only | Pi 3 based players reached end of life in December 2025. They keep running, but they no longer receive updates or support. | All three show content at up to 1080p. That ceiling comes from what we support on this hardware rather than from the board you pick, so a newer board does not raise it. For 4K you need a [Screenly Player Max](/docs/screenly-players/overview/choosing-a-model/). ## Memory Use a board with 2 GB or more. More memory is better, and it is the specification most worth paying for on a self-build. ## Which to pick For a new screen, buy a Pi 5. It has the most headroom, and it is the generation that will stay current longest. A Pi 4 is the safe choice if you already have one, or if you are buying second-hand. Do not build a new screen on a Pi 3, and plan to move the ones you have to a Pi 4, a Pi 5, or a [Screenly Player Max](/docs/screenly-players/). A Pi 3 keeps playing after its end-of-life date, which is what makes this easy to leave alone. What stops is the updates. See [Lifecycle and support](/docs/screenly-players/reference/lifecycle-and-support/) for what end of life means in practice and when each generation reaches it. ## Power Use the official power supply for your board. Undervoltage on a Pi shows up as a screen that reboots or freezes at random, which looks like a software fault and is not one. ## Next The card matters as much as the board. See [SD cards](/docs/screenlyos/hardware/raspberry-pi/reference/sd-cards/). The board's own indicator lights are the same whether you supplied the Pi or bought a player built on one. See [Indicator lights](/docs/screenly-players/models/screenly-player/reference/indicator-lights/). --- # Get the image Source: https://www.screenly.io/docs/screenlyos/hardware/scala-players/guides/get-the-image/ > The ScreenlyOS image for Scala players comes from Screenly support rather than a public download, and why the process works that way. The ScreenlyOS image for Scala players is not a public download. Contact [Screenly support](https://support.screenly.io/hc/en-us/requests/new), tell us which models you have, and we will send you the image and the steps for your hardware. We do it this way because these installations replace a working system on hardware we have not always seen, and because support depends on the model. [Supported models](/docs/screenlyos/hardware/scala-players/reference/supported-models/) shows where each one stands. > [!IMPORTANT] > Installing ScreenlyOS on a Scala player replaces what is on the device. Anything held only on that player, including locally stored content and its Scala configuration, is gone once the install starts. Confirm you can rebuild the schedule in Screenly before you begin. ## What to expect afterwards Once ScreenlyOS is installed, the player behaves like any other ScreenlyOS device. It shows a pairing code on first boot, you enter it in your dashboard, and it updates itself from then on. [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) covers the pairing step and what first boot does. --- # Moving a Scala fleet to Screenly Source: https://www.screenly.io/docs/screenlyos/hardware/scala-players/overview/moving-a-scala-fleet/ > Scala players run standard x86 hardware. Replacing the operating system brings the fleet under Screenly without buying new devices or scheduling a truck roll. If you run Scala players, the hardware still works. The question is what happens next, and that changed in 2026. ## Where Scala hardware stands Scala is now part of Vertiseit, which completed the acquisition in June 2026. Vertiseit is a software platform company, alongside Dise, Grassfish, and Visual Art, and the player hardware line is not where its attention sits. Several player models were already discontinued before that. Together it means an existing fleet runs on hardware nobody is actively building a future for, even though the players themselves are fine. There is no emergency here. It is the sort of thing worth deciding on your own schedule rather than on the day a player fails. ## Two problems, one answer The players you have and the players you will need are usually treated as separate problems. They are the same one. ### Reuse the players you already have Scala players are standard x86 machines. Nothing about the hardware ties it to the software that shipped on it, so the existing fleet can run Screenly instead. No new hardware and no capital request. ### Have somewhere to go when one fails When a player does eventually die, the replacement is a current Screenly Player rather than a hunt for second-hand stock of a discontinued model. The fleet ends up mixed for a while, and that is fine. Reimaged Scala players and Screenly players appear side by side in the same dashboard and are managed the same way. That second part is the one people underrate. It turns a failure from a small crisis into an order. ## What reimaging involves Support sends you the image and the steps for your model. You write it to a USB stick, boot the player from it, and the machine becomes a Screenly device. Ubuntu Core underneath, our playback engine on top, managed from your dashboard, updated over the air with signed transactional updates that roll themselves back if they fail. Whatever the player was running before, Windows or Linux, comes off. The only visit needed is the person walking to the player with the USB stick. On a fleet that already boots over the network, the same image can go out by PXE with no visit at all. ## What it does not do It does not make old hardware faster. A player that struggles with demanding content today will struggle after the change, and what a given player handles depends on its memory and its generation as much as its model name. Tell us the configuration you have and we will tell you what to expect from it. It also does not work on every model yet. We only call a model supported once someone here has booted one and watched it play, and several models are still untested. [Supported models](/docs/screenlyos/hardware/scala-players/reference/supported-models/) shows exactly where each one stands, including the ones we cannot yet vouch for. ## Where to start Tell us which models you run and roughly how many. If your model is confirmed we will send you the image and the steps. If it is not, that conversation is usually what moves it up our testing queue. [Get in touch](https://support.screenly.io/hc/en-us/requests/new), or read [the guides](/docs/screenlyos/hardware/scala-players/guides/) for what the process involves. --- # Supported models Source: https://www.screenly.io/docs/screenlyos/hardware/scala-players/reference/supported-models/ > Model-by-model status for running ScreenlyOS on Scala players, covering what we have confirmed on real hardware and what still needs testing. Scala shipped several player generations, so support is per model rather than across the range. We only call a model supported once someone here has booted one and watched it play. ## What the statuses mean ### Supported We have installed ScreenlyOS on that model, run content on it, and confirmed it behaves. ### Likely compatible The processor and firmware match a model we have confirmed, so we expect it to work. We have not run it ourselves, so we will not promise it. ### Needs testing We have not put ScreenlyOS on one. It may work perfectly. We have no evidence either way, and we would rather say that than guess. ## Models | Model | Status | Notes | | --- | --- | --- | | Player-SP (R1505G, current generation) | Supported | Confirmed on real hardware, including driving two displays as one joined surface. Two HDMI outputs and 8 GB of memory. | | Player-S (R1305G, current generation) | Likely compatible | Same processor family as the Player-SP, with less memory. What it handles depends on the memory fitted, so ask us about your configuration. | | Player-DX (B396) | Needs testing | - | | Player-Q (B396) | Needs testing | Four outputs. We have not been able to source one to test. | | Player-L (B308) | Needs testing | The oldest platform. Test queue for that reason. | | Player-S (B409, earlier generation) | Needs testing | Discontinued hardware, so replacement stock is the problem this route solves. | | Player-SP (B409, earlier generation) | Needs testing | As above. | | Player-R | Needs testing | We have little documentation on this model. | ## If your model needs testing Tell us what you have. If you run a model that is not listed, [tell us](https://support.screenly.io/hc/en-us/requests/new) which one and how many. [Get in touch](https://support.screenly.io/hc/en-us/requests/new) with the model and roughly how many you run. If it is already in our queue we will tell you where it stands, and if it is not, that conversation is usually what puts it there. --- # Configure time servers Source: https://www.screenly.io/docs/screenlyos/networking/guides/configure-time-servers/ > Screens use NTP to keep their clocks accurate. Allow ntp.ubuntu.com, or point players at a time server on your own network. A player keeps its clock through Network Time Protocol, and an accurate clock is a requirement rather than a nicety. Security depends on it, and so does playback: a screen with the wrong time runs your schedule at the wrong time. By default players use `ntp.ubuntu.com`. ## On a corporate network Either allow `ntp.ubuntu.com` through the firewall on port 123, or point players at a time server you already run. ## Adding your own servers Time servers are set through the [Network Config Generator](/os/network-config-generator/), the same tool used for Wi-Fi and static addressing. 1. Open the [Network Config Generator](/os/network-config-generator/). 2. Turn on **Configure NTP settings**. 3. Enter your time server, and use the add button to list more than one. 4. Generate the file and apply the `network.yaml` from a USB drive, as in [Connect to Wi-Fi](/docs/screenlyos/networking/guides/connect-to-wifi/). [ntppool.org](https://www.ntppool.org) is a source of public servers if you do not run your own. Listing more than one is worth doing wherever the primary server is not guaranteed. A player that cannot set its clock reports an error rather than quietly carrying on, so a single unreachable server takes the screen out of service. ## If you see a time server error See [Diagnostic errors](/docs/screenlyos/networking/reference/diagnostics-errors/) for what to check. --- # Connect on an enterprise network Source: https://www.screenly.io/docs/screenlyos/networking/guides/connect-on-an-enterprise-network/ > Use WPA2-Enterprise with 802.1X on a Screenly Player, on Wi-Fi or wired ethernet, including alongside a static IP. Corporate networks usually authenticate the device rather than accept a shared password. ScreenlyOS supports that on both Wi-Fi and wired ethernet. ## What is supported **WPA2-Enterprise with 802.1X**, on wireless and on wired connections, including alongside a [static IP](/docs/screenlyos/networking/guides/set-a-static-ip/). > [!IMPORTANT] > The current implementation supports **PEAP only**. If your network requires a different EAP method, such as EAP-TLS, talk to us before you plan a rollout around it. ## How to configure it 802.1X is set up through the on-screen wizard on the player, the same one used for Wi-Fi and static addressing. 1. Connect a USB keyboard to the player. 2. Press **F2**. 3. Work through the wizard and enter your 802.1X credentials. ## If it will not authenticate Confirm the network is offering PEAP rather than another EAP method. That is the most common reason a player fails on a network where laptops connect without trouble, because a laptop will negotiate a method the player does not implement. Then check the player is on the right VLAN, and see [Diagnostic errors](/docs/screenlyos/networking/reference/diagnostics-errors/). --- # Connect to Wi-Fi Source: https://www.screenly.io/docs/screenlyos/networking/guides/connect-to-wifi/ > Connect a Screenly Player to a wireless network with a USB keyboard, or with a network.yaml file on a USB drive for headless setups. By default a player uses DHCP over ethernet, which needs nothing configured. Wireless takes one of two routes. ## With a keyboard This is the route to use unless something prevents it. You pick the network from a list, so there is nothing to mistype. 1. Connect a USB keyboard to the player. 2. Press **F2**. On a Pi 3, or a device on older software, press **ESC** instead. 3. Select your network from the list with the arrow keys and press Enter. 4. Type the password and press Enter. For a hidden network, scroll to **Other** at the bottom of the list and enter the details by hand. ## With a USB drive Use this when you cannot attach a keyboard, or when support asks you to. It carries more risk, because every detail is typed rather than picked. 1. Format a USB stick as **FAT32**. No other filesystem is supported. 2. Open the [Network Config Generator](/os/network-config-generator/). 3. Enter the SSID and passphrase. The other settings are optional. 4. Generate the file. A `network.yaml` downloads. 5. Copy it to the USB stick and eject the stick safely. 6. Boot the player and wait for the pairing screen. It will show a network error, which is expected at this point. 7. Insert the stick. The player picks up the configuration and reboots itself. ## If it does not connect Check the band first. A Pi 3B is 2.4 GHz only, and everything newer handles both. Each model page lists what its radio supports: see [Screenly players](/docs/screenly-players/models/). Then check two access point settings. These cause most of the wireless trouble we see, and neither looks like a fault on the player. Turn off band steering on managed access points. It confuses players that are choosing a band. Avoid one SSID that serves 2.4 and 5 GHz at the same time. Create a dedicated SSID for your players on one band or the other. Both are worth ruling out before you spend time on the player, because a player that connects on one network and not another is usually looking at one of these. On a corporate network that authenticates devices rather than using a shared password, see [Connect on an enterprise network](/docs/screenlyos/networking/guides/connect-on-an-enterprise-network/). --- # Set a static IP Source: https://www.screenly.io/docs/screenlyos/networking/guides/set-a-static-ip/ > Assign a static IP address to a Screenly Player over ethernet with a keyboard, or over Wi-Fi with a network.yaml file on a USB drive. Players use DHCP by default. A static address takes one of two routes, and which routes are available depends on the connection. ## Wired, with a keyboard 1. Connect a USB keyboard to the player. 2. Press **F2**. 3. Follow the Wired Wizard and enter the address details. ## Wireless, or headless Wireless static addressing is configuration-file only at the moment. 1. Format a USB stick as **FAT32**. 2. Open the [Network Config Generator](/os/network-config-generator/) and enter the settings you need. Not every field applies to every setup. 3. Generate the file. A `network.yaml` downloads. 4. Copy it to the stick and eject the stick safely. 5. Boot the player and wait for the pairing screen, which will show a network error at this stage. 6. Insert the stick. The player applies the configuration and reboots. ## 802.1X A static address works alongside 802.1X authentication on both wired and wireless connections, configured through the same on-screen wizard. See [Connect on an enterprise network](/docs/screenlyos/networking/guides/connect-on-an-enterprise-network/). > [!NOTE] > A mistake in a hand-written `network.yaml` is the most common cause of the wired and wireless diagnostic errors. If a player will not come back after applying one, see [Diagnostic errors](/docs/screenlyos/networking/reference/diagnostics-errors/). --- # Use a cellular connection Source: https://www.screenly.io/docs/screenlyos/networking/guides/use-a-cellular-connection/ > Connect a screen over 4G or 5G with a mobile router, and the data cost and hardware limits to plan around first. Screens work over cellular, with two constraints worth understanding before you commit to it. ## You need a router, not a modem You cannot plug a USB modem into a player. Use a 3G, 4G, or 5G router, and connect the player to it over ethernet where possible, or Wi-Fi otherwise. The reason is the sheer number of modem and carrier combinations, which we cannot test or support. A router turns that problem into an ordinary network connection. Any router that provides an internet connection over ethernet or Wi-Fi should work. Availability varies by country, and we do not endorse specific models. ## Plan for the data We cache aggressively, and video and images are still large files. An idle player uses very little, but a playlist of HD video on a metered plan is a different proposition. See [What the network needs](/docs/it-requirements/overview/what-the-network-needs/) for the traffic figures we have measured, and size the plan against your actual content rather than the idle number. For fleets, IoT-focused carriers are worth looking at alongside consumer plans. --- # Diagnostic errors Source: https://www.screenly.io/docs/screenlyos/networking/reference/diagnostics-errors/ > What each network diagnostic error on a Screenly Player means, and the causes worth checking first for each one. A player runs its own network checks and reports which one failed. Each error points at a different layer, so the message narrows the search considerably. ## Wired connection The player cannot establish a link or get an IP address over ethernet. Check the cable at both ends, including whether it is fully seated rather than partly inserted. Then check the switch port: the player may need allowlisting on your network, or the port may be on the wrong VLAN. ## Wireless connection The player cannot connect over Wi-Fi. The usual causes are a wrong password, a wrong or unfindable SSID, a band the board does not support, an access point that is out of reach, or a player that needs allowlisting. Most of these come from typing network details by hand into a configuration file. Use a USB keyboard instead where you can, because it lets you pick the network from a list rather than spelling out the SSID. ## Time server (NTP) connection The player cannot reach a time server, so it cannot set its clock. Check that port 123 is open and that `ntp.ubuntu.com` is allowed. Then check for an error in a manual NTP configuration, or a routing problem reaching the server. Accurate time is not cosmetic here: security and scheduled playback both depend on it. See [Configure time servers](/docs/screenlyos/networking/guides/configure-time-servers/). ## Screenly backend connection The player cannot reach `api.screenlyapp.com`, `mtls.screenlyapp.com`, or `ws.screenlyapp.com`. Check whether those hostnames are blocked by your firewall, whether there is a DNS mistake in a manual network configuration, or whether the player is on the wrong VLAN. ## Operating system connection The player cannot reach the resources Canonical provides for Ubuntu Core. Check the [hostnames and ports](/docs/it-requirements/reference/hostnames-and-ports/) are allowlisted in full, including the Ubuntu entries, and that the player is on the right VLAN. ## If an error persists Once you have confirmed the requirements are in place, power cycle the player: disconnect it for 20 to 30 seconds and reconnect. If it comes back with the same error, [contact support](https://support.screenly.io/hc/en-us/requests/new). --- # How to get it Source: https://www.screenly.io/docs/screenlyos/overview/how-to-get-it/ > ScreenlyOS comes preinstalled on Screenly players and Sharp displays, and you can install it yourself on a Raspberry Pi or a Scala player. ScreenlyOS is included with your subscription, updates included. It is never a separate line item, and buying our hardware is not a condition of anything. There are two ways to get a device running it: buy hardware with it already installed, or install it yourself on hardware you have. ## Hardware that arrives with it installed The Screenly Player is Raspberry Pi based and shows content at up to 1080p. The Screenly Player Max is the more powerful model, goes up to 4K, and adds a TPM and Secure Boot for environments with stricter requirements. Both arrive tuned to the hardware, so you plug in the display and the network, turn it on, and it shows a pairing code. Sharp ships ScreenlyOS preloaded on some of its large-format displays, with a Raspberry Pi Compute Module built into the panel. Nothing plugs in and nothing hangs off the back. The display is the device. This is the most hands-off route, and the one to pick if you are buying hardware anyway. ## Install it yourself You can put ScreenlyOS on hardware you already own. We support two kinds today, and each has its own guide because the way the image gets onto the device differs. A [Raspberry Pi](/docs/screenlyos/hardware/raspberry-pi/) becomes a full ScreenlyOS device. You download the image and write it to an SD card. It shows content at up to 1080p and behaves the same as a Screenly Player in almost every respect. This is the fastest way to try ScreenlyOS on real hardware before committing to a purchase. A [Scala player](/docs/screenlyos/hardware/scala-players/) can be converted to ScreenlyOS, which keeps a fleet that is already mounted behind displays. The image for these is not a public download, so you [contact support](https://support.screenly.io/hc/en-us/requests/new) to get it. Note: A Raspberry Pi running our software is not a Screenly Player. We use that name for hardware we sell, which matters when you are reading hardware-specific pages. ## Setting up a device with no keyboard A ScreenlyOS device has no login and no desktop, so there is nothing to administer on it. Everything is configured from your dashboard once the device is paired, and pairing needs only the code shown on the display. Wired ethernet needs nothing at all. For wireless or a static IP, the device shows a setup wizard on first boot, which you can complete with a USB keyboard. To skip the keyboard, put a `network.yaml` from the [Network Config Generator](/os/network-config-generator/) on a USB drive and the device reads it on first boot, so a screen in a ceiling mount needs nothing attached to it. ## Next [Hardware](/docs/screenlyos/hardware/) has a page for each supported device, or go straight to [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) if your hardware arrived with ScreenlyOS on it. --- # Driving more than one display Source: https://www.screenly.io/docs/screenlyos/overview/multiple-displays/ > One player can drive up to four screens, showing the same content on each. How many depends on the device, and the outputs it exposes. A single player can drive more than one screen. How many depends on the device. ## What it does Every output shows the same picture, mirrored. That is the point of the mode: one player, one playlist, several screens showing it. > [!IMPORTANT] > This is not a way to run different content on each screen. Independent playlists per output are not what this mode does. If you need two screens showing different things, use two screens in your dashboard. ## How many displays | Device | Displays | | --- | --- | | [Player Max Mk2](/docs/screenly-players/models/player-max-mk2/) and [Mk3](/docs/screenly-players/models/player-max-mk3/) | 4 | | [Player Max Mk1](/docs/screenly-players/models/player-max-mk1/) | 2 | | Raspberry Pi 4 and 5 | 2 | | Raspberry Pi 3 | 1 | ## The outputs **Player Max Mk2 and Mk3** expose four video outputs you can use at once: two HDMI, and two USB-C carrying video over DisplayPort Alt Mode. The USB-C outputs need a suitable USB-C to display cable or adapter. **Raspberry Pi 4 and 5** expose two micro HDMI outputs. Connect each output to its own screen. All of them show the same mirrored image. ## On Screenly Anywhere Multiple displays work on [Screenly Anywhere](/docs/anywhere/) too, but nothing about it is configured in Screenly. In a **browser**, it is entirely the host operating system's business. How many displays you get depends on how many monitors are attached to that machine and how the system is set up. There are no display settings inside Anywhere. On **Android**, behavior varies by device and by Android version, because multi-display support differs between manufacturers. ## A joined surface Driving several outputs as one continuous canvas, a video wall, is a different thing from mirroring, and it is not a released feature. It is proven on our hardware, but the layout still has to be configured by hand. If you need a video wall rather than mirrored screens, [talk to us](https://support.screenly.io/hc/en-us/requests/new) rather than planning around it. --- # What ScreenlyOS is Source: https://www.screenly.io/docs/screenlyos/overview/what-is-screenlyos/ > An operating system built for one job, so nobody is left holding the parts of a signage device that no vendor owns. ScreenlyOS is a complete operating system, built on Ubuntu Core in partnership with Canonical, and hardened down to a single job. The whole system is ours, and the device exists to run it. The practical consequence: the device does nothing else. Nothing to log into, nothing else installing updates, nothing else competing for memory, and nothing else putting a window in front of your content. ## Why it exists Digital signage is three layers, and most vendors own only one. | Layer | What it covers | Who usually owns it | |---|---|---| | Content | Authoring, scheduling, publishing | The signage software vendor | | Device management | Monitoring, control, provisioning, diagnostics | A separate vendor, or nobody | | Operating system and device | Boot, drivers, patching, hardening, lifecycle | The OS vendor or display manufacturer | Each party does its part competently. The gap is in the space between them, and the operating system is where that space sits. The hardware maker did not write it, and the signage vendor cannot patch it. The OS vendor has no idea the machine is showing a lobby display. That gap becomes somebody's job anyway: patching, testing the patches, imaging and reimaging, drivers, and a site visit every time one of them stops behaving. None of it appears in a signage budget. We build all three layers and release them as one product, which is what lets one vendor be answerable for the whole device. ## What we optimize for Owning the whole device means we get to decide what the device is good at. Two things come before everything else, and every other decision follows from them. Security, because a screen is a computer on your network, usually in a public space, often in a building nobody from your team visits. Reliability, because the value of a screen is that it is playing. A screen that needs attention costs more than it earns, and the attention it needs is almost always a person driving to it. ## Security ### Closed by default No remote login and no open ports. Encrypted storage where the hardware supports it. There is no way to get a shell on the device. The attack surface is small because the device does one job. Nothing else is installed, so nothing else can be exploited. ### Built for real networks 802.1X on wired and wireless, including static IP configuration from the on-screen setup wizard, and mutual TLS client certificates so a screen can authenticate to internal services. A screen that cannot meet your network's requirements ends up on a guest VLAN or an exception, which is its own kind of risk. ### Credentials sealed to the hardware On devices with a TPM, such as the Screenly Player Max, the credentials a screen uses to reach protected content are stored in that chip rather than in ordinary storage. A screen showing a dashboard behind a login, or reaching an internal service over mutual TLS, keeps those secrets tied to the device itself. ## Reliability ### Updates that undo themselves The operating system and the playback software update together, over the air, cryptographically signed and transactional. A failed update rolls back on its own, so a bad update does not leave a screen stranded. Because the two update together, there is no version of the operating system that the playback software was never tested against. ### Nothing else competing for the machine No background updater, no antivirus scan, and no other application deciding it needs the foreground. When a general-purpose system fails as a screen, it is usually because something else put a window in front of the content. ### Managed without site visits Remote reboot, remote diagnostic screenshots, and CPU, memory, and network health, all from the dashboard. Some things people expect to find on that list are missing from it, because they are not exclusive to ScreenlyOS. Offline playback and playback reporting work on a ScreenlyOS device, but they work on every other Screenly screen too, including [Screenly Anywhere](/docs/anywhere/), because they come from the platform rather than the operating system. ## What it adds up to Peace of mind, mostly. You deploy the device and stop thinking about it. There is no patching schedule, no imaging process to keep current, no antivirus, no logins to rotate, and no general-purpose system quietly doing its own thing behind your content. Updates apply themselves and undo themselves if they fail. A screen on a factory floor, in a branch office, or in a building nobody from your team visits is meant to be something you set up once and leave running. That is what owning the whole device buys. ## What it costs Nothing on its own. ScreenlyOS is included with your Screenly subscription, and so are its updates, for as long as the screen is subscribed. There is no license for the operating system, no separate line item, and no upgrade fee when a new version ships. You pay per screen for Screenly, and the software that runs on the device comes with it. Buying our hardware is not a condition either. An organization that runs ScreenlyOS entirely on hardware it already owns, and never buys a single Screenly Player, is a perfectly normal outcome. ## What it runs on Our own Screenly Player, in both the standard and Max models, and Sharp large-format displays that ship with it preloaded. It also runs on hardware you supply: a Raspberry Pi, which you flash yourself, and Scala players, where support depends on the model and the image comes from our support team. [Hardware](/docs/screenlyos/hardware/) has a page for each device, covering what it can do and how to install ScreenlyOS on it. ### Other hardware you already own ScreenlyOS can also run on other amd64 hardware, the standard 64-bit PC architecture. That includes signage players from other vendors, whether or not the vendor still supports them. This is not a self-serve route. Each model has to be booted and confirmed before we list it as supported, and we will not tell you a model works until someone has actually tested one. [Get in touch](https://support.screenly.io/hc/en-us/requests/new) with what you have and we will tell you where it stands. It is worth asking about either way. If you are moving to Screenly, converting the players you already have avoids buying hardware to replace hardware that works. And where the hardware is fine but the software on it is not, replacing the operating system is the change that keeps the fleet in service. ## Next [How to get it](/docs/screenlyos/overview/how-to-get-it/) covers the routes to a device running ScreenlyOS. --- # Supported platforms Source: https://www.screenly.io/docs/anywhere/overview/supported-platforms/ > Every device Screenly Anywhere runs on, how each one is set up, and which route to pick for the hardware you already have. Screenly Anywhere runs on hardware you already own. What that means in practice depends on the device, so this page lists everything supported and how each one gets Screenly onto it. Each platform has its own guide with the exact steps. Pick the row that matches your hardware. ## Install an app The device installs the Screenly app from its own store, then shows a pairing code. | Platform | Where the app comes from | | --- | --- | | [Android and Android TV](/docs/anywhere/platforms/android/) | Google Play Store | | [Amazon Fire TV](/docs/anywhere/platforms/amazon-fire-tv/) | Amazon Appstore | | [Samsung Tizen / SSSP displays](/docs/anywhere/platforms/samsung-tizen/) | Installed on the display from a URL | ## Use the browser already on the device Nothing is installed. The device opens a web address and becomes a screen. | Platform | What you open | | --- | --- | | [Any web browser](/docs/anywhere/platforms/browser/) | Windows, macOS, Linux, ChromeOS, iPadOS | | [LG webOS](/docs/anywhere/platforms/lg-webos/) | The browser built into the television | ## Deployed centrally For fleets an IT team manages, rather than a screen set up by hand. | Platform | How it is deployed | | --- | --- | | [ChromeOS Flex](/docs/anywhere/platforms/chromeos-flex/) | Kiosk policy from the Google Admin Console | | [Amazon Signage Stick](/docs/anywhere/platforms/amazon-signage-stick/) | Paired through the Amazon Signage console | ## Set up with us Screenly Anywhere runs on Crestron AirMedia® devices, so a meeting room display can carry signage between meetings and hand the screen back when someone presents. This one is not self-serve, so there is no guide to follow here yet. [Get in touch](/get-demo/) and we will pair the device with you. ## A note on commercial and consumer displays Samsung and LG are currently the reverse of each other, so check which line your model belongs to rather than assuming the pattern holds across brands. On Samsung we support the commercial displays and not consumer televisions. On LG we support consumer webOS TV through its browser, and not webOS Signage, which is the business display line. ## Next [Connect a screen](/docs/screens/setup/connect-a-screen/) explains what the process looks like before you open your platform's guide. --- # What Screenly Anywhere is Source: https://www.screenly.io/docs/anywhere/overview/what-is-screenly-anywhere/ > An app that turns hardware you already own into a managed Screenly screen, without replacing what is on the device. Screenly Anywhere is the Screenly software packaged as an app, so it can run on a device that already has an operating system of its own. A commercial display, a smart TV, an Android box, a streaming stick, or a spare computer becomes a managed screen without you replacing anything on it. The device keeps its own system, and Screenly runs on top. ## What stays the same Everything you actually work with. An Anywhere screen appears in the same screen list as every other screen, takes the same content, plays the same playlists, follows the same schedules, and answers to the same labels. Nothing about your day-to-day changes based on what a screen happens to be running. ## What it is for Three situations where this is the right answer. ### You already own the hardware A working display with a computer built in, or a box already connected to a screen, does not need replacing to run Screenly. ### The device cannot take our operating system A Samsung or LG business display runs its manufacturer's system and always will. Anywhere is how those screens join your fleet. ### You want to try Screenly today A browser tab becomes a screen in about a minute, with nothing to buy and nothing to install. ## What you give up This is worth understanding before you commit a large rollout to it. On Anywhere we manage what happens inside our app, but not the system around it. That system is still doing its own job, and it can install its own updates and restart, compete for memory, or put its own messages in front of your content. On some platforms, apps are drawn on our servers and sent to the screen as pictures rather than running on the device itself. There is a longer-term version of the same trade. Anywhere rides on the device's own software, so when the manufacturer stops updating it, the screen ages out with it even though the panel may be in perfect condition. Putting a device running [ScreenlyOS](/docs/screenlyos/) in front of that same panel turns it into only a display, which is the part that lasts. None of this happens on ScreenlyOS, because there the device does nothing else. If a screen matters enough that an unexpected restart would be a problem, or you expect it to stay in service for years, that is the better route for it. Most organizations run both, and we support that fully. ## How it compares to ScreenlyOS The two are alternatives. A device runs one or the other, and a workspace can hold both. | | Screenly Anywhere | ScreenlyOS | |---|---|---| | What it is | An app on the device's own system | The whole operating system | | Hardware | Whatever you already own | Our players, a Raspberry Pi, Sharp displays | | Something interrupting your content | Possible | Only a Screenly update | | Who updates the system | The device manufacturer | We do | | How long it stays current | The manufacturer's support window | As long as we support it | Anywhere wins on reach and on starting today. ScreenlyOS wins on control and on staying in service for years. [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) has the full comparison, including what each means in practice. ## Next [Choose your platform](/docs/anywhere/platforms/) for setup steps, or [what you need](/docs/anywhere/overview/what-you-need/) for the hardware and network requirements. --- # What you need Source: https://www.screenly.io/docs/anywhere/overview/what-you-need/ > The devices Screenly Anywhere runs on, the network access it needs, and the workspace to pair it with. Screenly Anywhere asks for very little: a device that can display a web page, an internet connection, and a Screenly account. ## A supported device Anywhere runs on Samsung commercial displays, LG televisions, Android and Android TV devices, Amazon Fire TV, the Amazon Signage Stick, ChromeOS Flex, and any current browser, which is how Windows runs it. [Supported platforms](/docs/anywhere/overview/supported-platforms/) has the detail on each, including which Samsung and LG lines are covered. If a device can open a current browser and stay awake, it can almost certainly run Anywhere. ## An internet connection The device needs normal outbound internet access, the same as a phone or a computer. It only ever connects out to us, so there is nothing to open up or forward on your network. Two things to avoid, because a screen cannot work around either: - A guest network with a sign-in page. A screen cannot click through a "click here to accept" page. - A device set to sleep or power off on a timer. Check the device's own power settings before you mount it. If your network is restricted, [IT requirements](/docs/it-requirements/) has the hostnames and ports to allow. An Anywhere screen needs the Screenly entries only. ## A Screenly account [Signing up](https://login.screenlyapp.com/sign-up) takes an email address and starts a free trial with no card required. You need an account before pairing, because a screen joins a specific workspace. ## Next [Choose your platform](/docs/anywhere/platforms/) and follow its setup steps. --- # Install the app Source: https://www.screenly.io/docs/anywhere/platforms/amazon-fire-tv/guides/install-the-app/ > Install Screenly from the Amazon Appstore on a Fire TV Stick or Fire TV device and pair it with your workspace. 1. On the device, open the Amazon Appstore and search for Screenly. 2. Install the app and open it. 3. A pairing code appears on screen. 4. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. ## Next Fire TV devices sleep by default, and that is the usual reason a Fire TV screen goes dark. [Keep it running unattended](/docs/anywhere/platforms/amazon-fire-tv/guides/keep-it-running/) covers the settings to change. --- # Keep it running unattended Source: https://www.screenly.io/docs/anywhere/platforms/amazon-fire-tv/guides/keep-it-running/ > Turn off the Fire TV screensaver and sleep timer, and allow Screenly to start on boot, so a Fire TV screen recovers from a power cut on its own. A Fire TV is sold as a television accessory, so it ships configured to power down when nobody is using it. That is the opposite of what a signage screen needs. The Screenly app starts itself when the device boots, so a screen recovers from a power cut on its own with nobody visiting the site. Fire OS is built on Android, so the same two device settings have to permit it first, and both are off on many devices. ## Turn off sleep and the screensaver In the device settings, turn off the screensaver and any sleep timer before leaving a screen to run on its own. Both are on by default. ## Allow display over other apps Screenly needs permission to put itself in front of whatever the device shows at startup. Without it the app starts but sits behind the launcher. 1. Open the device settings. 2. Find the app permissions for Screenly. 3. Enable the permission usually called **Display over other apps**. Some devices name it **Appear on top**, **Draw over other apps**, or **Floating window**. ## Allow the app to start on boot Android tells apps when the device has finished booting, and Screenly listens for that. Some devices ship with a security or power-management app that blocks that boot message from reaching apps, which is usually what prevents an otherwise correct setup from coming back on its own. 1. Open the device settings and look for an autostart, startup manager, or permission manager. 2. Find Screenly in the list. 3. Allow it to start on boot. > [!NOTE] > The names and locations of both settings vary between Fire OS versions. If you cannot find them, search the device settings for "autostart" and for "over other apps". ## Check it worked Pull the power, wait, and plug it back in. The screen should return to your content without anyone picking up a remote. Test this before a screen is mounted somewhere awkward. A screen that needs a person to press a button after every power cut is the most expensive kind to run. --- # Digital signage on Amazon Fire TV Source: https://www.screenly.io/docs/anywhere/platforms/amazon-fire-tv/overview/digital-signage-on-fire-tv/ > Turn a Fire TV Stick or Fire TV device into a managed digital signage screen by installing Screenly from the Amazon Appstore. A Fire TV Stick is one of the cheapest ways to put a display under management. Screenly is published on the Amazon Appstore, so the device installs the app directly and joins your fleet like any other screen. For a screen showing a production dashboard or a rotation of company notices, the hardware cost stops being a reason not to do it. ## How it works Install Screenly from the Amazon Appstore and open it. The device shows a pairing code, you enter it in your dashboard, and the screen starts playing. Fire OS is built on Android, so a Fire TV behaves like an Android device once Screenly is running on it. ## What it is good for Adding screens cheaply, and adding them quickly. A Fire TV Stick plugs into any display with an HDMI port, which means an existing television becomes a signage screen without touching the display itself. Sites where hardware goes missing or gets damaged. Replacing a stick is inexpensive enough that it is not a project. ## What to weigh against it A Fire TV is a television accessory, so it ships configured to power down when nobody is using it. The screensaver and sleep timer both have to be turned off, and the same two Android settings decide whether it comes back after a power cut. See [Keep it running unattended](/docs/anywhere/platforms/amazon-fire-tv/guides/keep-it-running/). It is also not the Amazon Signage Stick, which is a different product that is purpose-built for signage and pairs through Amazon's own console. See [Amazon Signage Stick](/docs/anywhere/platforms/amazon-signage-stick/) if that is the device you have. ## Get started [Install the app](/docs/anywhere/platforms/amazon-fire-tv/guides/install-the-app/) and pair the screen. --- # What to know first Source: https://www.screenly.io/docs/anywhere/platforms/amazon-fire-tv/overview/what-to-know-first/ > The one product mix-up worth avoiding before you buy: a Fire TV Stick is not the Amazon Signage Stick. Amazon sells two devices that both look like candidates for digital signage, and they are set up in completely different ways. ## Fire TV A television accessory. Screenly installs on it as an app from the Amazon Appstore. Fire OS is built on Android, so it behaves like an Android device once Screenly is running on it. ## Amazon Signage Stick Purpose-built signage hardware. There is no app to install. You pair it through Amazon's own Signage console, choosing Screenly as the CMS provider. See [Amazon Signage Stick](/docs/anywhere/platforms/amazon-signage-stick/). > [!NOTE] > If you are buying hardware for a new screen, the Signage Stick needs no sleep or screensaver settings changed. A Fire TV does. --- # Pair the stick Source: https://www.screenly.io/docs/anywhere/platforms/amazon-signage-stick/guides/pair-the-stick/ > Add your Amazon Signage Stick in the Amazon Signage console, choose Screenly as the CMS provider, and enter the pairing code. 1. Connect the stick to your display over HDMI and power it on. 2. Complete the on-screen setup, choosing language and network. 3. In the [Amazon Signage console](https://console.signage.amazon.com/), add your stick and select Screenly as the CMS provider. 4. A pairing code appears on your display. 5. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. There is nothing further to configure on the device. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. --- # Digital signage on the Amazon Signage Stick Source: https://www.screenly.io/docs/anywhere/platforms/amazon-signage-stick/overview/digital-signage-on-the-amazon-signage-stick/ > Pair an Amazon Signage Stick with Screenly as your CMS provider through the Amazon Signage console, and run it as a managed screen. The Amazon Signage Stick is purpose-built signage hardware from Amazon. Unlike a Fire TV Stick, it is not a television accessory adapted for the job, and it does not run an app store you install a signage app from. Screenly is available as a CMS provider for it, so a Signage Stick can be managed from the same dashboard as the rest of your screens. ## How it works You add the stick in Amazon's own Signage console and choose Screenly as the CMS provider. The display shows a pairing code, you enter it in your Screenly dashboard, and the screen joins your fleet. There is no app to install on the device, which is the main way this platform differs from every other Anywhere route. ## What it is good for Screens that need to run unattended with as little device configuration as possible. Because the stick is built for signage rather than for watching television, it does not ship with the sleep timers and screensavers that have to be turned off on consumer hardware. There is no unattended-running setup for this platform. Organizations already deploying through Amazon's signage tooling, where adding Screenly as the CMS fits the process they have. ## What to weigh against it It is dedicated hardware you buy, so it is not the route for reusing something you already own. If that is what you are after, the [browser](/docs/anywhere/platforms/browser/) or [Android](/docs/anywhere/platforms/android/) routes fit better. It is also easy to confuse with a Fire TV Stick, which is a different product with a different setup path. See [Amazon Fire TV](/docs/anywhere/platforms/amazon-fire-tv/) if that is what you have. ## Get started [Pair the stick](/docs/anywhere/platforms/amazon-signage-stick/guides/pair-the-stick/) through the Amazon Signage console. --- # How it differs Source: https://www.screenly.io/docs/anywhere/platforms/amazon-signage-stick/overview/how-it-differs/ > The Signage Stick is the only Anywhere platform with no app to install and no unattended-running setup. Every other Anywhere platform installs an app or opens a web address on the device. This one does neither. ## Setup runs through Amazon You add the stick in Amazon's Signage console and choose Screenly as the CMS provider. Nothing is installed on the device by you. ## There is no unattended setup On consumer hardware, most of the work is turning off sleep timers and screensavers. A Signage Stick ships without them, so once it is paired there is nothing further to configure. ## It is not a Fire TV Stick The two are different products with different setup paths. See [Amazon Fire TV](/docs/anywhere/platforms/amazon-fire-tv/) if that is the device you have. --- # Launch the app automatically on power on Source: https://www.screenly.io/docs/anywhere/platforms/android/guides/auto-launch-on-power-on/ > Configure an Android device so Screenly starts by itself after a power cut, including the two settings that block it by default. The Screenly app starts itself when the device boots, so a screen recovers from a power cut on its own with nobody visiting the site. Two device settings have to permit it first, and both are off on many devices. If a screen comes back to a home screen instead of your content after a restart, one of these is the reason. ## Allow display over other apps Screenly needs permission to put itself in front of whatever the device shows at startup. Without it the app starts but sits behind the launcher. 1. Open the device settings. 2. Find the app permissions for Screenly. 3. Enable the permission usually called **Display over other apps**. Some manufacturers name it **Appear on top**, **Draw over other apps**, or **Floating window**. ## Allow the app to start on boot Android tells apps when the device has finished booting, and Screenly listens for that. Some devices, and many consumer televisions, ship with a security or power-management app that blocks that boot message from reaching apps. That is usually the thing preventing an otherwise correct setup from coming back on its own. 1. Open the device settings and look for an autostart, startup manager, or permission manager. On manufacturer skins this often sits under battery, security, or privacy rather than under the app itself. 2. Find Screenly in the list. 3. Allow it to start on boot. > [!NOTE] > The names and locations of both settings vary widely between manufacturers and Android versions. If you cannot find them, search the device settings for "autostart" and for "over other apps". ## Turn off sleep and power saving Check the device's own sleep and power-saving settings too. An Android TV in particular will often turn itself off after a period with no remote input, which looks like a Screenly fault and is not one. ## Check it worked Pull the power, wait, and plug it back in. The screen should return to your content without anyone touching a remote. Test this before a screen is mounted somewhere awkward. A screen that needs a person to press a button after every power cut is the most expensive kind to run. --- # Install the app Source: https://www.screenly.io/docs/anywhere/platforms/android/guides/install-the-app/ > Install Screenly Anywhere from the Google Play Store on an Android device and pair it with your workspace. 1. On the device, open the Google Play Store and search for Screenly. 2. Install the app and open it. 3. A pairing code appears on screen. 4. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. ## Next The app launches itself on boot, but two device settings have to allow it first, and both are off on many devices. [Launch the app automatically on power on](/docs/anywhere/platforms/android/guides/auto-launch-on-power-on/) covers those and the power settings that put a screen to sleep. --- # Digital signage on Android and Android TV Source: https://www.screenly.io/docs/anywhere/platforms/android/overview/digital-signage-on-android/ > Turn an Android TV, tablet, commercial display, or streaming box into a managed digital signage screen with the Screenly app from Google Play. Android TVs, Android-based commercial displays, tablets, and streaming boxes are widely available and inexpensive, which makes them straightforward to source and to justify. Screenly Anywhere installs on all of them from the Google Play Store. ## How it works Install the app from Google Play and open it. It shows a pairing code. Enter that code in your Screenly dashboard and the device joins your fleet, managed with the same playlists, scheduling, and monitoring as every other Screenly screen. The Android app is our web app packaged for Android, so it behaves the same as the browser route with a launcher that is easier to live with on a television. ## What it is good for Screens where the hardware budget is the constraint. Android hardware is inexpensive and widely available, and replacing a failed unit means ordering another one rather than sourcing a discontinued model. Commercial displays that already run Android. Many large-format panels have Android built in, which removes the separate player from the installation entirely. ## What to weigh against it Android hardware is built for people who are in the room. It sleeps, it powers down after a period with no remote input, and it puts its own launcher in front of whatever is running. Two device settings decide whether a screen comes back on its own after a power cut, and both are off by default on many devices. That is the real work on this platform, and it is covered in [Launch the app automatically on power on](/docs/anywhere/platforms/android/guides/auto-launch-on-power-on/). Consumer televisions are the harder case, because some ship with security or power-management apps that block an app from starting on boot at all. ## Get started [Install the app](/docs/anywhere/platforms/android/guides/install-the-app/) and pair the screen. --- # Supported devices Source: https://www.screenly.io/docs/anywhere/platforms/android/overview/supported-devices/ > The Android hardware Screenly Anywhere installs on, and what the app is under the hood. Anything running a current version of Android with access to the Google Play Store. ## Hardware types Android TVs, Android-based commercial displays, tablets, and streaming boxes. Commercial displays with Android built into the panel are worth calling out, because they remove the separate player from the installation entirely. ## What the app is The Android app behaves the same as the browser route, with a launcher that is easier to live with on a television. ## Consumer televisions These are the harder case. Some ship with a security or power-management app that blocks an app from starting on boot at all, which is the setting that decides whether a screen comes back after a power cut. --- # Open it and pair the screen Source: https://www.screenly.io/docs/anywhere/platforms/browser/guides/open-it/ > Open Screenly Anywhere in the browser on the device you want to use as a screen, and pair it with your workspace. 1. On the device you want to use as a screen, open a browser and go to [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com). 2. A pairing code appears on screen. 3. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. ## Next [Run it unattended](/docs/anywhere/platforms/browser/guides/run-unattended/) covers full screen, kiosk mode, and the power settings that blank a display. --- # Run it unattended Source: https://www.screenly.io/docs/anywhere/platforms/browser/guides/run-unattended/ > Put the browser in full screen or kiosk mode, start it automatically, and stop the device sleeping, so a browser-based screen runs without anyone in the room. A browser is a general-purpose application on a general-purpose computer, so it needs three things settled before it can be left alone: hide the browser's own interface, bring it back after a restart, and stop the device powering down. ## Go full screen The browser's toolbars and tabs should not be visible on a screen people are looking at. Press F11 on Windows or Linux, or Control + Command + F on macOS. ## Start automatically in kiosk mode Full screen by hand is fine for a demonstration. A screen that runs on its own needs the browser to open the page by itself after a power cut. Set the browser to launch at startup, open [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com), and run in kiosk mode. Kiosk mode removes the address bar and the controls that let a passer-by browse somewhere else. Chrome, Edge, and other Chromium browsers support it through a command-line flag on the shortcut that starts them. Safari has no kiosk flag, so on a Mac use full screen instead. ## Stop the device sleeping The most common cause of a blank browser screen is the device's own power settings rather than Screenly. 1. Turn off sleep in the device's power settings. 2. Turn off the screensaver. 3. Remove any scheduled power-off. On a laptop, check the settings that apply when the lid is closed and when it is running on mains power, since those are configured separately. > [!NOTE] > Test a restart before the device is mounted somewhere awkward. Pull the power, plug it back in, and confirm the screen returns to your content without anyone touching a keyboard. --- # Digital signage in a web browser Source: https://www.screenly.io/docs/anywhere/platforms/browser/overview/digital-signage-in-a-browser/ > Run digital signage on a PC, Mac, or smart display using only a web browser. No media player to buy, no software to install, and no hardware to mount. You do not need a media player to run digital signage. If a device has a current web browser and can reach the internet, it can be a managed screen. That covers a lot of hardware people already own: an office PC, a mini-PC behind a display, a Mac, a Linux machine, a Chromebook, an iPad, or a smart TV with a usable browser. ## How it works You open a web address on the device. It shows a pairing code. You enter that code in your Screenly dashboard, and the device becomes a screen you manage remotely like any other, with the same playlists, scheduling, and monitoring. Nothing is installed on the device, so nothing has to be updated on it either. The browser loads the current version every time it starts. ## What it is good for Trying digital signage without buying anything. This is the shortest path from signing up to content on a real display, and it costs nothing to abandon if the answer is no. Getting more out of hardware you already have. A PC already sitting behind a display does not need replacing to become a signage screen. Windows specifically. There is no separate Windows app, because Windows uses this route in kiosk mode. ## What to weigh against it A general-purpose computer is doing a single-purpose job, and it will behave like a general-purpose computer unless you tell it not to. It sleeps, it shows a screensaver, it puts a notification over your content, and it does not necessarily come back on its own after a power cut. None of that is unfixable, and the settings are covered in [Run it unattended](/docs/anywhere/platforms/browser/guides/run-unattended/). But it is real work, and it is the reason purpose-built players exist. If you want a device that needs none of that attention, [ScreenlyOS](/docs/screenlyos/) is the other end of the same product. ## Get started [Open it and pair the screen](/docs/anywhere/platforms/browser/guides/open-it/) takes about a minute. --- # Where it runs Source: https://www.screenly.io/docs/anywhere/platforms/browser/overview/where-it-runs/ > The operating systems and devices that can run Screenly Anywhere in a browser, and what to expect from each. The browser route works on anything with a current browser that can stay powered on and online. ## Desktop systems Windows, macOS, Linux, and ChromeOS. These are the most predictable, because you can control sleep, autostart, and kiosk mode. There is no separate Windows app. Windows uses this route, run in kiosk mode. ## Tablets An iPad can run it, though not every unattended setting has an equivalent on iPadOS. Treat a tablet as a screen someone can reach rather than one mounted out of the way. ## Smart TVs Some televisions have a browser good enough to run it. Whether yours does is a question of that specific set. If you have a Samsung or LG display, check the platform page first: [Samsung Tizen / SSSP](/docs/anywhere/platforms/samsung-tizen/) and [LG webOS](/docs/anywhere/platforms/lg-webos/) have their own routes and their own supported model lists. --- # Deploy the kiosk app Source: https://www.screenly.io/docs/anywhere/platforms/chromeos-flex/guides/deploy-the-kiosk-app/ > Add Screenly Anywhere by URL as an auto-launch kiosk app in the Google Admin Console, then enroll the ChromeOS Flex device. Configure the policy before enrolling the device, so it restarts straight into Screenly. 1. In the Google Admin Console, go to **Devices** > **Chrome** > **Apps and Extensions** > **Kiosks**, and add Screenly Anywhere by URL. 2. Set it as the auto-launch kiosk app for that policy. 3. Install ChromeOS Flex on the device, enrolled to the same organizational unit. 4. The device restarts into Screenly Anywhere and shows a pairing code. 5. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. --- # Digital signage on ChromeOS Flex Source: https://www.screenly.io/docs/anywhere/platforms/chromeos-flex/overview/digital-signage-on-chromeos-flex/ > Deploy Screenly as an auto-launching kiosk app on ChromeOS Flex through the Google Admin Console, for IT-managed fleets of repurposed PCs and Macs. ChromeOS Flex turns older PCs and Macs into managed ChromeOS devices. For organizations with hardware that still works but no longer suits its original job, it is a way to get more life out of machines already on the books. Screenly runs on it as an auto-launching kiosk app, deployed centrally rather than configured device by device. ## How it works In the Google Admin Console you add Screenly Anywhere as a kiosk app and set it to auto-launch for an organizational unit. A device enrolled into that unit restarts straight into Screenly and shows a pairing code, which you enter in your dashboard. The policy travels with the device, so a replacement machine enrolled into the same unit comes up the same way with nothing configured locally. ## What it is good for IT-managed fleets, where devices are enrolled centrally and policy is how everything else is already handled. Screens in public areas. A kiosk policy hides the desktop and the login prompt, and a passer-by cannot exit to anything else. That is usually the reason to choose ChromeOS Flex over a plain browser on the same machine. Reusing hardware. A PC too old for a current desktop operating system is often perfectly capable of showing a playlist. ## What to weigh against it This is not a quick one-off setup. Getting to the first screen means touching the Admin Console, defining a policy, and enrolling a device. If you want a single screen running in a few minutes, the [browser](/docs/anywhere/platforms/browser/) route is faster on the same hardware. It also assumes you have Google Workspace with Chrome device management. Without that, the kiosk policy that makes this route worthwhile is not available to you. ## Get started [Deploy the kiosk app](/docs/anywhere/platforms/chromeos-flex/guides/deploy-the-kiosk-app/) from the Google Admin Console. --- # Who it is for Source: https://www.screenly.io/docs/anywhere/platforms/chromeos-flex/overview/who-it-is-for/ > ChromeOS Flex suits IT-managed fleets with Google Workspace and Chrome device management, and is a poor fit for a single ad hoc screen. This route assumes an IT function, not an individual setting up a screen. ## It fits if You already enroll devices centrally through the Google Admin Console, and policy is how the rest of your estate is managed. You have Google Workspace with Chrome device management. Without it, the kiosk policy that makes this route worthwhile is not available to you. You have PCs or Macs that still work but no longer suit their original job. ## It does not fit if You want one screen running in a few minutes. The [browser](/docs/anywhere/platforms/browser/) route is faster on the same machine. ## One thing to check on the hardware The kiosk policy brings the screen back after a restart, but the machine still has to power itself on. Set it in the BIOS to start when mains power returns, or a power cut leaves the device off. --- # Keep it running unattended Source: https://www.screenly.io/docs/anywhere/platforms/lg-webos/guides/keep-it-running/ > Turn off the sleep timer, screensaver, and auto-off schedule on an LG webOS television so the screen stays on without a remote. Consumer televisions are designed to power themselves down after a few hours without remote input. On a signage screen nobody ever picks up a remote, so the television reaches that timer every day. ## Turn off the automatic power-off 1. Open the TV settings. 2. Turn off the sleep timer. 3. Turn off the screensaver. 4. Turn off any auto-off or energy-saving schedule. The names differ between webOS versions, and they are not always in the same section. The setting that catches people out is the one that powers the set down after a fixed period with no remote activity. It is often described as an energy-saving feature rather than a timer. ## Check it worked Leave the screen running for longer than the timer you disabled, without touching the remote, and confirm it is still showing content. > [!NOTE] > A television that powers itself off reports as offline in your dashboard. If a screen goes offline at the same time every day, the television's own schedule is the first thing to check. --- # Open it and pair the screen Source: https://www.screenly.io/docs/anywhere/platforms/lg-webos/guides/open-it/ > Open Screenly Anywhere in the LG webOS Web Browser app and pair the television with your workspace. 1. On the TV, open the **Web Browser** app. 2. Go to [anywhere.screenlyapp.com](https://anywhere.screenlyapp.com). 3. A pairing code appears on screen. 4. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. ## Next [Keep it running unattended](/docs/anywhere/platforms/lg-webos/guides/keep-it-running/) covers the sleep timer and auto-off settings. --- # Digital signage on LG webOS Source: https://www.screenly.io/docs/anywhere/platforms/lg-webos/overview/digital-signage-on-lg-webos/ > Run Screenly on an LG webOS television using the browser built into the set. Nothing installed on the display, and no separate media player. LG televisions running webOS include a web browser, and that is enough to turn one into a managed Screenly screen. Nothing is installed on the display, and no separate player is needed. For a television already mounted on a wall, this is the shortest route to putting it under management. ## How it works Open the television's Web Browser app and go to the Anywhere address. The screen shows a pairing code, you enter it in your dashboard, and the television joins your fleet. Because it runs in the built-in browser, there is nothing on the set to update. ## What it is good for Televisions you already own. A webOS set in a meeting room, a reception area, or a break room can start showing managed content without new hardware. Sites where you cannot add a device. No player means no extra power outlet, no HDMI input consumed, and nothing hanging off the back of the set. ## What to weigh against it Support today is for webOS TV, the consumer line. webOS Signage, also sold as webOS for Pro or Commercial, is LG's platform for business and industrial displays, and it is not supported. The bigger practical issue is that a consumer television is built to switch itself off after a few hours without remote input. On a signage screen nobody ever picks up a remote, so the set reaches that timer every day. It is the single most common cause of an LG screen going dark, and it is fixable in the television's own settings. See [Keep it running unattended](/docs/anywhere/platforms/lg-webos/guides/keep-it-running/). ## Get started [Open it and pair the screen](/docs/anywhere/platforms/lg-webos/guides/open-it/) from the television's browser. --- # Supported models Source: https://www.screenly.io/docs/anywhere/platforms/lg-webos/overview/supported-models/ > Screenly Anywhere runs on LG webOS TV through the built-in browser. webOS Signage for commercial displays is not supported. LG runs two separate webOS lines, and the distinction decides whether this route works for you. ## webOS TV Supported. This is the consumer television line, and Screenly runs through the browser built into the set. ## webOS Signage Not supported. This is LG's platform for business and industrial displays, also sold as webOS for Pro or Commercial. If you run these, [tell us](https://support.screenly.io/hc/en-us/requests/new) which models and how many. > [!NOTE] > LG and Samsung are currently inverses of each other. On LG we support the consumer line; on Samsung we support the commercial range. Check which line your model belongs to rather than assuming the pattern holds across brands. --- # Install the app Source: https://www.screenly.io/docs/anywhere/platforms/samsung-tizen/guides/install-the-app/ > Install Screenly on a Samsung Tizen commercial display using the custom app URL, and pair it with your workspace. 1. On the display, go to **Settings** > **System** > **Play Via** > **Custom App**. 2. Go to **App Management** > **Install Custom App**, enter `https://tizen.srly.io`, and press **Go**. 3. A pairing code appears on screen. 4. In your dashboard, open **Screens**, click **Connect screen**, and enter the code. The screen starts playing as soon as it is paired. > [!NOTE] > A code is good for 30 days, so there is no window to miss. [Pairing codes](/docs/screens/reference/pairing-codes/) has the characters a code never contains, and why one is refused. ## Next [Keep it running unattended](/docs/anywhere/platforms/samsung-tizen/guides/keep-it-running/) covers the display's own on and off schedule. --- # Keep it running unattended Source: https://www.screenly.io/docs/anywhere/platforms/samsung-tizen/guides/keep-it-running/ > Check the display's own on and off schedule so a Samsung Tizen screen is powered during the hours you expect it to be showing content. Samsung commercial displays have a power schedule built into the display settings, separate from anything Screenly controls. A display that is switched off on its own timer shows nothing, however healthy it looks in your dashboard. ## Check the on and off schedule In the display settings, find the on and off timer and confirm it matches the hours the screen should be showing content. This is worth checking on every display in a fleet rather than one, because the schedule is set per display and factory defaults vary between models and between the settings a previous installer left behind. > [!NOTE] > A screen that is powered down on schedule reports as offline in your dashboard for those hours. That is expected, and it is worth knowing before you set up alerts for screens dropping off. --- # Digital signage on Samsung Tizen / SSSP displays Source: https://www.screenly.io/docs/anywhere/platforms/samsung-tizen/overview/digital-signage-on-samsung-tizen/ > Install Screenly directly on a Samsung Smart Signage Platform (SSSP) display running Tizen. No media player behind the screen, and no second device to power or mount. Samsung commercial displays running Tizen have a computer built into the panel. That means signage software can run on the display itself, with no player mounted behind it and no HDMI cable between the two. Samsung calls this the Samsung Smart Signage Platform, which is why these displays are usually sold and discussed as SSSP displays. If you have been given a spec sheet that says SSSP, this is the page you want. Screenly installs directly onto the display and manages it alongside every other Screenly screen. ## How it works You point the display at a URL from its own settings menu. It installs Screenly, shows a pairing code, and you enter that code in your dashboard. From then on the display is a screen in your fleet, with the same playlists, scheduling, and remote monitoring as any other. ## What it is good for Fleets of SSSP displays, where this is usually the tidiest option available. Every player you do not mount is a device that cannot be unplugged, stolen, knocked loose, or fail on its own. Installations where there is physically nowhere to put a player. A wall-mounted panel with no recess behind it has no good home for a separate box. ## What to weigh against it Support is for Samsung commercial displays. Consumer televisions do not allow custom app installation, so there is no way to install Screenly on them. For those, use a separate device over HDMI, such as a [Fire TV Stick](/docs/anywhere/platforms/amazon-fire-tv/) or an [Android box](/docs/anywhere/platforms/android/). The display also runs its own power schedule, independent of Screenly. A display switched off on its own timer shows nothing, however healthy it looks in your dashboard. ## Get started [Install the app](/docs/anywhere/platforms/samsung-tizen/guides/install-the-app/) from the display's settings menu. --- # Supported models Source: https://www.screenly.io/docs/anywhere/platforms/samsung-tizen/overview/supported-models/ > Screenly Anywhere installs on Samsung commercial displays running Tizen. Consumer televisions do not allow custom app installation. Support depends on which Samsung line the display belongs to. ## Commercial displays Supported. These are the panels Samsung sells under the Smart Signage Platform, commonly written as SSSP. ## Consumer televisions Not supported. Consumer sets do not allow custom app installation, so there is no way to install Screenly on them. Use a separate device over HDMI instead, such as a [Fire TV Stick](/docs/anywhere/platforms/amazon-fire-tv/) or an [Android box](/docs/anywhere/platforms/android/). > [!NOTE] > LG and Samsung are currently inverses of each other. On Samsung we support the commercial range; on LG we support the consumer line. Check which line your model belongs to rather than assuming the pattern holds across brands. --- # Factory reset Source: https://www.screenly.io/docs/screenly-players/guides/factory-reset/ > Reset a player to a clean state and reinstall ScreenlyOS, either from a USB drive with network.yaml or from the boot menu with a keyboard. A factory reset returns a player to a clean state and reinstalls ScreenlyOS. Use it when redeploying a player to a different site, or when a device is behaving in a way remote diagnostics cannot explain. The route below is for the Player Max. For any other player, including a Raspberry Pi, [contact support](https://support.screenly.io/hc/en-us/requests/new) and we will talk you through it. ## From the boot menu This route is for the Player Max, and needs a USB keyboard and access to the display. 1. Restart the player, and press **ESC** repeatedly while it boots until the boot menu appears. 2. Select **Install** with the arrow keys. 3. Press Enter. The reset and reinstall run on their own from there. > [!IMPORTANT] > Choose **Install**, not the **Factory Reset** entry in the same menu. Despite the name, that option leaves the device in an unusable state. Install is the supported path. If pressing ESC does nothing, check the keyboard is connected and try again while the device boots. ## What a reset does The device is returned to its recovery point and ScreenlyOS is reinstalled. Its credentials are revoked, including the certificate and private key held in the TPM on hardware that has one, so the player no longer authenticates as its old self. ## Afterwards The device comes up clean and shows a pairing code. Pair it as you would a new one: see [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/). Nothing is stored only on the device, so a screen rebuilt this way comes back with the same content and schedule once it is paired to the same workspace. --- # Mount with VESA brackets Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/guides/mount-with-vesa/ > Mount a Screenly Player Max Mk1 to the back of a display using the VESA adapter included in the box. The Mk1 ships with a VESA mount adapter, so it hangs on the back of the display with no bracket to buy. It fits the standard 75 x 75 mm and 100 x 100 mm patterns. You need a cross-head screwdriver. 1. Insert the two shoulder screws into the bottom of the player. 2. Attach the VESA plate to the display using the four screws provided. 3. Align the shoulder screws with the holes in the plate and slide the player down so it hangs on them. Mount the display first, then hang the player, then connect the cables. In that order you are never supporting the weight of the display and reaching behind it at once. > [!NOTE] > Leave room for the cables to bend. A short HDMI run pressed flat against a wall puts steady strain on the port, and that becomes an intermittent display fault months later. --- # Power on automatically Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/guides/power-on-automatically/ > Set a Screenly Player Max Mk1 to start on its own when mains power returns, using its BIOS. A Mk1 does not start by itself after a power cut unless its BIOS is told to. On a screen nobody visits, that setting is the difference between a blip and a site visit. ## Get into the BIOS 1. Disconnect the power cable from the player. 2. Connect a keyboard to one of the USB ports. 3. Hold **F2** or **DEL**, reconnect the power cable, and press the power button. Release the key once the BIOS appears. ## Change the setting 1. Move to the **Chipset** or **Advanced** tab. 2. Press Enter, then set **State** or **State After G3** to **S0**. 3. Move to the last tab and choose the option to save and exit. Some Mk1 BIOS versions need one more change: 1. Move to the **Boot** tab. 2. Find **Auto Power** and enable it. 3. Save and exit. ## Check it worked Pull the power at the wall, wait, and restore it. The player should boot on its own and return to your content with nobody touching it. Test this before the player is mounted behind a display. --- # Reinstall ScreenlyOS Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/guides/reinstall-screenlyos/ > The Player Max image is not a public download. Contact Screenly support for the image and the steps for your device. The Max is a different board from the standard player, and its image is not a public download. Contact [Screenly support](https://support.screenly.io/hc/en-us/requests/new) and we will send you the image and the steps for your device. We handle it this way because the Max uses Secure Boot, so the device only starts software we signed. Getting the right image onto the right device matters more here than on a board without it. > [!NOTE] > You should not need this to get a new player working. A Max ships with ScreenlyOS installed and updates itself once it is online. To return a working device to a clean state rather than replace its image, see [Factory reset](/docs/screenly-players/guides/factory-reset/). --- # What it is Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/overview/what-it-is/ > The first Screenly Player Max: an x86 machine with an 8th generation Intel i3, driving up to two screens. The first Player Max, and an x86 machine rather than a Raspberry Pi. It drives up to two screens, both showing the same picture, and it is the only Max that shipped with a VESA mount adapter in the box. Its BIOS menus differ from later models, which is why [Power on automatically](/docs/screenly-players/models/player-max-mk1/guides/power-on-automatically/) is written separately for it. --- # Where to buy Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/overview/where-to-buy/ > The Player Max Mk1 is discontinued. The current model is the Mk3. ## No longer sold The Mk1 is discontinued. The current Player Max is the [Mk3](/docs/screenly-players/models/player-max-mk3/). ## Why these pages are still here Plenty of Mk1s are still in service, and everything in this section applies to a device you already own: how to mount it, how to make it power on by itself, and how to reinstall it. Before planning around one, check where its generation sits in [Lifecycle and support](/docs/screenly-players/reference/lifecycle-and-support/). A player that is still running is not necessarily still supported. --- # Specifications Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk1/reference/specifications/ > Screenly Player Max Mk1: an 8th generation Intel Core i3 with an SSD, shipped with a VESA mount adapter. | Component | Specification | | --- | --- | | Processor | Intel Core i3, 8th generation | | Storage | SSD | | VESA mount | Adapter included in the box | | WPA3 | Supported | | Displays | Up to 2 | > [!NOTE] > This is the specification we publish for the Mk1. For anything not listed, [ask support](https://support.screenly.io/hc/en-us/requests/new) with your order details rather than assuming it matches a later model. ## Displays A Mk1 drives up to two screens, both showing the same picture. See [Driving more than one display](/docs/screenlyos/overview/multiple-displays/). --- # Mount with VESA brackets Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/guides/mount-with-vesa/ > Mount a Screenly Player Max Mk2 to the back of a display with a standard VESA bracket, which is not included. The player mounts on the back of the display at the standard 75 x 75 mm and 100 x 100 mm patterns. > [!NOTE] > No bracket is included with this model. Only the [Mk1](/docs/screenly-players/models/player-max-mk1/guides/mount-with-vesa/) shipped with a VESA adapter in the box. ## What to buy A VESA bracket rated for the player's weight, in 75 x 75 mm or 100 x 100 mm to match your display. Check what the display itself needs before ordering. A large-format panel may already be using its VESA holes for a wall mount, in which case you want a bracket that sandwiches between the two rather than one competing for the same screws. ## Mounting Follow the bracket's own instructions, and work in this order: mount the display, attach the player, then connect the cables. That way you are never supporting the weight of the display and reaching behind it at once. > [!NOTE] > Leave room for the cables to bend. A short HDMI run pressed flat against a wall puts steady strain on the port, and that becomes an intermittent display fault months later. --- # Power on automatically Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/guides/power-on-automatically/ > Set a Screenly Player Max Mk2 to start on its own when mains power returns, using its BIOS. A Player Max does not start by itself after a power cut unless its BIOS is told to. On a screen nobody visits, that setting is the difference between a blip and a site visit. ## Get into the BIOS 1. Disconnect the power cable from the player. 2. Connect a keyboard to one of the USB ports. 3. Hold **F2** or **DEL**, reconnect the power cable, and press the power button. Release the key once the BIOS appears. ## Change the setting 1. Move to the **Power** tab, using the arrow keys or a USB mouse. 2. Set the option that controls behavior after power loss so the device powers on. 3. Move to the last tab and choose the option to save and exit. ## Check it worked Pull the power at the wall, wait, and restore it. The player should boot on its own and return to your content with nobody touching it. Test this before the player is mounted behind a display. --- # Reinstall ScreenlyOS Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/guides/reinstall-screenlyos/ > The Player Max image is not a public download. Contact Screenly support for the image and the steps for your device. The Max is a different board from the standard player, and its image is not a public download. Contact [Screenly support](https://support.screenly.io/hc/en-us/requests/new) and we will send you the image and the steps for your device. We handle it this way because the Max uses Secure Boot, so the device only starts software we signed. Getting the right image onto the right device matters more here than on a board without it. > [!NOTE] > You should not need this to get a new player working. A Max ships with ScreenlyOS installed and updates itself once it is online. To return a working device to a clean state rather than replace its image, see [Factory reset](/docs/screenly-players/guides/factory-reset/). --- # What it is Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/overview/what-it-is/ > The Screenly Player Max Mk2: Intel Core i3-1315U, 16 GB memory, four video outputs, and Wi-Fi 6E. A high-performance signage computer built for continuous playback rather than desktop use. It drives up to four screens from one player, through two HDMI and two USB-C outputs, all showing the same picture. See [Driving more than one display](/docs/screenlyos/overview/multiple-displays/). This is also the generation that added WPA3. --- # Where to buy Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/overview/where-to-buy/ > The Player Max Mk2 is discontinued. The current model is the Mk3. ## No longer sold The Mk2 is discontinued. The current Player Max is the [Mk3](/docs/screenly-players/models/player-max-mk3/). ## Why these pages are still here Plenty of Mk2s are still in service, and everything in this section applies to a device you already own: how to mount it, how to make it power on by itself, and how to reinstall it. Before planning around one, check where its generation sits in [Lifecycle and support](/docs/screenly-players/reference/lifecycle-and-support/). A player that is still running is not necessarily still supported. --- # Specifications Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk2/reference/specifications/ > Screenly Player Max Mk2: Intel Core i3-1315U, 16 GB memory, NVMe storage, dual 4K HDMI, Wi-Fi 6E, and 2.5 Gigabit ethernet. | Component | Specification | | --- | --- | | Processor | Intel Core i3-1315U | | Graphics | Intel UHD Graphics | | Memory | 16 GB dual channel DDR4 SODIMM at 3200 MHz | | Storage | 256 GB M.2 2280 PCIe NVMe Gen 4 | | Networking | 2.5 Gigabit ethernet, Wi-Fi 6E, Bluetooth 5.3 | | Power | 90 W (19 V, 4.74 A) DC-in, barrel 5.5 mm outer and 2.5 mm inner | | VESA mount | 75 x 75 mm or 100 x 100 mm, bracket not included | | Dimensions | 4.61 x 4.40 x 1.46 in | ## Ports - Front: a 3.5 mm audio combo jack, two USB 3.2 Gen 2 Type-A ports, and a power button with an integrated status indicator. - Back: two Thunderbolt 4 USB-C ports supporting DisplayPort 1.4a, two HDMI 2.1 ports for dual 4K output, 2.5 Gigabit ethernet, one USB 3.2 Gen 2 and one USB 2.0 Type-A, and a cable keeper. ## Displays Four video outputs can be used at once: the two HDMI ports, and the two USB-C ports carrying video over DisplayPort Alt Mode. That is up to four screens from one player, all showing the same picture. See [Driving more than one display](/docs/screenlyos/overview/multiple-displays/). ## Wireless Wi-Fi 6E, and WPA3 is supported. WPA2-PSK and 802.1X work as well: see [Connect on an enterprise network](/docs/screenlyos/networking/guides/connect-on-an-enterprise-network/). ## Bluetooth The hardware includes Bluetooth 5.3, but ScreenlyOS does not use it, and we do not support Bluetooth peripherals or beacons. ## Power A Mk2 is not powered over ethernet. It needs its 90 W DC supply. --- # Mount with VESA brackets Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/guides/mount-with-vesa/ > Mount a Screenly Player Max Mk3 to the back of a display with a standard VESA bracket, which is not included. The player mounts on the back of the display at the standard 75 x 75 mm and 100 x 100 mm patterns. > [!NOTE] > No bracket is included with this model. Only the [Mk1](/docs/screenly-players/models/player-max-mk1/guides/mount-with-vesa/) shipped with a VESA adapter in the box. ## What to buy A VESA bracket rated for the player's weight, in 75 x 75 mm or 100 x 100 mm to match your display. Check what the display itself needs before ordering. A large-format panel may already be using its VESA holes for a wall mount, in which case you want a bracket that sandwiches between the two rather than one competing for the same screws. ## Mounting Follow the bracket's own instructions, and work in this order: mount the display, attach the player, then connect the cables. That way you are never supporting the weight of the display and reaching behind it at once. > [!NOTE] > Leave room for the cables to bend. A short HDMI run pressed flat against a wall puts steady strain on the port, and that becomes an intermittent display fault months later. --- # Power on automatically Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/guides/power-on-automatically/ > Set a Screenly Player Max Mk3 to start on its own when mains power returns, using its BIOS. A Player Max does not start by itself after a power cut unless its BIOS is told to. On a screen nobody visits, that setting is the difference between a blip and a site visit. ## Get into the BIOS 1. Disconnect the power cable from the player. 2. Connect a keyboard to one of the USB ports. 3. Hold **F2** or **DEL**, reconnect the power cable, and press the power button. Release the key once the BIOS appears. ## Change the setting 1. Move to the **Power** tab, using the arrow keys or a USB mouse. 2. Set the option that controls behavior after power loss so the device powers on. 3. Move to the last tab and choose the option to save and exit. ## Check it worked Pull the power at the wall, wait, and restore it. The player should boot on its own and return to your content with nobody touching it. Test this before the player is mounted behind a display. --- # Reinstall ScreenlyOS Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/guides/reinstall-screenlyos/ > The Player Max image is not a public download. Contact Screenly support for the image and the steps for your device. The Max is a different board from the standard player, and its image is not a public download. Contact [Screenly support](https://support.screenly.io/hc/en-us/requests/new) and we will send you the image and the steps for your device. We handle it this way because the Max uses Secure Boot, so the device only starts software we signed. Getting the right image onto the right device matters more here than on a board without it. > [!NOTE] > You should not need this to get a new player working. A Max ships with ScreenlyOS installed and updates itself once it is online. To return a working device to a clean state rather than replace its image, see [Factory reset](/docs/screenly-players/guides/factory-reset/). --- # What it is Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/overview/what-it-is/ > The current Screenly Player Max: 4K, four video outputs, a TPM, and Secure Boot. The current Player Max, and the model to buy when replacing hardware that is reaching the end of its support window. It shows content at up to 4K, drives up to four screens from one player, and has the TPM and Secure Boot that stricter environments ask for. As the newest generation it also has the longest support ahead of it. See [Lifecycle and support](/docs/screenly-players/reference/lifecycle-and-support/). --- # Where to buy Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/overview/where-to-buy/ > Order a Screenly Player Max Mk3 from the Screenly shop. Order it from the [Screenly shop](https://shop.screenly.io/products/screenly-player-max-mk-3). This is the model to buy when replacing a player that is reaching the end of its support window, and the one to specify for a new deployment. > [!NOTE] > Buying our hardware is not a condition of using ScreenlyOS. What a Player Max adds over hardware you supply is 4K, four display outputs, and the TPM and Secure Boot. --- # Specifications Source: https://www.screenly.io/docs/screenly-players/models/player-max-mk3/reference/specifications/ > Screenly Player Max Mk3: Intel Core 3 100U, 16 GB DDR5, 500 GB PCIe4 storage, 4K over HDMI, with a TPM and Secure Boot. The current Player Max, and the model to buy when replacing hardware that is reaching the end of its support window. ## Specifications | Component | Specification | | --- | --- | | Processor | Intel Core 3 100U | | Memory | 16 GB DDR5 | | Storage | 500 GB PCIe4 | | Video output | Up to 4K. Four outputs usable at once: two HDMI and two USB-C | | Networking | Ethernet and Wi-Fi. No external Wi-Fi antenna | | Dimensions | 4.63 x 4.41 x 2.13 in (117 x 112 x 54 mm) | | Expected lifetime | 5 years | The Mk3 is not fanless. ## Displays Four video outputs can be used at once: two HDMI, and two USB-C carrying video over DisplayPort Alt Mode. That is up to four screens from one player, all showing the same picture. See [Driving more than one display](/docs/screenlyos/overview/multiple-displays/). ## Security | Feature | | | --- | --- | | Trusted Platform Module (TPM) | Yes | | Secure Boot | Yes | | Cryptographically signed updates | Yes | A TPM means the credentials a screen uses to reach protected content are stored in the chip rather than in ordinary storage, which matters for a screen showing a dashboard behind a login or reaching an internal service over mutual TLS. ## Other A real time clock keeps time across a power cut, so the device does not depend on reaching a time server before it can do anything. See [Configure time servers](/docs/screenlyos/networking/guides/configure-time-servers/). Wake on LAN is supported, so the player can be started remotely over the network. ## Not published here We do not have confirmed figures for the graphics, ethernet speed, Wi-Fi standard, Bluetooth, power supply, audio ports, or the VESA pattern. For any of those, check the [product page](https://shop.screenly.io/products/screenly-player-max-mk-3) or [ask support](https://support.screenly.io/hc/en-us/requests/new). --- # Power over ethernet Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/guides/power-over-ethernet/ > Power a Raspberry Pi based Screenly Player over its network cable using a PoE HAT or a splitter, for screens with no outlet nearby. Power over ethernet sends power and data down one cable. It is worth it where there is no outlet near the display, where you want one cable instead of two behind a screen, and where IT wants to power cycle a player remotely from the switch. There are two ways to add it to a Raspberry Pi based player. ## A PoE HAT A Hardware Attached on Top board sits inside the case, which is the tidier result. The official Raspberry Pi Foundation PoE HAT needs a Raspberry Pi 3 Model B+ or later. Three things to check before you buy one. Some HATs include a fan, and fans fail, which can shorten the life of an otherwise solid-state device. If you use a heatsink, and we use one in all our players, the HAT may not physically fit alongside it. And you will likely need a taller case. ## A PoE splitter An external splitter takes the PoE cable and gives you separate data and power leads. It is less tidy than a HAT and it avoids the fit and cooling questions entirely. ## Either way The switch has to supply PoE, and the power budget has to cover the board plus anything attached to it. > [!NOTE] > This applies to the standard, Raspberry Pi based player. A Player Max is not powered over ethernet: it uses a DC supply. --- # Reinstall ScreenlyOS Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/guides/reinstall-screenlyos/ > The standard Screenly Player is Raspberry Pi based, so reinstalling ScreenlyOS uses the same public image and the same steps as any Raspberry Pi. The standard Screenly Player is Raspberry Pi based, so reinstalling ScreenlyOS on one is the same job as installing it on any Raspberry Pi. The image is a public download and the steps are identical. Follow [Write the image](/docs/screenlyos/hardware/raspberry-pi/guides/write-the-image/). You will need to open the case to reach the microSD card. Everything after that is the standard process: write the image, put the card back, power the player on, and pair the code it shows. > [!NOTE] > You should not need to do this to get a new player working. Players ship with ScreenlyOS installed, and the software updates itself once it is online. If the player will not start at all after a reinstall, see [Flashing problems](/docs/screenlyos/hardware/raspberry-pi/guides/troubleshooting/). --- # Use a USB Wi-Fi adapter Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/guides/use-a-usb-wifi-adapter/ > Extend a standard Screenly Player's wireless range with a USB adapter, and the one line in network.yaml it needs. The on-board radio is usually enough. An adapter is worth it where the access point is far enough away that the built-in antenna struggles. ## Which adapter We suggest the official Raspberry Pi USB Wi-Fi dongle where you can find one, which is not always. The adapter we have tested and confirmed is the **Panda Wireless PAU06**. ## Configure it An adapter is a second wireless interface, so the network configuration has to name it. 1. Generate a `network.yaml` with the [Network Config Generator](/os/network-config-generator/), or open the one you already use. 2. Replace `wlan0` with `wlan1`. 3. Copy the file to a FAT32 USB stick and insert it into the player. The player picks up the configuration and reboots. See [Connect to Wi-Fi](/docs/screenlyos/networking/guides/connect-to-wifi/) for the full USB drive process. > [!NOTE] > This applies to the Raspberry Pi based standard player. A Player Max has its own radio and does not take an adapter. --- # What it is Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/overview/what-it-is/ > The standard Screenly Player is Raspberry Pi based, shows content at up to 1080p, and arrives with ScreenlyOS already installed. The standard player. Raspberry Pi based, showing content at up to 1080p, and the right choice for most screens. It arrives with ScreenlyOS installed and tuned to the board, so there is nothing to flash and nothing to configure on the device. Plug it into the display and the network, turn it on, and it shows a pairing code. ## When to pick something else For 4K, for a TPM and Secure Boot, or to drive more than two screens from one device, you need a [Player Max](/docs/screenly-players/models/player-max-mk3/). Those are properties of the board, so no software setting adds them here. [Choosing a model](/docs/screenly-players/overview/choosing-a-model/) compares the two. --- # Where to buy Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/overview/where-to-buy/ > Where to order a standard Screenly Player, and what to check before deciding between it and a Player Max. Order from the [Screenly shop](https://shop.screenly.io/), which has current availability. If you are still deciding between this and a Player Max, [Choosing a model](/docs/screenly-players/overview/choosing-a-model/) sets out what each one is for. > [!NOTE] > Buying our hardware is not a condition of using ScreenlyOS. You can run the same operating system on [a Raspberry Pi you supply](/docs/screenlyos/hardware/raspberry-pi/), with the same features and the same subscription. --- # Indicator lights Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/reference/indicator-lights/ > What the power, activity, and ethernet LEDs on a standard Screenly Player tell you about power, storage, and the network link. The standard player is Raspberry Pi based, and its LEDs will often tell you what is wrong before the screen does. This covers the Raspberry Pi 3 B+, and the same lights appear on nearby generations. A Player Max has no LEDs of this kind. It has a power button with an integrated status indicator instead. ## Power and activity Two LEDs sit next to the power connector. The red LED, labelled **PWR** on the board, is the power supply. A steady red light means power is good. Flashing, blinking, or off means the supply is not delivering enough power, which is the single most common cause of a player that reboots or freezes at random. The green LED, labelled **ACT**, is storage activity. Irregular flashes are normal and happen whenever the player reads or writes its card. A steady green light while booting means a missing or bad microSD card. ## Ethernet Two LEDs sit on the ethernet socket. Both are off when the player is using Wi-Fi, which is expected rather than a fault. The yellow LED on the left is link speed: on for 100 Mbps, off for 10 Mbps. The green LED on the right is the link itself: on when a link is established, flashing during activity, off when there is no link. ## Reading them together Steady red and no green activity on boot points at the card. See [Flashing problems](/docs/screenlyos/hardware/raspberry-pi/guides/troubleshooting/). Flashing red points at the power supply, whatever else the screen is doing. See [Build your own player](/docs/screenlyos/hardware/raspberry-pi/guides/build-your-own-player/) for why the official supply matters. --- # Specifications Source: https://www.screenly.io/docs/screenly-players/models/screenly-player/reference/specifications/ > The standard Screenly Player is Raspberry Pi based, shows content at up to 1080p, and has no TPM or Secure Boot. ## What it does | | | | --- | --- | | Platform | Raspberry Pi based | | Resolution | Up to 1080p | | Wireless | Follows the Raspberry Pi generation it was built on | | WPA3 | No | | TPM and Secure Boot | No | | Power over ethernet | Possible, with a HAT or a splitter | ## Wireless The radio follows the Raspberry Pi generation the player was built on. | Generation | Bands | | --- | --- | | Raspberry Pi 5 | 2.4 and 5 GHz | | Raspberry Pi 4 and 4B | 2.4 and 5 GHz | | Raspberry Pi 3B+ | 2.4 and 5 GHz | | Raspberry Pi 3B | 2.4 GHz only | WPA3 is not available on this model. It needs a Player Max. WPA2-PSK and 802.1X both work. See [Connect on an enterprise network](/docs/screenlyos/networking/guides/connect-on-an-enterprise-network/). ## Displays How many screens one player drives depends on its Raspberry Pi generation: a Pi 4 or Pi 5 drives two through its micro HDMI outputs, and a Pi 3 drives one. Both show the same picture. See [Driving more than one display](/docs/screenlyos/overview/multiple-displays/). ## What it does not do No 4K, and no TPM or Secure Boot. Those are properties of the board, so no software setting adds them. For any of the three you need a [Player Max](/docs/screenly-players/models/player-max-mk3/). ## Power Use the official Raspberry Pi power supply for the board. Third-party supplies deliver power inconsistently, which shows up later as a screen that reboots or freezes at random, and reads as a software fault. --- # Choosing a model Source: https://www.screenly.io/docs/screenly-players/overview/choosing-a-model/ > The standard Screenly Player shows content at up to 1080p. The Max adds 4K, a TPM, and Secure Boot, and has the outputs for a joined-canvas video wall. Two models. They differ in resolution and in the security hardware on the board. > [!NOTE] > The Player Max Mk1 and Mk2 are discontinued. The current Max is the [Mk3](/docs/screenly-players/models/player-max-mk3/), and this page compares against that. ## Standard Raspberry Pi based. It shows content at up to 1080p. This covers most screens. A display showing a playlist, a dashboard, or a web page does not need more than this, and it is the right default unless something below applies to you. ## Max The more powerful model. It goes up to 4K, and it adds a TPM and Secure Boot. Pick it if any of the following applies. ### The content is genuinely 4K A 4K panel showing 1080p content is not a reason on its own. ### The screen has to meet stricter security requirements Secure Boot means the device will only start software we signed. ### You want credentials sealed to the hardware On a device with a TPM, the credentials a screen uses to reach protected content are stored in that chip rather than in ordinary storage, which matters for a screen showing a dashboard behind a login or reaching an internal service over mutual TLS. ### You need one player to drive more than one display The Max has the outputs for it. Driving them as [a single joined surface](/docs/screenlyos/overview/multiple-displays/) is not self-serve yet, so talk to us before you plan around it. ## If you are unsure Pick the Max if the budget allows. The standard player is the right choice when you know the screen's job and know it will not change. Plenty of screens are like that. But content gets replaced, a 1080p panel gets swapped for a 4K one, a security review arrives a year after the install, or someone asks for a second display off the same player. The Max has headroom for all of that. Choosing it costs more once. Choosing the standard model and being wrong costs a replacement player and a site visit. --- # What you get Source: https://www.screenly.io/docs/screenly-players/overview/what-you-get/ > Screenly players ship with ScreenlyOS installed and tuned to the board, so there is nothing to flash and nothing to configure on the device. A Screenly Player runs the same operating system you can put on your own hardware, on a board we build and support. ## It arrives ready ScreenlyOS is already installed and tuned to the hardware. Plug the player into the display and the network, turn it on, and it shows a pairing code. There is no image to write, no first-boot setup, and no BIOS to touch. [Boot and pair the device](/docs/screenlyos/first-device/boot-and-pair-the-device/) is the whole process. ## The hardware is tested On hardware you supply, we say plainly which models we have confirmed and which we have not. That question does not arise here. We build the board, test the operating system on it, and support both. That is the practical difference. A Raspberry Pi or a Scala player runs the same software, but the hardware underneath it is yours to vouch for. ## It costs nothing extra to run ScreenlyOS and its updates are included with your subscription, on our hardware and on yours alike. Buying a player does not unlock anything, and not buying one does not cost you anything: [Raspberry Pi](/docs/screenlyos/hardware/raspberry-pi/) and [Scala players](/docs/screenlyos/hardware/scala-players/) run the same operating system with the same features. What you are buying is hardware that arrives working and stays supported. --- # Lifecycle and support Source: https://www.screenly.io/docs/screenly-players/reference/lifecycle-and-support/ > How long each Screenly Player generation is supported, what end of life means for a device, and what to do when one reaches it. A player is supported for as long as the ScreenlyOS version it runs is supported. That version is built on Ubuntu Core, and each Core release has its own timeline set by Canonical, which is why devices bought at different times reach the end of support at different times. ## Support timeline | Generation | Supported until | | --- | --- | | Core 24 | 2034 | | Core 20 | 2030 | | Core 18 | 2028 | | Core 16 | Ended June 2026 | | Raspberry Pi 3 based players | Ended December 2025 | | V1 players | Ended 2018 | If you are on a Raspberry Pi 3, move to a Pi 4, a Pi 5, or a Player Max. > [!NOTE] > Your Core version is not shown in the dashboard. [Ask support](https://support.screenly.io/hc/en-us/requests/new) and we will tell you where a given player stands. ## What end of life means The operating system version or hardware generation stops receiving security updates and support from its maintainer. In practice: No further security patches, so the device becomes more exposed over time. No new Screenly features or app compatibility updates for that device. Less that our support team can do about platform-specific problems. The player generally keeps running and keeps playing your content. That is the part that catches people out: nothing visibly breaks on the end-of-life date, so an unsupported fleet can sit unnoticed for a long time. ## What to do about it Replace the device before or shortly after its date rather than waiting for a failure. A screen that is still playing is not evidence that it is still supported. If you are planning a replacement round, [talk to us](https://support.screenly.io/hc/en-us/requests/new) with the models and rough counts, and we will tell you which of them have time left. --- # Warranty and returns Source: https://www.screenly.io/docs/screenly-players/reference/warranty-and-rma/ > The warranty on Screenly hardware, and how a return merchandise authorisation works if a device cannot be repaired remotely. New devices bought from Screenly come with a one year warranty from the date of purchase. Refurbished devices come with six months. ## If a device fails Support troubleshoots first. Most problems that look like hardware turn out to be the power supply, the card, or the network, and none of those need a return. If the problem is the device and it is within warranty, support may approve a return merchandise authorisation. **No return is accepted without prior approval**, and it is limited to one replacement per warranty period. ## How the process runs 1. [Open a support ticket](https://support.screenly.io/hc/en-us/requests/new) describing the problem, and include your support PIN. 2. Work through it with the support team. 3. If they suspect the device and it is in warranty, they may approve an RMA. 4. Provide your order receipt or email confirmation as proof of purchase. 5. Pack and ship the device to Screenly support. 6. Send the device only. Do not include cables or accessories unless support asks, because accessories are not returned. Once it arrives, inspection usually takes two to three business days, and the return is either accepted for repair or replacement, or rejected with a reason. Shipping costs on accepted returns are reimbursed against proof of payment. --- # Security and access Source: https://www.screenly.io/docs/it-requirements/overview/security-and-access/ > The controls an IT or security review asks about, and where each one is documented: device hardening, certificates, private network access, sign-in, roles, and audit. A review usually arrives as a list of questions. This page answers the first round and points at the page that answers the rest. ## Screens Every screen connects outbound only, over TLS, and nothing connects in. [What the network needs](/docs/it-requirements/overview/what-the-network-needs/) has the detail, and [Hostnames and ports to allow](/docs/it-requirements/reference/hostnames-and-ports/) the allowlist. A ScreenlyOS player runs nothing but Screenly. It is built on Ubuntu Core, updates the operating system and the player together over the air with signed, transactional updates that roll back if they fail, has no remote login and no open ports, and encrypts storage where the hardware supports it. On a Screenly Player Max, credentials for protected dashboards live in the TPM. [What ScreenlyOS is](/docs/screenlyos/overview/what-is-screenlyos/) covers the design, and [ScreenlyOS or Screenly Anywhere](/docs/screens/overview/screenlyos-or-screenly-anywhere/) has the section written for security teams, including what is and is not true of a Screenly Anywhere screen running inside another vendor's system. Each screen has its own device certificate, signed by the Screenly certificate authority, and a service on your network can require it before serving a page. [Device certificates](/docs/screens/managing/certificates/) explains how to download them, and [Authenticated pages](/docs/content/web-pages/authenticated-pages/) how to verify a screen rather than the whole fleet. Screens that need to show something on a private network can join your Tailscale network, configured once for the workspace, on ScreenlyOS only. See [Reaching your private network](/docs/integrations/network/private-network-access/). Remote screenshots can be turned off per screen with Privacy Mode, for displays showing sensitive information. See [Screenshots](/docs/screens/monitoring/screenshots/). ## People There are no passwords. People sign in with a one-time email code, a passkey, or an existing Google, GitHub, or Microsoft account, and can add two-factor authentication. Enterprise workspaces can require SAML single sign-on. See [Ways to sign in](/docs/account/signing-in/ways-to-sign-in/), [Securing your account](/docs/account/securing/), and [Single sign-on](/docs/workspaces/settings/single-sign-on/). Four roles decide who can change what inside a workspace; every role sees every screen, and separation of screens between groups of people is done with separate workspaces, which are isolated from each other. See [Roles and permissions](/docs/workspaces/people/roles-and-permissions/) and [What a workspace is](/docs/workspaces/overview/what-a-workspace-is/). Access that should expire on its own is covered in [Temporary access](/docs/workspaces/people/temporary-access/). API tokens carry the permissions of the person who created them and are managed per workspace. See [API tokens](/docs/developers/overview/api-tokens/). ## Audit and billing controls Audit logs, linked workspaces with consolidated billing, and a support SLA are Enterprise features. The workspace [Security](/docs/workspaces/settings/security/) settings page is where SAML, API tokens, and Tailscale live, and [Plans for Screenly](/docs/get-started/plans/plans-for-screenly/) lists what each tier includes. --- # What the network needs Source: https://www.screenly.io/docs/it-requirements/overview/what-the-network-needs/ > Screens connect outbound only, work behind NAT, and need an allowlist of hostnames rather than IP addresses on a restricted network. A screen is a client. It reaches out to us, and nothing reaches in. This applies to every Screenly screen; the sections marked ScreenlyOS describe the player operating system, and do not apply to a Screenly Anywhere screen running inside another system. ## Outbound only Screens only make outgoing connections, over ports 443, 123, and 53. Nothing needs to be opened inbound, no port forwarding is involved, and no inbound rule is required for a screen to work. On ScreenlyOS, connection attempts to a player on port 22 are refused, because there is no SSH access to the device at all. ## Behind NAT You can run as many screens as you like behind a single public IP address. There is no per-IP limit and nothing to configure for it. ## On a restricted network If outbound access is filtered, allow the hostnames in [Hostnames and ports](/docs/it-requirements/reference/hostnames-and-ports/). A Screenly Anywhere screen needs the Screenly entries only; a ScreenlyOS player needs the operating system entries as well. > [!IMPORTANT] > Allow the hostnames, not resolved IP addresses. Our infrastructure sits behind Cloudflare, so the addresses behind those names change. An allowlist built from IPs will work on the day you build it and break later. You may also need to allow your DNS servers on port 53 UDP. Those normally come from DHCP. ## No proxy support (ScreenlyOS) ScreenlyOS players cannot route their traffic through a proxy server. If your network requires one for all outbound traffic, players need an exception. If this blocks a deployment, [talk to us](https://support.screenly.io/hc/en-us/requests/new). A Screenly Anywhere screen uses whatever proxy the device it runs on is configured with. ## Firewall on the device (ScreenlyOS) The ScreenlyOS image does not include a firewall of its own. The device makes outbound connections and refuses inbound ones, so there is nothing on it to configure. ## DNSSEC Our domains, `screenlyapp.com` and `screenly.io`, are configured for DNSSEC. ## How much traffic to expect An idle ScreenlyOS player with no playlist used about 8.6 MB in 24 hours in our own measurement. Lab devices running mixed sample content averaged around 3 GB a month. Treat both as a starting point rather than a budget. Real usage follows your content: video is large, and a playlist that changes often downloads more than one that does not. Content is cached on the device, so the same asset is not fetched twice. Configuring a ScreenlyOS player's own connection, such as Wi-Fi, a static IP, or 802.1X, is under [ScreenlyOS](/docs/screenlyos/networking/). A Screenly Anywhere screen takes its network settings from the system it runs on. --- # Dashboard requirements Source: https://www.screenly.io/docs/it-requirements/reference/browser-and-network/ > The browser the dashboard runs in, the hostnames it has to reach on a restricted network, and the two things that most often break it. This page is about the browser you manage screens from. What the screens themselves need is a separate list, in [Hostnames and ports](/docs/it-requirements/reference/hostnames-and-ports/). ## The browser The dashboard is a JavaScript application and runs in any current version of Chrome, Edge, Safari, or Firefox. There is nothing to install and no plugin. There is no non-JavaScript version. A browser or a corporate policy that blocks scripts blocks the dashboard entirely. ## Ad blockers break it This is the single most common cause of a dashboard that half works: sections render blank, or buttons that should be there are missing. The fix is to disable ad blockers for the dashboard and restart the browser. If a page looks broken in a way that seems too strange to be a real bug, check this before reporting it. ## Hosts the dashboard needs On a restricted corporate network, allow these outbound over HTTPS on 443. | Hostname | Why | | --- | --- | | `login.screenlyapp.com` | The dashboard itself, and signing in | | `api.screenlyapp.com` | The API behind every page | | `ws.screenlyapp.com` | Live connection, for status that updates without a refresh | | `us-assets.screenlyapp.com` | Screenshots, thumbnails, and content you upload | > [!IMPORTANT] > Allow the hostnames, not resolved IP addresses. We use Cloudflare in front of our infrastructure and the addresses change. ## Hosts that only affect the edges Blocking these does not stop you working. The parts that use them go quiet. | Hostname | What stops | | --- | --- | | `www.youtube.com` and Google's APIs | The video feed on the Home page | | `screenly.io` | The product news feed on the Home page | | `support.screenly.io` | The Help Center link | | `shop.screenly.io` | Hardware links | | Sentry, and Google reCAPTCHA | Error reporting, and a check on the sign-in form | If Home looks emptier than the screenshots in these docs, this list is usually why, and nothing is actually wrong. ## Passkeys need a current browser Signing in with a [passkey](/docs/account/signing-in/ways-to-sign-in/) uses WebAuthn, which every current Chrome, Safari, Edge, and Firefox supports. On an older browser the passkey option will not appear, and a one-time email code still works. --- # Hostnames and ports to allow Source: https://www.screenly.io/docs/it-requirements/reference/hostnames-and-ports/ > The outbound hostnames and ports a screen needs, for allowlisting on a restricted network: Screenly's own hosts, the Anywhere app hosts, and the Ubuntu Core hosts a ScreenlyOS player needs too. Allow these outbound. Nothing inbound is required. A Screenly Anywhere screen needs the Screenly and Screenly Anywhere tables; a ScreenlyOS player needs the Screenly and operating system tables, and makes the network checks. What the dashboard itself needs from the browser you manage screens in is a separate, shorter list in [Dashboard requirements](/docs/it-requirements/reference/browser-and-network/). > [!IMPORTANT] > Allow the hostnames themselves. If you resolve them to IP addresses and allow those instead, your deployment will break, because we use Cloudflare in front of our infrastructure and the addresses change. ## Screenly | Hostname | Port | Purpose | | --- | --- | --- | | `api.screenlyapp.com` | 443 TCP | Our API | | `mtls.screenlyapp.com` | 443 TCP | Alternative path to the API | | `login.screenlyapp.com` | 443 TCP | Access to Screenly services | | `us-assets.screenlyapp.com` | 443 TCP | Asset storage | | `ws.screenlyapp.com` | 443 TCP | Web socket, for real-time updates on players | | `sentry.screenlyapp.com` | 443 TCP | Error tracking and monitoring | ## Screenly Anywhere An Anywhere screen runs inside a browser or an app on the device, so it also fetches the app itself. App-store installs (Google Play, the Amazon Appstore) use the device's own store hosts, which the device already reaches. | Hostname | Port | Purpose | | --- | --- | --- | | `anywhere.screenlyapp.com` | 443 TCP | The Screenly Anywhere app, opened in a browser or wrapped by the platform apps | | `tizen.srly.io` | 443 TCP | Installing the app on a Samsung Tizen display, at setup time only | ## Operating system (ScreenlyOS) ScreenlyOS is built on Ubuntu Core, so it needs Canonical's endpoints as well. | Hostname | Port | Purpose | | --- | --- | --- | | `snapcraft.io` and `*.snapcraft.io` | 443 TCP | Ubuntu Core | | `*.cdn.snapcraft.io` | 443 TCP | Ubuntu Core | | `*.snapcraftcontent.com` | 443 TCP | Ubuntu Core | | `login.ubuntu.com` | 443 TCP | Ubuntu Core | | `myapps.developer.ubuntu.com` | 443 TCP | Ubuntu Core | | `search.apps.ubuntu.com` | 443 TCP | Ubuntu Core | | `public.apps.ubuntu.com` | 443 TCP | Ubuntu Core | | `upload.apps.ubuntu.com` | 443 TCP | Ubuntu Core | | `serial-vault-partners.canonical.com` | 443 TCP | Initial link with Ubuntu's application store | | `ntp.ubuntu.com` | 123 UDP and TCP | Time synchronisation | ## Network checks (ScreenlyOS) A player confirms it has a route out before it reports a fault, using two well-known targets. | Hostname | Protocol | Purpose | | --- | --- | --- | | `google.com` | ICMP | Network check | | `8.8.8.8` | ICMP | Network check | ## If wildcards are not allowed Some firewalls cannot match on a wildcard. These are the names behind each one, all on port 443 TCP. ### In place of `*.snapcraftcontent.com` | Hostname | | --- | | `storage.snapcraftcontent.com` | | `canonical-lgw01.cdn.snapcraftcontent.com` | | `canonical-lcy01.cdn.snapcraftcontent.com` | | `canonical-lcy02.cdn.snapcraftcontent.com` | | `canonical-bos01.cdn.snapcraftcontent.com` | | `cloudfront.cdn.snapcraftcontent.com` | ### In place of `*.cdn.snapcraft.io` | Hostname | | --- | | `fastly.cdn.snapcraft.io` | | `fastly-global.cdn.snapcraft.io` | | `cloudfront.cdn.snapcraft.io` | | `canonical-lgw01.cdn.snapcraft.io` | | `canonical-lcy01.cdn.snapcraft.io` | | `canonical-bos01.cdn.snapcraft.io` | ### In place of `*.snapcraft.io` | Hostname | | --- | | `api.snapcraft.io` | | `dashboard.snapcraft.io` | You may also need to allow your DNS servers on port 53 UDP. > [!NOTE] > This list changes as our infrastructure does. If you are building a long-lived firewall rule, check back rather than treating a copy as permanent. --- # Get started Source: https://www.screenly.io/docs/developers/api/overview/get-started/ > From a token to a web page playing on a screen, in five requests. Everything here is copy-and-pasteable. The goal of this page is a real outcome: a web page playing on one of your screens, put there entirely over HTTP. Five requests. You need an [API token](/docs/developers/overview/api-tokens/) and a screen already paired. ```bash export API_TOKEN=your-token-here export API=https://api.screenlyapp.com/api/v4.1 ``` ## 1. Prove the token works ```bash curl -s -H "Authorization: Token $API_TOKEN" "$API/screens" | jq '.[].name' ``` If you get a list of screen names, everything after this is detail. A `401` means the token is wrong; a `403` usually means the token belongs to an account without access to what you asked for. ## 2. Find the screen you want Filters go in the query string, as `field=operator.value`, because the API is built on [PostgREST](https://postgrest.org/). ```bash curl -s -H "Authorization: Token $API_TOKEN" \ "$API/screens?name=eq.Reception&select=id,name,location" ``` `eq` is one of several. `like`, `in`, `gt`, `is` and the rest all work, which is why there is no endpoint per question. > [!NOTE] > A screen's **status** is not on the screen. Online and in-sync live on `/v4.1/screens/statuses`, keyed by `screen_id`. That separation is deliberate: the screen record is what you configured, the status record is what the device reported. ## 3. Add the content ```bash curl -s -X POST -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -H "Prefer: return=representation" \ -d '{"title": "Ops dashboard", "source_url": "https://example.com/dashboard"}' \ "$API/assets" ``` `Prefer: return=representation` makes the API hand back the object it created, including its `id`. Without it you get a `201` and nothing to work with, and then have to go looking for what you just made. Screenly works out what the URL is from what it serves: a page becomes a web asset, an image or video is fetched and stored. ## 4. Put it in a playlist ```bash curl -s -X POST -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -H "Prefer: return=representation" \ -d '{"playlist_id": "PLAYLIST_ID", "asset_id": "ASSET_ID", "duration": 30, "position": 0}' \ "$API/playlist-items" ``` Note the hyphen in `playlist-items`. `position` is zero-based, so this puts it first. ## 5. Point the playlist at the screen Assignment goes through [labels](/docs/labels/), and every screen has one matching its own name, created when it was paired. ```bash # the screen's own label curl -s -H "Authorization: Token $API_TOKEN" "$API/labels?human_name=eq.Reception" # attach the playlist to it curl -s -X POST -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"label_id": "LABEL_ID", "playlist_id": "PLAYLIST_ID"}' \ "$API/labels/playlists" ``` The screen picks it up on its next check-in, usually within a minute or two. ## The one query worth learning `select` embeds related records, which is the difference between one request and a hundred: ```bash curl -s -H "Authorization: Token $API_TOKEN" \ "$API/playlists?select=title,playlist_items(duration,position,asset_id)" ``` Ask for the nested data rather than looping over ids. ## Where to go next [The full v4.1 schema](https://developer.screenly.io/api_v4_1/) has every endpoint, field, and filter. [Versions](/docs/developers/api/reference/versions/) covers what is in v4.1 that is not in v4, and the v3 shutdown on 1 October 2026. --- # Querying the API Source: https://www.screenly.io/docs/developers/api/overview/querying/ > PostgREST-style filtering, embedding related records with select, and getting your own content back out. The API is built on [PostgREST](https://postgrest.org/), which is worth knowing because it explains the query syntax: you filter, select, and embed with query parameters rather than through one endpoint per question. If you have not made a request yet, [Get started](/docs/developers/api/overview/get-started/) goes from a token to content on a screen in five of them. ## Authenticating Send your [API token](/docs/developers/overview/api-tokens/) in the `Authorization` header, prefixed with `Token`. ```bash curl -H "Authorization: Token $API_TOKEN" \ https://api.screenlyapp.com/api/v4.1/assets ``` The examples below drop the host and write paths as `/v4.1/...`. ## Filtering Comparisons go in the query string, as `field=operator.value`. ```bash # every video GET /v4.1/assets?type=eq.video ``` ## Embedding related records `select` decides which columns come back, and pulls in related tables in the same request. ```bash # playlists, each with its items GET /v4.1/playlists?select=*,playlist_items(*) ``` That is usually the difference between one request and a hundred: ask for the nested data rather than looping over ids. ## Getting your content out Every asset carries a `source_url`. Listing your assets and fetching each `source_url` is how you export a library. ## The full reference Endpoint by endpoint, with schemas, in the [v4.1 API reference](https://developer.screenly.io/api_v4_1/). --- # Versions Source: https://www.screenly.io/docs/developers/api/reference/versions/ > v4.1 is the current version and a superset of v4. v3 stops responding on 1 October 2026. Three versions have existed. Two of them still respond. | Version | Base | Status | | --- | --- | --- | | v4.1 | `https://api.screenlyapp.com/api/v4.1/` | Current. Target this | | v4 | `https://api.screenlyapp.com/api/v4/` | Still responds, and is a subset of v4.1 | | v3 | `https://api.screenlyapp.com/api/v3/` | **Switched off on 1 October 2026** | ## Use v4.1 Stable since May 2026, and what new work should target. Tokens you already have work with it; there is nothing to reissue. It is a **superset of v4**: every v4 path exists in v4.1 with the same shape, under the `/v4.1/` segment instead of `/v4/`. Four paths exist only in v4.1, and they are the ones you are most likely to want: | Path | What it gives you | | --- | --- | | `/v4.1/screens/statuses` | `is_online` and `in_sync` per screen | | `/v4.1/screens/reports` | The health report a device sends | | `/v4.1/screens/pings` | Check-in history | | `/v4.1/screens/configs` | A screen's delivered configuration | That first one matters more than it looks. A screen's **status is not on the screen record**, so "which of my screens are offline" cannot be answered from `/screens` at all, in either version. It needs `/v4.1/screens/statuses`, which does not exist in v4. ## Moving from v4 to v4.1 Change the segment. Nothing else, for the nine paths that exist in both. v4 is not being switched off and no date has been announced for it. It is simply missing everything added since, so there is no reason to start something new on it. ## v3 is being switched off > [!IMPORTANT] > **All v3 endpoints (`api.screenlyapp.com/api/v3/*`) stop responding on 1 October 2026.** There is no partial shutdown, no read-only mode, and no grace period. Anything still calling v3 after that date fails. v3 is a different API rather than an older version of this one, so moving off it is a rewrite of the calls, not a change of segment. It is worth starting well before the date. If you are not sure whether anything of yours is on v3, the cheapest check is to grep your own code and CI configuration for `/v3/` while there is still time to act on the answer. ## The schema Every endpoint, field, and filter is in the [v4.1 API reference](https://developer.screenly.io/api_v4_1/). --- # Running in CI Source: https://www.screenly.io/docs/developers/cli/guides/ci-pipelines/ > The CLI is non-interactive by design. A GitHub Action, and the one thing to get right. The CLI runs unattended without a wrapper, which is the point of it in a pipeline. ## Authenticate with an environment variable Set `API_TOKEN`. There is no login step, no prompt, and nothing stored on the runner. ```bash export API_TOKEN=$SCREENLY_API_TOKEN screenly screen list -o json ``` ## GitHub Actions There is a published action: ```yaml - uses: screenly/cli@master with: screenly_api_token: ${{ secrets.SCREENLY_API_TOKEN }} cli_commands: edge-app deploy ``` `cli_commands` takes any command, so the same step deploys an app, uploads an asset, or reassigns a playlist. `cli_version` pins a version if you would rather not track the latest. Anything that can run a binary works the same way: GitLab CI, CircleCI, Jenkins. ## The thing to get right Scope the token. A pipeline token carries the permissions of whoever created it, and it lives in a secret store that more people can read than you might assume. Create it from an account with the access the pipeline actually needs, name it after the pipeline rather than the person, and revoke it when the pipeline is retired. See [API tokens](/docs/developers/overview/api-tokens/). ## Deploying an app from a pipeline The natural fit: your app is code in a repository, and a push deploys it to every screen running it. ```bash screenly edge-app validate screenly edge-app deploy ``` Validate first. It catches a malformed manifest before the deploy reaches any screens. --- # Scripting with the CLI Source: https://www.screenly.io/docs/developers/cli/guides/scripting/ > Three output formats, and why JSON plus jq is where the CLI earns its place. ## Choose an output format `-o` or `--output` takes **table**, **json**, or **csv**. Table is the default and is for reading; the other two are for feeding something else. ```bash screenly screen list # table, for a human screenly screen list -o json # for jq screenly screen list -o csv # for a spreadsheet ``` CSV is the one to remember when somebody asks for a fleet inventory. It goes straight into a spreadsheet without anyone writing a script. ## JSON and jq ```bash screenly screen list -o json | jq -r '.[] | select(.status.is_online == false) | .name' ``` That is the shape of most useful one-liners: list something, filter it, print the field you care about. ## Piping in and out Fetching, transforming, and piping back is the intended style: ```bash screenly playlist get $PLAYLIST_ID -o json \ | jq '...' \ | screenly playlist update ``` ## Things worth scripting Bulk provisioning is a loop over pairing codes and names, from an inventory file. Content rollouts add an asset, then append it to a playlist with a duration. ```bash screenly asset add throughput.html "Throughput Board" screenly playlist append $PLAYLIST_ID $ASSET_ID 20 ``` Fleet reports are a scheduled `screen list -o csv` into whatever your organization already reads. Authenticated pages are `basic-auth`, `bearer-auth` and `inject-js` applied consistently across many assets, rather than clicked one at a time. ## Permissions The CLI carries the permissions of the token, which carries the permissions of the account that made it. A script that only uploads content is safer with a token from an account that can only upload content. See [API tokens](/docs/developers/overview/api-tokens/). --- # The command surface Source: https://www.screenly.io/docs/developers/cli/overview/commands/ > Five groups of commands, plus login, logout, and the MCP server. ```text screenly [OPTIONS] <COMMAND> login Log in with a token and store it logout Remove the stored token screen Screen related commands asset Asset related commands playlist Playlist related commands edge-app Edge App related commands mcp Start the MCP server on stdio -o, --output <OUTPUT> table (default), json, or csv ``` ## Screens `list`, `get`, `add`, `delete`. `screen add` takes a pairing code and a name, which is how you provision a device without opening a browser. ## Assets `list`, `get`, `add`, `delete`, plus five that configure web assets: `inject-js`, `set-headers`, `update-headers`, `basic-auth`, and `bearer-auth`. Those five are the reason to reach for the CLI over the dashboard for authenticated pages: they are scriptable and reviewable. See [Authenticated pages](/docs/content/web-pages/authenticated-pages/). ## Playlists `create`, `list`, `get`, `delete`, `append`, `prepend`, `update`. `append` and `prepend` take a duration in seconds as a positional argument, so adding an asset to the front of a rotation is one line. ## Edge apps `create`, `list`, `rename`, `run`, `validate`, `deploy`, `delete`, plus `setting` (`list`, `set`) and `instance` (`list`, `create`, `update`, `delete`). This is the full build and release cycle for an app. See [Edge apps](/docs/developers/edge-apps/). ## MCP `screenly mcp` starts the [MCP server](/docs/developers/mcp/) on stdio. ## The full reference Every command, flag, and argument is generated from the CLI itself and published in [`docs/CommandLineHelp.md`](https://github.com/Screenly/cli/blob/master/docs/CommandLineHelp.md), and at [developer.screenly.io](https://developer.screenly.io/cli/). --- # Get started Source: https://www.screenly.io/docs/developers/cli/overview/get-started/ > Install, log in, and do something real in four commands. Install it, log in, and the rest of this page is things worth actually running. ```bash brew tap screenly/screenly-cli brew install screenly-cli screenly login ``` Other install routes are in [Install the CLI](/docs/developers/cli/overview/install/). ## Which screens are down The one that earns the install: ```bash screenly screen list -o json | jq -r '.[] | select(.status.is_online == false) | .name' ``` Nothing else in your toolchain answers that in one line. Swap `jq` for `-o table` when a person is reading it, or `-o csv` when somebody asks for a fleet inventory and you would rather not build one. ## Put something on a screen Three commands from nothing to playing: ```bash screenly asset add https://example.com/dashboard "Ops dashboard" screenly playlist create "Reception" screenly playlist append $PLAYLIST_ID $ASSET_ID 30 ``` `append` takes the duration in seconds as its last argument. `prepend` does the same at the front, which is the one you want for something urgent. ## Pair a screen without a browser ```bash screenly screen add k7ptqz34 "Line 4 Andon" ``` The pairing code comes off the display. In a rollout, this plus a list of codes and names is the whole provisioning script. ## Set up an authenticated page The five asset commands that make the CLI worth using over the dashboard for this: ```bash screenly asset basic-auth $ASSET_ID "user=s3cret" screenly asset bearer-auth $ASSET_ID "eyJhbG..." screenly asset inject-js $ASSET_ID close-cookie-banner.js ``` Also `set-headers` and `update-headers`. All of it is scriptable and reviewable, which clicking is not. See [Authenticated pages](/docs/content/web-pages/authenticated-pages/). ## Ship an app ```bash screenly edge-app validate screenly edge-app run --generate-mock-data screenly edge-app deploy ``` Build locally against mock data, then deploy to every screen running it. See [Edge apps](/docs/developers/edge-apps/). ## Then [The command surface](/docs/developers/cli/overview/commands/) for what else is there, [Scripting](/docs/developers/cli/guides/scripting/) for output formats and pipes, and [Running in CI](/docs/developers/cli/guides/ci-pipelines/) for the pipeline. Or `screenly mcp`, and let an assistant do it. See [MCP server](/docs/developers/mcp/). --- # Install the CLI Source: https://www.screenly.io/docs/developers/cli/overview/install/ > Homebrew, Nix, Docker, a release binary, or from source. Then sign in. The CLI is [open source](https://github.com/Screenly/cli/) and ships as a single binary. ## Homebrew, on macOS ```bash brew tap screenly/screenly-cli brew install screenly-cli ``` ## Other routes **A release binary** for your platform, from the [latest release](https://github.com/Screenly/cli/releases/latest). **Nix** and **Docker** are both supported; the [README](https://github.com/Screenly/cli/) has the invocations. **From source** with `cargo build --release`, if you already have a Rust toolchain. > [!NOTE] > macOS release artifacts are not yet Developer ID signed, so a browser download can be blocked by Gatekeeper. If that happens, allow it under **System Settings**, **Privacy & Security**, **Open Anyway**. ## Signing in ```bash screenly login ``` It takes an [API token](/docs/developers/overview/api-tokens/) and stores it in `~/.screenly` for subsequent commands. `screenly logout` removes it. The `API_TOKEN` environment variable overrides the stored token, which is how you authenticate in CI without a login step. ## Versions The CLI moved to calendar versioning at **26.8.0**, having previously been on 1.x. A version like `26.8.0` is the year and month it was released, not a semantic version, so a jump in the number does not imply a breaking change. --- # Build and deploy Source: https://www.screenly.io/docs/developers/edge-apps/guides/build-and-deploy/ > The development loop: validate, run against mock data, deploy. Then instances, settings, and versions. An edge app is a web application plus a `screenly.yml` manifest. Everything below is done with the [CLI](/docs/developers/cli/). ## The loop ```bash screenly edge-app validate screenly edge-app run --generate-mock-data screenly edge-app deploy ``` **Validate** checks the manifest before anything reaches a screen. Run it first, and run it in [CI](/docs/developers/cli/guides/ci-pipelines/). **Run** starts the app locally against generated mock data, so you can develop without a device and without touching your workspace. **Deploy** ships it. Every screen running the app picks up the new version on its next sync. ## Creating and naming `edge-app create` makes the app, `rename` changes its name, and `delete` removes it. ## Settings `edge-app setting list` and `edge-app setting set` work with the fields your manifest declares. Settings are ordered as declared in the manifest, so the order in your `screenly.yml` is the order somebody sees in the dashboard. Put the field they must fill in first. Settings can also be conditionally visible, using `depends_on`, so an option only appears once a prior choice makes it relevant. That is worth using: a form with eight fields where three are irrelevant is a form people get wrong. ## Instances `edge-app instance list`, `create`, `update`, `delete`. An instance is the app plus one configuration, and it is the instance that goes in a playlist. One app can have many. See [Instances](/docs/apps/using/instances/). ## Where it runs On a Screenly player or Player Max, the app runs on the device. On some Screenly Anywhere platforms it is rendered on our infrastructure and sent as an image instead. > [!IMPORTANT] > An app that depends on running locally, animating or reacting between refreshes, will not behave the same on Screenly Anywhere. Test on the hardware you are targeting. The local emulator or a player is the right place to develop a dynamic app. See [Where an app runs](/docs/apps/overview/where-an-app-runs/). ## The full reference The manifest schema, the JavaScript API available to your app, the branding values, and the deploy model are at [developer.screenly.io](https://developer.screenly.io/edge-apps/). --- # Get started Source: https://www.screenly.io/docs/developers/edge-apps/guides/get-started/ > From an empty folder to an app playing on a screen. What the manifest does, and why building one beats pointing a screen at a URL. An edge app is a web page plus a manifest. The manifest is what turns it from a page into something a colleague can configure without touching your code. ## What you are building ```text my-app/ index.html screenly.yml styles.css app.js ``` `index.html` is an ordinary page. `screenly.yml` declares the app's name and the settings it needs, and the dashboard renders a form from it. ## The loop ```bash screenly edge-app create "Throughput Board" screenly edge-app validate screenly edge-app run --generate-mock-data screenly edge-app deploy ``` **Validate** catches a malformed manifest before anything reaches a screen. Run it first, always, and run it in [CI](/docs/developers/cli/guides/ci-pipelines/). **Run** starts the app locally against generated mock data, so you develop without a device and without touching your workspace. **Deploy** ships it. Every screen running the app picks up the new version on its next sync. ## Then create an instance ```bash screenly edge-app instance create ``` The app is the code; the **instance** is the code plus one configuration, and it is the instance that goes in a [playlist](/docs/playlists/). One app can have many, which is how the same board runs against three production lines. See [Instances](/docs/apps/using/instances/). ## Designing the settings form This is the part worth more thought than the code. Order matters, and you control it. Settings appear in the order your manifest declares them, so put what somebody must fill in first. Hide what is irrelevant. `depends_on` makes a setting appear only once a prior choice makes it relevant, and a form with eight fields where three do not apply is a form people get wrong. Anything sensitive is a secret rather than a setting. Settings are visible to anyone with workspace access, while secrets are encrypted, write-only once saved, and decrypted only on the device that owns the instance. See [Settings and secrets](/docs/apps/setting-up/settings-and-secrets/). ## Why bother, rather than a URL If none of these apply, point a screen at your page and stop reading. That is a legitimate answer. **Configuration in the dashboard**, so a non-technical colleague sets it up. **Secrets**, so an API key never appears in the page source. **Versioned deploys**, so one command updates the whole fleet. **A CORS proxy**, so the app can fetch from APIs that would block a browser request, with no proxy of your own. **Branding**, so it picks up your workspace logo and colors instead of having them hard-coded. ## Test on what you are targeting On a Screenly player or Player Max the app runs on the device. On some Screenly Anywhere platforms it is rendered on our infrastructure and sent as an image. > [!IMPORTANT] > An app that animates or reacts between refreshes will not behave the same on Screenly Anywhere. Develop dynamic apps against the local emulator or a real player. ## The full reference The manifest schema, the JavaScript API, and the branding values are at [developer.screenly.io](https://developer.screenly.io/edge-apps/). --- # What an edge app is Source: https://www.screenly.io/docs/developers/edge-apps/overview/what-an-edge-app-is/ > A web app packaged for a screen, with a manifest, typed settings, and encrypted secrets, deployed as versions. An edge app is a web app plus a manifest that tells Screenly how to configure and run it. Once installed it behaves like any other content: it goes in a playlist, takes a duration, and follows the playlist's schedule. The reason to build one rather than pointing a screen at a URL is everything around the code. You get configuration fields in the dashboard, secrets that never appear in a page source, and versioned deploys across a fleet. ## The manifest The manifest declares the settings your app exposes in the dashboard. Field types include text, number, select, boolean, textarea, URL, datetime, and image upload, so an app that needs a logo gets an upload control rather than asking someone to paste a URL. Each field can carry structured help text, which is what stops a settings form being a row of unlabeled boxes. ## Secrets An API key belongs in a secret, not a setting. Secrets are encrypted and delivered to the device, and an app whose secrets cannot be decrypted is skipped rather than breaking the whole playlist. ## Instances Installing an app creates an **instance**: your configuration plus the app. One app can have many instances, which is how the same dashboard app runs against three different data sources on three different screens. ## Where it runs On ScreenlyOS the app runs on the device. On some Screenly Anywhere platforms Screenly runs it server-side and sends the screen images instead, which matters if your app animates or reacts by the second. See [Where an app runs](/docs/apps/overview/where-an-app-runs/). ## Building one The workflow is CLI-driven: ```bash screenly edge-app validate screenly edge-app run --generate-mock-data screenly edge-app deploy ``` The manifest schema, the JavaScript API available to your app, and the deploy model are all documented at [developer.screenly.io](https://developer.screenly.io/edge-apps/). --- # Publish HTML as an app Source: https://www.screenly.io/docs/developers/mcp/guides/publish-html-as-an-app/ > Turn a page an assistant just made into a Screenly app, wrapped for unattended playback, installed and deployed in one step. `edge_app_publish_from_html` takes HTML and publishes it as a Screenly [edge app](/docs/developers/edge-apps/). Ask an assistant to **upload this as a Screenly app** and this is the tool it calls. It is the shortest path from "make me a dashboard" to that dashboard being on a wall. ## What it does It wraps the page for unattended signage. A screen has no mouse and no keyboard, so anything that needs a click never advances. The wrapper rotates tab panels and carousel slides on its own, which is the difference between a page that works on a laptop and one that works on a wall. It completes a fragment. If the assistant hands it a fragment rather than a whole document, it is wrapped into a complete page. It creates an instance. The app appears in your Content library ready to add to a playlist, rather than existing only as an app definition. **Deploys it.** ## Updating it later Publish again with the same name and it updates the app you published before, rather than creating a second one. That works because the tool remembers the app id by name on the machine it published from. Two consequences worth knowing: From a different machine that memory is not there, so pass the `app_id` explicitly to target a specific app. Prefer passing `app_id` whenever you know it. It is unambiguous, and it does not depend on the name matching exactly. ## Where it fits Then it is ready for a playlist. Add the instance to a [playlist](/docs/playlists/), give it a duration, and assign the playlist to screens. Nothing about it is special once it exists. ## What to be careful about This tool is annotated destructive, because publishing again over a remembered name replaces what was there. The page is also, at that point, on screens. Anything it fetches is fetched from the device, and anything hard-coded in it is visible to anyone who can read the app. Credentials belong in [secrets](/docs/apps/setting-up/settings-and-secrets/), not in the HTML. --- # Working with an assistant Source: https://www.screenly.io/docs/developers/mcp/guides/working-with-an-assistant/ > The requests that work well, the ones that do not, and how to keep an assistant from doing something you did not mean. ## What works well - Reading a fleet: "List every screen in the Frankfurt plant and show which are offline." One call and some filtering. - Bulk changes through labels: "Find every screen labeled Warehouse and assign the Safety Rotation playlist to them." Labels are the assistant's lever on a fleet, exactly as they are yours. - Assembling a playlist: "Add this video to the start of the Logistics Briefing playlist" is a create then a position update. - Publishing something it just made. See [Publish HTML as an app](/docs/developers/mcp/guides/publish-html-as-an-app/). ## What does not - Anything a tool does not cover. There is no tool to pair a screen, change a screen's settings, or edit an app's configuration, so an assistant cannot do those however it is asked. See [Tool reference](/docs/developers/mcp/reference/tools/). - Anything across workspaces. One token, one workspace. - Judgement about what should be on a wall. An assistant will happily put a draft on fifty screens if that is what it was asked for. ## Keeping it safe **Scope the token** to the access the assistant needs. See [Permissions](/docs/developers/mcp/overview/permissions/). Turn on confirmations if your client supports them. Every destructive tool is annotated, so a client can prompt before deleting a playlist. Work on a label rather than on everything. Ask for changes scoped to a label you control rather than to all screens, and the blast radius of a misunderstood instruction is one group rather than the fleet. Check Now playing afterwards. A screen's own page shows what is actually active on it, which is the fastest way to confirm an assistant did what you meant. See [A screen's own page](/docs/screens/overview/the-screen-page/). --- # Connect a client Source: https://www.screenly.io/docs/developers/mcp/overview/connect-a-client/ > The Claude Desktop extension, or a JSON configuration for Cursor and other MCP clients. Two routes, and the first is considerably easier. ## Claude Desktop Install it as a **Desktop Extension** from **Settings**, then **Extensions**, and paste your API token when prompted. No JSON to edit. The token is stored in your operating system's keychain rather than a plaintext configuration file, which is the main reason to prefer this route. > [!NOTE] > Before the listing is live you can sideload the `.mcpb` bundle from the [latest release](https://github.com/Screenly/cli/releases/latest). macOS bundles are not Developer ID signed yet, so allow it under **System Settings**, **Privacy & Security**, **Open Anyway** if Gatekeeper blocks it. ## Cursor and other clients Add this to your client's MCP configuration: ```json { "mcpServers": { "screenly": { "command": "screenly", "args": ["mcp"], "env": { "API_TOKEN": "your-api-token-here" } } } } ``` Then restart the client. ## Authentication The same two options as the [CLI](/docs/developers/cli/): the `API_TOKEN` environment variable, or `screenly login` storing credentials in `~/.screenly`. The extension route uses the keychain instead of either. ## Getting a token In your **workspace settings**, go to the **Security** tab, then **Tokens**. It is shown once. See [API tokens](/docs/developers/overview/api-tokens/). --- # Get started Source: https://www.screenly.io/docs/developers/mcp/overview/get-started/ > Connect an assistant to your workspace, then ask it three things that get harder in the dashboard. Ten minutes, and the last one is the reason to bother. ## 1. Install the CLI The MCP server lives inside it. ```bash brew tap screenly/screenly-cli brew install screenly-cli ``` ## 2. Get a token Workspace **Settings**, then **Security**, then **Tokens**. It is shown once. See [API tokens](/docs/developers/overview/api-tokens/). Use a token from an account with the access you want the assistant to have, not necessarily your own. See [Permissions](/docs/developers/mcp/overview/permissions/). ## 3. Connect a client In **Claude Desktop**, install the Screenly extension and paste the token. It goes into your operating system keychain rather than a config file. See [Connect a client](/docs/developers/mcp/overview/connect-a-client/) for where to get the bundle. For Cursor and others, the JSON is in [Connect a client](/docs/developers/mcp/overview/connect-a-client/). ## Then ask it these three ### Something you would have had to look up > "Which screens are offline, and how long have they been down?" One call and some filtering. In the dashboard this is a sort and a scan; here it is a sentence, and the answer comes back as prose you can paste into a ticket. ### Something you would have clicked forty times > "Find every screen labeled warehouse and assign the Safety Rotation playlist to them." This is where it stops being a novelty. Labels are the assistant's lever on a fleet, exactly as they are yours, and `label_link_playlist` does in one call what forty clicks would. Scope requests to a label rather than to everything. The blast radius of a misunderstood instruction is then one group. ### Something that did not exist a minute ago > "Build me a dashboard showing our four production lines, and upload it as a Screenly app." The assistant writes the page, then `edge_app_publish_from_html` wraps it for unattended playback, creates an instance, and deploys it. It appears under **Apps**, ready for a playlist. That is the one that has no dashboard equivalent at all. See [Publish HTML as an app](/docs/developers/mcp/guides/publish-html-as-an-app/). ## What it will not do There is no tool to pair a screen, change screen settings, or edit an app's configuration, so an assistant cannot do those however it is asked. Screens are read-only. See [Tool reference](/docs/developers/mcp/reference/tools/). ## Before you let it loose Scope the token, because it inherits the account's access exactly. Turn on confirmations if your client offers them. Every destructive tool is annotated, so a client can ask before deleting a playlist. Check Now playing afterwards. A screen's own page shows what is actually active on it, which is the fastest way to confirm the assistant did what you meant. See [A screen's own page](/docs/screens/overview/the-screen-page/). --- # Permissions Source: https://www.screenly.io/docs/developers/mcp/overview/permissions/ > The server inherits your token's access and nothing more. What that means before you hand one to an assistant. The MCP server holds no permissions of its own. `API_TOKEN` is an ordinary [API token](/docs/developers/overview/api-tokens/), and the assistant inherits exactly the access of the account that created it, in one workspace. So the question is not what the server can do. It is what the token can do. > [!IMPORTANT] > A token created by an Owner lets an assistant do everything an Owner can, including managing members and billing. Give an assistant a token from an account with the access it actually needs. ## Practical advice Make a token for the purpose. Name it after the assistant rather than the person, so revoking it later is obvious. Use the least-privileged account you can. If the assistant is meant to answer questions about screens and update content, a User account covers it. Revoke rather than rotate when in doubt. Deleting the token stops the assistant immediately, and creating another takes seconds. ## What the annotations do not do The `destructiveHint` flags tell a client which tools change or delete data, so it can ask before calling them. They are advisory. A client that ignores them still gets through, because the enforcement is the token, not the hint. That is the right way round, but it means a confirmation prompt is a convenience rather than a control. ## Scope of the memory The server remembers which app it published under which name, on that machine. That memory sits next to the token file and is scoped by API host and token, so two workspaces on one machine do not see each other's. --- # What the MCP server is Source: https://www.screenly.io/docs/developers/mcp/overview/what-it-is/ > The CLI's operations, exposed as tools an assistant can call, with hints that tell a client which ones are destructive. `screenly mcp` starts a server on stdio that exposes the Screenly API as a set of tools. An assistant connected to it can list screens, upload content, build playlists, manage labels, and publish an app. It is part of the [CLI](/docs/developers/cli/), not a separate download. Every current build includes it. ## Behaviour hints Every tool is annotated with `readOnlyHint`, `destructiveHint`, `idempotentHint`, and `openWorldHint`. That matters more than it sounds. A client can tell `screen_list` from `playlist_delete` without parsing English, and prompt for confirmation before a destructive call rather than after it. If your client supports confirmations, these are what drive them. Roughly half the tools are read-only. The rest are split between creating things and modifying or deleting them. ## What it is good at - Questions about a fleet. "Which screens in the Frankfurt plant are offline?" is a `screen_list` call and some filtering, answered without anyone writing a query. - Bulk work through labels. "Find every screen labeled Warehouse and assign the Safety Rotation playlist" is `label_list` then `label_link_playlist`, which is the shape where an assistant saves real time because the alternative is a lot of clicking. - Publishing something you just made. `edge_app_publish_from_html` turns a page an assistant generated into a Screenly app on your screens. See [Publishing HTML as an app](/docs/developers/mcp/guides/publish-html-as-an-app/). ## What it is not It is not a separate permission system. The server holds no access of its own and does exactly what your token allows, in one workspace. See [Permissions](/docs/developers/mcp/overview/permissions/). --- # Tool reference Source: https://www.screenly.io/docs/developers/mcp/reference/tools/ > All 34 tools, what each one does, and which are read-only, which write, and which are destructive. Every tool is annotated, so a client can tell them apart without reading this page. **Read** never changes anything. **Write** creates. **Destructive** modifies or deletes. ## Screens | Tool | | | | --- | --- | --- | | `screen_list` | Read | Every screen with status, hardware info, and sync state | | `screen_get` | Read | One screen by UUID | Screens are read-only. There is no tool to pair, update, disable, or delete a screen, so an assistant can tell you a screen is offline but cannot act on it. ## Assets | Tool | | | | --- | --- | --- | | `asset_list` | Read | Every asset with type, status, and metadata | | `asset_get` | Read | One asset by UUID | | `asset_create` | Write | From a URL: web page, image, or video | | `asset_update` | Destructive | Title, JavaScript injection, headers | | `asset_delete` | Destructive | By UUID | `asset_create` takes a URL rather than a file, so an assistant adds content by pointing at it. ## Asset groups | Tool | | | | --- | --- | --- | | `asset_group_list` | Read | The folders in your content library | | `asset_group_create` | Write | | | `asset_group_update` | Destructive | | | `asset_group_delete` | Destructive | **Also deletes every asset in the group** | > [!IMPORTANT] > `asset_group_delete` is not the same as deleting a folder in the dashboard, which leaves the content and moves it to the root. Through MCP, deleting a group deletes what is in it. ## Playlists | Tool | | | | --- | --- | --- | | `playlist_list` | Read | | | `playlist_create` | Write | | | `playlist_update` | Destructive | | | `playlist_delete` | Destructive | | ## Playlist items | Tool | | | | --- | --- | --- | | `playlist_item_list` | Read | Everything in a playlist | | `playlist_item_create` | Write | Add an asset to a playlist | | `playlist_item_update` | Destructive | Duration and position | | `playlist_item_delete` | Destructive | Remove an item | ## Labels | Tool | | | | --- | --- | --- | | `label_list` | Read | | | `label_create` | Write | | | `label_update` | Destructive | | | `label_delete` | Destructive | | | `label_link_screen` | Write | Attach a label to a screen | | `label_unlink_screen` | Destructive | | | `label_link_playlist` | Write | Attach a label to a playlist | | `label_unlink_playlist` | Destructive | | The link tools are how an assistant changes what plays where, since screens themselves are read-only. See [Labels](/docs/labels/). ## Shared playlists | Tool | | | | --- | --- | --- | | `shared_playlist_list` | Read | | | `shared_playlist_create` | Write | Share a playlist with another workspace | | `shared_playlist_delete` | Destructive | Unshare it | There is no update: a share either exists or it does not. ## Edge apps | Tool | | | | --- | --- | --- | | `edge_app_list` | Read | | | `edge_app_list_settings` | Read | The settings an app declares | | `edge_app_list_instances` | Read | Configured instances of an app | | `edge_app_publish_from_html` | Destructive | Publish HTML as an app, install it, and deploy | Apart from publishing from HTML, edge apps are read-only through MCP. Building and deploying an app from source is a [CLI](/docs/developers/cli/) job. ## What has no tool at all Screen settings, pairing, workspace members, integrations, notifications, and billing. Those are dashboard or [API](/docs/developers/api/) work. --- # API tokens Source: https://www.screenly.io/docs/developers/overview/api-tokens/ > Create a token to use the API, the CLI, or the MCP server, and where to find it afterwards. You cannot: it is shown once. Everything the dashboard does is available through the API, and a token is how you authenticate to it. The CLI and the MCP server use the same token. ## Creating one Go to **Settings** in the main navigation, which is your **workspace settings**, then the **Security** tab, then **Tokens**. Choose **Show**, name the token, and choose **Add**. There is a Security tab in your account settings too, and it is the wrong one: that holds passkeys and two-factor rather than tokens. > [!IMPORTANT] > Copy it now and store it somewhere safe. It is displayed once and never shown again. If you lose it, delete it and create another. Name tokens after where they are used rather than who made them. `ci-pipeline` tells you what breaks when you revoke it; `alex-token` does not. ## What a token is bound to A token belongs to **one member in one workspace**. Both, not either. Creating one in a workspace stamps it with your identity and that workspace. It cannot reach a different workspace, and it cannot act as anybody else. So if you work in three workspaces and want to script all three, that is three tokens. ## What scope it has Exactly what **you** can do in **that workspace**, and nothing more. A token carries your role, so: | Your role | What the token can do | | --- | --- | | User | Screens, content, playlists, apps | | Billing Manager | The same, plus billing | | Admin | The same, plus members and workspace settings | | Owner | Everything, including creating Admins | There is no narrower scope to select. You cannot make a read-only token, or one limited to content, and there is no expiry date to set. That absence is the thing to design around. > [!IMPORTANT] > If a script only needs to upload content, the safe move is a token from an account that only has permission to upload content. Create a User account for the automation and make the token from that, rather than handing a pipeline an Owner's token because an Owner happened to set it up. An [MCP](/docs/developers/mcp/) assistant is the same question with more urgency, because it acts on instructions written in English. See [Permissions](/docs/developers/mcp/overview/permissions/). ## When a member leaves or is disabled A token is only as alive as the membership behind it. | What happens to the member | What happens to their tokens | | --- | --- | | Disabled in the workspace | Stop returning data | | Removed from the workspace | Stop returning data | | Role reduced | Lose whatever that role lost | | Leaves the company, still a member | Nothing | The membership check runs on every request rather than at sign-in, so there is no window where an old token keeps working after access is withdrawn. A role change lands the same way, because the token carries the role rather than a copy of it: demote an Admin to User and their pipeline loses member management the moment you save. The last row is the one that bites. Somebody leaving without being removed looks like offboarding was done, and their tokens carry on working exactly as before. ### Plan for it before it happens The tokens list shows each token's name and when it was created, and lets you delete one. It does not show who created a token, so tokens are not something you can audit across a workspace from the dashboard. That has a practical consequence: **removing or disabling the member is the reliable lever** during offboarding, and it is the one you should use. It also breaks anything those tokens were running, silently, which is usually a CI pipeline nobody remembers. Two habits make that a non-event. Do not let automation depend on a person. A token named `alex-token` is a resignation away from an outage, so create automation tokens from an account that exists for the job and offboarding a human never touches them. **Keep a record outside Screenly** of which token runs what, and who made it. A name like `ci-deploy-prod` tells you what breaks when it stops working; it does not tell you whose membership it depends on. ## Revoking one Delete it from the same page. It stops working immediately, and anything using it starts getting `401` rather than failing quietly. Rotate on the usual triggers: somebody leaves, a token turns up somewhere it should not, or a pipeline is retired. See [the API](/docs/developers/api/), [the CLI](/docs/developers/cli/), and [the MCP server](/docs/developers/mcp/) for what to do with it. --- # What is available Source: https://www.screenly.io/docs/developers/overview/what-is-available/ > The API, the CLI, the MCP server, and edge apps: what each is for and when to pick it. Four surfaces, one token, one set of permissions. | Surface | Use it for | | --- | --- | | [API](/docs/developers/api/) | Anything, from anything that can make an HTTP request | | [CLI](/docs/developers/cli/) | Terminal work and CI pipelines | | [MCP server](/docs/developers/mcp/) | Letting an AI assistant work with your workspace | | [Edge apps](/docs/developers/edge-apps/) | Content that no ready-made app covers | ## Which one **The API** if you are building something that runs unattended: provisioning a fleet from an inventory system, syncing content from a CMS, pulling playback data into a warehouse. **The CLI** if a person or a pipeline is driving. It is the fastest way to do something once, and it drops into GitHub Actions without any wrapper code. **The MCP server** if the driver is an assistant rather than a script. It exposes the same operations as tools, so "which screens in the Frankfurt plant are offline" is answerable without anyone writing a query. **An edge app** when the problem is what goes on the screen rather than how it gets there. Everything above moves content around; an edge app *is* content. ## One token, four surfaces All four authenticate with the same [API token](/docs/developers/overview/api-tokens/) and are scoped by it. A token carries exactly your permissions in one workspace and cannot exceed them, which is the property that matters when you hand one to a pipeline or an assistant. The dashboard runs on the same API, so there is no capability that exists only by clicking. --- # Authentication Source: https://www.screenly.io/docs/developers/web-pages/authentication/ > Getting a player past a login from code: request headers for basic and bearer auth, client certificates, and where each one leaves the credential. A screen has nobody sitting at it, so a page behind a login has to be authenticated in advance. From code there are three routes, and they differ in where the credential ends up. ## Request headers Every web content item carries a set of HTTP headers the player sends with its request. This is the route for anything the page will accept as a header: basic auth, a bearer token, an API key. The CLI has a shortcut for each of the two common cases. Both write an `Authorization` header. ```bash screenly asset basic-auth <asset-uuid> alice=hunter2 ``` ```bash screenly asset bearer-auth <asset-uuid> eyJhbGciOi... ``` For anything else, set headers directly. `set-headers` replaces the whole set, `update-headers` merges into what is already there. ```bash screenly asset update-headers <asset-uuid> X-Api-Key=abc123,X-Tenant=eu-west ``` Over the API it is the `headers` field, a JSON object of up to 50 entries. ```bash curl -X PATCH \ 'https://api.screenlyapp.com/api/v4.1/assets?id=eq.<asset-uuid>' \ -H "Authorization: Token $SCREENLY_API_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"headers": {"Authorization": "Bearer eyJhbGciOi..."}}' ``` > [!IMPORTANT] > Headers are readable. Unlike [JavaScript injection](/docs/developers/web-pages/javascript-injection/), a `GET` on the asset returns them in full, so any token you store here can be read back by anyone holding an API token for the workspace. Issue a credential scoped to just the page being displayed, and rotate it on the same schedule as anything else you would put in a shared config. Headers do not refresh themselves. A token with an expiry stops working when it expires, and something of yours has to patch the asset with a new one. That is a natural fit for the same job that mints the token. ## Client certificates For internal systems where you would rather the device proved its identity than carried a password. Each screen holds its own certificate, and the server serves the page only to devices that present one. From code this is the `client_cert_allowed` boolean on the asset, which only exists in v4.1. ```bash curl -X PATCH \ 'https://api.screenlyapp.com/api/v4.1/assets?id=eq.<asset-uuid>' \ -H "Authorization: Token $SCREENLY_API_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"client_cert_allowed": true}' ``` Turning the flag on is the small half. The server has to be configured to require and verify the certificate, and how you validate matters: see [Pages behind a login](/docs/content/web-pages/authenticated-pages/) for the certificate download and the server configuration, including why chain validation alone is not enough. ## Session cookies For a page whose login is an ordinary form and whose session lives in a cookie, the [browser extension](/community/save-web-pages-with-browser-extensions/) captures a session you established yourself. There is no API for this, by design: the credential never exists as text anywhere you could script against. ## Scripted logins When none of the above fit, because the login is multi-step or built out of JavaScript, drive the form with [JavaScript injection](/docs/developers/web-pages/javascript-injection/). That field is write-only, which makes it the least bad place to put a credential in Screenly, though a script that types a password into a page is still a password in a form field. Nothing here gets past multi-factor authentication or SSO. Neither can be completed on a player, so a page behind either needs a service account, a token, or a certificate instead. --- # JavaScript injection Source: https://www.screenly.io/docs/developers/web-pages/javascript-injection/ > Attach a script to a web content item and the player runs it after the page loads: dismissing banners, hiding chrome, or completing a login form. Attach JavaScript to a web content item and the player runs it against the page once the page has finished loading, every time that item plays. It is the escape hatch for pages you do not control. A cookie banner covering the dashboard, a navigation bar wasting the top third of the screen, a login form that basic auth cannot satisfy: all of them are a few lines of DOM manipulation, and none of them are a Screenly setting. > [!NOTE] > There is no dashboard control for this. It is set through the API, the CLI, or the MCP server, and nowhere else. ## Setting it The CLI takes a local file or a URL, which makes the script itself a reviewable file in your repository rather than a blob pasted into a form. ```bash screenly asset inject-js <asset-uuid> ./dismiss-banner.js ``` ```bash screenly asset inject-js <asset-uuid> https://example.com/scripts/login.js ``` Over the API it is the `js_injection` field on the asset. ```bash curl -X PATCH \ 'https://api.screenlyapp.com/api/v4.1/assets?id=eq.<asset-uuid>' \ -H "Authorization: Token $SCREENLY_API_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"js_injection": "document.querySelector(\".cookie-banner\")?.remove();"}' ``` An assistant can set it too, through the MCP server's asset update tool. See [Tools](/docs/developers/mcp/reference/tools/). ## When it runs The script runs after the page reports itself fully loaded, so the DOM is in place and you do not need to wait for `DOMContentLoaded` yourself. It runs on every load, not once per item, so a script that logs in runs again each time the page comes round in the playlist. It has no way to signal back. Whatever the script returns is logged on the device and discarded; the page plays regardless of whether your code threw. ## Write once, read never `js_injection` is write-only. Reading the asset back does not return your code, it returns a placeholder: ```json { "js_injection": "<hidden; sha256 a1b2c3...>" } ``` An empty string means nothing is set. The placeholder is derived from the script, so it changes when the script changes, which is enough to detect drift in a pipeline. It is not enough to recover the script, so keep the source in version control. There is no way to read it back out of Screenly. ## Limits The field holds up to 65,536 characters. That is generous for DOM manipulation and small for a bundle: if you are approaching it, host the real script and inject a loader, or build an [edge app](/docs/developers/edge-apps/) instead. Edge apps do not use this field. An app ships its own `screenly_inject.js` alongside its manifest, and the player runs that instead. ## Worked examples The [Screenly Playground](https://github.com/Screenly/Playground/tree/master/javascript-injectors) holds working injectors for common cases. Test a script in a normal browser console against the same page before you attach it, because debugging one on a wall is slow. --- # Web asset fields Source: https://www.screenly.io/docs/developers/web-pages/web-asset-fields/ > The fields on a web content item you can set over the API, what each one accepts, and which ones only exist in v4.1. A web content item is a URL plus the fields below. All of them are set the same way, by patching the asset. ```bash curl -X PATCH \ 'https://api.screenlyapp.com/api/v4.1/assets?id=eq.<asset-uuid>' \ -H "Authorization: Token $SCREENLY_API_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"zoom_level": 150, "send_metadata": true}' ``` | Field | What it does | Accepts | | --- | --- | --- | | `headers` | HTTP headers the player sends with its request | Object, up to 50 entries | | `js_injection` | Script run against the page after it loads | String, up to 65,536 characters. Write-only | | `send_metadata` | Player identifies itself to the page in `X-Screenly-*` headers | Boolean, default `false` | | `client_cert_allowed` | Player presents its device certificate | Boolean, default `false` | | `zoom_level` | Page scale, as a percentage | 25 to 500, default `100` | | `user_agent` | Overrides the user agent string | String, up to 1,024 characters | | `player_side_render` | Render on the device rather than as a server screenshot | Boolean, or `null` to let Screenly choose | | `screenshot_cache_seconds` | How long a captured screenshot is reused | 60 to 86,400, default `60` | | `screenshot_delay_seconds` | Wait after load before capturing | 0 to 5, default `0` | | `disable_verification` | Skip the reachability check when adding the URL | Boolean, default `false` | ## Version matters here Only `headers`, `js_injection`, `send_metadata` and `disable_verification` are updatable in v4. The rest of that table does not exist on the v4 asset at all, so patching one against `/v4/` is rejected rather than ignored. Target `/v4.1/`. See [Versions](/docs/developers/api/reference/versions/). ## Reading them back `GET` returns every field except `js_injection`, which comes back as a placeholder. Headers come back in full, tokens included, which is worth knowing before you decide where to keep a credential. See [Authentication](/docs/developers/web-pages/authentication/). ## Fields that do nothing on their own `client_cert_allowed` needs a server configured to ask for the certificate. `send_metadata` needs a page that reads the headers. `screenshot_cache_seconds` and `screenshot_delay_seconds` apply only when the page is rendered on our side, which is the [Screenly Anywhere](/docs/anywhere/) path. Setting any of them on content that does not meet the condition is harmless and has no effect. The complete schema, every field and filter on every endpoint, is in the [v4.1 API reference](https://developer.screenly.io/api_v4_1/). --- # Community tutorials # Create a multi-step Google Drive Zap using Screenly's Zapier integration Source: https://www.screenly.io/community/multi-step-google-drive-zap/ > Create a multi-step Zap using Screenly's Zapier integration With [Screenly's Zapier integration](https://zapier.com/apps/screenly/integrations), users can add content to their screen by uploading a file to a Google Drive folder, for instance. We previously wrote a tutorial article about using Google Drive to manage Screenly in just two steps. At the time of writing, users with a Free plan can only create two-step Zaps. ## Who is this tutorial for? This guide is for users who want a more fine-grained control on their workflows. With a [Professional, Team or an Enterprise Zapier plan](https://zapier.com/pricing), users can create Zaps with a single trigger step and multiple action steps. ## Step 1: Get a free Screenly account and your API key The first step is to get a [free Screenly demo account](https://login.screenlyapp.com/sign-up) or [log in](https://login.screenlyapp.com/login) to your existing Screenly account. Once you are logged in, you'll need to get an API key that you will use with Zapier. Navigate to the *Settings* tab on the left-side menu. Once you are there, click the *Security* tab and then click the *Show* button in the *Tokens* row. Provide a name for your token, and copy this secret token key from the popup modal that shows up. You will use this token key to authenticate your Screenly account with Zapier. ![How to get a Screenly API key.](/assets/images/community/google-drive-1.webp) ## Step 2: Get a free Zapier account and set up a Zap workspace Next, you will need to get signed into [Zapier](https://zapier.com/). Zapier makes it easy for non-technical users to make two different software products talk to each other. Once you are logged in, click the orange *+ Create* button on the top left of the Zapier interface. In the dropdown, click *Zaps*. ## Step 3: Set up your Zap trigger The next step is to set up a trigger for your Zap. A trigger is the event that gets your Zap workflow to start. In this case, the trigger will be a file getting added to a Google Drive folder. Click the *Trigger* icon, and then select *Google Drive* in the popup modal. At this step, you will have to log in to your Google Drive account. Next, in the popup that appears on the right side of the screen, select the trigger event to be *New File in Folder*. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-01.webp) Click the purple *Continue* button to configure the trigger further. Select your Google Drive account and select the *Folder* you want to use to manage your digital signage content. For the *Include Deleted Files?* option, you can select *Only return non-deleted files*. Next, click *Test trigger* to get sample data into your Zap. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-02.webp) ## Step 4: Set up your Screenly workflow ### Upload Asset This is the step where you configure what Screenly should do when your trigger fires. Click the *Action* button below your *Trigger* setup. Type in *Screenly* in the search bar and select the Screenly icon. In the *Action event* section, click it and then click *Upload Asset*. Next, you'll need to connect your Screenly account. Click the purple *Select* button, and enter the *Token key* from Step 1. If you do not have a *Token key*, you can create a new one inside Screenly. Once your *Screenly Account* is selected, click the *Continue* button. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-03.webp) Now, in the *Configure* stage, click on the *File URL* input box and select the second option *File* in the drop-down. For the *Title* input box, select the first option *Title* in the drop-down. Next, click the purple *Continue* button and test the Zap. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-04.webp) ### Add Asset to Playlist Next, add a new step by clicking on the *+* below the *Upload Asset* step. Again, search and select Screenly. In the *Action event* section, click *Add Asset to Playlist*. Choose the same *Account* that you have selected in the previous step. Click "Continue." ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-05.webp) In the *Configure* step, select the *Playlist* where you want your asset to be added. For the *Asset* field, click the *+* button. Click the step that says "2. Upload Asset in Screenly (x.y.z)". Select "ID". Update the duration (which has a default value) if needed. Once done, click *Continue*. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-06.webp) ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-07.webp) ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-08.webp) ### Assign Screen to Playlist Add a new step by clicking on the *+* below the *Add Asset to Playlist* step. Search and select Screenly, then select *Assign Screen to Playlist* for the *Action event*. Select the same account for this step. Click *Continue*. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-09.webp) In the *Configure* step, select a *Screen* where you want your playlist to be assigned. For the *Playlist*, click the dropdown and select the playlist where you would like the screen to be associated to. Click *Continue*. Click *Test step* if you prefer. ![How to create a multi-step Zap](/assets/images/community/multi-step-zap-10.webp) Once ready, click *Publish*. That's it! That is how you use Zapier and Google Drive to create a multi-step workflow. If you have any questions or run into any trouble, let us know at [Screenly Support](https://support.screenly.io/hc/en-us). We are always happy to help! --- # Data monitoring, reporting and display using Databox and Screenly Source: https://www.screenly.io/community/display-databox-dashboards/ > Databox is a comprehensive data management platform that allows users ![An example Databox dashboard](/assets/images/community/databox-dashboard.webp) [Databox](https://databox.com/) is an advanced analytics platform designed to streamline data monitoring and reporting, empowering businesses to make informed decisions based on actionable insights. With its powerful analytics dashboard, Databox offers a comprehensive solution for businesses of all sizes, providing real-time access to key performance indicators (KPIs) and key metrics in a visually engaging and user-friendly interface. With its centralized data hub, customizable databoards, real-time data updates, automated reporting, and mobile access, Databox equips businesses with the tools they need to unlock the full potential of their data. Databox provides a variety of sharing options including a shareable link option which makes it easy to display databoards from your Databox account on a digital sign with Screenly. The steps involved in displaying your databoards on a digital sign will be outlined in this article. ### Configure Databox with Screenly To display a Databox databoard on a TV or monitor, you would have to generate a public share link for the databoard you would like to display. To do so, you would have to [log in to your Databox account](https://app.databox.com/). The next step is to open the databoard you would like to display on your digital sign. At the top of the databoard, click on the "Share" button to open the databoard sharing options pop-up modal. ![An example Databox dashboard with Share button at the top](/assets/images/community/share-databox-url.webp) In the pop-up modal on your screen, you will see a URL in a textbox, below the Shareable Link option. Copy the URL provided as this is what you will use to add the databoard as content to your Screenly account. ![An example Databox dashboard with pop-up modal for dashboard sharing options](/assets/images/community/databox-dashboard-url.webp) ### Setting up your digital sign with Screenly To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Databox databoard URL as a new content item.](/assets/images/community/input-databox-content-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Databox databoard to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Databox databoard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Databox databoard content to a playlist](/assets/images/community/add-databox-content-to-screenly.webp) You will then see your Databox databoard in the playlist’s content section. Next to the databoard content listing, change the listing’s duration to the amount of time you want the databoard to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Databox databoard content in the playlist](/assets/images/community/set-duration-for-databox-content.webp) To assign the playlist containing the Databox databoard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Databox databoard content to your screen(s) or group(s) of screens, your digital signage dashboard will display on your digital sign in just minutes. ### Show your Databox databoards on a digital sign Displaying a Databox databoard on a digital sign provides real-time data insights at a glance, keeping stakeholders informed and enabling quick decision-making. To see if Screenly works for your organization, sign up for a <a id="sign-up" href="https://login.screenlyapp.com/login">-day free trial</a>. If you have any questions about how Screenly may meet your needs, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686) at any time. --- # Display AgencyAnalytics dashboards with Screenly Source: https://www.screenly.io/community/display-agencyanalytics-dashboards/ > Get your data on your digital signs with Screenly and AgencyAnalytics. [Watch the video](https://www.youtube-nocookie.com/embed/CeNuAswqQBQ) <br> Marketing agencies use [AgencyAnalytics](https://agencyanalytics.com/) to track the performance of their clients. It's also a great tool for internal marketing teams. With Screenly, users can get their AgencyAnalytics data on their digital signs so that this data can be seen and discussed with team members. Learn more in the post below. ## Step 1: Get started with Screenly If you don't have a Screenly account, you can get started with a free trial. If you have an account, log in. Once you are inside the screenly dashboard, click the *Screens* tab on the left-hand menu. Then, click the *+ Add Screen* button on the top right. If you have Screenly digital signage players, you can get pair a digital signage player-based screen. In this tutorial, we will display a Screenly Anywhere based screen. Follow the onscreen instructions and pair your Screenly Anywhere screen. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Get the AgencyAnalytics sharing link for your dashboard Once you have your screen paired, it's time to get your dashboard sharing link from AgencyAnalytics. Navigate to your AgencyAnalytics dashboard that you wish to display, and click the *Share* icon on the top right. Copy the link that appears in the popup modal. Next, click *Share Link* and then click *Share Current Section*. Select the time frame that you wish to display, and then click *Create Link*. ![Getting the share link from the AgencyAnalytics dashboard.](/assets/images/community/screenly-agencyanalytics.webp) ## Step 3: Add your AgencyAnalytics share link to your Screenly account Next, navigate to your Screenly account and click the *Content* tab. Click *New Content* on the top right, and in the popup modal, select URL. Be sure to click *Finish* when you finish adding the share link URL The next step is to create a playlist. To do so, click the *Playlists* tab on the left-side menu. Next, click the *+ New Playlist* button on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use). Lastly, click the *+* icon in the content section of the playlist menu and add the desired content item. Next, select *Save* on the bottom right of the screen. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 4: That's it Your AgencyAnalytics dashboard should now display on your Screenly screen! ## Get started with Screenly & AgencyAnalytics As you can see, it's easy to get started. The first step is to get a Screenly [free trial](https://login.screenlyapp.com/sign-up). Next, whip up your [AgencyAnalytics dashboard](https://agencyanalytics.com/) and get it running on your digital sign! --- # Display Airtable dashboards with Screenly digital signs Source: https://www.screenly.io/community/display-airtable-dashboards/ > Airtable is a great way to store, organize, and take action from your data. Display your Airtable dashboards on digital signs with Screenly. Airtable is like a supercharged spreadsheet — combining the simplicity of tables with the power of a database. Whether you're planning events, tracking projects, or managing assets, [Airtable](https://airtable.com) helps teams collaborate and organize data in one flexible workspace. With Screenly, you can display your Airtable data on digital signage screens to keep your team aligned and informed. ## Step 1: Get started with Screenly If you don’t already have a Screenly account, you can [start a free -day trial](https://login.screenlyapp.com/sign-up) with no credit card required. If you already have an account, [log in](https://login.screenlyapp.com/login) and head to your **Screenly dashboard**. To add a screen: - Click the **Screens** tab on the left-hand menu - Click **Add Screen** in center of the web page ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) For this tutorial, we’ll use a **Screenly Anywhere** screen — which lets you run digital signage in a browser on any smart TV, computer monitor, or web-connected display. Select **Screenly Anywhere** and then navigate to [anywhere.screenly.io](https://anywhere.screenly.io). Next, enter the pairing code shown on the screen. Give your screen a name like **Test Screen** and click **Add** to link it to your account. ## Step 2: Get your Airtable share link Next, open the Airtable base or view that you want to display. - In Airtable, navigate to the specific view (e.g., a Kanban board, calendar, etc.) that you want to show. - Click **Share** (usually found in the top-right of the screen). - In the popup modal, click **Share via link**. - In the new popup modal, click the **Share publicly** tab. - You can adjust the settings to your liking, but be sure to toggle off **Show extensions added to this base** to remove extra tools from displaying with your data. We also recommend toggling on the **Disable shared base link (read-only)** so that your share link only allows viewing. - You can then use your cursor to click directly on your link and copy it to your clipboard. ![Access your Airtable share link to display content on a digital sign.](/assets/images/community/tutorial-airtable-link.webp) You now have a public link to your Airtable view, and in the next step, you'll add that link to Screenly. ## Step 3: Add your Airtable link to Screenly Now that you have your Airtable link, you can add it to Screenly. - In your Screenly dashboard, click the **Content** tab on the left-hand menu. - Click **+ New Content** in the top right. - In the popup modal, select **URL**. - Paste in your Airtable share link and click **Finish**. - Give your content a name like **Airtable** and click **Save**. ![Adding content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) Your Airtable view is now saved and ready to display. ## Step 4: Create a playlist and assign it to your screen Now that you have your Airtable content saved, you can create a playlist and schedule that playlist. - Click the **Playlists** tab on the left-hand menu. - Click **+ New Playlist** on the top right. - Name your playlist something like **Airtable**. - Click the **+** icon next to **Content**, and select the Airtable item you added before. - Click **Done** in the popup modal after adding your content. - Set the display **Duration** — for example, 30 seconds. If it's the only item in the playlist, it will loop continuously. - Under **Plays On**, select your paired screen (e.g., **Test Screen**). - Under **Schedule**, be sure to set the display to before the curent date if you want the content to display immediately. - Click **Save**. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) Now, your Airtable content is live in a playlist and assigned to your screen. ## Step 5: That’s it! Your Airtable view will start displaying on your [Screenly Anywhere](/anywhere/) screen. It’s an easy and effective way to make important data visible to your entire team — whether you're in the office or distributed. ## Get started with Screenly & Airtable With Screenly, you can turn your [Airtable](https://airtable.com) bases into real-time dashboards on digital signage. Start your [Screenly free trial](https://login.screenlyapp.com/sign-up), add your first screen, and bring your data to life — no hardware required. **Have questions?** We’re here to help. Reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new), and we'll get back with you ASAP. --- # Display Canva designs on Screenly digital signs Source: https://www.screenly.io/community/display-canva-designs/ > Canva is an intuitive design tool that allows anyone to display beautiful [Canva](https://www.canva.com) is a user-friendly design platform packed with templates for presentations, whiteboards, process maps, and more. Whether you're visualizing team workflows or creating branded content, Canva makes it easy to build beautiful, collaborative designs. With Screenly, you can turn those designs into live signage — perfect for office displays, internal dashboards, and creative showcases. In the post below, we'll walk you through the steps to display your Canva designs on a digital sign with Screenly. ## Step 1: Set up a screen in Screenly If you're new to Screenly, you can [sign up for a free -day trial](https://login.screenlyapp.com/sign-up) — no payment info required. If you're already signed up, [log in here](https://login.screenlyapp.com/login) and open your **Screenly dashboard**. To get started: - Click on **Screens** in the left-hand navigation - Then select **Add Screen** ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) We’ll use **Screenly Anywhere** for this setup, which allows you to display content directly in a browser without extra hardware. Visit [anywhere.screenly.io](https://anywhere.screenly.io) on the screen device you want to use. Enter the pairing code that appears in the corresponding text field in your Screenly account. Give your screen a name like **Test Screen** and hit **Add** to connect it. ## Step 2: Get the share link for your Canva content Open a new browser tab and log in to your [Canva account](https://www.canva.com). Select the design you’d like to feature — this could be a **mind map**, **presentation**, **whiteboard**, or any other layout that displays your content. Canva’s templates work well for sharing business workflows, marketing strategies, internal team updates, and more. Next, you need to create a public viewing link in Canva. - Click the **Share** button in the top-right corner - Click **Public view link** and *not* the **Copy link** button - Then, in the new popup modal view, click **Copy** to copy the public URL to your clipboard ![Access your Canva public view link to display content.](/assets/images/community/tutorial-canva-link.webp) With your share link copied, you're ready to bring your Canva content into your Screenly account. ## Step 4: Add your Canva design to your Screenly content folder Head back to your Screenly account: - Go to the **Content** tab - Click **+ New Content** - Choose **URL** in the modal window - Paste your Canva share link and hit **Finish** - Give the content a name like **Canva**, then click **Save** ![Adding content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) Your Canva content is now uploaded to your Screenly account and ready to be scheduled. ## Step 5: Build a playlist, schedule your content, and assign it to a screen The next step is to build a playlist. Playlists are where your content is scheduled and assigned to display on screens. - In you Screenly account, click on the **Playlists** tab - Click **+ New Playlist** - Name it something like **Canva** - Under **Plays On**, choose the **Test Screen** screen you paired earlier - Be sure to set the scheduled date to before the current date so the playlist becomes active - Click **+** next to **Content** and add the Canva content item you previously uploaded - Click **Done**, then make sure to **Save** your playlist ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) Your playlist is now live and set to display your Canva design on your browser-based screen. ## Step 6: You're live! After a few moments, your Canva content will start displaying on your [Screenly Anywhere](/anywhere/) screen. Whether you're showcasing workflows in a shared workspace, looping a visual pitch in a meeting room, or displaying brand content. It’s a seamless way to share designs with your team. ## Try Screenly + Canva Today With [Canva](https://www.canva.com) and Screenly together, it only takes a few minutes to turn your creative assets into dynamic digital signage. No extra devices, no complicated setup — just simple, beautiful displays. Start your [free Screenly trial](https://login.screenlyapp.com/sign-up), connect a screen, and start sharing your Canva designs today. **Need assistance?** Our [Screenly Support team](https://support.screenly.io/hc/en-us/requests/new) is here to help. --- # Display ChartBlocks visualizations on Screenly digital signs Source: https://www.screenly.io/community/display-chartblocks-visualizations/ > You can make beautiful charts with ChartBlocks and display them on your ChartBlocks is a powerful online chart builder that lets you quickly turn datasets into beautiful visualizations. Whether you're tracking performance, comparing KPIs, or visualizing trends, [ChartBlocks](https://www.chartblocks.com) helps bring your data to life — no code required. With Screenly, you can take those charts and showcase them on digital signage screens, making insights accessible to your entire team at a glance. In this tutorial, we'll walk you through the steps to display a ChartBlocks chart on a digital sign with Screenly quickly and easily. ## Step 1: Set up your screen with Screenly If you haven’t already created a Screenly account, [sign up for a free -day trial](https://login.screenlyapp.com/sign-up) — no credit card needed. If you're already a user, just [log in](https://login.screenlyapp.com/login) and open your **Screenly dashboard**. To connect a new screen: - Go to the **Screens** tab in the sidebar - Click **Add Screen** ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) For this tutorial, we’re using a **Screenly Anywhere** screen, which turns any browser into a signage player — ideal for smart TVs, desktops, or tablets. Open [anywhere.screenly.io](https://anywhere.screenly.io) on the display you want to use. You’ll see a unique pairing code. Enter that code in your Screenly account, give your screen a name like **Test Screen**, and click **Add**. ## Step 2: Prepare your ChartBlocks embed link Now switch over to [ChartBlocks](https://www.chartblocks.com) and log in to your account. Pick the chart you'd like to display. In this tutorial, we're using a bar chart showing medal counts by country. Open that chart and click **Share**. ChartBlocks offers a public link, but for the cleanest presentation on your digital signs, we recommend using the **Embed code** option. Copy the **iframe `src` URL** (the part inside the `src="..."` quotes). ![Access your ChartBlocks iframe embed link.](/assets/images/community/tutorial-chartblocks-iframe.webp) This URL will be used inside a Screenly App that supports iframe content. ## Step 3: Add your chart as an App in Screenly Back in your **Screenly dashboard**: - Click on the **Apps** tab in the sidebar - Click **+ App**, then choose **iframe App** - Click **Create** ![Add an App in the Screenly interface.](/assets/images/community/tutorial-add-edge-app.webp) Name your app something like **ChartBlocks**. Then, paste the iframe source URL that you copied from ChartBlocks into the App input field. Click **Install** to finalize the app. Once installed, your App will appear in your **Content** tab alongside your other media assets. ![Add content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) ## Step 4: Create a playlist and schedule your chart Now let’s get your chart on your digital signage screen: - Open the **Playlists** tab - Click **+ New Playlist** - Name it something like **ChartBlocks Playlist** - Under **Plays On**, select your paired screen (in this case, **Test Screen**) - Set the **Schedule** to a time before the current moment so the playlist activates right away - Click the **+** icon next to **Content** and choose your ChartBlocks iframe App - Set the duration that you want your content to display for. If it's the only item in the playlist, it will loop continuously. - Click **Done**, then click **Save** ![Add a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) Your playlist is now active and configured to display your chart. ## Step 5: View your live chart Navigate back to your **Screens** tab, and you’ll see your content queued up and ready to go. If you're using **Screenly Anywhere**, just open a browser tab and navigate to [anywhere.screenly.io](https://anywhere.screenly.io) — your chart will appear full screen, automatically optimized for your display. You can also push this content to any digital sign powered by a Screenly Player or Screenly Player Max. Learn more about our [digital signage players](/digital-signage-players/). ## Why Screenly & ChartBlocks work well together ChartBlocks offers a smooth design experience and high-quality output — but it’s even more powerful when paired with Screenly. Rather than letting your charts sit hidden in dashboards or spreadsheets online, you can push them directly to the places where your teams work and where decisions happen. It’s a great setup for teams who want live data visibility across offices, warehouses, or remote workspaces. ## Get started with ChartBlocks and Screenly ChartBlocks is a fantastic tool for building clear and interactive visualizations. With Screenly, those insights don’t just live in a browser — they become a visible, shared resource across your organization. Start your [free Screenly trial](https://login.screenlyapp.com/sign-up), create a playlist with your [ChartBlocks](https://www.chartblocks.com) iframe link, and start broadcasting your data today. **Need help?** Our [Screenly Support team](https://support.screenly.io/hc/en-us/requests/new) is here if you have any questions. --- # Display ClickUp dashboards on Screenly digital signs Source: https://www.screenly.io/community/display-clickup-dashboards/ > Get your dashboards on your digital signs with Screenly and ClickUp. ClickUp is a popular all-in-one project management platform used by teams of all sizes to track tasks, timelines, goals, and collaboration. With its robust dashboards and flexible views, ClickUp makes it easy to manage complex projects in one place. Now, with Screenly, you can display your [ClickUp](https://clickup.com/) dashboards on digital signage — whether in your office, warehouse, or remote workspace — so your team can stay aligned and on track. Here’s how to set it up. ## Step 1: Get started with Screenly If you don’t already have a Screenly account, you can start a free -day trial with no credit card required. If you already have an account, log in and head to your Screenly dashboard. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) To add a screen: * Click the **Screens** tab on the left-hand menu * Click **+ Add Screen** in the top right In this walkthrough, we’re using a Screenly Anywhere screen, which allows you to launch a digital sign using just a web browser — no additional hardware needed. Just go to anywhere.screenly.io, and pair the screen using the code shown. Give your screen a name like **Test Screen** and click **Add**. ## Step 2: Get your public ClickUp dashboard link Next, open the ClickUp project or dashboard you want to display. * Navigate to the list or view you want to share. * In the top-right corner, click **Share**. * Scroll down and click **Share this view**. * In the top-right corner, click **Share**. * Scroll down and click **Share this view**. * Make sure the visibility is set to “Anyone with the link can view.” * Click **Copy Public Link**. This public link will be used to pull your ClickUp data into Screenly. ## Step 3: Add your ClickUp board to Screenly In the Screenly dashboard, click the **Content** tab on the left-hand menu. ![Adding content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) * Click **+ New Content** in the top right. * In the popup modal, select **URL**. * Paste in your ClickUp public link and click **Finish**. * Give the content a name like **ClickUp Dashboard** and click **Save**. Your ClickUp content is now ready in your content library. ## Step 4: Create a playlist and assign it to your screen Use the following steps to create a playlist and assign it to your screen: ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) * Click the **Playlists** tab on the left-hand menu. * Click **+ New Playlist** on the top right. * Click **+ New Playlist** on the top right. * Name the playlist something like "Project Management". * Under **Content**, add the ClickUp item you just created. * Set the schedule so the playlist starts immediately (or whenever you need). * Under **Plays On**, select the screen you paired earlier (e.g., Test Screen). * Optionally, adjust the display duration to something like 30 seconds for looping. * Click **Save**. Your playlist is now set up and linked to your screen. ## Step 5: That’s it! Your [ClickUp](https://clickup.com/) dashboard will now display on your Screenly screen. It’s a simple way to keep your team updated, visualize project progress, and stay on top of key deadlines — all in real time. ## Get started with Screenly & ClickUp It’s easy to get up and running with Screenly and ClickUp. Just sign up for a [free trial](https://login.screenlyapp.com/sign-up), share your favorite ClickUp dashboards, and turn any screen into a real-time project tracker — no extra hardware required. Have questions? We’re always happy to help. --- # Display Datadog dashboards on a digital sign Source: https://www.screenly.io/community/display-datadog-dashboards/ > With Datadog, users can combine infrastructure performance data and business ![The Datadog website sidebar menu.](/assets/images/community/datadog-display-datadog-dashboard.webp) Datadog helps teams monitor their infrastructure and visualize data on custom dashboards. Users can combine infrastructure performance and business metrics using multiple data sources. We use [Datadog](https://www.datadoghq.com/) internally at Screenly to monitor all sorts of data, including data from Google Cloud and Kubernetes. When company metrics are easily accessible and top-of-mind among employees, teams can use that data to make more informed business decisions. With Screenly, Datadog users can display real time dashboards to their teams using existing TVs and monitors. Follow the steps below to display your Datadog dashboards with Screenly. ## Steps for showing Datadog metrics on a digital sign To show a live Datadog dashboard on a digital sign, you will first need to generate a public share link for your dashboard. To do so, first log in to your Datadog account. From the left-hand menu, click on "Dashboards". Next, click "Dashboard List" from the sub-menu. ![The Datadog website sidebar menu.](/assets/images/community/datadog-open-datadog-dashboard-list.webp) Click on the dashboard you wish to display from the list. In this case, the dashboard name is "Test Dashboard". ![The Datadog website showing list of dashboards.](/assets/images/community/datadog-open-datadog-dashboard.webp) After your selected dashboard opens, click the settings/gear icon on the top right of the screen. ![The Datadog website showing a dashboard with gear icon at the top right corner.](/assets/images/community/datadog-open-datadog-dashboard-settings.webp) Then, click on "Generate shared URL" from the dropdown menu. ![The Datadog dashboard settings.](/assets/images/community/datadog-generate-datadog-dashboard-url.webp) In the new popup that loads, select the permission level that reads "'Anyone with a link (public)' can access this dashboard". This will grant Screenly access permissions to the dashboard you wish to display. ![The Datadog dashboard URL configuration popup modal.](/assets/images/community/datadog-configure-datadog-dashboard-url.webp) After setting the URL configuration, copy the generated URL to your clipboard. ![The generated Datadog dashboard public URL.](/assets/images/community/datadog-url-to-clipboard.webp) Note that you can revoke a public URL to a dashboard at any time. Being aware of this feature is important, as teams often display sensitive company information using Datadog. To revoke a public URL, go to the Dashboard List page. Next, select the dashboard and click the settings/gear icon on the top right of the screen. Next, click on the "Configure sharing" section and click the "Revoke URL" option. ![The Datadog dashboard URL settings popup modal.](/assets/images/community/datadog-revoke-dashboard-url.webp) ## Setting up your digital sign Now that you have your public URL, the next step is setting up your digital sign. The first step for creating a digital sign is to purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor. Screenly offers the Screenly Player and Screenly Player Max. You can then pair your [digital signage player](/blog/2019/02/16/what-is-a-digital-signage-player/) and associated screen to your online Screenly account. The next step for showing your Datadog dashboard on a digital sign is adding the public URL for the dashboard to your online Screenly account. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Datadog Dashboard URL as a new content item.](/assets/images/community/datadog-input-datadog-dashboard-url.webp) With the above steps completed, you can now add this asset to a playlist. To do so, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click the three-dots icon on the right of the playlist that you wish to edit. Next, click the "Edit" tab. ![The Edit option tab in the playlist settings menu](/assets/images/community/edit-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Datadog dashboard to the playlist from your content collection. ![The + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Datadog dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Datadog Dashboard content to playlist.](/assets/images/community/datadog-add-datadog-content-to-playlist.webp) You will then see your Datadog Dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the time you want the dashboard display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Datadog Dashboard content in the playlist.](/assets/images/community/datadog-set-content-duration.webp) To assign the playlist containing the Datadog dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page showing input field for screens that will display the playlist.](/assets/images/community/assign-playlist-to-screen.webp) A dropdown will appear containing all your screens and group labels, select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens.](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Datadog dashboard content to your screen(s) or group(s) of screens, your Datadog Dashboard will display on your TV or monitor in just minutes. ## Show your Datadog dashboards on a digital sign Displaying Datadog dashboards on a digital sign helps keep teams motivated and focused on company goals. When everyone can see key metrics and performance data, everyone can act on that information, too. To see if Screenly works for your organization, sign up for a [-day free trial](https://login.screenlyapp.com/sign-up). If you have any questions about how Screenly may meet your needs, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.148249140.2056958711.1596341311-1677843071.1576693976) at any time. --- # Display Domo dashboards on Screenly digital signs Source: https://www.screenly.io/community/display-domo-dashboards/ > Domo is business-intelligence platform trusted by large enterprises for [Domo](https://www.domo.com) is a veteran business-intelligence platform trusted by large enterprises for deep, real-time analytics. But data only drives action when people actually see it. By pairing Domo with Screenly, you can surface KPI dashboards on hallway monitors, office TVs, or any connected display, so insights are always in sight. Below is a concise walkthrough for publishing a Domo dashboard on a Screenly digital sign. ## Pair a Screenly Anywhere screen with your online account If you’re new to Screenly, start with a [free -day trial](https://login.screenlyapp.com/sign-up) (no credit card needed). Existing users can simply [log in](https://login.screenlyapp.com/login) and open their Screenly dashboard view. Once you are at your Screenly dashboard: 1. Click **Screens** in the lefthand sidebar. 2. Choose **Add Screen** or **+ New Screen**. 3. Select **Screenly Anywhere**, which isour browser-based player that runs on any device with a modern browser. 4. On the device you’ll use as a sign, visit [anywhere.screenly.io](https://anywhere.screenly.io) and copy the pairing code. 5. Paste the code into your Screenly account, give the screen a name (e.g., **Domo Display**), then click **Add**. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) Your screen is now paired to your account andready to receive content. ## Generate a public embed link in Domo Open a new tab and sign in to your [Domo](https://www.domo.com) workspace. 1. Navigate to the dashboard you want to publish. 2. Click the **Share** icon, but instead of “Share" in the submenu, choose **Domo Everywhere**. 3. Next, in **Embed Options**, set the access level to **Public**. 4. Copy the **Embed URL**. ![Access your Domo public view share link to display content.](/assets/images/community/tutorial-domo-link.webp) **Trouble finding the link?** In **More → Admin → Domo Everywhere → Settings**, make sure click the checkbox on **Allow public embedding of Cards and Dashboards** is enabled. Then, click **Embed** on the lefthand side of the screen, then click **Dashboards** on the right side. Tick your dashboard and choose **Edit** on the top right. In the popup modal, select **Public** under the **Update Embed Type** dropdown. ## Add the Domo link as content in Screenly Now that you have your Domo embed link, you can add it as content in Screenly. Back in your **Screenly dashboard**: 1. Click **Content** in the lefthand sidebar menu. 2. Hit **+ New Content** (top right). 3. Select **URL** in the modal. 4. Paste your Domo embed link and click **Finish**. 5. Name the item (e.g., **Domo Dashboard**) and click **Save**. ![Adding content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) Now that we have your Domo content added to your Screenly account, you can build a playlist and assign it to a screen. ## Build a playlist and assign it to a screen To build a playlist and assign it to a screen, complete the following steps: 1. Go to **Playlists** in the sidebar. 2. Click **+ New Playlist**. 3. Name it **Domo Playlist**. 4. Under **Plays On**, pick the screen you paired earlier (e.g., **Test Screen**). 5. Click the **+** next to **Content** and select your Domo item. 6. Set the **Start Time** to before the current moment so it begins right away. 7. Optionally, adjust the content **Duration** (e.g., 30 seconds). 8. Click **Save**. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) That's it! Your Domo dashboard is now assigned to a playlist and will display on your Screenly digital sign shortly. ## See your Domo dashboard live Open the Screenly Anywhere tab on your display. Your Domo dashboard should appear full-screen and refresh automatically according to your Domo settings and as your data changes. Need to roll this out company-wide? Just repeat the screen-pairing step for each location and assign the same playlist. Screenly scales seamlessly. ## Elevate your data visibility today Domo delivers powerful analytics; Screenly ensures those insights are impossible to miss. Unite the two to keep teams focused on the metrics that matter, from boardrooms to break rooms. Ready to try it? Start your Screenly [free trial](https://login.screenlyapp.com/sign-up), add a screen, and broadcast your Domo dashboard today. **Questions?** Reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). We’re here to help. --- # Display Flourish.Studio data visualizations on Screenly digital signs Source: https://www.screenly.io/community/display-flourish-studio-visualizations/ > Learn how to get beautiful dashboards from Flourish Studio on your digital signs. Flourish Studio is a powerful platform for creating dynamic, interactive data visualizations — from charts and maps to full dashboards. These visualizations take time to create, and with Screenly, you can make sure they’re seen by the people who need to see them. Whether you're sharing performance metrics, storytelling through data, or showcasing research, Screenly makes it easy to display [Flourish Studio](https://flourish.studio/) projects on your digital signage — no hardware required. Here’s how to get started. ## Step 1: Get started with Screenly If you don’t already have a Screenly account, you can start a [free -day trial](https://login.screenlyapp.com/sign-up) — no credit card required. If you already have an account, [log in](https://login.screenlyapp.com/login) and go to your Screenly dashboard. To add a screen: * Click the **Screens** tab on the left-hand menu * Click **+ Add Screen** in the top right We’ll be using a [Screenly Anywhere](/anywhere/) screen, which runs in any modern browser. Go to [anywhere.screenly.io](https://anywhere.screenly.io) after you log in, and use the pairing code shown on screen to connect it to your account. * Give your screen a name like "Test Screen" and click **Add**. ## Step 2: Get your public Flourish project link Open the Flourish project you want to display. * Click the **Export & Publish** button in the top right. * Make sure the visualization is set to **Public**. * Copy the **Public Link** that is generated. This public URL allows Screenly to access and display your Flourish project on a screen. ## Step 3: Add your Flourish visualization to Screenly In the Screenly dashboard, click the **Content** tab on the left-hand menu. Continue with the following steps: * Click **+ New Content** in the top right. * In the popup modal, select **URL**. * Paste in your Flourish public link and click **Finish**. * Give your content a name like "Flourish Dashboard" and click **Save**. Your visualization is now saved as content in your Screenly library. ## Step 4: Create a playlist and assign it to your screen To make a playlist and connect it to your screen, continue with the following steps: * Click the **Playlists** tab on the left-hand menu. * Click **+ New Playlist** on the top right. * Name your playlist something like "Data". * Under **Content**, add the Flourish visualization you just created. * Under **Plays On**, select the screen you added earlier (e.g., Test Screen). * Set the display duration (e.g., 30 seconds) or customize further with Screenly’s advanced scheduling options. * Click **Save**. Your Flourish visualization is now part of a playlist and assigned to your screen. ## Step 5: That’s it! You’re now displaying beautiful, interactive data from Flourish Studio on your Screenly-powered digital sign. It’s an easy and powerful way to turn complex insights into team-wide conversations. ## Get started with Screenly & Flourish Data doesn’t mean much if it’s not seen. With Screenly, your [Flourish Studio](https://flourish.studio/) dashboards can live front and center — in real time, on your terms. Sign up for a [-day free trial](https://login.screenlyapp.com/sign-up), connect your projects, and start sharing data that matters. --- # Display Funnel.io dashboards with Screenly Source: https://www.screenly.io/community/display-funnel-io-dashboards/ > Get your data on your digital signs with Screenly and Funnel.io. [Watch the video](https://www.youtube-nocookie.com/embed/qLU_waLucGs) Need to display and integrate marketing data? One way to do this is with [Funnel.io](https://funnel.io/). Funnel.io makes it easy to manage and make sense of marketing data across almost every channel you can imagine. Screenly makes it easy to display Funnel.io dashboards on your digital signs. Learn more in the post below. ## Step 1: Get started with Screenly The first step is to get your screen up and running. To do so, sign up for a free trial or log in to your existing Screenly account. Once you are inside the screenly dashboard, click the *Screens* tab on the left-hand menu. Then, click the *+ Add Screen* button on the top right. Follow the onscreen instructions and pair your Screenly Anywhere screen. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Get the Funnel.io sharing link for your dashboard Next, navigate to your Funnel.io account. Pull up the dashboard that you wish to display. Click the *Share* icon on the top right. Click *Share Link* from the dropdown menu. In the popup modal, click *Copy Link*. ![Getting the share link from the AgencyAnalytics dashboard.](/assets/images/community/screenly-funnelio.webp) ## Step 3: Add your AgencyAnalytics share link to your Screenly account Next, navigate back to your Screenly account and click the *Content* tab. Click *New Content* on the top right, and in the popup modal, select URL. Add your Funnel.io share link URL. Be sure to click *Finish*. The next step is to create a playlist. To do so, click the *Playlists* tab on the left-side menu. Next, click the *+ New Playlist* button on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use). Lastly, click the *+* icon in the content section of the playlist menu and add your Funnel.io share link. Next, select *Save* on the bottom right of the screen. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 4: That's it Your Funnel.io dashboard should now display on your Screenly screen! ## Get started with Screenly & Funnel.io Funnel.io is a great tool to get a handle on your marketing data, and it can be greatly enhanced with Screenly. To get started, sign up for a [free trial](https://login.screenlyapp.com/sign-up) with Screenly and start displaying your [Funnel.io dashboards](https://funnel.io/) on your digital signs! --- # Display Klipfolio dashboards on your Screenly digital signs Source: https://www.screenly.io/community/display-klipfolio-dashboards/ > Klipfolio is a popular cloud-based software for visualizing your data. [Klipfolio](https://klipfolio.com) turns raw data into real-time dashboards that help teams track KPIs and spot trends. Pair Klipfolio with Screenly and you can broadcast those dashboards on any connected display—bringing critical metrics out of hidden folders and burried emails and into plain view for everyone. Below is a step-by-step guide to publish a Klipfolio dashboard on a Screenly digital sign. ## Step 1: Add a screen to Screenly If you’re new to Screenly, [start a free -day trial](https://login.screenlyapp.com/sign-up) (no credit card required). Already have an account? [Log in here](https://login.screenlyapp.com/login) and open your **Screenly dashboard**. To link a new screen: 1. Click the **Screens** tab in the lefthand sidebar 2. Select **Add Screen** 3. Choose **Screenly Anywhere** (our browser-based player) 4. On the device you’ll use as a sign, visit [anywhere.screenly.io](https://anywhere.screenly.io) and copy the unique pairing code 5. Paste the code into your online Screenly account, name your screen (e.g., **Test Screen**), then click **Add** Your display is now ready to receive content. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Create a public share link for your Klipfolio dashboard In a new tab, sign into your [Klipfolio](https://klipfolio.com) workspace and open the dashboard you want to show (e.g., an **Executive Summary**). Next: 1. Click the **Share** icon (top-right) 2. Click **Publish link to dashboard** from the dropdown 3. In **Visibility**, select **Anyone with the link** 4. Pick a **Theme** (Light or Dark) 5. Click **Publish Now** and then **Copy Link** You now have a public URL that Screenly can load. ![Access your Klipfolio share link.](/assets/images/community/tutorial-klipfolio-share.webp) ## Step 3: Add the Klipfolio link to Screenly Back in your **Screenly dashboard**: 1. Click **Content** tab in the lefthand sidebar 2. Hit **+ New Content** on the top-right of the content screen 3. Choose the **URL** tab in the popup modal 4. Paste your Klipfolio link and click **Finish** 5. Give the content item a name such as **Klipfolio Dashboard** and click **Save** ## Step 4: Build a playlist and assign your screen ot the playlist Now that you have your Klipfolio dashboard added as a content item, complete the following steps: 1. Open **Playlists** in the lefthand sidebar 2. Click **+ New Playlist** 3. Name the playlist **Klipfolio Playlist** or something else that is relevant 4. Under **Plays On**, select your paired screen (e.g., **Test Screen**) 5. Click **+** next to **Content** and add the Klipfolio dashboard content item you saved 6. Set the **Start Time** to before the current moment so it begins right away 7. Adjust the content **Duration**. Note that if it's the only item, it will loop continuously. 8. Click **Save** ![Add a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 5: That’s it! Check your **Screenly Anywhere** browser tab, and you’ll see your Klipfolio dashboard fill the screen. Need to scale? Pair additional screens and assign the same playlist. Screenly handles the rest, whether you’re managing one screen or hundreds of displays worldwide. ## Get started with Screenly + Klipfolio With [Klipfolio](https://klipfolio.com) providing real-time analytics and Screenly delivering effortless digital signage, your data finally gets the visibility it deserves. Start your [Screenly free trial](https://login.screenlyapp.com/sign-up), add a screen, and bring your Klipfolio insights to life—no specialized hardware required. **Need help?** The [Screenly Support team](https://support.screenly.io/hc/en-us/requests/new) is here whenever you need a hand. --- # Display Microsoft Power BI dashboards on a digital sign Source: https://www.screenly.io/community/display-power-bi-dashboards/ > Use Screenly to display Microsoft Power BI dashboards on a digital sign. Microsoft Power BI is one of the most powerful and popular data visualization tools on the web. With Power BI, users can create stunning dashboards and populate those dashboards with real time data. By combining Power BI dashboards with Screenly digital signs, teams can display key business metrics to the entire team on a central, easily-viewable digital sign. In the steps below, we detail how you can start displaying your Power BI dashboards on a Screenly digital sign in minutes. Depending on how sensitive your dashboard is, you can choose one of the methods below. We recommend using the App approach, since it is the most secure method. This approach was developed for Fortune 500 companies with strict security requirements, and has passed security compliance from their security teams. If you are using Power BI, it is **strongly** recommended that you use a [Screenly Player Max](/digital-signage-players/), as the Screenly Player (or DIY Raspberry Pis) will struggle to load many Power BI dashboards. ![A data dashboard from Power BI.](/assets/images/community/power-bi-dashboard.webp) ## Using Power BI Screenly App The corner stone of this approach leverages the security features in our [Apps](/docs/developers/edge-apps/). This means that the sensitive data (i.e. Oauth 2.0 Client Credentials) are never exposed to the browser, and encrypted using the TPM (on the Screenly Player Max). You can display Power BI dashboards in Screenly using either the **Latest Power BI App** or the **Legacy Power BI App** . Each option offers a different setup experience depending on your integration preferences. The latest version streamlines the setup with direct account integration, allowing you to complete the entire process in just two simple steps. ### Connect the Power BI Integration - Log in to your Screenly account. - Go to **Integrations**. - Click **Power BI**. - Sign in using your **Microsoft account** to authorize the connection. ![A data dashboard from Power BI.](/assets/images/community/powerbi-intergrations01.webp) > **Note:** Only the account owner can view and connect the Power BI integration. Once the integration is added, other team members will be able to create and install the Power BI App on their own #### Install the Power BI App and select the dashboard you want to display Once the integration is connected, open the App Store. - Search for the **Power BI App**, enter a **Name** [1] and click **Create** to proceed. - Choose your **Workspace** [2], **Resource Type** [3], **Resource** [4] and **Page Number** [5] from the drop down. - click **Install** [6]. ![A data dashboard from Power BI.](/assets/images/community/powerbi-install.webp) After that, add the **Power BI App asset** to a **playlist**, and then link that **playlist** to a **screen** for display. ## Using Legacy Power BI App > **Note:** We suggest using the Power BI App with Power BI account integration for a quicker, more reliable, and easier setup experience. <br> To get started, you need the folowing * A Client ID and Client Secret for an Azure AD application * The Tenant ID for your Azure instance * The Group ID (also known as Workspace ID) for the Power BI dashboard * The report or dashboard ID You can reference the [documentation](https://learn.microsoft.com/en-us/power-bi/developer/embedded/embed-sample-for-customers?tabs=python) from Microsoft, but in simple terms, you need to: * Register an Azure AD application * Create a Power BI workspace (if you don't already have one) * Make sure that the [service principle has API access](https://learn.microsoft.com/en-us/power-bi/developer/embedded/embed-sample-for-customers?tabs=python#step-6---service-principal-api-access) to Power BI's API * Grant access to the Azure AD application has workspace access in Power BI ### Reports vs Dashboards In Power BI, a report is like a detailed story about your data with multiple views and deep interactions, made using the main Power BI tools. On the other hand, a dashboard is a single-page summary that shows key points from one or more reports, put together online in Power BI. Think of reports as detailed books and dashboards as quick summaries or highlights. When configuring the App, you need to specify if you are using a report or dashboard. ### Using the App Store (recommended) To install the Power BI App, you first need to have acquired all the information above. Armed with this information, it's quick to install the actual App. Navigate to "Apps" in the left-hand menu, press "+ App" and select "Power BI". You will need to provide the following values to install your App: * `azure_ad_client_id` * `azure_ad_client_secret` * `azure_ad_tenant_id` * `power_bi_group_id` * `power_bi_resource_id` * `power_bi_resource_type` * **Optional:** `power_bi_page_name` * This is used to select a tab in a report or dashboard with multiple pages. Note that this is not the name of the tab. Instead, you need to use the `ReportSection` part of the URL, such as `ReportSection50033...a22c`. Once you have pressed 'Install', you should be able to find your App under the Content section. You can then schedule it in a playlist just like you can with a regular content piece. ### Using the CLI * First, install the Screenly [CLI](https://developer.screenly.io/cli/#command-line-interface-cli) * Clone or download the [Playground](https://github.com/Screenly/playground) repository ```bash cd edge-apps/powerbi screenly edge-app create --name "My Power BI Dashboard" --in-place screenly edge-app upload ``` With the App uploaded, it's time to configure it. This is where we need to use the settings from above, namely: * `azure_ad_client_id` * `azure_ad_client_secret` * `azure_ad_tenant_id` * `power_bi_group_id` * `power_bi_resource_id` * `power_bi_resource_type` To set these, we again use the CLI. All but the `azure_ad_client_secret` are "settings," so let's start by setting the secret: ```bash screenly edge-app secret set azure_ad_client_secret=[redacted] ``` Now, we can continue with the settings: ```bash screenly edge-app setting set azure_ad_client_id=[redacted] ``` Rinse and repeat for all of the remaining settings. Once you're finished, you'll need to create an instance of the app. An instance is a unique installation of an App, and each instance can have its own settings and secrets. This allows you to run multiple instances of the same App with different configurations. ```bash screenly edge-app instance create --name=EDGE_APP_INSTANCE_NAME ``` You should now have an asset named `My Power BI Dashboard (stable)` in your web console. ## Using Public URL ### Getting a public URL for your Power BI dashboard To use less sensitive dashboards you can create an access URL to your dashboard. To do so, open your dashboard and click on the “File” dropdown. Next, click the “Publish to web” icon. If you are not an admin of your business’s Microsoft account, you may need to get admin access yourself or find your business’s admin user. You can find our more about sorting out admin access [here](https://docs.microsoft.com/en-us/power-bi/admin/service-admin-role). Once you have admin access, you will see the “Embed in a public website” popup modal. Click the “Create embed code” option. Next, in the “Embed in a public website” popup, you will see a warning about how the dashboard will be viewable via a public link. Make sure that this is OK with your organization and then click “Publish.” In the next popup that loads, you will see two boxes. You will see a “Link you can send in email” and a “HTML you can paste into your blog or website” box. Select the “Link you can send in email” option. This link will share a full-screen view of your Power BI dashboard. Only choose the link in the “HTML you can paste into your blog or website” if you have an advanced use case where you want to adjust the sizing of your dashboard. ### Add your Power BI dashboard URL to your screen Now that you have a public URL for your Power BI dashboard, the next step is to add the URL as content to your online Screenly account. To do so, login to your Screenly account [here](https://login.screenlyapp.com/login). Next, click the “Content” tab on the left-hand side of the screen. Once you are on the Content page, click the “+ New Content” button on the top right. You will then see the “Add Content” popup modal. Click the “URL” tab, and add your public URL for your Power BI dashboard in the “Enter URL link” input box. Next, click the “Finish” button on the bottom right of the popup modal. After your URL link uploads to your account, you can then change the content title in the “Title” input box. To finish adding your Power BI dashboard link, click “Save” on the bottom right of the screen. Next, you will then need to create a playlist and add your Power BI playlist to the screen. To learn more on this step, check out our video on [how to create a playlist with Screenly](https://www.youtube.com/watch?v=CmY0q-s_3pY). Once you have a playlist, you can add that playlist to a screen. For more information, see our videos on [how to add a new screen](https://www.youtube.com/watch?v=3VWtcbsI8PA) and [how to add content to your screen](https://www.youtube.com/watch?v=HZUJWLsTVmU). Once you assign a playlist containing your Power BI dashboard to your screen, your Power BI dashboard will then display on your TV or monitor in minutes. ## Getting started with Screenly If you do not have a Screenly account already, you can get started with a [-day free trial account](https://login.screenlyapp.com/sign-up). We do not require a credit card for a trial account. Take a look inside, add your Power BI dashboards, and set up your first screen with a digital signage player. If you have any trouble getting your Power BI dashboard to display on your screen, contact [Screenly Support](https://support.screenly.io/hc/en-us/requests/new) at any time. We are always happy to help! --- # Display Monday.com dashboards with Screenly Source: https://www.screenly.io/community/display-monday-com-dashboards/ > Show your Monday.com dashboards on your Screenly digital signs and keep [Watch the video](https://www.youtube-nocookie.com/embed/7eerjm15DJU) [Monday.com](https://monday.com/) is a popular work management platform that helps teams organize tasks, manage workflows, and monitor performance in real-time. With powerful dashboard views, you can keep track of key metrics, project statuses, and team progress. Now with Screenly, you can easily display your [Monday.com](https://monday.com/) boards and dashboards on digital signs — bringing visibility, alignment, and transparency to any workspace. Here’s how to set it up. ## Step 1: Get started with Screenly If you don’t already have a Screenly account, you can start a free -day trial with no credit card required. If you already have an account, log in and head to your Screenly dashboard. To add a screen: Click the **Screens** tab on the left-hand menu Click **+ Add Screen** on the top right In this tutorial, we’ll be using a Screenly Anywhere screen — which means you can display digital signage using just a web browser, with no extra hardware. Just go to anywhere.screenly.io, and pair the screen using the code shown. Give your screen a name like Test Screen and click **Add**. ## Step 2: Get your public Monday.com board link Next, let’s grab the content you want to display from Monday.com. Open the Monday.com board or dashboard you want to share. Click the three-dot icon (•••) on the board tab. Select **Share View** from the dropdown menu. Ensure the board is publicly visible — toggle the sharing option if needed. Click **Copy Link** to grab the shareable public URL. This link allows Screenly to display your board content on your digital screen. ## Step 3: Add your Monday.com board to Screenly In the Screenly dashboard, click the Content tab on the left-hand menu. Click **+ New Content** in the top right. In the popup modal, select **URL**. Paste in the Monday.com share link and click **Finish**. Give your content a name like Monday Dashboard and click **Save**. Your dashboard is now saved as content in your Screenly account. ## Step 4: Create a playlist and assign it to your screen Click the **Playlists** tab on the left-hand menu. Click **+ New Playlist** on the top right. Name your playlist something like Monday Dashboard. Under **Content**, add the Monday.com item you just saved. Set the schedule so the playlist starts immediately (or at your preferred time). Under **Plays On**, choose the screen you just created (e.g., Test Screen). Optionally, set the display duration — such as 30 seconds. Click **Save**. Now your Monday.com board is part of a playlist and assigned to your screen. ## Step 5: That’s it! Your Monday.com dashboard will now appear on your digital signage screen. This is a great way to keep everyone aligned, showcase team progress, and spark collaboration. ## Get started with Screenly & Monday.com It’s fast and easy to display [Monday.com](https://monday.com/) dashboards using Screenly. Sign up for a [free trial](https://login.screenlyapp.com/sign-up), connect your boards, and bring your data to life — no extra hardware required. --- # Display NetSuite data on a TV with Screenly Source: https://www.screenly.io/community/display-netsuite-data/ > With Screenly, you can show NetSuite data on a TV in your office using With Screenly, you can display dashboards from [Oracle's NetSuite](https://www.netsuite.com/portal/home.shtml) platform on a TV. NetSuite is one of the most popular cloud solutions for enterprise resource planning and business management. Displaying your company's NetSuite dashboards on a TV in your office can help keep your entire team coordinated and motivated. ## Use our beta NetSuite app Screenly has a NetSuite app that pulls your NetSuite data onto your screens. The app is currently in beta and available on request. To get access, reach out to our team at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new) and let us know you would like to try the NetSuite app. We will enable it for your workspace and help you connect it to your NetSuite data. ## Add your NetSuite content to a playlist Once the NetSuite app is set up in your workspace, add it to a playlist so it shows on your screens. [Log in to your Screenly account](https://login.screenlyapp.com/login). If you do not have a Screenly account, you can [sign up for a -day free trial](https://login.screenlyapp.com/sign-up). Click the _Playlists_ tab on the left-hand menu, then click the _+ New Playlist_ button. In the _Content_ section at the bottom of the _Edit Playlist_ screen, click the _+_ button next to your NetSuite content, then click the _Done_ button. In the _Plays On_ section, include the screen or group tag associated with your screen. If you still need to add a screen to your Screenly account, check out our video guide [linked here](https://www.youtube.com/watch?v=3VWtcbsI8PA). In the _Schedule_ section, enter the dates and times that you want to show your playlist. To finish, click the _Save_ button on the bottom right of the _Edit Playlist_ screen. ## Let us know if you need help showing NetSuite data If you have trouble setting up your digital sign, do not hesitate to reach out to our team at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). We are happy to help, and we can help you troubleshoot any issues. --- # Display Notion sites with Screenly Source: https://www.screenly.io/community/display-notion-pages/ > Get your data on your digital signs with Screenly and Notion. [Watch the video](https://www.youtube-nocookie.com/embed/8dBJAG7mmls) Notion is a powerful all-in-one workspace tool that’s perfect for organizing tasks, tracking progress, and collaborating with your team. Whether you’re using [Notion](https://www.notion.so) for company goals, project management, or team documentation, Screenly makes it easy to share that information across your organization with digital signage. With Screenly, you can display your Notion pages on screens across your office — or even in remote locations — keeping everyone informed and aligned. Here’s how to do it. ## Step 1: Get started with Screenly If you don't have a Screenly account, you can get started with a free trial. If you have an account, log in. Once you are inside the Screenly dashboard, click the *Screens* tab on the left-hand menu. Then, click the *+ Add Screen* button on the top right. If you have Screenly digital signage players, you can get pair a digital signage player-based screen. In this tutorial, we will display a [Screenly Anywhere](/anywhere/) based screen. Follow the onscreen instructions and pair your Screenly Anywhere screen. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Get the Notion sharing link for your dashboard Now it’s time to get the content you want to display. Open the Notion page or dashboard you want to show on your digital sign. In the top-right corner, click **Share**. Click **Publish** to make the page publicly viewable. Click **Copy site link** to grab the public URL. This link will be used to display your Notion page in Screenly. ## Step 3: Add your Notion share link to your Screenly account Next, navigate to your Screenly account and click the *Content* tab. Click *+ New Content* on the top right, and in the popup modal, select *URL*. Be sure to click *Finish* when you finish adding the share link URL The next step is to create a playlist. To do so, click the *Playlists* tab on the left-side menu. Next, click the *+ New Playlist* button on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use). Lastly, click the *+* icon in the content section of the playlist menu and add the desired content item. Next, select *Save* on the bottom right of the screen. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 4: That's it Your Notion should now display on your Screenly screen! ## Get started with Screenly & Notion As you can see, it's easy to get started. The first step is to get a Screenly [free trial](https://login.screenlyapp.com/sign-up). Next, whip up your [Notion site](https://notion.so/) and get it running on your digital sign! --- # Display ReportGarden dashboards with Screenly Source: https://www.screenly.io/community/display-reportgarden-dashboards/ > Get your data on your digital signs with Screenly and ReportGarden. [Watch the video](https://www.youtube-nocookie.com/embed/YHnpcrZHNh0) ReportGarden is a powerful tool for creating and displaying dashboards. It's great for marketing teams that are trying to display data to the company, and they offer several out-of-the-box report templates. Screenly allows you to display these [ReportGarden](https://reportgarden.com/) dashboards on your digital signs. Learn more in the post below. ## Step 1: Get started with Screenly First, log in to your Screenly account or get started with a [free trial](https://login.screenlyapp.com/sign-up). Within your account, click on the left-side menu and select the *Screens* tab. Then, get started with your first Screenly Anywhere screen. Pair the screen by entering the screen's unique pairing code. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Get the ReportGarden sharing link for your dashboard Navigate to your ReportGarden dashboard that you wish to display, and click the *Share* button. Copy the link that appears in the popup modal. If you have trouble locating this link, be sure to enable the Public Access Link toggle. Also, your link will not work until you press the *Save* button. So, be sure to do so. ![Getting the share link from the ReportGarden dashboard.](/assets/images/community/screenly-reportgarden.webp) ## Step 3: Add your ReportGarden share link to your Screenly account Next, navigate to your Screenly account and click the *Content* tab. Click *New Content* on the top right, and in the popup modal, select URL. Be sure to click *Finish* when the task is complete. The next step is to create a playlsit. To do so, click the *Playlists* tab on the left-side menu. Next, click the *+ New Playlist* button on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use). Lastly, click the *+* icon in the content section of the playlist menu and add the desired content item. Next, select *Save* on the bottom right. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 4: That's it Your ReportGarden dashboard should now start displayingon your Screenly screen! ## Get started with Screenly & ReportGarden It's simple and easy to start displaying [ReportGarden dashboards](https://reportgarden.com/) with Screenly. Take the first step and get started with a Screenly [free trial](https://login.screenlyapp.com/sign-up) today. --- # Display the weather channel on Screenly's digital sign using MeteoTV Source: https://www.screenly.io/community/display-weather-with-meteotv/ > MeteoTV is a weather service provider offering accurate and detailed weather forecasts. [Meteoblue](https://www.meteoblue.com/en/weather/meteotv/overview/mountain-view_united-states_5375480) is a weather service provider that offers detailed and accurate weather information. It provides weather forecasts, current conditions, and other meteorological data for locations around the world. Meteoblue utilizes advanced forecasting models and data sources to deliver precise weather predictions, making it valuable for various applications, including agriculture, energy, outdoor activities, and general weather monitoring. Users can access Meteoblue's services through their website or integrate their weather data into applications, providing a comprehensive and reliable resource for weather-related insights. MeteoTV is a weather channel service for digital signage provided by meteoblue. In this tutorial, I’ll explain how to display meteoTV on Screenly’s digital sign. ### Getting the meteoTV URL To set up meteoTV on Screenly’s digital sign, you’ll have to get the URL for it. Log in to your meteoblue account. If you don’t have an account, you can create one [here](https://www.meteoblue.com/en/user/login/signup). After logging in to your meteoblue account, click on "Widget" from the left sub-menu, then click on "meteoTV". ![MeteoTV weather view page](/assets/images/community/open-meteotv-widget.webp) Scroll down on the meteoTV features page and click on the "Create a new meteoTV" button. ![MeteoTV widget page](/assets/images/community/create-new-meteotv.webp) Uncheck the custom slide option. ![MeteoTV custom slide section](/assets/images/community/disable-custom-slide.webp) Proceed to type in the name you want for your meteoTV, select the duration per forecast slide, and select the slides you would like to be part of your meteoTV weather channel, then click on the submit button. The MeteoTV widget will display each forecast slide for the duration that you indicate here. Take note of the set duration per slide, as you will need it to set the duration for meteoTV in your Screenly playlist (covered later in this tutorial). For example, if you select all 4 forecast slides and set the duration to 15 seconds, then the total duration for your MeteoTV widget will be 60 seconds. ![MeteoTV details section](/assets/images/community/submit-meteotv-details.webp) After creating your meteoTV, scroll down to the "Your meteoTVs" section and right-click on "Show" beside the meteoTV you would like to display and copy the link address. ![your meteoTVs section](/assets/images/community/meteo-tv-url.webp) Now that you have the URL for your weather channel, you can add it as content to your Screenly account. ### Setting up your Screenly digital sign To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor. Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the drop-down menu. ![The + New Content button on the Screenly home page](/assets/images/community/new-content.webp) Next, click the URL tab in the popup modal and paste the meteoTV URL you copied into the "Enter URL link" input field. Be sure to click "Finish" at the bottom right after you successfully add the URL. ![The popup modal to add the meteotv URL as a new content item.](/assets/images/community/insert-meteotv-url-to-screenly.webp) Edit the meteoTV content title by clicking on the input field below the "Title" on your screen. Be sure to click the "Save" button on the bottom right. In this case, I've named the meteoTV content "MeteoTV - London" for easy identification. ![The MeteoTV title page](/assets/images/community/set-meteotv-content-title-in-screenly.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. Create a new playlist by clicking the "+ New Playlist" button on the top right of the new screen that loads. To edit a playlist, click on its name from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the meteoTV content to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-playlist-content.webp) In the new "Add Content to Playlist" popup, find your meteoTV content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the MeteoTV content to a playlist](/assets/images/community/add-meteotv-to-playlist.webp) You will then see your meteoTV content in the playlist’s content section. Next to the content listing, change the listing’s duration to the result of the number of slides you added to your meteoTV multiplied by the duration per slide which is "60" in this case. ![The popup modal to set the duration for the meteotv content in the playlist](/assets/images/community/set-content-duration-for-meteotv.webp) To assign the playlist containing the meteoTV content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/add-playlist-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-playlist-screen.webp) Once you assign the playlist containing the meteoTV content to your screen(s) or group(s) of screens, you will see the meteoTV channel on your TV or monitor in just minutes. ### We’re here to help To see if Screenly works for your organization, sign up for a [-day free trial](https://login.screenlyapp.com/sign-up?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686). If you have any questions about how Screenly may meet your needs, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686) at any time. --- # Display Trello kanban boards with Screenly Source: https://www.screenly.io/community/display-trello-boards/ > Get your kanban boardson your digital signs with Screenly and Trello. [Watch the video](https://www.youtube-nocookie.com/embed/c5irJ6GF-vo) Trello is one of the original, go-to project management tools — known especially for its kanban-style boards. Whether you're managing marketing tasks, product launches, or sprint planning, [Trello](https://trello.com) is a simple yet powerful way to stay organized. With Screenly, you can display your Trello boards on a digital sign so your entire team stays in sync. It’s perfect for showing what’s in progress, what’s next, and what’s complete — all on a shared screen. Here’s how to set it up. ## Step 1: Get started with Screenly If you don't have a Screenly account, you can get started with a free trial. If you have an account, log in. Once you are inside the Screenly dashboard, click the *Screens* tab on the left-hand menu. Then, click the *+ Add Screen* button on the top right. If you have Screenly digital signage players, you can get pair a digital signage player-based screen. In this tutorial, we will display a [Screenly Anywhere](/anywhere/) based screen. Follow the onscreen instructions and pair your Screenly Anywhere screen. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) ## Step 2: Get the Trello sharing link for your dashboard Now it’s time to grab the Trello content you want to display. Open the Trello board you'd like to share. Click the three dots (•••) in the top-right corner of the board. Select Print, Export, and Share. Enable the setting to make the board visible to anyone with the link. Copy the shareable public URL. This link will allow Screenly to access and display your Trello board on a screen. ## Step 3: Add your Trello share link to your Screenly account Next, navigate to your Screenly account and click the *Content* tab. Click *+ New Content* on the top right, and in the popup modal, select *URL*. Be sure to click *Finish* when you finish adding the share link URL The next step is to create a playlist. To do so, click the *Playlists* tab on the left-side menu. Next, click the *+ New Playlist* button on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use). Lastly, click the *+* icon in the content section of the playlist menu and add the desired content item. Next, select *Save* on the bottom right of the screen. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) ## Step 4: That's it Your Trello kanban board should now display on your Screenly screen! ## Get started with Screenly & Trello As you can see, it's easy to get started. The first step is to get a Screenly [free trial](https://login.screenlyapp.com/sign-up). Next, whip up your [Trello board](https://trello.com/) and get it running on your digital sign! --- # Displaying Instagram posts on a digital sign Source: https://www.screenly.io/community/display-instagram-posts/ > Instagram is a popular social media platform for sharing photos and videos Instagram is one of the most popular social media platforms designed for sharing photos and videos. It's known for its visually-oriented nature, offering various filters and creative tools for enhancing images and videos, making it a versatile platform for influencer marketing and brand promotion. Screenly has made it easy to display your latest Instagram posts on a digital sign. This can increase brand visibility by reaching a broader audience, creating brand recognition, and boosting social media engagement. There is more than one method to display your latest Instagram posts on Screenly's digital signs but we recommend using the App approach, since it is the most secure method. Once it has been set up, our Instagram app is programmed to fetch the latest two posts from your Instagram account and display them on the digital sign. ### Using App The cornerstone of this approach leverages the security features in our [Screenly Apps](/docs/developers/edge-apps/). This means that the sensitive data (i.e. Instagram access token and credentials) are never exposed to the browser, and encrypted using the TPM (on the Screenly Player Max). ### Using the Instagram basic display API to get access token In order to use our Instagram app, you're going to need an access token for Instagram Basic Display API. It is used to authenticate against the Instagram account and fetch the user's info and media. To get this access token, [log in to your Meta Developer account](https://developers.facebook.com/products/facebook-login/) or create an account if you don't have one. After logging in to your account, click on "My Apps" at the top-right of the page. ![Meta for developers home page](/assets/images/community/open-meta-developer-apps.webp) In the Apps page, click on "Create App". After clicking on "Create App", scroll down the list of app types provided, select "None", then click "Next". ![Meta for developers apps page](/assets/images/community/create-meta-developer-app.webp) Fill in the form provided with any app name you'd like to use, enter your email address, then click on "Create app" at the bottom right of the form. You may be asked to confirm your password before moving to the next step. The next step is to add a product. You should already be on the products page but if not, click on "Add Product" from the left side-menu. Then scroll to "Instagram Basic Display" and click the "Set up" button below the icon. After clicking on "Set up", you'll see a bunch of permissions and use-cases, scroll down and click "Create New App". ![Meta for developers products page](/assets/images/community/setup-ig-basic-display-api.webp) The next step is to add an Instagram Tester. To do this, click on "Basic Display" from the Products section in the left side-menu, scroll down to the "User Token Generator" section, and click on "Add or Remove Instagram Testers". ![Meta for developers basic display products page](/assets/images/community/add-instagram-tester.webp) From the pop-up modal on your screen, select "Instagram Tester" from the options provided, type in your Instagram username and click on "Add" at the bottom right of the pop-up modal. ![Pop-up modal to add instagram user as tester](/assets/images/community/add-instagram-tester-account.webp) An invite would be sent to your Instagram account. To activate it, log into your Instagram account, open "Settings", click on "Apps and Websites", then click on "Tester Invites". Proceed to click the "Accept" button to activate the Instagram tester account. ![Instagram tester invites page](/assets/images/community/accept-insagram-tester-invite.webp) Now that you've activated your Instagram tester account, you can now generate a user access token. From the left side-menu, click on "Basic Display" from the "Products" section in the left side-menu, scroll down to the "User Token Generator" section and click on "Generate Token" for the Instagram tester account you would like to use. ![Instagram Basic Display User token generator page](/assets/images/community/generate-instagram-access-token.webp) You'll be prompted to log in to your Instagram account again, log in and select "Allow" when prompted to do so. A token will be generated for you. Copy the token to your clipboard and store it somewhere as you will need it to set up the Instagram app. ![Pop-up modal to copy Instagram Basic Display API token](/assets/images/community/instagram-access-token.webp) For more information on how to use the Instagram Basic Display API, read their docs [here](https://developers.facebook.com/docs/instagram-basic-display-api/overview). ### Configuring your App First, install the Screenly [CLI](https://developer.screenly.io/cli/?_gl=1*1uemz7p*_gcl_au*MTA4NjgwNDc1OS4xNjk0OTc4ODYy#command-line-interface-cli). Then proceed to clone or download the [Playground](https://github.com/Screenly/playground) repository. ```bash cd edge-apps/instagram screenly edge-app create --name Instagram --in-place screenly edge-app upload ``` With the App uploaded, it's time to configure it. This is where we need to use the token generated from the steps earlier in this article. To set the token, we again use the CLI. The Instagram token is a "setting", so we'll be setting the secret: ```bash screenly edge-app secret set instagram_api_token="<MY_META_TOKEN>" ``` When you are done, it's time to promote this App. We promote the revision so that we can schedule it in the web interface: ```bash screenly edge-app version promote --latest ``` You should now have an asset named "Instagram (stable)" in your web console. ### Setting up your digital sign with Screenly To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). After logging in to your Screenly account, click the "Playlist" tab from the left side-menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Instagram app to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Instagram app content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Instagram content to a playlist](/assets/images/community/add-instagram-edge-app-to-playlist.webp) You will then see your Instagram app in the playlist's content section. Next to the content listing, change the duration to the amount of time you want the app to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Instagram content in the playlist](/assets/images/community/set-instagram-edge-app-duration.webp) To assign the playlist containing the Instagram app content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Instagram app content to your screen(s) or group(s) of screens, your digital signage content will display on your digital sign in just minutes. ### Getting started with Screenly If you do not have a Screenly account already, you can get started with a [-day free trial account](https://login.screenlyapp.com/sign-up?_gl=1*pn323f*_gcl_au*MTA4NjgwNDc1OS4xNjk0OTc4ODYy&_ga=2.179240996.166833758.1697885267-1002574798.1686923222). We do not require a credit card for a trial account. Take a look inside, add the Instagram app, and set up your first screen with a digital signage player. If you have any trouble getting your Instagram posts to display on your screen, contact [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_gl=1*pn323f*_gcl_au*MTA4NjgwNDc1OS4xNjk0OTc4ODYy&_ga=2.179240996.166833758.1697885267-1002574798.1686923222) at any time. We are always happy to help! --- # Displaying Shopify dashboards on your Screenly digital signs Source: https://www.screenly.io/community/display-shopify-dashboards/ > Shopify is an e-commerce platform that allows people to easily create ![Shopify analytics page.](/assets/images/community/shopify-analytics-page.webp) [Shopify](https://www.shopify.com/ng) provides a range of tools to help users build their store, manage inventory, process payments, and handle shipping. With Shopify, users can set up their store with no coding skills required and can customize their storefront to match their brand. Additionally, Shopify offers various integrations and apps to enhance the functionality of the store. Shopify provides built-in dashboards in the "Analytics" section of a Shopify store that displays various data from the user's store such as total sales, returning customer rate, average order value etc. With the help of Screenly, this dashboard can be displayed on a screen. ### Adding your dashboards to Screenly To display your Shopify dashboards on a digital sign with Screenly, you'll be needing the URL to the dashboard you would like to display. To get this URL, login to your Shopify store and click on "Analytics" from the left side-menu. ![Open Shopify analytics.](/assets/images/community/shopify-open-shopify-analytics.webp) From the analytics page, click on the particular dashboard you would like to display and copy the URL from your address bar. Once you have your dashboard URLs ready, we can tackle the next piece: authentication. Shopify blocks computers from accessing a user's dashboard via URL without logging in, so Screenly has made it easy by creating a ready-to-use Javascript snippet on the Screenly playground. Modifying this script with your Shopify email and password allows you to log in to your Shopify store and view your dashboard on a digital sign, using Screenly's [Javascript Injection](/blog/2022/04/25/screenly-developer-digital-signage/) feature. Armed with the URLs to your dashboards, we can now add your dashboards to Screenly. The recommended way to work with our JavaScript Injector is to use Screenly's Command Line Interface, so visit our [CLI repository](https://github.com/Screenly/cli/) for more information on how to work with the CLI. To add your Shopify dashboard to Screenly, simply add your dashboards as a new URL by running the following command on our CLI: ```bash $ screenly asset add "<http://path-to-shopify-dashboard>" Shopify +----------------------------+-------------+------+--------+ | Id | Title | Type | Status | +----------------------------+-------------+------+--------+ | XXXXXXXXXXXXXXXXXXXXXXXXXX | Shopify | N/A | none | +----------------------------+-------------+------+--------+ ``` After adding the asset to your Screenly account, it is important to store the Asset ID, as it will be referenced later. You can store the Asset ID for later by running the following command. ```bash $ export ASSET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX ``` With our asset created, we can now apply the JavaScript Injection for Shopify authentication. Proceed to download [shopify-sign-in-via-credentials.js](https://github.com/Screenly/Playground/tree/master/javascript-injectors/examples/shopify-signin-via-credentials.js) from Screenly's playground and modify it with your credentials. Run the following command to add the JavaScript to the Shopify dashboard. ```bash $ screenly asset inject-js "$ASSET_ID" /path/to/script.js 20XX-XX-XXTXX:XX:XX.XXXZ INFO [screenly] Asset updated successfully. ``` After running the above command, your Shopify dashboard should display correctly on your screen instead of the Shopify login page. ### We are here to help For more information on how to make use of our CLI, visit the repository for our [CLI](https://github.com/Screenly/cli) on github. To learn more about our javascript injector feature, you can also visit [Screenly's playground](https://github.com/Screenly/playground/tree/master/javascript-injectors/) on github. If you have any trouble integrating Shopify with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Displaying Zabbix dashboards on a digital sign with Screenly Source: https://www.screenly.io/community/display-zabbix-dashboards/ > Zabbix is an open source monitoring software for networks, operating [Zabbix](https://www.zabbix.com/) is used in everything from Network Operations Center (NOC) to companies of all sizes to monitor their infrastructure. Frequently, Zabbix is used on wall-mounted monitors to show real-time data. This does however require some sort of dedicated hardware to drive these monitors. This is often one or multiple desktop PCs or similar. These PCs are both expensive to purchase and to maintain. With Screenly, all you need is a single Raspberry Pi per screen. We handle everything for the device, from software to security updates, so you can concentrate on more important tasks. ### Getting your Zabbix dashboard URL To display your Zabbix dashboards on a digital sign with Screenly, you'll need the URL to the dashboard you would like to display. To get this URL, log in to your Zabbix front-end and click on "Dashboards" from the left side-menu and open the dashboard you would like to display on your digital sign. ![Zabbix account page with left-side menu open](/assets/images/community/open-zabbix-dashboards.webp) After opening the dashboard you would like to display, copy the dashboard URL from your browser's address bar, then log out of your Zabbix frontend. Now, proceed to open a new browser window, paste the dashboard URL you copied into your browser's address bar and press the "Enter" key on your keyboard. You should see a pop-up message as seen in the screenshot below. Click on the "Login" button on your screen. ![Zabbix login consent pop-up modal](/assets/images/community/click-zabbix-login-button.webp) After clicking on the "Login" button from the pop-up message, you should see a traditional login form with "Username" and "Password" input fields as seen in the screenshot below. Now proceed to copy the URL in your browser's address bar and store it somewhere, as this is what you'll use to add the Zabbix dashboard as content to your Screenly account. ![Zabbix login page](/assets/images/community/zabbix-login-page.webp) ### Adding your Zabbix dashboards to Screenly To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the Zabbix dashboard URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Zabbix dashboard URL as a new content item.](/assets/images/community/input-zabbix-dashboard-url.webp) Edit the Zabbix content title by clicking on the input field below the "Title" on your screen. Be sure to click the "Save" button on the bottom right. In this case, I've named the Zabbix content as "Zabbix dashboard" for easy identification. You can find the Asset ID for the Zabbix content at the end of the URL in your browser's address bar. Copy and store this Asset ID for later. ![The Zabbix content page](/assets/images/community/edit-zabbix-content-title.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. Create a new playlist by clicking the "+ New Playlist" button on the top right of the new screen that loads. To edit a playlist, click on its name from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Zabbix dashboard URL to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Zabbix dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Zabbix dashboard content to a playlist](/assets/images/community/add-zabbix-content-to-playlist.webp) You will then see your Zabbix dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the amount of time you want the dashboard to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Zabbix dashboard content in the playlist](/assets/images/community/set-duration-for-zabbix-content.webp) To assign the playlist containing the Zabbix dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Zabbix dashboard content to your screen(s) or group(s) of screens, you will see the Zabbix login form on your TV or monitor in just minutes. ### Zabbix dashboard authentication on your digital sign Now that you've added your Zabbix content URL to your Screenly account, we can tackle the next piece: authentication. Zabbix blocks computers from accessing a user's dashboard via URL without logging in, so Screenly has made it easy by creating a ready-to-use Javascript snippet on the Screenly playground. Modifying this script with your Zabbix username and password allows you to log in to your Zabbix front-end and view your dashboard on a digital sign, using Screenly's [Javascript Injection](/blog/2022/04/25/screenly-developer-digital-signage/) feature. The recommended way to work with our JavaScript Injector is to use Screenly's Command Line Interface. Visit our [CLI repository](https://github.com/Screenly/cli/) for more information on how to work with the CLI. You'll need the Asset ID for the Zabbix content which you should have gotten after adding the Zabbix content to your Screenly account earlier in this article. If you don't have the asset ID, open the Zabbix content page in your Screenly account user interface. You can find the Asset ID at the end of the added URL in your browser's address bar. Store the Asset ID in your CLI by running the following command. ```bash $ export ASSET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX ``` With our asset ID stored, we can now apply the JavaScript Injection for Zabbix authentication. Proceed to download [zabbix-login-via-credentials.js](https://github.com/Screenly/Playground/blob/master/javascript-injectors/examples/zabbix-login-via-credentials.js) from Screenly's playground and modify it with your credentials. Run the following command to add the JavaScript to the Zabbix dashboard. ```bash $ screenly asset inject-js "$ASSET_ID" /path/to/script.js 20XX-XX-XXTXX:XX:XX.XXXZ INFO [screenly] Asset updated successfully. ``` After running the above command, your Zabbix dashboard should display correctly on your screen instead of the Zabbix login page. ### We are here to help For more information on how to make use of our CLI, visit the repository for our [CLI](https://github.com/Screenly/cli) on github. To learn more about our javascript injector feature, you can also visit [Screenly's playground](https://github.com/Screenly/playground/tree/master/javascript-injectors/) on github. If you have any trouble integrating Shopify with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Flash Screenly onto NEC monitors with the Raspberry Pi Compute Module Source: https://www.screenly.io/community/flash-screenly-onto-nec-monitors/ > Learn how to set up Screenly on NEC monitors with the Raspberry Pi Compute ![Setup NEC screens with Screenly.](/assets/images/community/nec-1.webp) NEC provides beautiful, commercial grade digital sign displays, many of which integrate directly with a custom Raspberry Pi Compute Module. In this article, we list the necessary steps for setting up your NEC display and integrated Raspberry Pi Compute Module to run Screenly. Before we get started, you will need a few things: * An NEC monitor with the Raspberry Pi Compute Module add-on. * The NEC remote control (it is possible to do with the buttons on the monitor, but we do not recommend this as it is very tedious). * An "A-Male to B-Male" USB cable. This should come in the box with your NEC monitor. If you do not have one, you can find one on Amazon for $5. * A computer (macOS, Linux or Windows) with Etcher installed * You could use other software too, but Etcher simplifies the process a fair bit * The Screenly disk image for CM3. You download this disk image from within your account using the web interface. Simply navigate to Screen then Add Screen to find this disk image. The one you need is called “CM3,” which stands for Compute Module 3. Once you have the above things ready we can get started. ## Connecting the hardware * Make sure your Raspberry Pi is physically installed along with the NEC Compute Module Interface into the display. If you are yet to do this, you can find detailed instructions in the NEC Raspberry Pi Compute Module Setup Guide. * Next, you will need to connect your computer to the NEC display via USB in order to properly program the Raspberry Pi. Make sure to connect the host PC to the correct port on the monitor. It should be the USB type B connector (see Fig 1) located on the right side of the monitor. There is only one USB type B port on the monitor, so you should not be able to put it in the wrong port. <b>Please note that you should connect your the USB cable directly into your computer, and not use a USB hub or extender as that can cause issue.</b> ## Prepare the monitor Before we get started, we first need to connect the monitor to both power as well as Ethernet (required for Screenly). Once you have done this, the next step is to set the Raspberry Pi Compute Module in USB Boot Mode to allow us to write to it. To do that, follow these steps: * Press the Menu button on the remote control to bring up the On Screen Display (OSD) menu * Navigate to INPUT and select COMPUTE MODULE to bring up the Raspberry Pi as the active input source ![Setup NEC screens with Screenly.](/assets/images/community/nec-2.webp) * Navigate to C MODULE * Select POWER, then select POWER SUPPLY and set to OFF, and select AUTO POWER ON and set to DISABLE. ![Setup NEC screens with Screenly.](/assets/images/community/nec-3.webp) * Go back to the SERVICE MENU * If the SETTING LOCK is ON, you need to first disable it to reach the USB BOOT MODE. The default code is 0 0 0 0. * Navigate down to USB BOOT MODE and set it to ENABLE ![Setup NEC screens with Screenly.](/assets/images/community/nec-4.webp) * Go back to POWER and set POWER SUPPLY to ON ![Setup NEC screens with Screenly.](/assets/images/community/nec-5.webp) * Now leave this up on the screen while we prepare the PC. ## Prepare the PC and start the flashing procedure It is now time to prepare your computer for the flashing. It is assumed that you already have downloaded the disk image above, and have installed the latest version of Etcher. It is important to stress that you must use the latest version, as it will both speed up the flashing procedure, as well as remove the requirement to install "usbboot." Another benefit with using Etcher over other tools is that it verifies the result after the flashing to ensure that nothing went wrong in the process. <b>It is also worth noting that you should not extract the zip file that the Screenly disk image comes with. Etcher will take care of that automatically.</b> * Launch Etcher * Select the Screenly disk image that you downloaded before * Once the device has been initialized, you should see something similar to this: ![Setup NEC screens with Screenly.](/assets/images/community/nec-6.webp) * Select the device, press Continue and finally "Flash!" * Now sit back while you wait for the flashing to finish ![Setup NEC screens with Screenly.](/assets/images/community/nec-7.webp) ***(The observant viewers will be quick to spot that the screenshots above uses a 4GB Compute Module rather than the 16GB from NEC, but the process is identical.)*** Assuming you did not get any error reported from Etcher, you are can now proceed to the next step. ## Restoring the Compute Module to normal configuration The last step is to disable the USB Boot mode. Follow these simple steps: * Press the Menu button on the remote control to bring up the On Screen Display (OSD) menu * Navigate to C MODULE * Select POWER and select OFF * Go back to the SERVICE MENU * Navigate down to USB BOOT MODE and set it to DISABLE * Go back to POWER and set POWER SUPPLY to ON * The Raspberry Pi should now again spring to life and within a few seconds you should see the Screenly logo on the screen. Note: In some instances, you may find that the USB Boot Mode is already disabled, and the power supply is already set to On. In this case, turn the power supply to off, then turn it back on again to proceed. That should be it. Once the device is done with the initial initialization, you should see the PIN code on the screen, which will allow you to pair the screen with your Screenly account. ## Recommended configurations It is recommended that you also make the following changes to your NEC monitor. * Enable the Shutdown Signal: ![Setup NEC screens with Screenly.](/assets/images/community/nec-8.webp) * Enable Auto Power On: ![Setup NEC screens with Screenly.](/assets/images/community/nec-9.webp) ## Custom network configuration for Screenly By default, Screenly is configured to use Ethernet and DHCP configured. If you instead need to use a static IP, you need to use our network configuration wizard, which is available at [wizard.screenly.io](https://wizard.screenly.io/). The process is very simple. You populate your settings in the wizard and then configure the Screenly Player using a USB stick. Now, this is where it gets a bit trickier with the NEC monitors. As you may have noticed, the NEC monitor has no less than five USB ports on the side (including the Type B connector). However, only two of these are passed on to the Raspberry Pi (the two just above the LAN ports). As such, you need to insert the USB stick in one of those two ports in order for the device to pick up the network configuration. (Note: Out of the two USB ports, the port on the top can support devices that draw more power). ## Can I use WiFi with my NEC monitor? Generally speaking, we always discourage our users from using WIFi whenever possible. In some cases however, that is the only option. Since there is no built-in WiFi in the NEC monitor, the only way to do this to use a USB WiFi dongle. We recommend that if you need to use WiFi that you use the [official Raspberry Pi USB WiFi Dongle](https://www.raspberrypi.org/products/raspberry-pi-usb-wifi-dongle/). These seem to be very difficult to get a hold of, so the part that we tested and confirmed with (a Panda Wireless Adapter - Model PAU06) can be found on Amazon [here](https://www.amazon.com/Panda-Wireless-PAU06-300Mbps-Adapter/dp/B00JDVRCI0/ref=sr_1_1_sspa?keywords=Panda+PAU06&qid=1580401818&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExMlRWQVZETTRaNVVPJmVuY3J5cHRlZElkPUEwOTA3NDIzWEhGRjdGQlhJUElEJmVuY3J5cHRlZEFkSWQ9QTA1Nzg0NjcxMTlLOE5SMTJVWlZSJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==). In order to use WiFi, you need to configure the networking similarly to the section above using the network wizard. Using the tool, you can configure the SSID and passphrase and then attach this USB to the bottom port. Once the screen reboots and comes back up, you can then connect the WiFi USB dongle to the top port. For configuring the network file for use with an adapter, please see the guide [here](https://support.screenly.io/hc/en-us/articles/360044464873-Can-I-use-a-USB-WiFi-adapter-). ## Troubleshooting ### "Missing drivers" on Windows ![Setup NEC screens with Screenly.](/assets/images/community/nec-10.webp) If you are trying to flash your NEC monitor from Windows and get the following message, this means that you need to install the Raspberry Pi driver. You can do this by simply downloading the drivers from [here](https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe). Once you have installed the driver, close Etcher and follow the steps in "Prepare the PC and start the flashing procedure" again. ## Fig 1: USB Type-B connector ![Setup NEC screens with Screenly.](/assets/images/community/nec-11.webp) [Reference materials.](http://www.support.nec-display.com/dl_service/data/manual/raspberrypi/190307/NEC_Raspberry_Pi_Compute_Module_Setup_Guide.pdf ) --- # Get Screenly notifications inside Slack Source: https://www.screenly.io/community/screenly-notifications-in-slack/ > Get notifications from Screenly directly in your Slack channels. Slack is one of the most popular messaging apps for businesses. When they are connected, employees can better coordinate workflows, discuss projects, and drive business growth. That's why we wanted to bring Screenly directly inside of [Slack](https://slack.com/). Learn more about integrating Slack with Screenly in our tutorial below. ## Setting up your Slack and Screenly integration The first step is to [log in](https://login.screenlyapp.com/login) to your online Screenly account. If you do not have a Screenly account, you can get started right now for free with a [-day free trial](https://login.screenlyapp.com/sign-up). ![The Slack integrations page on the Screenly interface.](/assets/images/community/slack-integrations.webp) Next, click the "Settings" tab in the left-hand menu. Then, click the "Integrations" tab in the submenu. In the new area that loads to the right, find the Slack integration and click the "Connect" button. ![The Slack connection modal on the Screenly interface.](/assets/images/community/slack-connect.webp) In the popup modal that loads, click the "Connect" button and authenticate your Slack account. ![The Slack notifications page on the Screenly interface.](/assets/images/community/slack-notifications.webp) Next, in you Screenly account, click the "Notifications" tab in the submenu of your Settings page. Then, click the Slack icon. ![The Slack configuration modal on the Screenly interface.](/assets/images/community/slack-configuration.webp) In the new popup modal, select the Slack channel you wish to connect to and the type of notifications you wish to share. To finish, click the "Create" button on the bottom right of the popup modal ## Let us know if you have any questions That's it! If you have any questions, reach out to [Screenly Support](https://support.screenly.io/hc/en-us) anytime. We are always happy to help troubleshoot or advise on advance use cases. Now that our Slack integration is live, we are working on integrating with similar messaging apps, such as Microsoft Teams. If there is a messaging app that your business wants to use with Screenly, just give us a heads up! --- # How to build a security camera display with the Raspberry Pi Source: https://www.screenly.io/community/build-a-raspberry-pi-security-camera-display/ > Below you can find a guide on how to build a security camera display ![A security camera that displays footage on a security camera display.](/assets/images/community/security-camera-display.webp) A picture is worth a thousand words, and a video is worth a thousand pictures. For many businesses and organizations, video security cameras are a must-have item. A video security system can provide businesses with a source of truth for what happened during a particular event. This footage can be useful for determining who is responsible for broken equipment, arbitrating workplace disputes, and prosecuting theft. However, people can also use surveillance cameras to proactively prevent incidents from happening in the first place. Business owners can prevent incidents in this way with the help of a CCTV monitor that displays live surveillance video footage to customers and employees. When people know that someone is watching them, their behavior changes. For example, when an employee knows that someone is watching them, they are more careful with company equipment. When customers know that someone is watching them, they are less likely to shoplift. For maximum effectiveness, business owners must place security camera displays in clearly visible locations around their stores. This way, everyone knows that video surveillance is underway. Placing multiple security camera displays around a store can quickly become an expensive undertaking. Each setup needs a display screen and a device that renders the live image to the monitor screen. While many businesses use a standard PC to render the footage on a security camera monitor, this is not an optimal solution. A very basic PC can easily cost over US $250. With multiple display screens needed for each store, many businesses simply cannot afford the cost of those setups. However, business owners can dramatically cut the costs associated with security camera displays. Business owners can cut costs by using a Raspberry Pi mini-computer instead of a standard PC unit to display live footage on a security camera monitor. ## Setting up surveillance footage streaming Most surveillance camera systems use Real Time Streaming Protocol (RTSP) to communicate with streaming media players like the Raspberry Pi. Business owners can use this protocol to display video output from their security systems to a CCTV security monitor. To display live security footage on your security camera display, you first need the RTSP link pathway for your particular security camera’s make and model. Finding the RTSP link pathway for your surveillance camera can sometimes be a bit of a challenge. If you are having trouble finding that information, check out [iSpyConnect’s database of URLs](https://www.ispyconnect.com/sources.aspx) for a wide variety of surveillance cameras. Next, you will need software for your Raspberry Pi to process the video stream and project it to a security camera display. One software option for this task is Screenly's free open source software [Anthias](/ose/) (formerly known as Screenly OSE). To use Anthias, you will need a basic technical background. For a comprehensive guide on flashing Screenly onto your Raspberry Pi's microSD card, check out our step-by-step [video](https://www.youtube.com/watch?v=RE_C_n6dhyo). Once you find the RTSP URL for your security camera, you can simply enter it as URL content using the Anthias interface. Note that you must pair each CCTV security monitor with its own Raspberry Pi device. You can find more details on how to pair your Raspberry Pi media player and security camera display on this [Anthias video guide](https://www.youtube.com/watch?v=FQte5yP0azE). ## High-resolution images for your security camera display It is important to note that decreasing hardware costs for your security system does not force your business to sacrifice security camera display resolution. With Anthias, a Raspberry Pi can display video footage at full HD 1080p resolution. The Raspberry Pi can display this high-resolution video to an LCD security monitor or any other type of display that accepts video input via HDMI. If you already have a display that you would like to use that does not accept HDMI video input, you can purchase a variety of HDMI adapters. While the Raspberry Pi is a cheaper device for your CCTV security monitor setup than a standard PC, the Raspberry Pi is still a high performing piece of software that is more than capable of serving your needs. ## How to make a Raspberry Pi security camera After you set up your CCTV security monitors with Raspberry Pi media players, you may also want to build a security camera entirely from a Raspberry Pi computer board and Raspberry Pi accessories. You can do that with add-on cameras that are made specifically for the Raspberry Pi. There is the [Raspberry Pi Camera Module V2](https://www.raspberrypi.org/products/camera-module-v2/) that features a Sony IMX219 8-megapixel sensor. This camera can capture HD video and works with all Raspberry Pi models. Another type of camera add-on offered by the [Raspberry Pi Foundation](https://www.raspberrypi.org/) is the [Pi NoIR Camera V2](https://www.raspberrypi.org/products/pi-noir-camera-v2/). This camera is the same as the Camera Module V2 except for the fact that the Pi NoIR Camera V2 does not have an infrared filter. “NoIR” stands for “no infrared.” Without an infrared filter, the Pi NoIR Camera V2 can provide users with a form of night vision. This night vision capability is particularly useful for evening or nighttime surveillance footage. Once you have a Raspberry Pi camera, you can install motion detection software onto your Raspberry Pi. This software is useful as it allows the Raspberry Pi to capture video footage only when there is motion in the scene. This feature enables users to minimize unnecessary storage of video where nothing is happening. Note that you will need a Raspberry Pi for your camera add-on that is separate from the Raspberry Pi that you will use as a media player for your security camera monitor. For the Raspberry Pi that you will connect to your camera add-on, you can use the open source software [Motion](http://www.lavrsen.dk/foswiki/bin/view/Motion) for motion detection. When your Raspberry Pi camera and motion detection software are set up, you can access a live stream of the video footage at your Raspberry Pi’s local IP and the associated port for the camera’s captured footage. To access the live stream from anywhere, you must set up dynamic domain services with the local network associated with your Raspberry Pi. Check out [Oracle's DYN.com](https://www.dyn.com) for more information on how to set up dynamic domain services with your local network and router. For more detail on setting up a Raspberry Pi surveillance camera, check out this [useful guide on Instructable.com](https://www.instructables.com/id/Raspberry-Pi-as-low-cost-HD-surveillance-camera/). ## Commercial security cameras for a Raspberry Pi security camera display Before going through the bother of building your own Raspberry Pi surveillance camera(s), be sure to check out the costs of commercial grade security cameras online. Security cameras have become relatively inexpensive in recent years. Depending on your needs, an off-the-shelf security camera may be [less costly than a DIY Raspberry Pi solution](/blog/2018/12/07/diy-digital-signage-issues/). One great option for a security camera is [Ubiquiti Networks' UniFi G3 video camera](https://www.ubnt.com/unifi-video/unifi-video-camera-g3/). This video surveillance camera costs US $149. It captures 1080p HD video in both daytime and nighttime scenes. You can also purchase a IR Range Extender for this camera that extends the camera's night vision range to approximately 25 meters. Another great supplier for commercial video security cameras is [Axis Communications](https://www.axis.com/). Axis offers standard [box video surveillance cameras](https://www.axis.com/en-us/products/fixed-box-cameras) as well as a range of [fixed dome security cameras](https://www.axis.com/en-us/products/fixed-dome-cameras). Axis also offers [panoramic security cameras](https://www.axis.com/products/panoramic-cameras) for 360° and 180° surveillance. You can purchase Axis surveillance cameras from any [regional Axis reseller](https://www.axis.com/en-us/where-to-buy). ## Getting started with a Raspberry Pi security camera display We hope that this page has been informative and helpful. To get started with your Raspberry Pi security camera display, you will first need to purchase a Raspberry Pi media player and all necessary accessories. You can easily purchase your Raspberry Pi and needed accessories from our [network of distributors](/distributors/). Next, you will need to get started with Anthias software. You can download the most recent disk image for [Anthias on GitHub](https://github.com/Screenly/anthias). That's it! You should now be able to setup a Raspberry Pi security camera display. If you have any questions, you can find support for Anthias topics [linked here](https://github.com/Screenly/Anthias/discussions). Options include posting questions on GitHub or on listed Anthias forums. --- # How to make a Raspberry Pi video wall Source: https://www.screenly.io/community/build-a-raspberry-pi-video-wall/ > Below we show you how to build a Raspberry Pi video wall with Screenly ![An image showing video wall controlled by a Raspberry Pi device.](/assets/images/community/raspberrypi-raspberry-pi-video-wall.webp) The Raspberry Pi is arguably the best Linux minicomputer on the market, and it is useful for a variety of applications. One of these applications for a Raspberry Pi is using the device to support a Raspberry Pi video wall. A video wall displays - you guessed it - video content for [commercial promotion and advertising](/blog/2018/12/17/in-store-advertising/), [personal DIY projects](/blog/2018/10/04/diy-digital-signage/), [educational purposes](/blog/2018/08/23/library-digital-signage/), and more. Below we detail how you and your team can use this device for your video wall needs. ### Why is the Raspberry Pi an excellent solution for a video wall? There are a couple of reasons that the Raspberry Pi computer-on-a-chip is a great device for a video wall. One source of savings is the Raspberry Pi’s low power draw. The device only draws 3 watts of electricity. This number is quite impressive considering the Raspberry Pi can display full 1080p HD content. This low energy draw makes the electricity costs of a Raspberry Pi video wall deployment very low. This low cost can result in [thousands of dollars in savings](/blog/2018/10/24/going-green-digital-signage/) when compared to the electricity costs of other media players. Another important feature of the Raspberry Pi is the availability of digital signage management software. After setting up your Raspberry Pi video wall displays, you will need to manage your video content. Management tasks include uploading and storing video assets, organizing videos into playlists, and scheduling video content. Fortunately, there are useful [open source](/ose) and [professional, paid software solutions](/pricing) to assist with digital sign content management. Professional digital signage software is useful for video wall deployments with multiple screens. The software is helpful as it allows users to change video content directly from their computer. With this software, users do not have to physically access their Raspberry Pi and video wall for each content change. ### How can I get started with a Raspberry Pi video wall? To get started with your Raspberry Pi video wall, you will need both hardware and software. For hardware, we recommend the Raspberry Pi 3 Model B+. While you can use other models, the Model B+ will provide optimal performance for your video display. Next, you will need an official Raspberry Pi power source. This proper power supply will ensure you do not run into [several common issues associated with the minicomputer](/blog/2018/11/22/raspberry-pi-troubleshooting/). You will also need an HDMI cable to connect your Raspberry Pi media player to your display. Additionally, you will need a microSD card to store the required video wall software for your Raspberry Pi and your video wall content. The [Screenly Box 0](/digital-signage-players/) comes with all needed Raspberry Pi components bundled together. We designed the Screenly Box 0 for customers who are just getting started with their Raspberry Pi video wall deployment. While you can connect to WiFi with most Raspberry Pis, we recommend you connect to the internet via ethernet cable. Connecting via ethernet will help you avoid any wireless connectivity issues. If you do not already have an ethernet cable, be sure to purchase one separately. The Screenly Box 0 does not include an ethernet cable. For software, you can use free digital signage management software such as [Anthias](/ose/) (formerly known as Screenly OSE). You can also use a paid, professional software solution such as [Screenly's paid version](/pricing/) (referred to simply as "Screenly"). As mentioned, Screenly has a variety of useful features that users will not find in Anthias. These features include the ability to manage the content of multiple screens from a central interface. Learn more about the differences between Anthias and Screenly in our article on [Screenly vs. Anthias](/screenly-ose-vs-pro/). ### I want my video wall to display the same video and fragment it across multiple screens. How do I do that with the Raspberry Pi? Users may want to make a larger display by splitting the same video across multiple screens. This requirement is more challenging than showing a video on a single screen. However, users can still fulfill this requirement with the Raspberry Pi. To create a 2x2 video wall with 1080p HD resolution, a user will need to purchase a video wall controller. A video wall controller accepts video input from a Raspberry Pi and then splits the video as output to a multiple screens. There are several video wall controllers on the market. While we do not officially endorse any third party product, we have run successful tests with this [video wall controller from RIJER](https://www.amazon.com/Controller-Processor-Supports-Degree-Splicing/dp/B07Q14LXWT/). Note that the video wall controller does get a bit hot with continued use. ### Going forward with a Raspberry Pi video wall We hope this article has provided a useful overview of how to deploy a video wall with the Raspberry Pi. Whether your business needs a video wall with a single screen or a video wall that displays a single video that is split across multiple screens, the Raspberry Pi can handle your needs. If you have any questions on how Screenly can be used in your deployment, [reach out to Screenly support](https://support.screenly.io/hc/en-us/requests/new). ### Get started Ready to give Screenly a shot? <a id="sign-up" href="https://login.screenlyapp.com/login" >Sign up for Screenly</a>. --- # How to use PagerDuty with Screenly digital signs Source: https://www.screenly.io/community/pagerduty-alerts-for-screens/ > PagerDuty allows teams to set custom alerts for their digital signs. Digital signs are meant to be seen. This reality means that when screens have issues and display incorrect content, error messages, or not content at all, these mistakes are highly visible to customers and employees. The teams that run a company’s digital signs need to quickly identify screens that require troubleshooting so that they can address the problem as quickly as possible. With PagerDuty, teams can more easily delegate around-the-clock monitoring and alerts among employees. In the post below, we cover how users can setup PagerDuty to work with their Screenly digital signs and online Screenly account. ## Setting up PagerDuty for Screenly ### Using the OAuth Integration The simplest way to set up PagerDuty with Screenly is by using OAuth. Go to the Settings tab in your Screenly account and follow these steps to set up PagerDuty using the OAuth. Click on the “Integrations” tab from the left-hand menu. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-integration.webp) Find the PagerDuty. On the right side, click the “Connect” button. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-connect.webp) You will be redirected to the PagerDuty page. On this page, click the “Submit Consent” button to grant the necessary permissions. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-oauth-3.webp) After accepting, you will be redirected back to your Screenly account. Within your Screenly account, go to the “Notifications” section and click on the PagerDuty notification icon. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-notifications.webp) In the modal window that appears, go to the “Services” tab. Here, you can select an existing service or create a new service by filling in the Service name. Select the events you are interested in for notifications, and then click the “Create” button. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-services.webp) That’s it! Your PagerDuty integration using OAuth is now set up. ### Manual Setup The first step is to create a PagerDuty account. Within your PagerDuty account, click the “Services” tab on the header menu. Next, click the blue “+ New Service” button on the top right. ![The PagerDuty Services setup page.](/assets/images/community/pagerduty-1.webp) Enter a name for your service in the “Name” field. You can enter “Screenly” or a custom name of your choice. Then, click the blue “Next” button. ![The PagerDuty Services name page.](/assets/images/community/pagerduty-2.webp) For the “Assign” stage, you can click “Next” with the automatically selected settings. If you have a particular escalation policy that you would like to set, you can do that now. ![The PagerDuty Services Assign page.](/assets/images/community/pagerduty-3.webp) In the following “Reduce Noise” stage, you can also use the automatically selected settings or choose your own. Click the blue “Next” button at the bottom of the screen. In the “integrations” stage, select the “Events API V2” integration. If it is not visible immediately, search for it in the search box. Once you have the integration selected, click the blue “Create Service” button. ![The PagerDuty Services Integrations page.](/assets/images/community/pagerduty-4.webp) In the next screen that loads, copy the integration key on the right side of the screen. Once you have the integration key copied on to your clipboard, [log in](https://login.screenlyapp.com/sign-up) to your online Screenly account. If you do not have a Screenly Account, you can register for a [-day free trial](https://login.screenlyapp.com/sign-up). ![The PagerDuty Integrations page with the Integration Key featured.](/assets/images/community/pagerduty-5a.webp) Within your Screenly account, click the “Settings” tab from the left-hand menu. In the new page that loads, click the “Notifications” tab. Then, click on the PagerDuty icon. ![The Screenly interface with the PagerDuty integration.](/assets/images/community/pagerduty-notifications.webp) In the popup modal that loads, paste the integration key that you have copied to your clipboard. You can then select the cases where you want to receive notifications via PagerDuty. You can receive notifications for when your screens go offline and when your screens come back online. Once you have made your selection, click the purple “Create” button on the bottom right of the popup modal. ![The Screenly interface with the PagerDuty integration setup menu](/assets/images/community/pagerduty-integration-key.webp) That’s it! If you have any questions, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new) anytime. We are always happy to help. --- # Integrating Akkio with Screenly Source: https://www.screenly.io/community/display-akkio-predictions/ > Akkio is a software platform that allows users to build custom machine ![An example Airtable view](/assets/images/site/looker-data-dashboard.webp) ### What is Akkio? Using [Akkio](https://www.akkio.com/about), users can upload their own data sets and then use a drag-and-drop interface to build machine learning models that can predict outcomes or classify data. The software uses automated machine learning algorithms to suggest the best models for the user's data, and also allows for customization of the models to fit specific needs. Akkio is designed to be user-friendly and accessible, so that individuals and organizations of all sizes can leverage the power of machine learning in their work without needing a team of data scientists or programmers. The data is not top-of-mind if employees do not view this data regularly and cannot use the data to make informed decisions. Screenly allows users to display data from Akkio on a TV or monitor. By displaying these data on an office TV, businesses can make sure the relevant parties are up-to-date with relevant information. The best way to go about this is by adding data from Akkio to a dashboard/visualization software such as [Google Looker Studio](https://lookerstudio.google.com/) or [Zoho Analytics](https://www.zoho.com/analytics/). With Google Looker Studio or Zoho Analytics, data from Akkio can be used to create analytics dashboards that can be integrated smoothly with Screenly. ### Creating dashboards with Akkio data in Google Looker Studio The first step is to [log in to your Akkio account](https://app.akkio.com/). After logging in to your Akkio account, open the flow dataset you would like to display on the digital sign. At the top-right corner, click on the "Download" button, to download the csv file for the flow dataset. ![An image showing akkio flow dataset with download button at the top-right](/assets/images/community/download-akkio-flow-data.webp) This csv file can be added as a data source in Google Looker Studio. With Google Looker Studio, you can make interactive dashboards with the csv file for your Akkio workflow. This dashboard can then be added as content to your Screenly account and displayed on your TV or monitor with a digital signage player. To add your csv file to Looker, first you have to [sign up for or log in to Google Looker Studio](https://lookerstudio.google.com/?requirelogin=1). After logging in, click on "Create" from the side-menu, then click on "Report" from the sub-menu. ![An image showing looker page with left-side menu and button to create report](/assets/images/community/create-report-in-looker.webp) In the new page, from the "Add data to report" popup modal, scroll down to find the "File Upload" option and click on it. ![An image showing looker page with data sources for creating reports including the File Upload option](/assets/images/community/looker-file-upload.webp) In the pop-up modal, click on the "Click to Upload Files" button, add your csv file from your storage and click the "Add" button at the bottom right. ![An image showing a pop-up modal in looker to upload files for report creating](/assets/images/community/add-file-to-looker.webp) You have now successfully uploaded your Akkio data to Google Looker Studio as a data source. Follow the on-screen instructions to create an interactive dashboard with your data. To learn more about how to integrate your analytics dashboard with Screenly, read our detailed tutorial article on Google Looker Studio. ### Creating dashboards with Akkio data in Zoho Analytics The first step is to [log in to your Akkio account](https://app.akkio.com/). After logging in to your Akkio account, open the flow dataset you would like to display on the digital sign. At the top-right corner, click on the "Download" button, to download the csv file for the flow dataset. ![An image showing akkio flow dataset with download button at the top-right](/assets/images/community/download-akkio-flow-data.webp) This csv file can be added as a data source to a data visualization software such as Zoho analytics. With Zoho analytics, you can make custom analytics dashboards with the csv file for your Akkio workflow. This dashboard can then be added as content to your Screenly account and displayed on your TV or monitor with a digital signage player. To add your csv file to Zoho analytics, first you have to sign up for or log in to Zoho analytics. After logging in, click on "Create" from the side-menu, then click on "New Table/Import Data" from the sub-menu. ![An image showing a Zoho analytics page with left-side menu open and create button](/assets/images/community/create-table-with-import-data-in-zoho.webp) In the "Import Your Data" page, click on the Excel icon with "Files" written underneath. ![An image showing a Zoho analytics page with data sources for creating dashboards including the Files Upload option](/assets/images/community/import-excel-file-to-zoho.webp) In the new page, enter a name for your new table that is about to be created. Under File Type, select "CSV, TSV & Other Text Format". Select "Pasted Data" as the data location. Open the csv file in any text editor, copy it and paste it into the textbox provided, then click the "Next" button. ![An image showing a Zoho analytics page with form for csv file upload options](/assets/images/community/paste-csv-data-to-zoho.webp) In the final "Import" page, adjust the table settings as you like, then click on the "Create" button at the bottom of the page. This will create a table in your Zoho analytics account using the data from the csv file. ![An image showing a Zoho analytics page with form for csv file upload options and create button at the bottom](/assets/images/community/create-table-in-zoho.webp) To create an analytics dashboard from the table in Zoho analytics, click on "Create" from the side-menu, then click on "Chart View" from the sub-menu. Follow the on-screen prompts to create a dashboard. This dashboard can then be integrated with your Screenly account. ![An image showing a Zoho analytics page with left-side menu open and create new dashboard submenu](/assets/images/community/create-zoho-chart-view.webp) To learn more about how to integrate your analytics dashboard with Screenly, read our tutorial article on Zoho analytics. ### We are here to help If you have any trouble integrating Akkio with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Integrating Cyfe dashboards with Screenly's digital signs Source: https://www.screenly.io/community/display-cyfe-dashboards/ > Cyfe is a comprehensive business dashboard software that consolidates ![An example Cyfe dashboard](/assets/images/community/cyfe-dashboard.webp) [Cyfe](https://www.cyfe.com/) is a tool that helps businesses gather and analyze important data from various sources, such as social media, website traffic, sales, and more. It allows you to create custom dashboards that display all the key information you need to monitor your business performance in one place. With Cyfe, you can run metrics tracking, generate reports, and make informed decisions based on the data you collect. It simplifies the process of data analysis and helps businesses stay organized and focused on their goals. Learn how to display dashboards from your Cyfe account on a digital sign with [Screenly](/). Follow our step-by-step instructions below. ### Configure Cyfe with Screenly To show a Cyfe dashboard on a digital sign, you will first need to generate a share link for your dashboard. To do so, first [log in to your Cyfe account](https://www.cyfe.com/login/). From the left-hand menu, click on the "dashboard icon". Then open the dashboard you would like to display on your digital sign. ![An example Cyfe dashboard with left side-menu open](/assets/images/community/open-cyfe-dashboards.webp) From the toolbar at the top of the dashboard, click on the "Share icon". ![An example Cyfe dashboard with tool-bar containing share button at the top](/assets/images/community/share-cyfe-dashboard.webp) After clicking on the share icon, a pop-up modal will appear. Click on the "Create New Link" button. You have the option of creating a read-only share link with or without password protection. Creating a password-protected share link means you would have to make use of our [javascript injector for cyfe authentication](https://github.com/Screenly/Playground/tree/master/javascript-injectors/examples/cyfe-sign-in-via-credentials.js) to open the dashboard on your Screenly digital sign. For more information on how to work with javascript injectors, visit the javascript injectors' section on [Screenly's playground](https://github.com/Screenly/Playground/tree/master/javascript-injectors). ![Pop-up modal in cyfe containing create new link button](/assets/images/community/create-new-cyfe-dashboard-link.webp) Proceed to input a name for the recipient of the share link and an optional password in the space provided, then click on the "Create URL" button. In this case, the recipient of the share link is "Home Screenly Player". ![Pop-up modal in cyfe with input fields for dashboard share link details](/assets/images/community/input-cyfe-link-details.webp) The share link will be generated in the pop-up modal. Make sure to copy this link as you will use it to add the dashboard as content to your Screenly account. ![Pop-up modal in cyfe showing dashboard share URL](/assets/images/community/cyfe-dashboard-link.webp) ### Setting up your digital sign Now that you have your public URL, the next step is setting up your digital sign. To set up your digital sign, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step for showing your Cyfe dashboard on a digital sign is adding the public URL for your dashboard to your online Screenly account. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Cyfe dashboard URL as a new content item.](/assets/images/community/input-cyfe-url-in-screenly.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Cyfe dashboard to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Cyfe dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Cyfe dashboard content to a playlist](/assets/images/community/add-cyfe-content-to-screenly.webp) You will then see your Cyfe dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the amount of time you want the dashboard to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Cyfe dashboard content in the playlist](/assets/images/community/set-cyfe-content-duration.webp) To assign the playlist containing the Cyfe dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Cyfe dashboard content to your screen(s) or group(s) of screens, your digital signage dashboard will display on your TV or monitor in just minutes. ### Show your Cyfe dashboards on a digital sign Displaying Cyfe dashboards on a digital sign can help keep teams motivated and focused on company goals. When everyone can see key metrics and performance data, everyone can act on that information, too. Ready to give Screenly a shot? Sign up for Screenly with a <a id="sign-up" href="https://login.screenlyapp.com/login">-day free trial</a>. If you have any questions about how Screenly may meet your needs, reach out to Screenly Support at any time. --- # Manage digital signage content with Box & Zapier Source: https://www.screenly.io/community/manage-content-with-box-and-zapier/ > Use Box and Screenly's Zapier integration to make digita sign content [Watch the video](https://www.youtube-nocookie.com/embed/pT0Djjhj_ok) Box is one of the most popular enterprise cloud-based storage providers on the market. Now, with Screenly's [Zapier integration](/blog/2025/01/19/screenly-zapier-digital-signage-integration/), it's possible for thousands of companies to more easily manage their digital signage content through [Box](https://www.box.com/). It's now easier than ever for non-technical users to participate in their company's digital signage content strategy - all they need to do is drag and drop content into a Box folder. Next, that content is displayed on real digital signs in just moments. In the post below, we'll walk you through how to use Screenly's Zapier integration and Box to make your company's digital signage workflow more simple than ever. ## Step 1: Set up your Screenly account The first step is to [log in](https://login.screenlyapp.com/login) to your Screenly account. If you do not have a Screenly account, you can get one with our [free trial](https://login.screenlyapp.com/sign-up). Within your Screenly account, set up your first screen. Click the *Screens* tab on the left side menu. Next, click the *+ New Screen* button on the top right. In the new page that loads, select the *Screenly Anywhere* option. Open [anywhere.screenly.io](https://anywhere.screenly.io) on your smart TV or browser and enter the *PIN code*. Give your screen a name, and to add your screen, click *Add*. Next, you need to create a playlist. Click the *Playlists* tab on the left side menu. Then click the *+ New Playlist* option on the top right. In the new screen that loads, give the new playlist a name. Then, in the *Plays On* input field, select the new screen you just added (or the name of the screen you intend to use) and select *Save*. Next, select *Save* again on the bottom right. Great! Your Screenly account is now ready to receive content from your Box account. ## Step 2: Get started with your Zapier account The next step is to log in to your [Zapier](https://zapier.com/) account. If you don't have a Zapier account, there are several paid options as well as free trial options. Once you log in, click the *+ Create* button on the top left. In the new drop-down menu, click *Zaps*. To get started, now click the purple *+ Create* button on the top right. Select *New Zap*. ## Step 3: Set the Box trigger for your Zap Now, we need to connect your Box account and set up the *Trigger* that initiates the Zap process. Select the *Trigger* icon on the Zap dashboard. Next, search for and select the Box app. For the *Trigger* event, choose *New File*. In the *Account* field, you will have to log in and authenticate your Box account. When that is complete, click the purple *Continue* button. ![Setting up the Box trigger.](/assets/images/community/box-2.webp) In the Configure stage, select the folder in your Box account where you plan to add digital signage content. For the *Share* input field, you don't have to select anything. Click the purple *Continue* button again. Then, click the purple *Test trigger* button. If the test goes through successfully, you're all set! It's time to move on to setting up the Action. ![Setting up the Box configuration section.](/assets/images/community/box-3.webp) ## Step 4: Set the Screenly Action for your Zap The next step is to click the *Action* icon. In the popup that loads, search for and select Screenly. On the right side, select *Complete Workflow* for the *Action* event. ![Setting up the Screenly and Zapier action fields.](/assets/images/community/box-4.webp) Next, in the *Account* input, you'll need to authenticate your Screenly account. To do so, click the *Settings* tab on your Screenly dashboard. Then, click *Security* in the sub-menu of the new page that loads. Lastly, click *Show* on the *Token* row and name and save your token key. You can then paste your token key in the Zapier popup modal to authenticate your account. ![Setting up Screenly token authentication.](/assets/images/community/box-1.webp) In the Configure section, complete the *File URL* field using the *File* option from the Box drop-down options. For the *Asset Title* field, use the *Name* option from the Box drop-down options. Next, select the *Duration* you want the asset to show for with each appearance. Next, click the *Existing Playlist* input section and select the playlist you created in Step 1. In the *Screen* input section, select the screen you created in Step 1 or any other active screen(s) that you wish to use. Next, click *Test step* to test the process. After a successful test, you should see the Box file in the selected playlist inside your Screenly account. That file should then play on any assigned screens on the next sync. ![Setting up the Zapier action configuration section.](/assets/images/community/box-5.webp) After a successful test, click the purple *Publish* button. You are now ready to go! That's it! ## Get started with Screenly, Zapier, & Box If you haven't already, get started with Screenly today for free. We offer a -day free trial with no credit card required - [learn more](https://login.screenlyapp.com/sign-up). As you can see, Screenly's new Zapier integration allows Screenly to integrate with a variety of industry-leading tools. These integrations can significantly enhance workflows and make digital signage accessible to a larger audience. --- # mTLS for digital signage: serving protected resources to screens Source: https://www.screenly.io/community/mtls-for-digital-signage/ > Screens have to reach pages and endpoints that sit behind a login they can never complete. Here is the server side of doing that with client certificates. Almost every signage deployment eventually points a screen at something private, and it is rarely just one kind of thing. A reporting dashboard above the shop floor. A JSON endpoint a page polls every thirty seconds for throughput figures. An internal web app somebody's team built for dock scheduling. A page whose images and video come off an internal file server. A camera or telemetry feed from a system that was never meant to face the open network. All of it sits behind a login, and the screen cannot log in. There is no keyboard, nobody is standing there, and whatever you give it has to keep working unattended for months. Mutual TLS fits this shape well. The player holds a private key it never transmits and proves possession of it during the TLS handshake, so the screen authenticates itself before your application is involved. It works the same way whether the thing being protected is an HTML page, an API response, or a file. This tutorial is about the server side, which is the half nobody writes down. ## What you end up protecting Signage deployments hit this in a few places, and every one of them takes the same mechanism. ### The page the screen renders A URL that loads on the player: a reporting dashboard, an internal web app, a status board your team built. ### The endpoint behind dynamic content A page or app on the screen fetching JSON on a timer, for throughput figures, incident counts, dock assignments, days since last incident. This is the one that gets forgotten. The dashboard gets locked down and the endpoint feeding it quietly stays open, which leaves the data reachable even though the page in front of it is not. ### The subresources that page loads Images, video, fonts and stylesheets the page pulls from an internal host while it renders. These are easy to miss because they are never typed into a signage dashboard: they are referenced from inside the page. Lock down the page and leave its asset host open and the content is still reachable. Lock down the asset host without giving it the same trust configuration and the page renders half-empty on the wall, which is the more common way to find out. ## What client certificates give you ### The credential never leaves the device The private key is generated on the player and stays there. Nothing is transmitted that could be replayed, and there is no value sitting in a settings field to be copied. ### Every screen is its own identity Access logs, rate limits and audit trails name the individual screen rather than a shared viewer, so you can see which panel pulled which report and when. ### Revocation is scoped to one screen A player that is lost, replaced, or moved out of a secure area is cut off by removing its certificate from the trust store, or its name from the allowlist. Every other screen keeps working straight through that change: nothing to re-issue, nothing to push to the fleet, no window where half the estate has the new credential and half still has the old one. For a fleet spread across sites, that is often the difference between revoking a screen the day it goes missing and putting it off until the next maintenance slot. ### Authentication happens below your application By the time a request reaches your dashboard or API, the caller is already known. The application reads the identity from a header and renders, so an unattended screen needs nothing of its own at the application layer. ### Network position stops mattering A screen in a plant you run and a screen at a contractor-managed site authenticate identically. Access follows the device rather than the segment it happens to sit on. ### It composes with what you already have Terminate it at the edge or on the origin, keep SSO for the people reading the same dashboard, add IP rules on top if you want both. None of these get in each other's way. ### The identity is reusable Once the server knows which screen is calling, it can serve that screen its own content. That turns out to be the part most deployments underuse, and it gets its own section below. ## How the handshake changes In ordinary TLS the server proves who it is and the client stays anonymous. In mutual TLS both sides present a certificate, and the server drops the connection if the client's does not check out. ## The mistake that undoes all of it Worth reading twice, because it is easy to configure and looks correct. Verifying that a client certificate is *signed by a trusted authority* is not the same as verifying that it is *your screen*. If your players' certificates come from a vendor's certificate authority, every device that vendor has ever shipped carries a certificate signed by that same authority. A server that only checks the chain will accept a stranger's player. You have authenticated the manufacturer's customer list, not your fleet. Pick one of these deliberately. ### Trust the CA, then match the identity Point the server at the CA certificate, and additionally check the presented certificate's common name against screens you expect. The chain proves the certificate is real; the name proves it is yours. Both are needed. ### Trust the device certificates directly The alternative. Skip the CA and give the server only the specific screen certificates you want. Nothing else validates, so there is no name check to forget. The first scales: commission a screen, it works. The second is tighter and needs no second check, at the cost of editing a bundle whenever the fleet changes. Ten screens in one plant, use the allowlist. Two hundred across sites with monthly additions, use the CA plus a name check. Which is available depends on your player vendor. If they give you a CA certificate as well as per-device files, you can do either. If you only ever get per-device files, you are on the allowlist model whether you meant to be or not. ## Building the trust store For the allowlist model, concatenate the screen certificates: ```bash cat plant1-line-a.pem plant1-line-b.pem warehouse-dock.pem > trusted-screens.pem ``` Order does not matter. Apache can read a directory instead, which avoids rebuilding the bundle each time. ## NGINX in front of a dashboard ```nginx server { listen 443 ssl; server_name signage.grafana.internal.example.com; ssl_certificate /etc/ssl/server.crt; ssl_certificate_key /etc/ssl/server.key; ssl_verify_client on; ssl_client_certificate /etc/ssl/trusted-screens.pem; # With a shared vendor CA, keep this at 1 so only certificates issued # directly by that CA validate. ssl_verify_depth 1; location / { # The identity check. Without it, any certificate that CA signed # gets in, including players that are not yours. if ($ssl_client_s_dn_cn !~ "^(plant1-line-a|plant1-line-b|warehouse-dock)$") { return 403; } # Many dashboards can trust a header like this for auto-login, # instead of showing a form the screen could never fill in. proxy_set_header X-Screen-ID $ssl_client_s_dn_cn; proxy_set_header X-WEBAUTH-USER signage-viewer; proxy_pass http://grafana:3000; } } ``` `if` inside a `location` is normally an NGINX trap, but `return` is one of the two directives that are safe there. For a longer fleet, a `map` keyed on `$ssl_client_s_dn_cn` reads better and stays out of the request path. On the allowlist model, delete the `if`. The bundle is already the allowlist. ## The API endpoint, same handshake The dynamic-content case, where a page on the screen fetches JSON on a timer: ```nginx server { listen 443 ssl; server_name signage-api.internal.example.com; ssl_certificate /etc/ssl/server.crt; ssl_certificate_key /etc/ssl/server.key; ssl_verify_client on; ssl_client_certificate /etc/ssl/trusted-screens.pem; ssl_verify_depth 1; # Read-only surface for screens. Nothing here should accept a write. location /api/v1/metrics { limit_except GET { deny all; } proxy_set_header X-Screen-ID $ssl_client_s_dn_cn; proxy_pass http://metrics-api:8080; } } ``` Two things worth doing on a signage API specifically. Restrict it to `GET`, because a screen has no business writing anything. And keep it to the fields the screen renders: a board showing throughput does not need the endpoint that returns every order line behind it. ## Apache ```apache <VirtualHost *:443> ServerName signage.reports.internal.example.com SSLEngine on SSLCertificateFile /etc/ssl/server.crt SSLCertificateKeyFile /etc/ssl/server.key SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificatePath "/etc/ssl/screens/" <Location /> Require expr %{SSL_CLIENT_S_DN_CN} in {"plant1-line-a", "warehouse-dock"} RequestHeader set X-Screen-ID "%{SSL_CLIENT_S_DN_CN}s" ProxyPass "http://reports:8080/" </Location> </VirtualHost> ``` `SSLCACertificatePath` wants a hashed directory, so run `c_rehash /etc/ssl/screens/` after adding or removing a certificate. Forgetting is the usual reason a newly commissioned screen gets rejected. ## HAProxy ```haproxy frontend signage_in bind *:443 ssl crt /etc/ssl/server-bundle.pem \ ca-file /etc/ssl/trusted-screens.pem verify required acl known_screen ssl_c_s_dn(cn) -m reg ^(plant1-line-a|plant1-line-b|warehouse-dock)$ http-request deny unless known_screen http-request set-header X-Screen-ID %{+Q}[ssl_c_s_dn(cn)] default_backend dashboards backend dashboards server grafana1 127.0.0.1:3000 ``` ## Caddy ```caddy signage.internal.example.com { tls /etc/ssl/server.crt /etc/ssl/server.key { client_auth { mode require_and_verify trusted_ca_certs_file /etc/ssl/trusted-screens.pem } } @unknown not vars {http.request.tls.client.subject_cn} plant1-line-a warehouse-dock respond @unknown 403 reverse_proxy grafana:3000 { header_up X-Screen-ID {http.request.tls.client.subject_cn} } } ``` ## One URL, every screen its own numbers This is where signage gets more out of mTLS than a typical client would. Every example above forwards the certificate's common name as `X-Screen-ID`. Your dashboard or API can branch on it, so a single content item assigned to the whole fleet renders each site's own figures: ```http GET /api/v1/metrics X-Screen-ID: warehouse-dock ``` One asset covering the whole fleet is also less to keep in step than a URL per location. Two rules. Strip any inbound `X-Screen-ID` at the proxy, so nothing can set it for itself. And trust it only because the proxy verified the certificate first: the header is a convenience, not the authentication. If your signage platform can already send screen metadata as request headers, prefer that for choosing content and keep the certificate for access control. They answer different questions. ## Terminating at the edge instead The handshake does not have to happen on your web server. Cloudflare, an AWS Application Load Balancer, and most API gateways will terminate mTLS for you: upload the trust bundle, attach it to the listener, and unverified connections are dropped before they reach your network. Your dashboards keep serving plain HTTP behind it. In an organisation of any size this is usually the better arrangement. The network team owns screen access in one place, and the people building reports never touch a TLS directive. ## When people and screens share a dashboard The question that always follows a rollout: the operations team still needs the report they have used for a year. ### Split the hostname `reports.example.com` keeps normal TLS and your SSO for people. `signage.reports.example.com` requires a client certificate and points at the same backend. Two doors, one room. This is nearly always right and takes ten minutes. ### Make verification optional and enforce per path When one hostname is a hard requirement: ```nginx ssl_verify_client optional; ssl_client_certificate /etc/ssl/trusted-screens.pem; location /reports { proxy_pass http://dashboards; } location /signage-feed { if ($ssl_client_verify != "SUCCESS") { return 403; } proxy_set_header X-Screen-ID $ssl_client_s_dn_cn; proxy_pass http://dashboards; } ``` `optional` means the server asks for a certificate and carries on without one, leaving you to check `$ssl_client_verify` on the paths that matter. The trade is that a new location block has to remember the check. The subdomain split fails closed instead, which is why it is the recommendation. ## Operational things that bite later ### Certificates expire Find out the lifetime and who renews it before there are fifty screens. A fleet that goes blank on the same morning is a memorable way to learn this. ### Decommissioning a screen is a config change Allowlist model, drop its certificate and reload. CA model, drop it from the name list. It takes effect for that screen alone, which is the point, but it is not a button in a dashboard, so write down where that config lives and who can edit it before you need to do it in a hurry. ### Test the failure, not the success From a machine that is not a screen, confirm you are refused: ```bash curl -sS -o /dev/null -w '%{http_code}\n' \ https://signage.grafana.internal.example.com/ curl -sS -o /dev/null -w '%{http_code}\n' \ --cert plant1-line-a.pem --key plant1-line-a.key \ https://signage.grafana.internal.example.com/ ``` The first should be refused. If it returns 200, verification is not actually on. ### Know what a failure looks like on the wall Players differ here. Some treat an unreachable page as a failed item and move straight on to the next thing in the playlist, which is quiet and easy to miss: the screen looks fine, it is just no longer showing that dashboard. Others leave the panel blank, which reads as broken hardware. Find out which yours does before a certificate expires, because it decides whether anyone notices. ## Doing this with Screenly Screenly players can present a device certificate, so everything above applies directly. Open the screen's **Actions** tab and choose **Download certificate**. The file is named after the device, like `srly-y358c2nss7i40ly.pem`, and you repeat it for each screen that needs access. The same tab has **Download CA certificate**, which is the authority that signed every device certificate. Then on the content item, open **Advanced**, turn on **Allow sending client certificate**, and save. That is the whole client side. Because both are available, either trust model works. The device id in the filename is the certificate's common name, so it is what you match on in the configs above and what arrives as `X-Screen-ID`. The warning earlier in this article applies here with full force. Every Screenly device certificate is signed by the same Screenly authority, so a server that checks only the chain will accept a certificate from any Screenly player anywhere. If you go the CA route, match the common name as well. This needs ScreenlyOS 26.2.0 or newer and is not available on Screenly Anywhere, which has no device certificate to present. [Pages behind a login](/docs/content/web-pages/authenticated-pages/) in the documentation covers the dashboard side in full. --- # Screenly University - How to get started with Screenly Source: https://www.screenly.io/community/screenly-university-getting-started/ > Take our Screenly University tutorial to learn how to get started with Screenly quickly and easily. Screenly helps you launch digital signs in minutes and easily manage your digital signage content from anywhere. Please watch the video below for a high-level overview on how to get started. [Watch the video](https://www.youtube-nocookie.com/embed/bYLibTAjREw) ## How to add a Screen with Screenly The first step to getting the most out of Screenly is adding your first screen. Once you order and receive your Screenly player you are just a few steps away from having a professional digital signage system. First take the player and accompanying cables out of the box and make sure you received both a power cable and an HDMI cable. Then follow these steps: 1. Connect the power cable to the player and plug it into the wall 2. Use the included HDMI cable to connect the Screenly Player to your TV or Monitor 3. Connect your Screenly Player to the internet using an ethernet cable or Wi-Fi We will cover wi-fi setup in more detail later in this lesson. Once you plug the player in it will start up and think for a minute or two, and if it is connected to the internet it will display a pairing code. The video below will explain how to use that code to pair your player to your Screenly account. [Watch the video](https://www.youtube-nocookie.com/embed/3VWtcbsI8PA) ## Wi-fi setup and using the Screenly Knowledge Base If you are setting up your Screenly player on a Wi-Fi network for the first time then your player will display a "Network Error" message on screen indicating it has no internet connection. No need to panic, you will just need to perform a few additional steps to tell your player which wi-fi network to connect to. You can find step by step instructions for this setup in our help library called the Screenly knowledgebase, or KB for short. You can access the KB from within the Screenly web console under the Help menu (? icon at the top), or by navigating your browser to <https://support.screenly.io/>. Once you are in the KB search for "wifi". Then find the article titled "How do I configure WiFi for the Screenly 2 Player?" in the results and read through it. At the bottom of the instructions you will also find some tips for troubleshooting common setup problems users report. If you follow the instructions and are still having trouble please reach out to our support team for help. To open a support ticket go to the Screenly KB, click "Submit a request" on the top right, and fill out the form. In your message please describe the problem to the best of your ability and if there is an error message on screen tell us what it says so that we can better assist you. ## How to add content with Screenly Once your first screen is paired to your account it will spend a few minutes downloading content and updates, then start to play an example playlist of images and web pages. In the next three lessons you will learn how to control what plays on your screens using content, playlists, and group labels. We will define these terms briefly here, then go into more detail in the courses ahead: **Content**: Pieces of content, also called assets, are the files and web URLs that you have made available to your Screenly devices. **Playlists**: A playlist is what you use to tell Screenly what order to play your pieces of content in, how long to show each of them on screen, when to play them, and which of your screens to play them on. **Group Label**: You can assign labels to your screens to help identify groups of screens that should receive the same playlists. These labels can be based on anything, but for most companies they are related to the function or location of the screens. ## Content Screenly can display images, videos, web pages, and a few other types of files. You can find a detailed list of supported content types in the Screenly Knowledgebase. Learn more about uploading content to your online Screenly account in the video below. [Watch the video](https://www.youtube-nocookie.com/embed/HZUJWLsTVmU) ## How to add Playlists with Screenly Now that you have content uploaded to your online Screenly account, you can now organize your content into playlists. You can then schedule playlists to play at particular times and on one or multiple screens. [Watch the video](https://www.youtube-nocookie.com/embed/CmY0q-s_3pY) Some things to know about playlists: * You may create as many playlists as you want. * When multiple playlists are assigned to a screen, it will play them in alphanumeric order by playlist title. Alphanumeric means numbers 0-9 first, then capital letters A-Z, then lowercase letters a-z. ## How to add Group Labels with Screely To control multiple screens at once, use our screen group labels, also called tags. Learn more about this feature in our video below. [Watch the video](https://www.youtube-nocookie.com/embed/L0rkriaqsKs) ### What are group labels used for? Group labels are most useful when you have a large number of screens and you have subsets of screens that need to show the same content. Here's an an example to illustrate: Let's say that we have four grocery stores, two in New York and two in Boston. Our marketing department has designed three sets of advertisements to display on our screens. The first set should be displayed at all of the stores, the second set should only be shown at stores in New York, and the third set should only be shown in Boston area stores. By adding a group label to identify which city each of our screens are in, we can make it much easier to ensure playlists are assigned to play on the right screens. Next, we upload the 3 sets of advertisements from marketing, and create a playlist for each set. The playlist for the first set we can assign to play on the "All Screens" group because it should be played everywhere. The playlists containing the ads that should only be played in Boston we assign to the Boston group, and the playlist with the New York ads we assign to play on the New York group. Set up this way our screens in the Boston group will play the "Ads for all stores" playlist, then the "Boston Ads" playlist and then start over. Likewise, the New York group screens will play "Ads for all stores", then the "New York Ads" playlists on loop. Any changes to the content in these playlists will automatically be synced to players in the field, so Marketing can rest assured that the right content is playing in the right stores. ### That's just the tip of the iceberg Lets say we add a Pizza counter to three out of four of our stores next year. If we add the group label Pizza to those stores screens, then we can use a playlist to make sure pizza ads get played in the three stores that sell pizza, while making sure they don't in the store that doesn't have one. There are no limits on how many labels you can create or assign to a screen. As your organization grows labels will make it easier to display the right thing in the right place. Like: * If we add a new store and screen in Boston, all we have to do is add the Boston label to the new screen and it will start playing the appropriate playlists. * If we display menus with pricing that varies from region to region. * Manage screen content across many countries and languages. * Separate what plays on your office screens from what plays on your in-store screens. Tip: On the Screens or Playlists pages click on any group label and it will filter the current list to show only the items tagged with that label. To get back to the full list just click on Screens or Playlists on the left hand navigation menu. ## Congratulations you have completed the course We have covered the basics of how to: * Connect and pair a Screenly player to your account * Upload content to Screenly * Create playlists * Employ scheduling rules to control when a playlist is active * Use group labels to assign playlists to specific subgroups of screens Now it's time to put your knowledge to use, remember the old adage "use it or lose it"? Make some time to put your new skills into action so that you remember them. For practice you can upload content and create playlists, just don't assign them to any screens or groups and they won't play in the "real world". ### Remember the following * You can review this course at any time if you need a refresher. It's natural to forget some of what you learned over time, you can bookmark the course page for easy reference. * The [Screenly Knowledgebase](https://support.screenly.io/hc/en-us) is a helpful resource when you are stuck. * If the answer isn't there, reach out to the support team by opening a support ticket Good luck, and thank you for using Screenly. If you have any feedback about this course, areas that we could improve, or parts that were unclear you can send feedback via our [support portal](https://support.screenly.io/hc/en-us/requests/new) --- # Set up SAML with Auth0 and Screenly Source: https://www.screenly.io/community/saml-sso-with-auth0/ > Organizations can use Auth0 and Screenly's SAML support for user authentication. Screenly offers SAML support with Auth0. Screenly also supports SAML with Okta, which you can learn more about [here](/community/saml-sso-with-okta/), and Azure, which can you find [here](/community/saml-sso-with-microsoft-entra-id/). SAML stands for "Security Assertion Markup Language" and allows users to transfer identity information between an identity provider (IdP) and a service provider (SP). Please see below for more information on how to configure Screenly to work with SAML. ## Metadata Location If this is needed, here are the steps to find your metadata: 1. Login to your Screenly account (only the account owner can complete this). 2. Take the first part of the URL showing in your browser - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/> 3. Then append "sso/saml_metadata_view" to the end of it - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/sso/saml_metadata_view> 4. An example from a test account would look like: <https://screenly-testing-inc.screenlyapp.com/sso/saml_metadata_view> This will then bring up a page with your metadata. ## Step by step example for Auth0 Please see the steps for using Auth0 below. **Step 1** &mdash; Register at [Auth0](https://auth0.com/) **Step 2** &mdash; Create a new web application ![Auth0 SAML setup step 2.](/assets/images/community/auth0-step2.webp) **Step 3** &mdash; Open SAML settings ![Auth0 SAML setup step 3.](/assets/images/community/auth0-step3.webp) **Step 4** &mdash; Set SP metadata in the Auth0 SAML settings. The Application Callback URL should look like the following: ```text https://screenlyapp.com/sso/complete/saml/?idp=[domain]&RelayState=[domain] ``` The `[domain]` is the owner's team domain (remove the braces from the URL). It is shown in your Screenly URL address bar in your browser. Here is an example of how the complete Application Callback URL should look: <https://screenlyapp.com/sso/complete/saml/?idp=mysupportcompany&RelayState=mysupportcompany> Please find the other two properties to change below: ```json { "audience": "login.screenlyapp.com", "recipient": "https://screenlyapp.com/sso/complete/saml/" } ``` **Step 5** &mdash; Get Auth0 IDP settings. The issuer is the *entity ID* and the *Identity Provider Login URL* is the single sign-on URL. The certificate is the *Identity Provider Metadata*. You can copy it from the generated file (remove the `BEGIN` and `END` lines from the X.509 certificate when pasting into Screenly). ![Auth0 SAML setup step 5.](/assets/images/community/auth0-step5.webp) **Step 6** &mdash; Log in to Screenly, and configure the following inside of your Screenly SAML settings (Screenly &rarr; Settings &rarr; Team). These should also match the same attribute fields within your Auth0 configuration: * Email: <http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress> * Name: <http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier> You may also remove the `user_id` row from the attributes within Auth0, as this matches the name attribute above. **Step 7** &mdash; Save the configuration, and now SAML should be configured. You can test this by clicking the *Copy URL* button below the SAML settings in Screenly, logging out of Screenly, then pasting the URL into the browser to login. That completes the setup. ## What is the user authorization process with SAML? ![Auth0 SAML setup authorization.](/assets/images/community/auth0-authorization.webp) First, the owner sends the SAML login url. This is necessary to invite a new user. Next, the user redirects to the IdP authorization screen. The next step is for the user to complete authorization. When the user completes IdP authorization, the IdP redirects the user back to Screenly with the IdP's response. The user can then register as a new user or, if the user already exists, the user can merge his or her account. This process is the same registration process as SSO. ## That's it The user is now authenticated and is redirected to the Screenly dashboard. If you have any questions, feel free to reach out to Screenly Support! You can [submit a support ticket here](https://support.screenly.io/hc/en-us/requests/new). --- # Set up SAML with Google Workspace and Screenly Source: https://www.screenly.io/community/saml-sso-with-google-workspace/ > Organizations can use Google Workspace and Screenly's SAML support for Screenly offers SAML support with Google Workspace (formerly G Suite). For information about other supported identity providers, please see our [SSO and SAML documentation](/enterprise/sso-and-saml-support/). SAML stands for "Security Assertion Markup Language" and allows users to transfer identity information between an identity provider (IdP) and a service provider (SP). ## Step by step set up for Google Workspace SAML authentication **Step 1** &mdash; Sign in to your Google Workspace Admin Console at [admin.google.com](https://admin.google.com). **Step 2** &mdash; In the Admin Console, navigate to Apps > Web and mobile apps. **Step 3** &mdash; Click on Add App > Add custom SAML app. ![Google Workspace SAML setup step 3.](/assets/images/community/google-workspace-saml-step-3.webp) **Step 4** &mdash; Enter a name for the application (e.g., "Screenly") and click Continue. ![Google Workspace SAML setup step 4.](/assets/images/community/google-workspace-saml-step-4.webp) **Step 5** &mdash; On the Google IdP Information screen, download the IdP metadata XML file. ![Google Workspace SAML setup step 5.](/assets/images/community/google-workspace-saml-step-5.webp) **Step 6** &mdash; Configure Screenly SAML settings: - Login to the Screenly webconsole - Go to Settings > Security > SAML - Click the "Import" button - Select the downloaded metadata file to automatically populate the required fields - Set Email Identifier to `email` - Set Name Identifier to `firstName` - Click "Save" - Copy the generated Login URL (you'll need this for the next steps) - Logout from Screenly ![Google Workspace SAML setup step 6.](/assets/images/community/google-workspace-saml-step-6.webp) **Step 7** &mdash; In the Service Provider Details section, enter the following information: - ACS URL: `https://login.screenlyapp.com/sso/complete/saml/` - Entity ID: `login.screenlyapp.com` - Start URL: Set to the `idp` value from the copied Login URL (e.g., if the Login URL is `https://login.screenlyapp.com/sso/login/saml?idp=abc123`, use `abc123`) - Signed Response: Checked - Name ID Format: EMAIL - Name ID: Basic Information > Primary Email ![Google Workspace SAML setup step 7.](/assets/images/community/google-workspace-saml-step-7.webp) **Step 8** &mdash; In the Attribute Mapping section, add the following mappings: - Add `email` and map it to `Basic Information > Primary Email` with identifier `email` - Add `name` and map it to `Basic Information > First Name` with identifier `firstName` - Click "Finish" ![Google Workspace SAML setup step 8.](/assets/images/community/google-workspace-saml-step-8.webp) **Step 9** &mdash; Configure user access: - Select "ON for everyone" to enable access for all users, or - Choose "ON" to specify which users can access the application ![Google Workspace SAML setup step 9.](/assets/images/community/google-workspace-saml-step-9.webp) **Step 10** &mdash; Test your SAML configuration by clicking "TEST SAML LOGIN". If you encounter any errors on your first attempt, please wait a few minutes and try again, as the configuration may take some time to propagate. ![Google Workspace SAML setup step 10.](/assets/images/community/google-workspace-saml-step-10.webp) That's all! Your Google Workspace SAML integration with Screenly should now be complete. --- # Set up SAML with Microsoft Entra ID and Screenly Source: https://www.screenly.io/community/saml-sso-with-microsoft-entra-id/ > Organizations can use Microsoft Entra ID and Screenly's SAML support Screenly offers SAML support with Microsoft Entra ID (formerly Azure Active Directory). Screenly also supports SAML with Okta, which you can learn more about [here](/community/saml-sso-with-okta/), and Auth0, which can you find [here](/community/saml-sso-with-auth0/). SAML stands for "Security Assertion Markup Language" and allows users to transfer identity information between an identity provider (IdP) and a service provider (SP). Please see below for more information on how to configure Screenly to work with SAML. ## Metadata Location If this is needed, here are the steps to find your metadata: Login to your Screenly account (only the account owner can complete this). Take the first part of the URL showing in your browser - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/> Then append "sso/saml_metadata_view" to the end of it - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/sso/saml_metadata_view> An example from a test account would look like: <https://screenly-testing-inc.screenlyapp.com/sso/saml_metadata_view> This will then bring up a page with your metadata. ## Step by step setup with Microsoft Entra ID **Step 1** &mdash; Go to the Microsoft Entra ID console, Enterprise Applications, then click 'New Application'. ![Microsoft Entra ID SAML set up step 1.](/assets/images/community/azure-step1.webp) **Step 2** &mdash; Click on the option to create your own application, name it, and then select the option to "Integrate any other application you don't find in the gallery (Non-Gallery). ![Microsoft Entra ID SAML set up step 2.](/assets/images/community/azure-step2.webp) **Step 3** &mdash; Assign your users and/or groups to the application. ![Microsoft Entra ID SAML set up step 3.](/assets/images/community/azure-step3.webp) **Step 4** &mdash; Click on 'Single-sign-on' on the left side of the page. ![Microsoft Entra ID SAML set up step 4.](/assets/images/community/azure-step4.webp) **Step 5** &mdash; Complete the following settings in the 'Basic SAML Configuration' section: * Identifier (Entity ID) &mdash; login.screenlyapp.com * Reply URL (Assertion Consumer Service URL) &mdash; <https://login.screenlyapp.com/sso/complete/saml/> * Sign on URL &mdash; leave blank * Relay State &mdash; the first part of your Screenly domain when logging into your dashboard. e.g. If your dashboard URL is "<https://test-inc.screenlyapp.com/manage/dashboard>", your relay state would be "test-inc". * Logout Url &mdash; leave blank ![Azure SAML set up step 5.](/assets/images/community/azure-step5.webp) **Step 6** &mdash; Ensure your settings in the 'Attributes & Claims' section match the following: * givenname &mdash; user.givenname * surname &mdash; user.surname * emailaddress &mdash; user.mail * name &mdash; user.userprincipalname * Unique User Identifier &mdash; user.userprincipalname ![Microsoft Entra ID SAML set up step 6.](/assets/images/community/azure-step6.webp) **Step 7** &mdash; Download and open the 'Federation Metadata XML' ![Microsoft Entra ID SAML set up step 7.](/assets/images/community/azure-step7.webp) **Step 8** &mdash; Log into your Screenly account, and go to the SAML section found in Settings &mdash; Security. (Only the **account owner** can view and edit this setting.) ![Microsoft Entra ID SAML set up step 8.](/assets/images/community/azure-step8.webp) **Step 9** &mdash; Fill in the fields with the details from your 'Federation Metadata XML' file from Step 7 above. * Entity ID &mdash; entityID (get value from the 'Federation Metadata XML' file) * Email Identifier &mdash; name_id (use this value) * Single sign on URL &mdash; SingleSignOnService[Location] (get value from the 'Federation Metadata XML' file) * Single Logout URL &mdash; SingleLogoutService[Location] (get value from the 'Federation Metadata XML' file) * Name Identifier &mdash; <http://schemas.microsoft.com/identity/claims/displayname> (use this value) * Public Certificate &mdash; X509Certificate (get value from the 'Federation Metadata XML' file - remove any BEGIN and END lines from the X.509 certificate when pasting into Screenly, and only paste the content of the certificate). **Step 10** &mdash; Save the configuration, and now SAML should be configured. You can test this by clicking the 'Copy URL' button below the SAML settings in Screenly, logging out of Screenly, then pasting the URL into the browser to login. **Step 11** &mdash; Return Back to Microsoft Entra ID console on Single Sign on section of your application and fill in RelayState (which is required if you want to use IdP-initiated flow). RelayState is the hash that takes from the Screenly SAML URL login (/sso/login/saml?idp=**HASH**). That completes the setup. ## What is the user authorization process with SAML? ![Microsoft Entra ID SAML authorization.](/assets/images/community/azure-authorization.webp) First, the owner sends the SAML login url. This is a necessary step to invite a new user. Next, the user redirects to the IdP authorization screen. The next step is for the user to complete authorization. When the user completes IdP authorization, the IdP redirects the user back to Screenly with the IdP's response. The user can then register as a new user or, if the user already exists, the user can merge his or her account. This process is the same registration process as SSO. That's all for now! --- # Set up SAML with Okta and Screenly Source: https://www.screenly.io/community/saml-sso-with-okta/ > Organizations can use Okta and Screenly's SAML support for user authentication. Screenly offers SAML support with Okta. Screenly also supports SAML with Auth0, which you can learn more about [here](/community/saml-sso-with-auth0/), and Azure, which can you find [here](/community/saml-sso-with-microsoft-entra-id/). SAML stands for "Security Assertion Markup Language" and allows users to transfer identity information between an identity provider (IdP) and a service provider (SP). Please see below for more information on how to configure Screenly to work with SAML. ## Metadata Location If this is needed, here are the steps to find your metadata: Login to your Screenly account (only the account owner can complete this). Take the first part of the URL showing in your browser - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/> Then append "sso/saml_metadata_view" to the end of it - e.g. <https://YOUR-DOMAIN-HERE.screenlyapp.com/sso/saml_metadata_view> An example from a test account would look like: <https://screenly-testing-inc.screenlyapp.com/sso/saml_metadata_view> This will then bring up a page with your metadata. ## Step by step set up for Okta SAML authentication **Step 1** &mdash; Register at [okta.com](https://www.okta.com/) and navigate to the admin dashboard. **Step 2** &mdash; Add the SAML application to your Okta account. To do so, click *Applications* in the sidebar, then click *Create App Integration*. Next, select Web from the Platform dropdown menu. Then, select *SAML 2.0* and click Create. ![Okta SAML setup step 2.](/assets/images/community/okta-step2.webp) **Step 3** &mdash; The next task is to set your SAML configuration. For the Single sign on URL field, please enter: <https://login.screenlyapp.com/sso/complete/saml/?idp={domain}> For the Audience URL (SP Entity ID) field, please enter `login.screenlyapp.com` You can select Unspecified from the Name ID format drop-down menu. **Step 4** &mdash; Next, you must set the application's attribute statements. * For the first attribute, enter `name` with the value `user.login`. * For the second attribute, enter `email` with the value `user.email`. * You can leave the Name format field for each attribute as Unspecified. ![Okta SAML setup step 4.](/assets/images/community/okta-step4.webp) **Step 5** &mdash; On the next page, users must select the "I'm an Okta customer" adding an internal app option. ![Okta SAML setup step 5.](/assets/images/community/okta-step5.webp) **Step 6** &mdash; After creating the Okta app, users must navigate to the Sign On tab in the app settings section and click View Setup Instructions. Next, copy the *Identity Provider Single Sign-On URL*, the *Identity Provider Issuer*, and the *X.509 Certificate* to the *SAML single sign-on* section within your online Screenly account (Screenly &rarr; Settings &rarr; Security). **Step 7** &mdash; Assign your new Okta app to users within your Okta account. Paste the *Identity Provider Issuer* in the *Entity ID* field. Paste the *Identity Provider Single Sign-On URL* in the *Single sign on URL* field. Paste the X.509 Certificate in the *Public certificate* field without `BEGIN` and `END` certificate lines. **Step 8** &mdash; Log into your Screenly account, and go to the *SAML single sign-on* section found in Settings &rarr; Security. Note that only a workspace Owner can configure SAML, and it requires a subscription that includes SAML support. ![Okta SAML setup step 8.](/assets/images/community/okta-step8.webp) **Step 9** &mdash; Click *Import IdP manifest* and select the XML file from step 6 to fill in the configuration fields automatically. You can also enter the fields by hand instead. **Step 10** &mdash; Click *Save*, and now SAML should be configured. You can test this by clicking *Copy* next to the *Login URL* field that appears once a configuration is saved, logging out of Screenly, then pasting the URL into the browser to login. **Step 11** &mdash; Return Back to Okta console on Sign On section and fill in RelayState(this field is required if you want to use IdP-initiated flow). RelayState equals hash that takes from the Screenly SAML URL login (/sso/login/saml?idp=**HASH**). That completes the setup. ## What is the user authorization process with SAML? ![Okta SAML setup authorization.](/assets/images/community/okta-authentication.webp) First, the owner sends the SAML login url. This is necessary to invite a new user. Next, the user redirects to the IdP authorization screen. The next step is for the user to complete authorization. When the user completes IdP authorization, the IdP redirects the user back to Screenly with the IdP's response. The user can then register as a new user or, if the user already exists, the user can merge his or her account. This process is the same registration process as SSO. That's all for now! --- # Setting up a digital sign for your public Mixpanel dashboard Source: https://www.screenly.io/community/display-mixpanel-dashboards/ > Mixpanel is a data analytics tool that allows teams to understand how ![A data dashboard from Mixpanel.](/assets/images/community/mixpanel-display-mixpanel-dashboards.webp) ## What is Mixpanel? Mixpanel is a tool used by companies to track and analyze user behavior on their website or mobile app. It allows businesses to monitor specific user actions, such as clicks, views, and purchases, and to use this data to make informed decisions about product development, marketing, and user experience. Essentially, Mixpanel helps companies understand what their users are doing, and how they can improve their product or service by making analytics-backed decisions to better meet their users' needs. ## Setting up a digital sign To set up a digital sign, users will need a screen, a digital signage player, and digital signage software. The screen can be any TV or monitor that accepts HDMI input. Ideally, the screen has a 16:9 aspect ratio and can display content in at least 1080p Full HD resolution. A [digital signage player](/blog/2019/02/16/what-is-a-digital-signage-player/) is a small, physical device that connects to the digital signage screen via an HDMI cord. The digital signage player renders content to the digital sign screen, similar to how a DVD player renders a movie to a home TV. Users will also need [digital signage software](/foundations/digital-signage-software/). Digital signage software allows users to edit the content that displays on their digital signs from anywhere with an internet connection. Users can add, remove, or reorder, images, videos, and public URLs from the comfort of their PCs. You can learn more about [setting up your first digital sign here](/docs/get-started/). ## Adding your public Mixpanel dashboard URL to your digital sign Once you have your digital sign up and running, the next step is to add your public Mixpanel dashboard URL as content on your digital signage software account. Of course, the steps vary depending on what digital signage software you are using. To learn how to add your public Mixpanel dashboard URL to your online Screenly account, please follow the steps below: The first thing you need to do is to get the public share URL for the board you would like to display from your Mixpanel account. To do so, [log in to your Mixpanel account](https://mixpanel.com/login/) and open the board you would like to display on your digital sign. When building out your dashboards, you should keep the target resolution in mind. Most TVs are running 1920x1080px, so this is probably the resolution for which you want to optimize. After opening the dashboard, click on "Share" at the top right of the dashboard to open the dashboard sharing settings pop-up modal. ![A data dashboard from Mixpanel.](/assets/images/community/click-mixpanel-share-button.webp) From the pop-up modal, toggle the "Make Board Public" option on and click on "Copy URL" from the bottom left of the pop-up modal to copy the dashboard URL to your clipboard. If you are having any trouble getting your Mixpanel public dashboard, read Mixpanel's article on public dashboards [here](https://help.mixpanel.com/hc/en-us/articles/4402022733844-Public-Boards). ![A data dashboard from Mixpanel showing sharing settings in a pop-up modal.](/assets/images/community/mixpanel-share-url.webp) Now, you can add this dashboard URL as content to your Screenly account. To do so, you'll have to [log in to your online Screenly account](https://login.screenlyapp.com/login?_ga=2.206871251.1372799913.1681843777-1225057994.1675913478). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Mixpanel board URL as a new content item.](/assets/images/community/input-mixpanel-dashboard-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Mixpanel dashboard to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Mixpanel dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Mixpanel content to playlist.](/assets/images/community/add-mixpanel-content-to-playlist.webp) You will then see your Mixpanel dashboard in the playlist’s content section. Next to the chart content listing, change the listing’s duration to the amount of time you want the chart to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Mixpanel content in the playlist.](/assets/images/community/set-mixpanel-content-duration.webp) To assign the playlist containing the Mixpanel dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) That’s it! Your public Mixpanel dashboard will start displaying on your digital signs in minutes. If you having any trouble adding content to your Screenly account, watch our video guide [here](https://youtu.be/HZUJWLsTVmU). ## Getting started with Screenly Screenly offers an integrated hardware and software solution for digital signs that allows companies to launch their first digital signs with ease. To get started with Screenly, [sign up for a -day free trial](https://login.screenlyapp.com/sign-up) of our digital signage software. You can also learn more about our digital signage player, the [Screenly Player](/digital-signage-players/), here. If you have any trouble displaying your public Mixpanel dashboards with Screenly, do not hesitate to reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). --- # Show Dashthis dashboards on your screenly digital signs Source: https://www.screenly.io/community/display-dashthis-dashboards/ > Dashthis is a comprehensive digital marketing reporting tool that simplifies [DashThis](https://dashthis.com) is a reporting platform that turns marketing metrics into easy-to-read dashboards — perfect for keeping teams and stakeholders on the same page. With Screenly, you can broadcast a Dashthis dashboard on any digital sign in real time. Below is a quick, step-by-step guide to get your dashboard up and running. ## Add a screen in Screenly If you’re new to Screenly, [start a free -day trial](https://login.screenlyapp.com/sign-up) (no credit card required). Already have an account? [Log in here](https://login.screenlyapp.com/login) and open your Screenly dashboard. Once your at your Screenly dashboard: 1. Click **Screens** in the left sidebar. 2. Select **Add Screen** or **+ New Screen**. 3. Choose **Screenly Anywhere** (our browser-based player). 4. On the device you’ll use as a sign, visit [anywhere.screenly.io](https://anywhere.screenly.io) and copy the pairing code. 5. Paste the pairing code in Screenly, give the screen a name such as **Test Screen**, and click **Add**. ![Adding a screen in the Screenly interface.](/assets/images/community/tutorial-add-screen.webp) Your screen is now linked and ready for content. ## Create a share link in Dashthis Open a new tab, sign into your [Dashthis](https://dashthis.com) account, and pick the dashboard you want to display (e.g., an email-marketing report). **Tip:** A digital sign can’t scroll, so aim for a dashboard that fits in a single screen or use a one-widget view. Once you've navigated to your Dashthis dashboard that you wish to display: 1. Click the **Share** icon on the top right. 2. Under **Share a link**, click **Copy link** to copy the public URL to your clipboard. ![Access your Dashthis public view link to display content.](/assets/images/community/tutorial-dashthis-link.webp) Now, navigate back to your Screenly dashboard and add your Dashthis link as content. ## Add your DashThis link as a content item Return to your **Screenly dashboard**: 1. Click **Content** in the lefthand sidebar menu. 2. Hit **+ New Content** (upper-right). 3. In the modal, choose **URL**. 4. Paste in the Dashthis public share link and click **Finish**. 5. Name the item something like **Dashthis Dashboard** and click **Save**. ![Adding content in the Screenly interface.](/assets/images/community/tutorial-add-content.webp) Your Dashthis dashboard is now stored as a content item. ## Build a playlist and schedule it Now that you have your Dashthis content added to your Screenly account, you need to assign that cotent to a playlist. You also need to assign your **Test Screen** to that playlist. Complete the following steps: 1. Click **Playlists** in the sidebar menu. 2. Select **+ New Playlist** on the top right. 3. Name the new playlist **Dashthis Playlist** or something else that is relevant. 4. Under **Plays On**, pick the screen you paired earlier (e.g., **Test Screen**). 5. Click the **+** button next to **Content**, choose the Dashthis dashboard content item, then click **Done**. 6. Adjust scheduled start date so that it is before the current date and time (for immediate playback). 7. Optionally,set the content**Duration** (e.g., 30 seconds). If it’s the only item, it will loop continuously. 8. Click **Save**. ![Adding a playlist in the Screenly interface.](/assets/images/community/tutorial-add-playlist.webp) That's it! Your Dashthis dashboard will now display on your Screenly digital sign. ## See it live Open the Screenly Anywhere tab on your display screen. Your DashThis dashboard should appear full-screen, automatically refreshing as your metrics change. You now have your Dashthis dashboard on your digital sign! Bring data to the forefront DashThis makes reporting simple, and Screenly makes those reports visible. Reports and metrics aren't useful if your team can't see them. Use the Screenly and [DashThis](https://dashthis.com) combo to spotlight KPIs in offices, retail spaces, or remote hubs — wherever quick insights drive action. Ready to get started? Start your [Screenly free trial](https://login.screenlyapp.com/sign-up) today, drop in a DashThis link, and keep your team informed at a glance. **Need help?** The [Screenly Support team](https://support.screenly.io/hc/en-us/requests/new) is ready to assist. --- # Show Google Looker reports on digital signs with Screenly Source: https://www.screenly.io/community/display-google-looker-reports/ > Looker is a business intelligence and data analytics platform that allows ![A sample dashboard](/assets/images/community/looker-data-dashboard.webp) Google Looker Studio is a business intelligence platform that helps organizations analyze and visualize their data in a user-friendly way. With Looker Studio, users can create and share interactive dashboards, reports, and data visualizations based on their data, without needing advanced technical skills or expertise. The software allows users to connect to various data sources, such as databases, spreadsheets, and cloud storage, and then transform and model the data using a drag-and-drop interface. Looker Studio provides a range of tools for exploring and visualizing the data, including charts, graphs, and maps, as well as the ability to filter and drill down into specific data points. The software also provides a range of security and access controls to ensure that data is kept safe and confidential. Overall, Looker Studio aims to make data analysis more accessible and user-friendly for organizations of all sizes, and help them make better-informed decisions based on their data. The data, dashboards, reports and visualizations that Looker Studio provides will remain top-of-mind for team members and stakeholders when frequently displayed on a TV or monitor in the office. This can be achieved using Screenly's digital signage solution. Below, we provide a step-by-step guide on how to display reports/visualizations from your Google Looker studio on your screen using Screenly's software. ### Getting your public Domo dashboard URL The first major step to displaying your Looker report on a screen using Screenly's software is to get the public share URL for the report you wish to display on the screen. To do this, you'll have to make use of the following steps: First, you'll have to [log in to your Google Looker Studio account](https://lookerstudio.google.com/?requirelogin=1) and open the report you would like to display on your digital sign. At the top-right of the report, click on "Share". ![An image showing a Looker report with the Share button at the top-right](/assets/images/community/share-looker-report.webp) In the new pop-up modal, under "Link Settings", make sure access is set to "Public" and role is set to "Viewer". This step makes sure Screenly's software can access your report via the report URL. ![An image showing a Looker report with access permission settings](/assets/images/community/set-access-permissions-for-looker-report.webp) Proceed to click on "Copy link" to copy the report URL to your clipboard. ![An image showing a Looker report with access permission settings and copy link button](/assets/images/community/looker-report-url.webp) ### Setting up your digital sign Now that you have your public URL, the next step is setting up your digital sign. To set up your digital sign, first purchase a digital signage player. A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step for showing your Looker dashboard on a digital sign is adding the public URL for your dashboard to your online Screenly account. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging into your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" after you successfully add the URL. ![The popup modal to add the Looker dashboard URL as a new content item.](/assets/images/community/input-looker-report-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the "Content" section. After clicking the icon, you will see a popup that will allow you to add the Looker report URL to the playlist from your content item collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add content to playlist" popup, find your Looker report content and click the "+" button next to the file. Then, click the "Done" button below. You will then see your Looker report in the playlist’s content section. ![The popup modal to add the Looker dashboard content to a playlist](/assets/images/community/add-looker-report-to-playlist.webp) Next to the Looker report listing, change the listing’s duration to the time you want the report to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Looker dashboard content in the playlist](/assets/images/community/set-duration-for-looker-report.webp) To assign the playlist containing the Looker report content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown will appear containing all your group labels and screens. Select the screen or group of screens where you would like the playlist to display. Make sure to click "Save" at the bottom of the dropdown after selecting the screen or group of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Looker report URL content to your screen, your Looker report will display on your TV or monitor in just minutes. That’s it! If you followed the steps above, you are now displaying a Looker report on a digital sign with Screenly. ### Let us know how we can help with your digital signs We are always happy to help answer questions. If you have any trouble showing your Google Looker reports on a TV with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). --- # Show how many people are in a room with Density and Screenly Source: https://www.screenly.io/community/display-density-occupancy-data/ > With Screenly and Density, you can track how many people enter and leave ![Density people counter data on a green background on a Screenly sign.](/assets/images/community/density-digital-sign-people-counter-density.webp) Has COVID-19 made it important for you to track and manage capacity in your store or office? With [Density](https://www.density.io/) and Screenly, you can count the number of people in a room and display that data on a digital sign. In this article, we share important use cases for people-counting with Density, and we detail how users can benefit from displaying that information using Screenly. ## What is Density? Density provides the hardware and software for "the world's most reliable people counter." The [Density sensor](https://www.density.io/hardware/) mounts to a wall or ceiling, and users can install multiple sensors to form a network throughout the same building. With deep learning technology, Density sensors can determine which objects are people and which objects are just large boxes, swinging doors, or strollers. Importantly, Density sensors are secure and private. They are not cameras, and they do not transmit or record any personally identifiable information (PII). Instead, Density people-counters use depth sensors to understand the environment. That means that while density sensors can identify how many people are in a building, they do not transmit data that could identify those visitors. The data is 100% anonymous, and Density sensors process that data locally. Additionally, companies do not have to worry about the sensor seeing or hearing any privileged information, such as corporate IP. ## What can people do with Density data? When organizations know how people are using their buildings and rooms, they can optimize space allocation and scheduling. For example, the [Bethesda North Marriott](https://www.density.io/customers/marriott/) hotel and conference center uses Density data to better allocate staff resources across their 441 rooms, hotel facilities, and 56,000 square foot conference center. Additionally, the [University of Notre Dame](https://www.density.io/customers/notre-dame/) uses Density to help students identify which floors of the library have available study space. For companies with large corporate offices or campuses, security teams may struggle with a tailgating problem. A tailgater follows another person inside a building without using his own badge or entry code. Sometimes, tailgating occurs harmlessly when an employee enters a building with a co-worker after lunch. However, other times, tailgating occurs when an unauthorized individual enters the organization's offices. Density sensors can [integrate with a building's security system](https://www.density.io/security-tailgating/) and alert security teams when and where instances of tailgating occur. During the current public health crisis, Density can also help companies implement and enforce social distancing guidelines. Users can enter the maximum number of people that can safely be in a room on their online Density dashboard. When the space has met safe occupancy limits, users can [display a digital warning](https://www.density.io/safe/) outside the door that the space is not safe to enter. At the end of each day, building managers can view an analytics dashboard of when people followed social distancing guidelines and when they did not. Managers can then work to reschedule events and meetings for a safer workplace environment. ![Density people counter data on a Screenly digital sign.](/assets/images/community/density-people-counter-data-digital-sign.webp) ## Using Density and Screenly together To display live room occupancy data on a TV, a user will need to set up a digital sign. A digital sign accesses relevant information from the internet and displays that content to people who walk by the screen. Screenly provides hardware and software for [digital sign management](/foundations/digital-signage-software/). Through an [online Screenly account](https://login.screenlyapp.com/sign-up), users can determine which image, video, or web page content displays on their digital signs. Users can also create playlists and set content schedules to determine the order and time that their content shows. The [Screenly Player](/digital-signage-players/) device communicates with a user's online Screenly account via Ethernet or Wi-Fi, and the device renders the content to the user's digital signs via HDMI. ## Showing live data from Density on a Screenly digital sign To show live room occupancy data from Density, the first step is to get your Density Safe Display link from your Density dashboard. To get your link, [log in to your Density account](https://densityio.auth0.com/login) and click _Add Display +_ on the top right. Next, select the space that you want to monitor in the _Choose a space_ dropdown, and set the space's capacity limits. Next, click apply. You can then edit the fields that show on your screen, including wait times and sidebar content. Next, copy the URL. With Screenly, you can display the content from your Density Safe Display URL on your digital sign. To do so, [log in to your online Screenly account](https://login.screenlyapp.com/login). Plug in your Screenly Player to a power supply, and connect your Screenly Player to the internet using Ethernet or Wi-Fi. Next, connect your Screenly Player to your TV using an HDMI cable. The next step is to add a screen by pairing your Screenly Player and associated TV with your online Screenly account. For a step-by-step walkthrough, check out our video guide on [how to add a new screen with Screenly](https://www.youtube.com/watch?v=3VWtcbsI8PA). Next, you must add your Density Safe Display URL to your content library on your online Screenly account. To do so, click the _Content_ tab on the left-hand menu. Then, click the _+ New Content_ button on the top right of the new page. In the popup modal, click the _URL_ tab, and paste the Density Safe Display URL in the URL input box. Click the purple _Finish_ button on the bottom right. You can then provide a title for your URL content, such as the name of the space associated with the Density sensor. Click _Save_ on the bottom right. Next, you will need to add the Density URL content to a playlist and assign that playlist to a screen within your online Screenly account. You can then schedule when to show your Density Safe Display URL on your screen. You can also schedule additional content, such as [calendars](/apps/google-calendar/) and [weather forecasts](/apps/weather/), to display intermittently throughout the day. For more details, check out our videos on [how to add content with Screenly](https://www.youtube.com/watch?v=HZUJWLsTVmU) and [how to create a playlist with Screenly](https://www.youtube.com/watch?v=CmY0q-s_3pY). ![Density people counter data on a Screenly digital sign.](/assets/images/community/density-people-counter-on-a-digital-sign.webp) ## Let us know if you have any questions That's all for now! If you have any questions on how to display people-counter data from Density on a Screenly digital sign, do not hesitate to reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). --- # Show Tableau data dashboards on a digital sign Source: https://www.screenly.io/community/display-tableau-dashboards/ > Learn how to display Tableau data dashboards on a TV with Screenly. ![An example Tableau dashboard](/assets/images/community/show-tableau-data-dashboard.webp) [Tableau](https://www.tableau.com/) is a popular tool for data visualization and communicating business metrics. One common issue with Tableau and other data visualization tools is that they often go ignored. It is difficult to get employees to review the dashboards regularly and consistently. With Screenly, users can display their dashboards on a large TV and make company data more accessible. Displaying Tableau data dashboards on a TV is easy with Screenly. You can add, remove, and schedule dashboards remotely with an online Screenly account. You will need one digital signage player per screen. A digital signage player renders your Tableau dashboard content to your screen. Screenly offers both the Screenly Player and Screenly Player Max. You can learn more about each device’s unique features at the [link here](/digital-signage-players/). We highlight the steps for displaying your Tableau dashboard on a TV below. ### How to display a Tableau dashboard on a TV To show a Tableau dashboard on a TV, you will first need to make a public version of your Tableau dashboard. To do so from the desktop app, open the app and click on the workbook that contains the dashboard you would like to display. ![An image showing the Tableau app with workbooks and the left side-menu open](/assets/images/community/open-tableau-workbook.webp) Click "Server" from the top menu to open a dropdown server menu for the workbook. ![An image showing the Tableau workbook with the top menu](/assets/images/community/open-tableau-server-options.webp) Hover over "Tableau Public" from the dropdown. Next, click "Save to Tableau Public As" in the sub-menu. You may have to create a Tableau Public account at this time. Next, you can provide a title for your public workbook. ![An image showing the Tableau workbook with the Server options open](/assets/images/community/save-to-tableau-publc.webp) The next step is to get the share link for your Tableau Public dashboard. After providing the title for your workbook, the workbook will be published and you will be redirected to the Tableau public website. ![An image showing the Tableau workbook with a pop-up modal to name the public workbook](/assets/images/community/name-tableau-workbook.webp) You can find the share icon at the top right of the dashboard. Clicking on the icon produces a pop-up modal containing the public link for the dashboard. ![An image showing the Tableau public workbook with the share icon at the top-right](/assets/images/community/click-tableau-dashboard-share.webp) Copy this link, as this is the link you will use to add the Tableau dashboard as content to your Screenly account. ![An image showing the Tableau public workbook with a pop-up modal containing the share link](/assets/images/community/tableau-dashboard-url.webp) Note that if you wish to embed your dashboard in a custom webpage, you can also select the snippet in the Embed Code box. Using the embed snippet allows users to remove unwanted headers on their Tableau dashboard, but it is a more complicated process. The remainder of this guide focuses on using the public share URL. ### Setting up your Tableau dashboard screen with Screenly Now that you have a public share URL for your Tableau dashboard, you need to add the URL to your Screenly content library. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Make sure to append "&:showVizHome=no" at the end of the URL for a better viewing experience. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Tableau dashboard URL as a new content item.](/assets/images/community/input-tableau-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Tableau dashboard content to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Tableau dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Tableau dashboard content to a playlist](/assets/images/community/select-tableau-content-for-playlist.webp) You will then see your Tableau dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the time you want the dashboard display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Tableau dashboard content in the playlist](/assets/images/community/set-tableau-content-duration.webp) To assign the playlist containing the Tableau dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels, select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Tableau dashboard content to your screen(s) or group(s) of screens, your Tableau dashboard will display on your TV or monitor in just minutes. You can then repeat this for all the dashboards that you want to display. You can then simply add each of them as content items within your online Screenly account. ### We are here to help If you have any trouble setting up your Tableau dashboard, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new). We are here to help! --- # Showing an Apple Keynote presentation on a digital sign Source: https://www.screenly.io/community/display-apple-keynote-presentations/ > Apple Keynote is a popular tool for building presentations. You can display [Watch the video](https://www.youtube-nocookie.com/embed/bYLibTAjREw) Great digital signs need great content. One way to create content for your digital signs is by using Apple Keynote, a free presentation software solution from Apple. This software comes pre-installed on most Apple computers and devices, and Apple Keynote is easy and intuitive to use. Apple Keynote makes visual content creation fast with over 30 preset theme designs and over 700 customizable shapes and symbols. Also, Apple Keynote works seamlessly with the Apple Pencil, and users can add their own illustrations to each slide. In this guide, we show you how to display an Apple Keynote presentation with Screenly. The first step is to create you Apple Keynote presentation. Creating digital sign content with Apple Keynote is just like creating any other presentation slides with the software. The only difference is that instead of displaying these slides on a projector to an auditorium of people, you display these slides on a digital sign. A digital sign can be any smart TV, monitor, or HDMI-compatible display. Be To ensure that your Apple Keynote slides look great on your digital sign, make sure that you set the slides to 1920p x 1080p dimensions. You can do this by clicking the _Document_ tab on the top right of the Apple Keynote window. Then, under _Slide Size_ on the right-hand menu, choose _Custom Slide Size_ in the dropdown menu. If the slide size is not already set to a width of 1920p and a height of 1080p, you can set this now. Be aware that Apple Keynote measures dimensions in points (_pts_) rather than pixels (_p_). However, this unit difference will not affect you. Simply put 1920 in the width input box and 1080 in the height input box. To exit the popup modal, click "OK." Next, you need to export your slides to use them as an asset on your digital sign. Click _File_, then click _Export To_. Within the _Export To_ sub-menu, click _Images_. Next, select the slides that you want to export. In most cases, you will select _All_ for all slides. Then, under the “Format” section in the popup modal, select _JPEG (High Quality)_. Then press the _Next..._ button. In the new popup modal, enter a name and location for your new folder. This folder will hold the slide image files from your Apple Keynote presentation. Then, click _Export_. The next step for displaying Apple Keynote slides on your digital sign is to upload the slide images onto your Screenly account. To do so, log in to your online Screenly account, and click the _Content_ tab on the left-hand side of the Screenly web interface. Next, click the _+ New Content_ button. In the new popup modal, click the upload icon, and then select each of the slide images from your newly saved folder. Click _Open_ on the selection window. After your images upload to your Screenly account, click the _Finish_ button on the popup modal. You can learn more about [adding content to your Screenly account here](https://www.youtube.com/watch?v=HZUJWLsTVmU). You have now added your Apple Keynote slides to your online Screenly account. However, there a couple more steps to get your Apple Keynote slides showing on your digital sign. You need to add your Apple Keynote slides to a playlist. Next, you need to add that playlist to your screen. To add a your Apple Keynote slides to a playlist, click the _Playlists_ tab on the left-hand side of the Screenly web interface. Then, select the playlist where you want your slides to play. If you do not have custom playlists, note that you can always add your Apple Keynote images to the default “Play on All Screens” playlist. If you would like to add a custom playlist, you can learn more about [how to create a playlist with Screenly here](https://www.youtube.com/watch?v=CmY0q-s_3pY). Within the playlist, click the _+ Add_ button on the bottom right of the screen. Next, select the Apple Keynote slides you wish to display. Then, click _Done_ on the popup modal. To select which screens show your Apple Keynote slides, enter the name of each screen or appropriate screen group label in the _Plays On_ section at the top of the _Edit Playlists_ page. Be sure to click _Save_ on the bottom right of the _Edit Playlists_ page when you are done. ### Get started If you want to display Apple Keynote slides on a digital sign with Screenly and do not have a Screenly account, you can get started with our -day free trial. We do not require a credit card for your free trial. Ready to give Screenly a shot? <a id="sign-up" href="https://login.screenlyapp.com/login" >Sign up here</a> for your -day free trial. --- # Simplify IT monitoring dashboards' visualization using Dynatrace and Screenly Source: https://www.screenly.io/community/display-dynatrace-dashboards/ > Dynatrace is an intelligent observability platform that provides real-time insights into the performance and health of complex digital environments. [Dynatrace](https://www.dynatrace.com/company/) is a smart software tool that helps companies keep a close eye on how well their computer programs and technology systems are doing right now. Think of it like a doctor checking your health in real-time. It's often categorized as an Application Performance Monitoring (APM) and Artificial Intelligence Operations (AIOps) solution. Dynatrace offers a comprehensive suite of tools and features to optimize the digital experiences of users and ensure the smooth operation of complex IT environments. With Screenly, you can display dashboards from your Dynatrace account on a digital sign in real-time. All you need is a single Raspberry Pi per screen. ### Getting your Dynatrace dashboard URL To display your Dynatrace dashboards on a digital sign with Screenly, you'll need the URL to the dashboard you would like to display. To get this URL, log in to your Dynatrace environment and click on "Dashboards" from the left side-menu and open the dashboard you would like to display on your digital sign. ![Dynatrace account page with left-side menu open](/assets/images/community/open-dynatrace-dashboards.webp) After opening the dashboard you would like to display, click on the "Share" button at the top of the dashboard on your screen. This opens a pop-up modal where you can control your dashboard sharing options. ![Dynatrace dashboard with share button at the top](/assets/images/community/share-dynatrace-dashboard-content.webp) In the dashboard sharing pop-up modal that comes up, click on "Create link" to create a URL that enables you to share your dashboard. The dashboard sharing URL will be created and copied to your clipboard. ![Dynatrace dashboard with dashboard sharing pop-up modal open](/assets/images/community/create-dynatrace-dashboard-link.webp) Now, proceed to open a new browser window, paste the dashboard URL you copied into your browser's address bar and press the "Enter" key on your keyboard. You will be redirected to a single sign-on (SSO) page as seen below for logging into your Dynatrace environment. Copy the URL in your browser's address bar and store it somewhere, as this is what you'll use to add the Dynatrace dashboard as content to your Screenly account. ![Dynatrace SSO page](/assets/images/community/dynatrace-sso-page.webp) ### Adding your Dynatrace dashboards to Screenly To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the Dynatrace dashboard URL you copied from your browser's address bar into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Dynatrace dashboard URL as a new content item.](/assets/images/community/input-dynatrace-url.webp) Edit the Dynatrace content title by clicking on the input field below the "Title" on your screen. Be sure to click the "Save" button on the bottom right. In this case, I've named the Dynatrace content as "Dynatrace" for easy identification. You can find the Asset ID for the Dynatrace content at the end of the URL in your browser's address bar. Copy and store this Asset ID for later. ![The Dynatrace content page](/assets/images/community/edit-dynatrace-content-title.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. Create a new playlist by clicking the "+ New Playlist" button on the top right of the new screen that loads. To edit a playlist, click on its name from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Dynatrace dashboard URL to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Dynatrace dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Dynatrace dashboard content to a playlist](/assets/images/community/add-dynatrace-content-to-playlist.webp) You will then see your Dynatrace dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the amount of time you want the dashboard to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Dynatrace dashboard content in the playlist](/assets/images/community/set-duration-for-dynatrace-content.webp) To assign the playlist containing the Dynatrace dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Dynatrace dashboard content to your screen(s) or group(s) of screens, you will see the Dynatrace login form on your TV or monitor in just minutes. ### Dynatrace dashboard authentication on your digital sign Now that you've added your Dynatrace content URL to your Screenly account, we can tackle the next piece: authentication. Dynatrace blocks computers from accessing a user's dashboard via URL without logging in, so Screenly has made it easy by creating a ready-to-use Javascript snippet on the Screenly playground. Modifying this script with your Dynatrace username and password allows you to log in to your Dynatrace front-end and view your dashboard on a digital sign, using Screenly's [Javascript Injection](/blog/2022/04/25/screenly-developer-digital-signage/) feature. The recommended way to work with our JavaScript Injector is to use Screenly's Command Line Interface, so visit our [CLI repository](https://github.com/Screenly/cli/) for more information on how to work with the CLI. You'll need the Asset ID for the Dynatrace content which you should have gotten after adding the Dynatrace content to your Screenly account earlier in this article. If you don't have the asset ID, open the Dynatrace content page in your Screenly account user interface. You can find the Asset ID at the end of the added URL in your browser's address bar. Store the Asset ID in your CLI by running the following command. ```bash $ export ASSET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX ``` With our asset ID stored, we can now apply the JavaScript Injection for Dynatrace authentication. Proceed to download [dynatrace-login-via-credentials.js](https://github.com/Screenly/Playground/blob/master/javascript-injectors/examples/dynatrace-login-via-credentials.js) from Screenly's playground and modify it with your credentials. Run the following command to add the JavaScript to the Dynatrace dashboard. ```bash $ screenly asset inject-js "$ASSET_ID" /path/to/script.js 20XX-XX-XXTXX:XX:XX.XXXZ INFO [screenly] Asset updated successfully. ``` After running the above command, your Dynatrace dashboard should display correctly on your screen instead of the Dynatrace login page. ### We are here to help For more information on how to make use of our CLI, visit the repository for our [CLI](https://github.com/Screenly/cli) on github. To learn more about our javascript injector feature, you can also visit [Screenly's playground](https://github.com/Screenly/playground/tree/master/javascript-injectors/) on github. If you have any trouble integrating Shopify with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Use Dropbox & Zapier to manage digital signage content Source: https://www.screenly.io/community/manage-content-with-dropbox-and-zapier/ > Check out this tutorial to learn how to use Dropbox and Zapier to manage [Watch the video](https://www.youtube-nocookie.com/embed/f8gy-_zXlk0) Screenly recently launched its exciting [Zapier integration](/blog/2025/01/19/screenly-zapier-digital-signage-integration/), and this feature has enabled a ton of exciting digital signage workflows. One workflow, in particular, uses [Dropbox](https://www.dropbox.com/) and [Zapier](https://zapier.com/) to manage content on digital signs through an easy drag-and-drop process. Dropbox is (or at least was) the king of consumer cloud-based file storage, and a lot of users are very comfortable with the Dropbox interface. In the post below, we show how teams can set up a workflow where all they have to do is drop new content into a Dropbox folder, and that content starts showing on their screens in minutes. Learn the step-by-step process and implement this workflow in your team! ## Step 1: Prepare your Screenly account The first step is to get your Screenly account ready for action. First, [log in](https://login.screenlyapp.com/login) or sign up for a [-day free trial](https://login.screenlyapp.com/sign-up). Next, launch your first digital screen with [Screenly Anywhere](/blog/2025/01/27/screenly-anywhere-launch/). Click the *Screens* tab on the left-side menu, and then click *+ New Screen* on the new page that loads. Select *Screenly Anywhere* and visit [anywhere.screenly.io](https://anywhere.screenly.io) on a new browser tab. Next, enter the pairing *PIN code*, name your screen, and click *Add*. ![Setting up a new screen inside Screenly.](/assets/images/community/dropbox-1.webp) The next step is to get a playlist set up. Click the *Playlist* tab on the left-side screen. Then, click the *+ New Playlist* button on the top right. In the new page that loads, name your playlist *Test Playlist* or whatever you like. Then, in the *Plays On* input field, select the recently made *Test Screen*. Save this screen to the *Plays On* list, and then click *Save* again on the bottom right of the screen. ![Setting up a playlist inside the Screenly account.](/assets/images/community/dropbox-2.webp) ## Step 2: Get your Dropbox account ready Within your Dropbox account, set up a folder where you will add digital signage content. Simply click the *Create folder* button on the top of the *All files* screen and give your folder a name. We used the name *Screen Files*. Add an image for demo content in this folder. ## Step 3: Set up your Zapier Trigger Next, [log in](https://zapier.com/app/login) to your Zapier account or [create a new one](https://zapier.com/sign-up). Once you are on the main Zapier dashboard, click the *+ Create* orange button on the top left. Select *Zaps* from the drop-down menu. Then, in the Zap building area, click the *Trigger* icon. Select the *Dropbox* app. In the *Trigger event* input field, select *New File in Folder*. Next, in the *Account* field, authenticate your Dropbox account. Click the purple *Continue* button. ![The Dropbox set up stage in Zaiper](/assets/images/community/dropbox-4.webp) Now, in the *Configure* stage and *Space* input field, select *Default* or the *Space* where your folder lives. Next, in the *Folder* input field, select the Folder that you wish to use. We are using our *Screen Files* folder. You can leave the other settings as their defaults. Click the purple *Continue* button. Next, click the purple *Test trigger* button. Then, click *Continue with selected record*. ![The Dropbox configuration stage in Zapier.](/assets/images/community/dropbox-5.webp) ## Step 4: Set up your Screenly Action The next step is to set up the *Action* you want Screenly to take when this Zap is triggered. Click the grey *Action* icon. Search for Screenly in the popup modal and select the Screenly app. Next, in the *Action* event input field, select *Complete workflow*. ![The Dropbox-Zapier Screenly Action set up stage.](/assets/images/community/dropbox-6.webp) To link your Screenly account, you will need to provide a token key in the *Account* input field. To get your token key, click *Settings* on the left menu of your Screenly dashboard. Then, click *Security* in the submenu of the page that loads. Next, click *Show* on the *Tokens* row. You can then provide a *Name* for the token and click *Add*. You will then see the secret token key once. Enter that secret token key in the Zapier popup modal. Next, click the purple *Continue* button. ![The Screenly token key process.](/assets/images/community/dropbox-3.webp) In the Configure stage, select *File* in the *File URL* field. In the *Asset Title* field, select *File Name* from the drop-down. You can also set the duration for which you want the asset to display on your screen. In the *Existing Playlist* field, choose the *Test Playlist* you recently created or the playlist you intend to use. Also, select the *Test Screen* option or whichever screen you intend to use in the *Screen* input field. Click the purple *Continue* button. Next, click the *Test step* button. ![The Dropbox app configure stage in Zapier.](/assets/images/community/dropbox-7.webp) You should then see the content in the selected playlist within your Screenly account. The content should then start displaying on your screen within a couple of minutes. That’s it! You’ve successfully set up a Dropbox digital signage workflow with Screenly and Zapier. ## Take the next step If you don’t have a Screenly account, get a [-day free trial](https://login.screenlyapp.com/sign-up) now or upgrade to a [paid plan](/pricing). Also, be sure to check out Screenly’s [digital signage player](/digital-signage-players/). [Screenly Anywhere](/blog/2025/01/27/screenly-anywhere-launch/) screens are convenient as they work with any hardware that can display a modern web browser, but dedicated digital signage players are the better choice in deployments where reliability is critical. Questions? Reach out to [Screenly Support](https://support.screenly.io/hc/en-us). We are always happy to help and answer any questions you may have. --- # Use Google Drive to manage Screenly via Zapier Source: https://www.screenly.io/community/manage-content-with-google-drive-and-zapier/ > It's possible to use Google Drive to manage your digital signage content [Watch the video](https://www.youtube-nocookie.com/embed/zK8_tPtVgiA) Screenly makes it easier than ever for businesses and organizations to manage their digital signs. Part of fulfilling this mission means enabling both technical and non-technical users to be able to take control of their company’s digital signage deployment. We believe that users should be able to use tools that they already know and are comfortable using. With our recent [Zapier integration](/blog/2025/01/19/screenly-zapier-digital-signage-integration/), users can add content to their screen by simply adding the content piece to a Google Drive folder. In this post, we show you how to set up a custom Zap workflow so that you can start managing your digital signs with a simple drag-and-drop into a Google Drive folder. ## Step 1: Get a free Screenly account and your API key The first step is to get a [free Screenly demo account](https://login.screenlyapp.com/sign-up) or [log in](https://login.screenlyapp.com/login) to your existing Screenly account. Once you are logged in, you’ll need to get an API key that you will use with Zapier. Navigate to the *Settings* tab on the left-side menu. Once you are there, click the *Security* tab and then click the *Show* button in the *Tokens* row. Provide a name for your token, and copy this secret token key from the popup modal that shows up. You will use this token key to authenticate your Screenly account with Zapier. ![How to get a Screenly API key.](/assets/images/community/google-drive-1.webp) ## Step 2: Get a free Zapier account and set up a Zap workspace Next, you will need to get signed into [Zapier](https://zapier.com/). Zapier makes it easy for non-technical users to make two different software products talk to each other. Once you are logged in, click the orange *+ Create* button on the top left of the Zapier interface. In the dropdown, click *Zaps*. ## Step 3: Set up your Zap trigger The next step is to set up a trigger for your Zap. A trigger is the event that gets your Zap workflow to start. In this case, the trigger will be a file getting added to a Google Drive file. Click the *Trigger* icon, and then select *Google Drive* in the popup modal. At this step, you will have to log in to your Google Drive account. Next, in the popup that appears on the right side of the screen, select the trigger event to be *New File in Folder*. ![How to set up your Zap trigger with Google Drive.](/assets/images/community/google-drive-2.webp) Click the purple *Continue* button to configure the trigger further. Select your Google Drive account and select the *Folder* you want to use to manage your digital signage content. For the *Include Deleted Files?* option, you can select *Only return non-deleted files*. Next, click *Test trigger* to get sample data into your Zap. ![How to configure your Google Drive trigger.](/assets/images/community/google-drive-3.webp) ## Step 4: Set up your Screenly workflow This is the step where you tell Screenly what to do when your trigger fires. Click the *Action* button below your *Trigger* setup. Type in *Screenly* in the search bar and select the Screenly icon. In the *Action event* section, click it and then click *Complete Workflow*. Next, you’ll need to connect your Screenly account. Click the purple *Select* button, and enter the *Token key* from Step 1. If you do not have a *Token key*, you can create a new one inside Screenly. Once your *Screenly Account* is selected, click the *Continue* button. ![How to set up your Screenly workflow in Zapier.](/assets/images/community/google-drive-4.webp) Now, in the *Configure* stage, click on the *File URL* input box and select the second option *File* in the drop-down. For the *Asset Title* input box, select the first option *Title* in the drop-down. Next, select the duration that you want the asset to display in seconds. Next, select the playlist where you want the content to display. You can choose an existing playlist or make a new playlist in the *New Playlist Name* section and select a screen in the *Screen* section for that content to play on. Next, click the purple *Continue* button and test the Zap. If successful, you will see the content in the desired playlist within your Screenly account, and it will shortly after start displaying on any assigned screen(s). ![How to configure your Screenly workflow in Zapier.](/assets/images/community/google-drive-5.webp) That's it! That is how you use Zapier and Google Drive to simplify digital signage management with Screenly. Instead of having to instruct a non-technical user on how to use the Screenly interface, teams can delegate digital sign content responsibilities by enabling users to work with the familiar Google Drive interface. For users who want more control over their workflows, we also have a [tutorial on creating multi-step Zaps](/community/multi-step-google-drive-zap/) that shows how to break down the process into separate steps for uploading assets, adding them to playlists, and assigning screens. If you have any questions or run into any trouble, let us know at [Screenly Support](https://support.screenly.io/hc/en-us). We are always happy to help! --- # Use OneDrive & Zapier to manage digital signage content Source: https://www.screenly.io/community/manage-content-with-onedrive-and-zapier/ > Check out this tutorial to learn how to use OneDrive and Zapier to manage Screenly recently launched its exciting [Zapier integration](/blog/2025/01/19/screenly-zapier-digital-signage-integration/), and this feature has enabled a ton of exciting digital signage workflows. One workflow, in particular, uses [OneDrive](https://onedrive.com/) and [Zapier](https://zapier.com/) to manage content on digital signs through an easy drag-and-drop process. OneDrive is popular among many teams, especially Microsoft power users. In the post below, we show how teams can set up a workflow where all they have to do is drop new content into a OneDrive folder, and that content starts showing on their screens in minutes. Learn the step-by-step process and implement this workflow in your team! ## Step 1: Prepare your Screenly account The first step is to get your Screenly account ready for action. First, [log in](https://login.screenlyapp.com/login) or sign up for a [-day free trial](https://login.screenlyapp.com/sign-up). Next, launch your first digital screen with [Screenly Anywhere](/blog/2025/01/27/screenly-anywhere-launch/). Click the *Screens* tab on the left-side menu, and then click *+ New Screen* on the new page that loads. Select *Screenly Anywhere* and visit [anywhere.screenly.io](https://anywhere.screenly.io) on a new browser tab. Next, enter the pairing *PIN code*, name your screen, and click *Add*. ![Setting up a new screen inside Screenly.](/assets/images/community/onedrive-01.webp) The next step is to get a playlist set up. Click the *Playlist* tab on the left-side screen. Then, click the *+ New Playlist* button on the top right. In the new page that loads, name your playlist *Test Playlist* or whatever you like. Then, in the *Plays On* input field, select the recently made *Test Screen*. Save this screen to the *Plays On* list, and then click *Save* again on the bottom right of the screen. ![Setting up a playlist inside the Screenly account.](/assets/images/community/onedrive-02.webp) ## Step 2: Get your OneDrive account ready Within your OneDrive account, set up a folder where you will add digital signage content. Simply click the *+ Create or upload* button on the top right corner of the page then click *Folder*. We used the name *Zapier* for this tutorial. ## Step 3: Set up your Zapier Trigger Next, [log in](https://zapier.com/app/login) to your Zapier account or [create a new one](https://zapier.com/sign-up). Once you are on the main Zapier dashboard, click the *+ Create* orange button on the top left. Select *Zaps* from the drop-down menu. Then, in the Zap building area, click the *Trigger* icon. Select the *OneDrive* app. In the *Trigger event* input field, select *New File*. Next, in the *Account* field, authenticate your OneDrive account. Click the purple *Continue* button. ![The OneDrive set up stage in Zapier](/assets/images/community/onedrive-03.webp) Now, in the *Folder* input field, select the Folder that you wish to use. We are using our *Zapier* folder. You can leave the other settings as their defaults. Click the purple *Continue* button. Next, click the purple *Test trigger* button. Then, click *Continue with selected record*. ![The OneDrive configuration stage in Zapier.](/assets/images/community/onedrive-04.webp) ## Step 4: Set up your Screenly Action The next step is to set up the *Action* you want Screenly to take when this Zap is triggered. Click the grey *Action* icon. Search for Screenly in the popup modal and select the Screenly app. Next, in the *Action* event input field, select *Complete Workflow*. ![The OneDrive-Zapier Screenly Action set up stage.](/assets/images/community/onedrive-05.webp) To link your Screenly account, you will need to provide a token key in the *Account* input field. To get your token key, click *Settings* on the left menu of your Screenly dashboard. Then, click *Security* in the submenu of the page that loads. Next, click *Show* on the *Tokens* row. You can then provide a *Name* for the token and click *Add*. You will then see the secret token key once. Enter that secret token key in the Zapier popup modal. Next, click the purple *Continue* button. ![The Screenly token key process.](/assets/images/community/onedrive-06.webp) In the Configure stage, select *Download URL* in the *File URL* field. In the *Asset Title* field, select *File Name* from the drop-down. You can also set the duration for which you want the asset to display on your screen. In the *Existing Playlist* field, choose the *Test Playlist* you recently created or the playlist you intend to use. Also, select the *Test Screen* option or whichever screen you intend to use in the *Screen* input field. Click the purple *Continue* button. Next, click the *Test step* button. ![The OneDrive app configure stage in Zapier.](/assets/images/community/onedrive-07.webp) You should then see the content in the selected playlist within your Screenly account. The content should then start displaying on your screen within a couple of minutes. That’s it! You’ve successfully set up a OneDrive digital signage workflow with Screenly and Zapier. ## Take the next step If you don’t have a Screenly account, get a [-day free trial](https://login.screenlyapp.com/sign-up) now or upgrade to a [paid plan](/pricing). Also, be sure to check out Screenly’s [digital signage player](/digital-signage-players/). [Screenly Anywhere](/blog/2025/01/27/screenly-anywhere-launch/) screens are convenient as they work with any hardware that can display a modern web browser, but dedicated digital signage players are the better choice in deployments where reliability is critical. Questions? Reach out to [Screenly Support](https://support.screenly.io/hc/en-us). We are always happy to help and answer any questions you may have. --- # Use our browser extensions to add web page content to your digital signs Source: https://www.screenly.io/community/save-web-pages-with-browser-extensions/ > Learn how to use our Google Chrome and Mozilla Firefox extensions to ![An image showing the browser extension](/assets/images/community/browser-extension-overview.webp) The Save to Screenly extension allows users to add web page content to their digital signs easily. Users can add public web pages, and, most importantly, users can add password-protected web pages to their digital signs. ### Getting started To use Save to Screenly, take the following steps: Install Save to Screenly on your Chrome or Firefox browser. You can find the extension available for free on the [Chrome Web Store](https://chromewebstore.google.com/detail/save-to-screenly/kcoehkngnbhlmdcgcadliaadlmbjmcln?hl=en) or on the [Mozilla Add-ons](https://addons.mozilla.org/en-US/firefox/addon/save-to-screenly/) page. Once Save to Screenly is installed on your web page, log in to your Screenly online account from within the extension using your Screenly token. If you don't have a token yet, you can log into your Screenly account and go to Settings, then Security. In the Tokens section, input a name for your token and click the “Add” button. Copy the token and paste it into the extension's sign-in page. Also make sure to take note of the token and save it somewhere safe. See this [guide](https://support.screenly.io/hc/en-us/articles/35897560148371-How-to-Generate-a-Screenly-API-Token) for details. Next, navigate to the web page you wish to display on your digital sign. Click the Save to Screenly icon on the top right of your web browser. If the web page you wish to display is password-protected, click the “Save Authentication” option. This option saves current session credentials to your Screenly account so that the web page can be displayed by your digital signage player. If the web page you wish to display is not password-protected, you can leave the box unchecked. Click “Add to Screenly” to save the web page as an asset in your Screenly account. ![An image showing the browser extension add asset page](/assets/images/community/browser-extension-add-asset.webp) When the web page is successfully added, you will see a notification that reads “Web page saved!” ![An image showing the browser extension page saved](/assets/images/community/browser-extension-asset-saved.webp) Next, click the “View Asset” button on the browser extension. You will then be redirected to your online Screenly account in a new tab. Within your online Screenly account, you can assign the asset to a playlist and then assign the playlist to your screen(s). ### Open Source The source code for the browser extension is available on [GitHub](https://github.com/Screenly/Browser-Extension/). Feel free to open [issues](https://github.com/Screenly/Browser-Extension/issues) or submit [pull requests](https://github.com/Screenly/Browser-Extension/pulls) if you have any suggestions or improvements. That’s all! If you have any trouble using our Save to Screenly extension, feel free to reach out to Screenly Support. --- # Using AppDynamics dashboards with Screenly's digital signs Source: https://www.screenly.io/community/display-appdynamics-dashboards/ > AppDynamics is a performance monitoring software that helps businesses AppDynamics is a software for monitoring and optimizing application performance and IT infrastructure in real-time. It offers insights into application stacks, code-level details, and user experiences, enabling quick issue resolution and better digital service reliability. It provides data and analytics to support proactive decision-making and enhance software experiences for customers and stakeholders. You can easily show your AppDynamics dashboards on a digital sign with Screenly by sharing a link from your AppDynamics account. This article will outline the steps involved in displaying your dashboards on a digital sign. ### Configure AppDynamics with Screenly Displaying an AppDynamics dashboard on a TV or monitor requires the share link for the dashboard you want to display. To get the link, log in to your AppDynamics account. The next step is to view your dashboards list in your AppDynamics account. Go to the dashboards tab by clicking on "Dashboards & Reports" in the top menu. ![Appdynamics account home page.](/assets/images/community/open-appdynamics-dashboard-tab.webp) Click on the dashboard you want on your digital sign, then click "Share" from the toolbar above it. ![Appdynamics dashboard and reports page.](/assets/images/community/share-appdynamics-dashboard.webp) Clicking on the "Share" button opens a dropdown sub-menu. From the dropdown sub-menu, click on "Share Dashboard". This creates a shared link that allows your dashboard to be accessible on other devices. ![Appdynamics dashboard and reports page.](/assets/images/community/create-appdynamics-dashboard-url.webp) Click on the "Share" button again, then click on "Copy Shared URL to Clipboard" to copy the dashboard URL. Later on in this article, you will use this URL to add your dashboard as content to your Screenly account. ![Appdynamics dashboard and reports page.](/assets/images/community/appdynamics-dashboard-url.webp) ### Setting up your digital sign with Screenly To set up your digital sign with Screenly, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step is to log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Appdynamics dashboard URL as a new content item.](/assets/images/community/input-appdynamics-dashboard-url.webp) Edit the AppDynamics content title by clicking on the input field below the "Title" on your screen. Be sure to click the "Save" button on the bottom right. In this case, I've named the AppDynamics content as "AppDynamics dashboard" for easy identification. ![The Appdynamics content page](/assets/images/community/edit-appdynamics-content-title.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. To make a new playlist, click the "+ New Playlist" button on the top right of the screen. To edit an existing playlist, click on its name from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the AppDynamics dashboard to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your AppDynamics dashboard content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Appdynamics dashboard content to a playlist](/assets/images/community/add-appdynamics-dashboard-content.webp) You will then see your AppDynamics dashboard in the playlist’s content section. Next to the dashboard content listing, change the listing’s duration to the amount of time you want the dashboard to display on your screen. Set the duration to at least, 20 seconds because Appdynamics' dashboards take a while to get loaded on the digital sign. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Appdynamics dashboard content in the playlist](/assets/images/community/set-appdynamics-content-duration.webp) To assign the playlist containing the AppDynamics dashboard content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the AppDynamics dashboard content to your screen(s) or group(s) of screens, your digital signage dashboard will display on your TV or monitor in just minutes. ### Show your AppDynamics dashboards on a digital sign Having AppDynamics dashboards on digital signs allows for real-time visibility into key performance metrics, enabling quick decision-making and enhancing communication, thereby improving overall IT management and efficiency. To see if Screenly works for your organization, sign up for a [-day free trial](https://login.screenlyapp.com/sign-up?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686). If you have any questions about how Screenly may meet your needs, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686) at any time. --- # Using Google Slides with Screenly Source: https://www.screenly.io/community/display-google-slides/ > Google Slides is a popular web based presentation tool. Learn how to [Watch the video](https://www.youtube-nocookie.com/embed/R_-eE1VO3fg) Adding Google Slides to a digital sign is easy with Screenly. Check our step-by-step video above or read the detailed article below to get started. Google Slides is a free web application that makes it easy to create visual content for slideshows. Google Slides comes packed with free design themes, fonts, and customization features so that you can make each presentation an expression of yourself and your ideas. If you need some guidance on where to start or how to structure your presentation, Google Slides also provides pre-made templates for common presentation types, such as business pitches or portfolio displays. Google Slides also works across devices so that you can easily create, edit, and view your visual content on-the-go. While Google Slides is useful for making presentations for day-to-day business use, it is also an excellent tool for creating digital signage content. Google Slides makes it easy to arrange, edit, and tweak content for the big screen. Below, we provide a step-by-step guide on how to display Google Slides digital signage content on your screen. ### Step-by-Step process for displaying Google Slides with Screenly First, open your Google Slides presentation online. Next, it is essential to set the size of your slides to "Widescreen 16:9". To adjust slide dimensions, click "File" within your Google Slides document. Then, click "Page setup" towards the bottom of the menu. ![The Google Slides side menu.](/assets/images/community/googleslides-slides-page-setup.webp) Check to make sure the dimensions are set to "Widescreen 16:9". This setting optimizes your Google Slides content for Screenly digital signage displays. After your presentation is set to "Widescreen 16:9", go through your slides and make sure to arrange your content just as you want to view it on your screen. ![A pop-up modal showing the Google Slides dimension.](/assets/images/community/googleslides-slides-page-dimension.webp) The next step is to adjust a few settings so that your Google Slides display smoothly on your digital signs. To do so, click "File" on the top left of your Google Slides document. Click the "Share" option from the dropdown menu, and then click the "Publish to the web" option from the submenu. ![The Google Slides side menu showing the publish to web option.](/assets/images/community/googleslides-slides-publish-to-web.webp) On the new popup window, select a time duration for each slide to display in the "Auto-advance slides" section. It is important to leave enough time for viewers to read each slide. Next, select the "Start slideshow as soon as the player loads" option and the "Restart the slideshow after the last slide" option. ![A popup modal showing the Google Slides publishing settings](/assets/images/community/googleslides-configure-slides-url.webp) Then, click on "Publish" to generate the public share link URL. ![A popup modal showing the Google Slides publishing settings and publish button](/assets/images/community/googleslides-generate-slides-url.webp) Please take note of the time duration you set for each slide and the number of slides in the presentation. You will need this information when configuring the content within the Screenly interface. Next, copy the generated URL to your clipboard. ![A popup modal showing the Google Slides publish to web URL](/assets/images/community/googleslides-generated-slides-url.webp) You are now ready to upload your Google Slides as digital signage content within your Screenly account. To do so, log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "+ New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" after you successfully add the URL. ![The popup modal to add the Google Slides URL as a new content item.](/assets/images/community/googleslides-input-slides-content-url.webp) The next step is to add your Google Slides content to a playlist. Click the "Playlists" tab on the left-hand side of your Screenly dashboard. Then, click the three dots to the right of the playlist you want to edit. Click "Edit" in the dropdown menu. ![The Edit option tab in the playlist settings menu](/assets/images/blog/edit-playlist.webp) Within the playlist, click the "+" icon in the "Content" section title. After clicking the icon, you will see a popup that will allow you to add the Google Slides URL to the playlist from your content item collection. ![The + button for adding content to your Screenly playlist](/assets/images/community/googleslides-add-content-to-playlist-slides.webp) In the new "Add Content to Playlist" popup, find your Google Slides content and click the "+" button next to the file. Then, click the "Done" button below. You will then see your Google Slides in the playlist’s content section. ![The popup modal to add the Google Slides content to playlist.](/assets/images/community/googleslides-add-slides-to-playlist.webp) Next to the Google Slides listing, change the listing’s duration to the total time of your Google Slides presentation. You will need to multiply the number of slides by the number of seconds for each slide. The number of seconds for each slide is what you put in the "Auto-advance slides" section in the Google Slides "Publish to the web" menu. Be sure to click "Save" on the bottom right when you are done. ![The popup modal to set the duration for the Google Slides content in the playlist.](/assets/images/community/googleslides-set-timer-for-slides.webp) To assign the playlist containing the Google Slides content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page showing input field for screens that will display the playlist.](/assets/images/community/assign-playlist-to-screen.webp) A dropdown will appear containing all your group labels and screens. Select the screen or group of screens that you want to display the playlist. ![The Edit Playlist page showing a dropdown list of your screens and group labels.](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Google Slides URL content to your screen, your Google Slides presentation will display on your TV or monitor in just minutes. That’s it! If you followed the steps above, you are now displaying Google Slides on a digital sign with Screenly. ### Get started Ready to give Screenly a shot? Get started today with a [-day free trial](https://login.screenlyapp.com/login ). --- # Using Infogram Dashboard Data Visualizations with Screenly Source: https://www.screenly.io/community/display-infogram-visualizations/ > Infogram is a data visualization tool that allows users to create engaging Infogram is a web-based dashboard data visualization and infographic creation tool that allows users to create engaging and interactive visual representations of data. It provides an easy-to-use platform for individuals, businesses, and organizations to transform complex information into clear and compelling visual formats. Infogram offers a wide range of pre-designed templates, charts, maps, and graphics, quite different from other data visualization tools such as domo data visualization tools making it accessible to users with varying levels of design and technical skills. Users can create charts, graphs, diagrams, maps, reports, and infographics by simply dragging and dropping elements onto their workspace. Infogram has found applications in a wide range of fields, including journalism, digital marketing, education, business intelligence, and data-driven storytelling. It has become a popular tool for effectively conveying information in a visually appealing and accessible manner. Overall, Infogram provides a user-friendly and powerful platform for creating and sharing data visualizations and infographics, enabling individuals and organizations to communicate complex ideas and data in a more engaging and understandable way. To learn how to display charts from your Infogram account on a digital sign with [Screenly](/foundations/digital-signage-software/). Follow the steps outlined in this article below. ### Getting your public Infogram chart URL To integrate your Infogram chart with Screenly's digital sign, you'll need to generate a share URL for your Infogram chart. This URL will be added as content to your Screenly account. For a better viewing experience, we would recommend creating multiple charts and adding them separately to your Screenly account instead of creating multiple pages in a single chart. The first step to getting the share URL is to [log in to your Infogram account](https://infogram.com/login) and open the chart you wish to display on your digital sign. At the top-right of the chart, click the "Share" button from the chart toolbar. ![An example Infogram dashboard with Share button at the top-right](/assets/images/community/share-infogram-chart.webp) After clicking the "Share" button, a new page will appear. Select the "Public on the web" option from the right side of the page and copy the URL provided. This URL will be added as content to your Screenly account. ![An example Infogram dashboard with dashboard URL at the right](/assets/images/community/infogram-chart-link.webp) ### Setting up your digital sign Now that you have your public URL, the next step is setting up your digital sign. To set up your digital sign, first purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step for showing your Infogram chart on a digital sign is adding the public URL for your chart to your online Screenly account. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button on the Screenly home page](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the Infogram dashboard URL as a new content item.](/assets/images/community/input-infogram-chart-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the Infogram chart to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your Infogram chart content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Infogram dashboard content to a playlist](/assets/images/community/add-infogram-chart-to-playlist.webp) You will then see your Infogram chart in the playlist’s content section. Next to the chart content listing, change the listing’s duration to the amount of time you want the chart to display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the Infogram dashboard content in the playlist](/assets/images/community/set-duration-for-infogram-chart.webp) To assign the playlist containing the Infogram chart content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels. Select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the Infogram chart content to your screen(s) or group(s) of screens, your digital signage chart will display on your TV or monitor in just minutes. ### We are here to help To see if Screenly works for your organization, sign up for a <a id="sign-up" href="https://login.screenlyapp.com/login">-day free trial</a>. If you have any questions about how Screenly may meet your needs, reach out to [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.195024877.1956650712.1669833223-2100226291.1664823686) at any time. --- # Using Jenkins dashboards with Screenly Source: https://www.screenly.io/community/display-jenkins-dashboards/ > Jenkins is an amazing CI/CD tool with dashboards that can be displayed ![Jenkins standard view without Dashboard View plugin.](/assets/images/community/jenkins.webp) [Jenkins](https://www.jenkins.io/) is one of the most popular CI/CD tools around. Many organizations use Jenkins on dedicated wall-mounted screens. Screenly takes the pain out of managing these screens. ### Creating your dashboards The first thing you need to do in order to use Jenkins with Screenly is to decide what to view. Some users are happy with only displaying the front page, while others prefer to go a bit further and build custom dashboards using the Dashboard View plugin. When building out your dashboards, you should keep the target resolution in mind. Most TVs are running 1920x1080px, so this is probably the resolution for which you want to optimize. Also, since you can cycle through multiple dashboards with Screenly, it may be better to break up your builds into multiple dashboards rather than trying to squeeze everything into a single dashboard. ### Setting up authentication After preparing your dashboards, copy the URL for the Jenkins dashboard you would like to display from your browser’s address bar. Once you have your dashboards and the dashboard URLs ready, we can tackle the next piece: authentication. Authentication is a bit trickier since Jenkins supports a large number of authentication mechanisms but Screenly has made it easy by creating a ready-to-use Javascript snippet on the Screenly playground. Modifying this script with your Jenkins username and password allows you to log in to your Jenkins instance in Screenly. To improve security, we recommend that you create a dedicated, locked-down (ideally, read-only) user account for the sole purpose of displaying your dashboards. ### Adding your dashboards to Screenly To display your Jenkins dashboard on your Screenly digital sign, make sure the Screenly player is connected to the same network as the computer running Jenkins. Armed with your dedicated user account and the URLs to your dashboards, we can now add your dashboards to Screenly. The recommended way to work with our JavaScript Injector is to use Screenly's Command Line Interface, so visit our [CLI repository](https://github.com/Screenly/cli/) for more information on how to work with the CLI. To add your Jenkins dashboard to Screenly, simply add your dashboards as a new URL by running the following command on our CLI: ```bash $ screenly asset add http://path-to-jenkins-dashboard Jenkins +----------------------------+-------------+------+--------+ | Id | Title | Type | Status | +----------------------------+-------------+------+--------+ | XXXXXXXXXXXXXXXXXXXXXXXXXX | Jenkins | N/A | none | +----------------------------+-------------+------+--------+ ``` After adding the asset to your Screenly account, it is important to store the Asset ID, as it will be referenced later. You can store the Asset ID for later by running the following command. ```bash $ export ASSET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX ``` With our asset created, we can now apply the JavaScript Injection for Jenkins authentication. Proceed to download [jenkins-sign-in-via-credentials.js](https://github.com/Screenly/Playground/tree/master/javascript-injectors/examples/jenkins-sign-in-via-credentials.js) from Screenly's playground and modify it with your credentials. Run the following command to add the JavaScript to the Jenkins dashboard. ```bash $ screenly asset inject-js "$ASSET_ID" /path/to/script.js 20XX-XX-XXTXX:XX:XX.XXXZ INFO [screenly] Asset updated successfully. ``` After running the above command, your Jenkins dashboard should display correctly on your screen instead of the Jenkins login page. ### We are here to help For more information on how to make use of our CLI, visit the repository for our [CLI](https://github.com/Screenly/cli) on github. To learn more about our javascript injector feature, you can also visit [Screenly's playground](https://github.com/Screenly/playground/tree/master/javascript-injectors/) on github. If you have any trouble integrating Jenkins with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Using Nagios with Screenly Source: https://www.screenly.io/community/display-nagios-dashboards/ > Nagios is probably one of the most commonly used internal monitoring ![Nagios dashboard on a digital sign](/assets/images/community/nagios-on-screenly.webp) If you've spent any time working with development, operations or at a Network Operations Center (NOC), you are most likely familiar with [Nagios](http://www.nagios.com/). While it might not be the sexiest web app, it is more or less the industry standard for monitoring both physical hardware and services. Nagios is an open-source software that helps you monitor your computer systems and network infrastructure for problems or performance issues. It works by periodically checking various aspects of your systems, such as server availability, CPU usage, memory usage, disk space, and network connectivity. If Nagios detects a problem, it can send alerts to notify you via email, SMS, or other means. Nagios can also be configured to run automated scripts to perform corrective actions, such as restarting a service or server. Overall, Nagios helps you keep track of the health and performance of your IT infrastructure, so you can identify and resolve issues before they become major problems. Once you have Nagios up and running, you most likely want to display this data on a big screen. This is where Screenly comes into play. Thanks to our powerful digital signage solution, it is both easy and cost effective to provide your team with the dashboard they need. ## Creating your dashboards The first thing you need to do in order to use Nagios with Screenly is to decide what to view. Some users are happy with displaying already-built graphs, reports or maps from their Nagios account, while others prefer to go a bit further and build custom dashboards. When building out your dashboards, you should keep the target resolution in mind. Most TVs are running 1920x1080px, so this is probably the resolution for which you want to optimize. Also, since you can cycle through multiple dashboards with Screenly, it may be better to break up your IT metrics into multiple dashboards rather than trying to squeeze everything into a single dashboard. ## Configuring Nagios for Screenly In order to display your Nagios dashboards on a digital sign, you will have to obtain the URL to the dashboard. To obtain the URL, log in to your Nagios account on your local computer. From the top-menu, click on "Dashboards". This will open the dashboards page. ![Nagios home dashboard](/assets/images/community/open-nagios-dashboards.webp) In the "Dashboards" page, from the left-hand menu, right click on the name of the dashboard you want to display on your digital sign and copy the link address to the dashboard. ![Nagios dashboards page](/assets/images/community/get-nagios-dashboard-link.webp) ## Setting up authentication Once you have your dashboards and the dashboard URLs ready, we can tackle the next piece: authentication. Screenly has made authenticating your Nagios account easy by creating a ready-to-use Javascript snippet on the [Screenly playground](https://github.com/Screenly/Playground/blob/master/javascript-injectors/examples/nagios-signin-via-credentials.js). Modifying this script with your Nagios username and password allows you to automate the login process to your Nagios instance in Screenly. ## Adding your dashboards to Screenly To display your Nagios dashboard on your Screenly digital sign, make sure the Screenly player is connected to the same network as the computer running Nagios. Armed with the URLs to your dashboards, we can now add your dashboards to Screenly. The recommended way to work with our JavaScript Injector is to use Screenly's Command Line Interface, so visit our [CLI repository](https://github.com/Screenly/cli/) for more information on how to work with the CLI. To add your Nagios dashboard to Screenly, simply add your dashboards as a new URL by running the following command on our CLI ```bash $ screenly asset add "<http://path-to-Nagios-dashboard>" Nagios +----------------------------+-------------+------+--------+ | Id | Title | Type | Status | +----------------------------+-------------+------+--------+ | XXXXXXXXXXXXXXXXXXXXXXXXXX | Nagios| N/A | none | +----------------------------+-------------+------+--------+ ``` After adding the asset to your Screenly account, it is important to store the Asset ID, as it will be referenced later. You can store the Asset ID for later by running the following command. ```bash $ export ASSET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX [...] ``` With our asset created, we can now apply the JavaScript Injection for Nagios authentication. Proceed to download [nagios-signin-via-credentials.js](https://github.com/Screenly/Playground/tree/master/javascript-injectors/examples/nagios-signin-via-credentials.js) from Screenly's playground and modify it with your credentials. Run the following command to add the JavaScript to the Nagios dashboard. ```bash $ screenly asset inject-js "$ASSET_ID" /path/to/script.js [...] ``` After running the above command, your Nagios dashboard should display correctly on your screen instead of the Nagios login page. ## We are here to help For more information on how to make use of our CLI, visit the repository for our [CLI](https://github.com/Screenly/cli) on github. To learn more about our javascript injector feature, you can also visit [Screenly's playground](https://github.com/Screenly/playground/tree/master/javascript-injectors/) on github. If you have any trouble integrating Nagios with Screenly, let us know at [Screenly Support](https://support.screenly.io/hc/en-us/requests/new?_ga=2.173173995.952909872.1676239759-1225057994.1675913478). We are here to help! --- # Using New Relic with Screenly Source: https://www.screenly.io/community/display-new-relic-dashboards/ > New Relic is a widely used Application Performance Monitoring (APM) tool. [New Relic](https://newrelic.com/) is most famous for its application performance monitoring (APM) tool, which provides users with insights into how their applications are performing and where bottlenecks are located. In addition to their APM tool, New Relic also offers a great server and network monitoring tool. With the wealth of data, New Relic provides a great overview of how your service is performing. Users can display this performance data on a digital signage dashboard. To display New Relic data on a digital sign, you can use Screenly digital signage software. The first step is to get the public links for the New Relic charts you wish to share. Next, you will add those public links as a content item within your online Screenly account. ### Steps for getting New Relic chart link To display your New Relic chart on your digital sign, you will need to get the link for the chart you wish like to display. You can do this by following the steps below: First, log in to your [New Relic account](https://one.newrelic.com/). After logging in to your New Relic account, view the side-menu navigation and click on "All entities" to view all your New Relic data sources. ![An image showing all user's New Relic entities with the left side-menu open](/assets/images/community/newrelic-all-new-relic-entities.webp) From the "All entities" page, click on the entity you would like to get a chart from. ![An image showing all user's New Relic entities](/assets/images/community/newrelic-open-new-relic-entity.webp) The next step is to identify the chart from the list of data charts available that you would like to display on your digital sign. After identifying and selecting the chart, click on the three dots at the top-right corner of the chart to get a pop-up menu for that chart. ![An image showing metric charts from a user's New Relic entity](/assets/images/community/newrelic-open-new-relic-chart-options.webp) From the pop-up menu for the chart, click on "Get chart link" to get a URL for the chart. Copy this URL, as this is the URL that you will add as a content item within your Screenly account. ![An image showing chart options for a selected New Relic chart](/assets/images/community/newrelic-get-new-relic-chart-link.webp) ### Setting up your digital sign Now that you have your public URL, the next step is to set up your digital sign. The first step for creating a digital sign is to purchase a [digital signage player](/digital-signage-players/). A digital signage player is a small physical device that renders content to your TV or monitor - Screenly offers the Screenly Player and Screenly Player Max. You can then pair your digital signage player and associated screen to your online Screenly account. The next step for displaying your New Relic chart on your digital sign is adding the public URL for the chart to your online Screenly account. To do so, follow the steps below. Log in to your online Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Next, click the URL tab in the popup modal and paste the public URL into the "Enter URL link" input field. Edit the URL by changing the "height" variable to 1020px. This edit gives a better viewing experience as it will be better suited to the resolution (1920x1080) that we will be using. Be sure to click "Finish" on the bottom right after you successfully add the URL. ![The popup modal to add the New Relic dashboard URL as a new content item.](/assets/images/community/newrelic-input-new-relic-url.webp) With the above steps completed, you can now add this asset to a playlist. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the New Relic chart to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your New Relic chart content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the New Relic dashboard content to a playlist](/assets/images/community/newrelic-add-new-relic-chart-to-playlist.webp) You will then see your New Relic chart in the playlist’s content section. Next to the chart content listing, change the listing’s duration to the time you want the chart display on your screen. Be sure to click "Save" on the bottom right. ![The popup modal to set the duration for the New Relic dashboard content in the playlist](/assets/images/community/newrelic-set-duration-for-new-relic-chart.webp) To assign the playlist containing the New Relic chart content to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown menu will appear containing all your screens and group labels, select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the New Relic chart content to your screen(s) or group(s) of screens, your New Relic chart will display on your TV or monitor in just minutes. You can then repeat the above steps for all the New Relic charts that you want to display. You can then simply add each of them as content items within your online Screenly account. ### Get started Ready to give Screenly a shot? Sign up for Screenly with a <a id="sign-up" href="https://login.screenlyapp.com/login">-day free trial</a>. --- # Using PowerPoint with Screenly Source: https://www.screenly.io/community/display-powerpoint-presentations/ > PowerPoint is likely the most popular presentation software on the market. [Watch the video](https://www.youtube-nocookie.com/embed/8x27vXo1_i4) <i>A quick screencast on how to create content for Screenly using PowerPoint.</i> Microsoft PowerPoint is likely the most popular presentation software on the market. For a lot of users, it is not only the go-to tool for presentations but also for creating charts and illustrations for their business cases. Because of this widespread use of PowerPoint, we have received a lot of requests on how to display a PowerPoint presentation on a TV or any screen with Screenly. However, due to the proprietary nature of Microsoft PowerPoint files, there is no way for us to natively support displaying these files. We do, however, recommend one of the following workarounds for your slide display. Before you begin, we recommend that you [change the resolution](https://support.microsoft.com/en-us/kb/827745) of your slide deck to 1920x1080 pixels, which is the resolution Screenly uses. ### Export your slide deck as images Perhaps the easiest way to display a PowerPoint presentation on a TV in Screenly is to simply export your slide deck as images. For more information on how to export your slide deck to images, please see [this article](https://support.microsoft.com/en-us/kb/827745). Once you have your presentation exported as images, you can just add them all as image content items in Screenly. Read below to see detailed steps on how to add images to Screenly. ### Export your slide deck as a video Another way of using PowerPoint presentations with Screenly is to export the presentation as a video. Details on how to do that can be found [here](https://support.office.com/en-au/article/Turn-your-presentation-into-a-video-c140551f-cb37-4818-b5d4-3e30815c3e83). With the video exported, just add it as a video content item to your online Screenly account. Please note that if you are using [Anthias](/ose/) (formerly known as Screenly OSE), you will likely need to re-encode the video such that it uses a supported video codec. For [Screenly's paid version](https://login.screenlyapp.com/login), on the other hand, this re-encoding will happen automatically. ### Upload your Powerpoint slide deck to Google Slides Lastly, you may want to use Google Slides (which is a part of Google Drive) with Screenly. To upload your PowerPoint slide deck to Google Slides with Screenly, simply follow the steps below: Start a new presentation on Google Slides. Click on "File" to open a dropdown menu. From the dropdown menu, click on "Import slides". ![An image showing an empty Google slide with the File dropdown menu](/assets/images/community/powerpoint-import-to-google-slides.webp) Click on the "Upload" tab. ![An Image showing a pop-up modal to import files from local computer into Google slides](/assets/images/community/powerpoint-open-slides-upload-tab.webp) Drag and drop your PowerPoint file onto the new popup modal or click the area below the "Upload" tab to find the file on your computer. ![An Image showing a pop-up modal to import files from local computer into Google slides](/assets/images/community/powerpoint-select-ppt-files.webp) After selecting the PowerPoint file, select the slides you would like to import from the popup modal, then click on "Import Slides". You can then proceed to save the Google Slides file. Click [here](/community/display-google-slides/) to view our detailed article on how to display google slides on TV with Screenly. ### Adding image/video as content to Screenly The next step for showing your PowerPoint deck on a digital sign is adding the images or video file to your online Screenly account. To do so, follow the steps below. Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Drag and drop your images/video onto the new popup modal or click the area below the "Upload" tab to find the files on your computer. After your files upload, click the "Finish" button on the bottom right of the popup modal. ![An image showing the pop-up modal to add image/video content to screenly](/assets/images/community/upload-content-to-screenly.webp) Having done the previous steps, you have successfully added your PowerPoint content to your online Screenly account. The next step is to [add your content to a playlist](https://youtu.be/CmY0q-s_3pY) and [add a screen to your account](https://youtu.be/3VWtcbsI8PA). Click on the links to watch a video on each step or continue reading this article for more information on how to do so. To add your content to a playlist, click the "Playlist" tab from the left-hand menu. If you wish to add a new playlist, click the "+ New Playlist" button on the top right of the new screen that loads. To edit the new playlist or a previously existing playlist, click on the name of the playlist you wish to edit from the list of playlists. ![The Playlists page showing lists of playlists and New Playlist button](/assets/images/community/create-new-playlist.webp) Within the playlist, click the "+" icon in the Content section. From there, you will see a popup that will allow you to add the PowerPoint content to the playlist from your content collection. ![A selected playlist page showing the + button to add content to your playlist](/assets/images/community/add-content-to-playlist.webp) In the new "Add Content to Playlist" popup, find your PowerPoint content and click the "+" button next to the file. Then, click the "Done" button below. ![The popup modal to add the Powerpoint content to a playlist](/assets/images/community/powerpoint-add-ppt-to-playlist.webp) You will then see your PowerPoint content in the playlist’s content section. If you are using an image next to the content listing, change the listing’s duration to the time you want the content to display on your screen. Be sure to click "Save" on the bottom right. If you're using exported images, make sure to add all the images to the playlist and set the duration you want for each image slide. ![The popup modal to set the duration for the Powerpoint image content in the playlist](/assets/images/community/powerpoint-set-canva-content-duration.webp) To assign the playlist to a screen, click on the "Plays On" input field in the "Edit Playlist" section. ![The Edit Playlist page](/assets/images/community/assign-playlist-to-screen.webp) A dropdown will appear containing all your screens and group labels, select the screen(s) or group(s) of screens you would like the playlist to show on. Make sure to click "Save" at the bottom of the dropdown after selecting the screen(s) or group(s) of screens you want. ![The Edit Playlist page showing a dropdown list of your screens](/assets/images/community/select-screen-for-playlist.webp) Once you assign the playlist containing the PowerPoint content to your screen(s) or group(s) of screens, your PowerPoint content will display on your TV or monitor in just minutes. ### Get started Ready to give Screenly a shot? <a id="sign-up" href="https://login.screenlyapp.com/login" >Sign up for Screenly</a> and get started with a -day free trial. --- # Using Screenly with Grafana Real Time Dashboards Source: https://www.screenly.io/community/display-grafana-dashboards/ > Grafana is an amazing data visualization tool that can be displayed on **Update**: Improved **Grafana Integration** Available - Since we published this guide, we have released a more reliable way to display Grafana dashboards on Screenly. The method below still works, but we suggest using the updated **Grafana Dashboard app**. It offers better compatibility, an easier setup, and ongoing support. Check out the new integration here: [Grafana Dashboard App](/apps/grafana-dashboard/). ![Grafana dashboard in the wild](/assets/images/community/grafana-dashboard.webp) [Grafana](https://grafana.com/) brands itself as 'the open platform for beautiful analytics and monitoring.' Grafana lives up to its claim. With Grafana, you can gather data from 51 data sources, and you can display that data on 1,392 pre-configured dashboards. Important data sources and applications that are compatible with Grafana include [Graphite](https://graphiteapp.org/), [Elasticsearch](https://www.elastic.co/), [Cloudwatch](https://aws.amazon.com/cloudwatch/), [InfluxDB](https://www.influxdata.com/), [Prometheus](https://prometheus.io/), and [Hosted Metrics](https://hostedmetrics.com/). Grafana supports a variety of data visualizations, including heat maps, histograms, bar graphs, and geo-maps. When your data falls above or below a certain threshold, you can receive a timely alert via channels such as [Slack](https://slack.com/) and [PagerDuty](https://www.pagerduty.com/). Grafana is also open source, so it's entirely free to use. The Grafana open source developer community is quite active. The Grafana developer community regularly adds features and quickly fixes discovered bugs. With Screenly, you can easily display your Grafana dashboards on your digital signs. The ability to display your data is essential, as great dashboards are only useful if your team can see the dashboard data and take action. Displaying Grafana dashboards on your digital displays ensures that your entire team has access to your real-time company metrics with ease. You can find our [Grafana support announcement](/blog/2018/11/06/digital-signage-grafana-dashboard/) on our blog. Remote teams can also take advantage of Grafana and digital signs to share company metrics with team members. Even though remote teams will not be able to gather around a large display screen in a central office, teams can still view the same real-time company data on a digital sign. Remote organizations can achieve this functionality by providing each team member with a desktop display screen such as the [Raspberry Pi Touch Display](https://www.raspberrypi.com/products/raspberry-pi-touch-display/). In fact, Screenly’s own team is entirely remote and located around the world. Each team member keeps a desktop digital signage display on their work desk with a playlist of company metrics on Grafana dashboards. ### Setting up Screenly with Grafana Real Time Dashboards To display your Grafana dashboards on your Screenly digital signs, you must take a few additional steps. These extra steps come from the need to authenticate your digital signage with Grafana. In short, you will need to use authorization header data. ### Getting your 'Service Account Token' from Grafana Before you get started, you need to get your service account token from Grafana. This is what Screenly uses to authenticate against Grafana. This service account token can be used across multiple screens. This is a more secure way of authenticating with Grafana. This is also true if you are using Grafana Cloud. To generate a service account token, take the following steps: Log in to your Grafana account and click on the "Administration" tab in the left-hand menu. Choose "Service accounts" from the "Administration" sub-menu. ![The Grafana Side Menu Bar](/assets/images/community/grafana-view-service-accounts.webp) Click on "Add service account". ![Add Service Account](/assets/images/community/grafana-add-service-account.webp) Enter a name for your service account and select "Viewer" as the role. Click "Create" to finish. ![Create Service Account](/assets/images/community/grafana-create-service-account.webp) Click on the service account you just created. Click on "Add service account token" in the right part of the screen. ![Add Service Account Token](/assets/images/community/grafana-add-service-account-token.webp) Enter a name for your service account token and click "Generate token". ![Generate Service Account Token](/assets/images/community/grafana-generate-service-account-token.webp) Copy the token and save it somewhere safe. You will need it later. ![Copy Service Account Token](/assets/images/community/grafana-service-account-token.webp) Click "Close" to finish. ### Getting your API key from Grafana 5.2 or older (legacy) If you are using older Grafana version (Grafana 5.2 or older), you need to get your API key from Grafana. This is what Screenly uses to authenticate against Grafana 5.2 or older . This API key can be used across multiple screens. To generate an API key in Grafana, you need to have administrative permissions. Assuming you have the required permissions, simply log in to your Grafana account and take the following steps: Scroll down in the left-hand menu and click the "Configuration" tab. Choose "API keys" from the "Configuration" sub-menu. ![The Grafana Side Menu Bar](/assets/images/community/grafana-view-api-keys.webp) Click on "API keys" in the top right part of the screen. Enter a name for your API key and select "Viewer" as the role. Click "Add" to finish. ![The Grafana API keys page](/assets/images/community/grafana-add-api-key.webp) You will then get a dialogue window with a command that looks like this: ```bash $ curl -H "Authorization: Bearer abc123=" \ https://grafana.yourdomain.com/api/dashboards/home ``` What you need to take note of here is "Authorization: Bearer abc123=". You will use this data in Screenly when you are adding your content items. ### Adding your Grafana dashboards to Screenly Adding a Grafana dashboard to Screenly is very straight forward. You can either add an individual chart or an entire dashboard. Once you have identified the Grafana digital dashboard that you want to display, open the dashboard and click on the share icon near the top of the screen. Then, copy the generated URL. ![A Grafana dashboard showing the Share icon](/assets/images/community/grafana-share-dashboard.webp) We recommend that you append "&kiosk" to the end of the URL. This will automatically hide the menu bars, which makes for a better viewing experience. With the URL ready, simply add this as an asset to Screenly by following the following steps: Log in to your Screenly account [here](https://login.screenlyapp.com/login). If you do not have a Screenly account, register for a [-day free trial](https://login.screenlyapp.com/sign-up). After logging in to your Screenly account, click on the "New" button on the top right of your screen. Then, click on the "Content" tab in the dropdown menu. ![The + New Content button](/assets/images/community/add-new-content.webp) Add the dashboard URL as content to your Screenly account. After you add the asset, you need to add your Grafana credentials. To do this, take the following steps: Navigate to the URL content item you just added. Select the "Advanced" link below the content title. Press the "+ Add Header" button. ![The content configuration page to add authorization headers](/assets/images/community/grafana-add-auth-header.webp) In the "Header" field, enter the text "Authorization". In the "Value" field, enter "Bearer abc123=" (replace the "abc123=" part with your token). ![The content configuration page showing input fields for authorization headers](/assets/images/community/grafana-input-auth-header.webp) Press the "Save" button on the bottom right. With the above steps completed, you can now add this asset to your playlist either by editing the playlist or creating a new playlist. Alternatively, you can also use our [CLI](https://github.com/Screenly/cli/) to perform the above task. With the Bearer Token, you would then simply do: ```bash $ screenly asset add https://grafana.mydomain.com Grafana +----------------------------+-------------+------+--------+ | Id | Title | Type | Status | +----------------------------+-------------+------+--------+ | XXXXXXXXXXXXXXXXXXXXXXXXX | Grafana | N/A | none | +----------------------------+-------------+------+--------+ ``` ```bash $ screenly asset bearer-auth XXXXXXXXXXXXXXXXXXXXXXXXX abc123= [...] ``` If you're bulk adding Grafana Dashboards, you might also take a look at the Grafana helper Python script on our [GitHub Playground](https://github.com/Screenly/Playground/tree/master/scripts/grafana). ![The Edit option tab in the playlist settings menu](/assets/images/community/edit-playlist.webp) Please note that these dashboards tend to be heavy, so we do not recommend setting the duration to anything less than 30 seconds (set the duration higher if you have multiple graphs). **Tip**: When designing your dashboards, it is recommended that you optimize the height and width of your dashboard to 1920x1080px, which is most likely the resolution used by the screen. ### Steps for adding an individual graph First, navigate to the dashboard in Grafana. Next, click on the dashboard title and select "Share". Copy the share link and open the link in a new browser tab. Then, modify the time range to the desired range (such as "Last days"). ![Menu showing timeranges that can be set for grafana dashboard](/assets/images/community/grafana-set-date-range.webp) Then, copy the new URL, and append "&kiosk" to the end. Add the URL as an content item in Screenly as described in this [video guide](https://youtu.be/HZUJWLsTVmU). Add the bearer token credentials to the newly created asset as described above. After following the steps outlined in this article, you should now have your digital dashboard display up and running on your Screenly digital signs. If you have any trouble getting your Grafana live dashboards and/or charts to display on your screens, contact Screenly Support at any time. We are always happy to help! If you do not have a Screenly account, sign up for a [-day free trial](https://login.screenlyapp.com/sign-up). --- # Using Tailscale with Anthias Source: https://www.screenly.io/community/using-tailscale-with-anthias/ > Tailscale is a great way to remotely access your Anthias installation. [Tailscale](https://tailscale.com/) describes itself as a way to 'easily manage access to private resources.' Think of it as VPN on steroids. With the Tailscale client installed on your Anthias installation and laptop, you can remotely access it from anywhere. ## Installing Tailscale on Anthias In order to use Tailscale, you need to have installed Anthias by yourself on Raspberry Pi OS. The official disk images are using [Balena Hub](https://hub.balena.io), which is great for most users, but will not allow you to install custom software along Anthias. The easiest way to install Tailscale is to use the installation script. SSH into your Raspberry Pi running Anthias and run: ```bash curl -fsSL https://tailscale.com/install.sh | sh ``` Tailscale will install, and at the end, you will be asked to pair your Raspberry Pi with your Tailscale account. ## Accessing Anthias remotely Once you've successfully completed the installation of Tailscale, you should be able to see your Raspberry Pi in the Tailscale [admin interface](https://login.tailscale.com/login?next_url=%2Fadmin). To access your Anthias installation remotely, simply copy the IP to your Raspberry Pi, and you should be able to access your Anthias installation remotely. ![The Screenly interface with the PagerDuty integration setup menu.](/assets/images/community/anthias-interface.webp) --- # Weather-driven playlists with the API Source: https://www.screenly.io/community/weather-driven-playlists-with-the-api/ > A predicate knows the time and the day, not the forecast. Here is a job that reads the weather each morning and rewrites which playlist is allowed to play. A screen that promotes hot drinks on the coldest morning of the year is worth more than one showing the same rotation it showed in July. So is a yard board that puts an ice warning first when there has been a frost, and a cinema foyer that pushes the afternoon showing when it is going to rain all day. None of that can come from the schedule itself. A playlist decides when it may play using a **predicate**, and a predicate knows three things: the time, the date and the day of week. It has never heard of rain. The weather has to arrive from your side, as a job that reads a forecast and rewrites the schedule to match. This tutorial builds that job. ## What you need An [API token](/docs/developers/overview/api-tokens/) and a screen already paired to your workspace. The forecast comes from [Open-Meteo](https://open-meteo.com/), which needs no key, so the whole thing runs without signing up for anything else. Every example below is plain HTTP against the same four settings, and reads them from the environment whichever language you run it in. Set them in the shell you are working in: ```bash export API_TOKEN=your-token-here export API=https://api.screenlyapp.com/api/v4.1 export LAT=51.5072 export LON=-0.1276 ``` The same four lines without `export` make a `.env` file, which is what you will want once this runs on a cron rather than in a terminal you have open. Either way the token is a credential, so keep it out of the repository. There is no Screenly SDK to install. The only thing that differs by language is what you need to parse JSON and make requests: ```bash # curl is already there. jq reads the responses. brew install jq # or: apt install jq ``` ```bash pip install requests ``` ```bash # Node 18 or newer, for a global fetch. Run the script as an ES module, # since the examples await at the top level. node --version ``` ```bash # Node 18 or newer, plus a way to run TypeScript directly. npm install -D typescript tsx @types/node ``` ## The shape of it One playlist per condition, each holding the content for that kind of day: `Hot day`, `Cold day`, `Wet day`, `Mild day`. All four are assigned to the same screens and stay that way. Nothing about the assignment changes from one day to the next. What changes is which of them is allowed to play. Each morning the job reads the forecast, gives the matching playlist a predicate covering today's trading hours, and gives the other three `FALSE`. A playlist whose predicate is `FALSE` is never eligible, so the screen simply plays the one that is. Building it this way means the content for a cold day is prepared once, by whoever prepares content, and the job only ever writes one short string per playlist. ## Writing the predicate Three variables are available, and they are evaluated on the player, in that screen's local time: | Variable | What it holds | | --- | --- | | `$TIME` | Milliseconds since local midnight, so 8am is `28800000` | | `$DATE` | A calendar day as an epoch timestamp in milliseconds | | `$WEEKDAY` | Day of week, 0 for Monday through 6 for Sunday | Because the job runs again every morning, the predicate does not need a date in it. Today's decision only has to survive until tomorrow's run replaces it. ```bash # Trading hours, 8am to 5pm. Write the hours in 24-hour time: the hour is the # number you multiply, so there is no am/pm to convert first. start=$(( 8 * 3600000 )) end=$(( 17 * 3600000 )) open_today="TRUE AND (\$TIME BETWEEN {$start, $end})" never="FALSE" ``` ```python def ms(hour, minute=0): return (hour * 60 + minute) * 60_000 def time_window(start, end): return f"TRUE AND ($TIME BETWEEN {{{ms(*start)}, {ms(*end)}}})" NEVER = "FALSE" # Trading hours, 8am to 5pm, written in 24-hour time so no am/pm has to be # converted before it reaches ms(). OPEN_TODAY = time_window((8, 0), (17, 0)) ``` ```javascript const ms = (hour, minute = 0) => (hour * 60 + minute) * 60000; const timeWindow = ([startHour, startMin], [endHour, endMin]) => `TRUE AND ($TIME BETWEEN {${ms(startHour, startMin)}, ${ms(endHour, endMin)}})`; const NEVER = 'FALSE'; // Trading hours, 8am to 5pm, written in 24-hour time so no am/pm has to be // converted before it reaches ms(). const OPEN_TODAY = timeWindow([8, 0], [17, 0]); ``` ```typescript type Clock = [hour: number, minute: number]; const ms = (hour: number, minute = 0): number => (hour * 60 + minute) * 60000; const timeWindow = (start: Clock, end: Clock): string => `TRUE AND ($TIME BETWEEN {${ms(...start)}, ${ms(...end)}})`; const NEVER = 'FALSE'; // Trading hours, 8am to 5pm, written in 24-hour time so no am/pm has to be // converted before it reaches ms(). const OPEN_TODAY: string = timeWindow([8, 0], [17, 0]); ``` Milliseconds since midnight is an awkward number to write by hand and an easy one to generate, which is most of the argument for doing this over the API rather than in the rule editor. Full syntax, including `$DATE` and how several rules become an `OR` chain, is in [Predicates](/docs/scheduling/advanced/predicates/). ## Create the four playlists This part runs once. `predicate` is a field on the playlist, so each one is born with a schedule, and `FALSE` is the right starting point: nothing plays until the first run of the job decides what should. `Prefer: return=representation` makes the API hand back what it created, including the `id` you need to patch it later. Keep those four ids somewhere the job can read them. ```bash for title in "Hot day" "Cold day" "Wet day" "Mild day"; do curl -s -X POST "$API/playlists" \ -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -H "Prefer: return=representation" \ -d "{\"title\": \"$title\", \"predicate\": \"FALSE\"}" \ | jq -r '.[0] | "\(.title)\t\(.id)"' done ``` ```python import os import requests API = os.environ["API"] HEADERS = { "Authorization": f"Token {os.environ['API_TOKEN']}", "Content-Type": "application/json", "Prefer": "return=representation", } playlists = {} for condition, title in [ ("hot", "Hot day"), ("cold", "Cold day"), ("wet", "Wet day"), ("mild", "Mild day"), ]: response = requests.post( f"{API}/playlists", headers=HEADERS, json={"title": title, "predicate": NEVER}, ) response.raise_for_status() playlists[condition] = response.json()[0]["id"] ``` ```javascript const API = process.env.API; const headers = { Authorization: `Token ${process.env.API_TOKEN}`, 'Content-Type': 'application/json', Prefer: 'return=representation', }; const titles = { hot: 'Hot day', cold: 'Cold day', wet: 'Wet day', mild: 'Mild day', }; const playlists = {}; for (const [condition, title] of Object.entries(titles)) { const response = await fetch(`${API}/playlists`, { method: 'POST', headers, body: JSON.stringify({ title, predicate: NEVER }), }); if (!response.ok) throw new Error(await response.text()); const [playlist] = await response.json(); playlists[condition] = playlist.id; } ``` ```typescript type Condition = 'hot' | 'cold' | 'wet' | 'mild'; interface Playlist { id: string; title: string; predicate: string; } const API = process.env.API!; const headers: Record<string, string> = { Authorization: `Token ${process.env.API_TOKEN}`, 'Content-Type': 'application/json', Prefer: 'return=representation', }; const titles: Record<Condition, string> = { hot: 'Hot day', cold: 'Cold day', wet: 'Wet day', mild: 'Mild day', }; const playlists = {} as Record<Condition, string>; for (const [condition, title] of Object.entries(titles) as [Condition, string][]) { const response = await fetch(`${API}/playlists`, { method: 'POST', headers, body: JSON.stringify({ title, predicate: NEVER }), }); if (!response.ok) throw new Error(await response.text()); const [playlist]: Playlist[] = await response.json(); playlists[condition] = playlist.id; } ``` Fill each one with content and assign all four to the same screens through a [label](/docs/labels/), which is also a one-off. [Get started](/docs/developers/api/overview/get-started/) covers uploading an asset, adding it to a playlist, and finding the label id. ## Read the forecast and pick a condition Open-Meteo returns a daily maximum temperature and a precipitation total for the site. The thresholds below are a starting point and the interesting part of the tuning: what counts as a hot day for a QSR promoting cold drinks is not what counts as one for a yard board warning about heat stress. ```bash forecast="https://api.open-meteo.com/v1/forecast?latitude=$LAT&longitude=$LON&daily=temperature_2m_max,precipitation_sum&timezone=auto&forecast_days=1" condition=$(curl -s "$forecast" | jq -r ' .daily | if .precipitation_sum[0] >= 1 then "wet" elif .temperature_2m_max[0] >= 24 then "hot" elif .temperature_2m_max[0] <= 8 then "cold" else "mild" end') ``` ```python FORECAST = "https://api.open-meteo.com/v1/forecast" def condition_today(lat, lon): daily = requests.get( FORECAST, params={ "latitude": lat, "longitude": lon, "daily": "temperature_2m_max,precipitation_sum", "timezone": "auto", "forecast_days": 1, }, timeout=10, ).json()["daily"] rain = daily["precipitation_sum"][0] high = daily["temperature_2m_max"][0] if rain >= 1: return "wet" if high >= 24: return "hot" if high <= 8: return "cold" return "mild" ``` ```javascript async function conditionToday(lat, lon) { const url = new URL('https://api.open-meteo.com/v1/forecast'); url.search = new URLSearchParams({ latitude: lat, longitude: lon, daily: 'temperature_2m_max,precipitation_sum', timezone: 'auto', forecast_days: 1, }); const { daily } = await fetch(url).then((r) => r.json()); const rain = daily.precipitation_sum[0]; const high = daily.temperature_2m_max[0]; if (rain >= 1) return 'wet'; if (high >= 24) return 'hot'; if (high <= 8) return 'cold'; return 'mild'; } ``` ```typescript interface DailyForecast { daily: { temperature_2m_max: number[]; precipitation_sum: number[]; }; } async function conditionToday(lat: number, lon: number): Promise<Condition> { const url = new URL('https://api.open-meteo.com/v1/forecast'); url.search = new URLSearchParams({ latitude: String(lat), longitude: String(lon), daily: 'temperature_2m_max,precipitation_sum', timezone: 'auto', forecast_days: '1', }).toString(); const { daily }: DailyForecast = await fetch(url).then((r) => r.json()); const rain = daily.precipitation_sum[0]; const high = daily.temperature_2m_max[0]; if (rain >= 1) return 'wet'; if (high >= 24) return 'hot'; if (high <= 8) return 'cold'; return 'mild'; } ``` `timezone=auto` matters. It makes the daily figures cover the site's own calendar day, which is the same day the predicate is evaluated against on the player. ## Rewrite the schedules Every playlist gets a `PATCH`, including the three that are being switched off. Writing all four each morning means the state on the screen matches today's forecast and not some mixture of today's and last Thursday's. ```bash for entry in "hot:$HOT_ID" "cold:$COLD_ID" "wet:$WET_ID" "mild:$MILD_ID"; do key=${entry%%:*} id=${entry#*:} if [ "$key" = "$condition" ]; then predicate=$open_today else predicate=$never fi curl -s -X PATCH "$API/playlists?id=eq.$id" \ -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"predicate\": \"$predicate\"}" done ``` ```python today = condition_today(os.environ["LAT"], os.environ["LON"]) for condition, playlist_id in playlists.items(): requests.patch( f"{API}/playlists", headers=HEADERS, params={"id": f"eq.{playlist_id}"}, json={"predicate": OPEN_TODAY if condition == today else NEVER}, ).raise_for_status() ``` ```javascript const today = await conditionToday(process.env.LAT, process.env.LON); for (const [condition, playlistId] of Object.entries(playlists)) { await fetch(`${API}/playlists?id=eq.${playlistId}`, { method: 'PATCH', headers, body: JSON.stringify({ predicate: condition === today ? OPEN_TODAY : NEVER, }), }); } ``` ```typescript const today = await conditionToday(Number(process.env.LAT), Number(process.env.LON)); for (const [condition, playlistId] of Object.entries(playlists)) { await fetch(`${API}/playlists?id=eq.${playlistId}`, { method: 'PATCH', headers, body: JSON.stringify({ predicate: condition === today ? OPEN_TODAY : NEVER, }), }); } ``` The filter goes in the query string because the API is built on [PostgREST](https://postgrest.org/). A `PATCH` without one updates every playlist in the workspace, so never send it without `id=eq.`. A successful `PATCH` answers `204` with no body, so there is nothing to read back. Add `Prefer: return=representation` if you want the updated playlist returned. Put the whole thing on a morning cron, early enough that it has landed before the doors open. ## The screen has to be online to hear about it A predicate change reaches a player the same way any other change does, so this only works on screens that are actually connected. That is the good case, and it is fast. A screen that is online usually holds an open connection, and a schedule change is a few dozen bytes with no files attached: nothing to download, nothing to transcode. Swapping which playlist is eligible lands almost immediately. If the connection has dropped and the screen is pinging instead, it waits for the next ping, which is a matter of minutes rather than seconds. Adding content is the slower case. A playlist whose assets the screen has never seen has to fetch them first, and video takes considerably longer than images. This is the argument for creating the four playlists and filling them once, ahead of time, rather than uploading a wet-day video at 7am and hoping. By the time the weather job runs, every screen already holds all four; the only thing crossing the wire is the decision. A screen that is offline keeps playing whatever it was last told, because schedules are held on the device. It will not switch to the cold-day playlist, and it will not go dark either. When it reconnects it catches up on its own. [Status and sync](/docs/screens/monitoring/status-and-sync/) has the check-in intervals, and [alerts](/docs/screens/monitoring/alerts/) is how you find out a screen has been missing for a week rather than noticing in the spring. ## Two things to know before you rely on this A predicate written by hand is read-only in the dashboard. The rule editor displays schedules in the shape it generates, an `OR` chain of `AND` groups, and anything else shows without editing controls. The playlist plays exactly as written, but a colleague cannot fix it by clicking. [Complex schedules](/docs/scheduling/advanced/complex-schedules/) covers what happens. Nothing warns you about a predicate that never matches. `FALSE` is the point here, but `$TIME BETWEEN {61200000, 28800000}` is equally valid and equally silent, and the only symptom is a screen that quietly never plays the playlist. The same goes for a job that fails: yesterday's decision stays on the screens until something replaces it, so the run is worth alerting on. ## The whole thing in one file The pieces above, assembled. This is the file that goes on the cron: it reads the forecast, works out today's condition, and writes a predicate to all four playlists. Creating the playlists and assigning them to screens stays a one-off, so it is not in here. It expects `API_TOKEN`, `API`, `LAT`, `LON` and the four playlist ids from the creation step in the environment. ```bash #!/usr/bin/env bash # weather-playlists.sh set -euo pipefail # Trading hours, 8am to 5pm, in 24-hour time. start=$(( 8 * 3600000 )) end=$(( 17 * 3600000 )) open_today="TRUE AND (\$TIME BETWEEN {$start, $end})" never="FALSE" forecast="https://api.open-meteo.com/v1/forecast?latitude=$LAT&longitude=$LON" forecast+="&daily=temperature_2m_max,precipitation_sum&timezone=auto&forecast_days=1" condition=$(curl -fsS "$forecast" | jq -r ' .daily | if .precipitation_sum[0] >= 1 then "wet" elif .temperature_2m_max[0] >= 24 then "hot" elif .temperature_2m_max[0] <= 8 then "cold" else "mild" end') echo "Forecast for today: $condition" for entry in "hot:$HOT_ID" "cold:$COLD_ID" "wet:$WET_ID" "mild:$MILD_ID"; do key=${entry%%:*} id=${entry#*:} if [ "$key" = "$condition" ]; then predicate=$open_today else predicate=$never fi curl -fsS -o /dev/null -X PATCH "$API/playlists?id=eq.$id" \ -H "Authorization: Token $API_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"predicate\": \"$predicate\"}" done ``` ```python #!/usr/bin/env python3 """weather_playlists.py: allow one playlist to play, by today's forecast.""" import os import requests API = os.environ["API"] HEADERS = { "Authorization": f"Token {os.environ['API_TOKEN']}", "Content-Type": "application/json", } PLAYLISTS = { "hot": os.environ["HOT_ID"], "cold": os.environ["COLD_ID"], "wet": os.environ["WET_ID"], "mild": os.environ["MILD_ID"], } def ms(hour, minute=0): return (hour * 60 + minute) * 60_000 def time_window(start, end): return f"TRUE AND ($TIME BETWEEN {{{ms(*start)}, {ms(*end)}}})" NEVER = "FALSE" # Trading hours, 8am to 5pm, in 24-hour time. OPEN_TODAY = time_window((8, 0), (17, 0)) def condition_today(lat, lon): daily = requests.get( "https://api.open-meteo.com/v1/forecast", params={ "latitude": lat, "longitude": lon, "daily": "temperature_2m_max,precipitation_sum", "timezone": "auto", "forecast_days": 1, }, timeout=10, ).json()["daily"] rain = daily["precipitation_sum"][0] high = daily["temperature_2m_max"][0] if rain >= 1: return "wet" if high >= 24: return "hot" if high <= 8: return "cold" return "mild" def main(): today = condition_today(os.environ["LAT"], os.environ["LON"]) print(f"Forecast for today: {today}") for condition, playlist_id in PLAYLISTS.items(): requests.patch( f"{API}/playlists", headers=HEADERS, params={"id": f"eq.{playlist_id}"}, json={"predicate": OPEN_TODAY if condition == today else NEVER}, timeout=10, ).raise_for_status() if __name__ == "__main__": main() ``` ```javascript #!/usr/bin/env node // weather-playlists.mjs: allow one playlist to play, by today's forecast. const API = process.env.API; const headers = { Authorization: `Token ${process.env.API_TOKEN}`, 'Content-Type': 'application/json', }; const playlists = { hot: process.env.HOT_ID, cold: process.env.COLD_ID, wet: process.env.WET_ID, mild: process.env.MILD_ID, }; const ms = (hour, minute = 0) => (hour * 60 + minute) * 60000; const timeWindow = ([startHour, startMin], [endHour, endMin]) => `TRUE AND ($TIME BETWEEN {${ms(startHour, startMin)}, ${ms(endHour, endMin)}})`; const NEVER = 'FALSE'; // Trading hours, 8am to 5pm, in 24-hour time. const OPEN_TODAY = timeWindow([8, 0], [17, 0]); async function conditionToday(lat, lon) { const url = new URL('https://api.open-meteo.com/v1/forecast'); url.search = new URLSearchParams({ latitude: lat, longitude: lon, daily: 'temperature_2m_max,precipitation_sum', timezone: 'auto', forecast_days: 1, }); const response = await fetch(url); if (!response.ok) throw new Error(`Forecast failed: ${response.status}`); const { daily } = await response.json(); const rain = daily.precipitation_sum[0]; const high = daily.temperature_2m_max[0]; if (rain >= 1) return 'wet'; if (high >= 24) return 'hot'; if (high <= 8) return 'cold'; return 'mild'; } async function main() { const today = await conditionToday(process.env.LAT, process.env.LON); console.log(`Forecast for today: ${today}`); for (const [condition, playlistId] of Object.entries(playlists)) { const response = await fetch(`${API}/playlists?id=eq.${playlistId}`, { method: 'PATCH', headers, body: JSON.stringify({ predicate: condition === today ? OPEN_TODAY : NEVER, }), }); if (!response.ok) throw new Error(await response.text()); } } main().catch((error) => { console.error(error); process.exit(1); }); ``` ```typescript #!/usr/bin/env tsx // weather-playlists.ts: allow one playlist to play, by today's forecast. type Condition = 'hot' | 'cold' | 'wet' | 'mild'; type Clock = [hour: number, minute: number]; interface DailyForecast { daily: { temperature_2m_max: number[]; precipitation_sum: number[]; }; } const API = process.env.API!; const headers: Record<string, string> = { Authorization: `Token ${process.env.API_TOKEN}`, 'Content-Type': 'application/json', }; const playlists: Record<Condition, string> = { hot: process.env.HOT_ID!, cold: process.env.COLD_ID!, wet: process.env.WET_ID!, mild: process.env.MILD_ID!, }; const ms = (hour: number, minute = 0): number => (hour * 60 + minute) * 60000; const timeWindow = (start: Clock, end: Clock): string => `TRUE AND ($TIME BETWEEN {${ms(...start)}, ${ms(...end)}})`; const NEVER = 'FALSE'; // Trading hours, 8am to 5pm, in 24-hour time. const OPEN_TODAY: string = timeWindow([8, 0], [17, 0]); async function conditionToday(lat: number, lon: number): Promise<Condition> { const url = new URL('https://api.open-meteo.com/v1/forecast'); url.search = new URLSearchParams({ latitude: String(lat), longitude: String(lon), daily: 'temperature_2m_max,precipitation_sum', timezone: 'auto', forecast_days: '1', }).toString(); const response = await fetch(url); if (!response.ok) throw new Error(`Forecast failed: ${response.status}`); const { daily }: DailyForecast = await response.json(); const rain = daily.precipitation_sum[0]; const high = daily.temperature_2m_max[0]; if (rain >= 1) return 'wet'; if (high >= 24) return 'hot'; if (high <= 8) return 'cold'; return 'mild'; } async function main(): Promise<void> { const today = await conditionToday(Number(process.env.LAT), Number(process.env.LON)); console.log(`Forecast for today: ${today}`); for (const [condition, playlistId] of Object.entries(playlists)) { const response = await fetch(`${API}/playlists?id=eq.${playlistId}`, { method: 'PATCH', headers, body: JSON.stringify({ predicate: condition === today ? OPEN_TODAY : NEVER, }), }); if (!response.ok) throw new Error(await response.text()); } } main().catch((error) => { console.error(error); process.exit(1); }); ``` ## Where to go next [Predicates](/docs/scheduling/advanced/predicates/) has the full expression syntax. [Priority override](/docs/playlists/playback/priority-override/) is what you want if a severe weather notice should interrupt everything else rather than share the screen. The [v4.1 API reference](https://developer.screenly.io/api_v4_1/) has every endpoint and field. If what you actually want is the forecast on the screen rather than the forecast deciding what plays, that is the [Weather app](/apps/weather/), which needs none of this. If a screen is not switching the way the forecast says it should, [contact support](https://support.screenly.io/hc/en-us/requests/new) and we will take a look. ---