# Obscreen Docs (full) > Documentation for Obscreen, lean and modern digital signage system. Full technical documentation of Obscreen, generated from https://docs.obscreen.io. Legal pages are listed in https://docs.obscreen.io/llms.txt. --- Source: https://docs.obscreen.io/ # What is Obscreen? [Obscreen](https://obscreen.io) is a simple tool helping you to organizes and broadcasts media to your screens through any web browser. It uses a simple approach that avoids bulky hardware or complicated configurations. Keep reading to learn more, or [get started](https://docs.obscreen.io/install) right away. ## Why Obscreen? - **Simple Architecture.** Starts in 2 seconds, uses any web browser to view media. Dead simple. - **Fancy graphical user interface.** Colorful, modern and easy to use. - **Lightweight.** Minimal dependencies Python application and embeddable SQLite database. - **Flexible Content Rotation.** Set up dynamic playlists to automatically rotate content across your screens. - **Screen Fleet Management.** Easily manage and control multiple screens from a centralized dashboard. - **Authentication Management.** Securely manage user authentication and access permissions. - **USB Embeddable content.** Plays content from flashdrive in offline mode. - **Extendable.** Core API & Plugin system to extend capabilities. - **Multi Languages.** Up to 16 languages supported. - [Screen] **Chromecast.** Cast pictures and iframes to Chromecasts Visit the [website](https://obscreen.io) for demonstrations, or explore our latest updates in the [changelog](https://docs.obscreen.io/releases). ## Getting Started Follow our [Installation Guide](https://docs.obscreen.io/install) guide. ## Issue Tracker For reporting bugs and requesting features, please use the [issue tracker.](https://github.com/obscreen/obscreen/issues) ## Support If you require assistance with Obscreen, please [initiate a discussion](https://github.com/obscreen/obscreen/issues/new/choose) or send an email to [support](mailto:hello@obscreen.io). ## Community Become part of our [Discord community](https://discord.obscreen.io) to interact with fellow Obscreen users. ## Behind the Scenes Curious about the intricate details behind Obscreen? Explore the [learn more](https://docs.obscreen.io/learn-more) overview. ## Documentation This documentation is open source and is available on [GitHub](https://github.com/obscreen/documentation). --- Source: https://docs.obscreen.io/install # Get Started To get started with Obscreen, you need to install the Studio (server) and Player (client). Below are the available installation options. ## Studio Setup (Server) The Studio is responsible for managing content and providing the Player with the necessary content to display. You can install it on **Linux**, **macOS**, or **Windows**. [Install Studio](https://docs.obscreen.io/install/studio-server) ## Player Setup (Client) The Player is responsible for displaying the content provided by the Studio. You can run it on a **Raspberry Pi**, any **Linux** computer, a **Smart TV** or any other device with a **browser**. [Install Player](https://docs.obscreen.io/install/player-client) --- Source: https://docs.obscreen.io/faq # Frequently Asked Questions Please search for your question, or [open an issue](https://github.com/obscreen/obscreen/issues/new/choose) if you can't find an answer. ## Can I install both the server and the client on the same device? Yes, you can install both the Studio and Player on a single device, such as a Raspberry Pi connected to a TV. For more information, please refer to the [deployment types](https://docs.obscreen.io/deployment-types) section of the documentation. ## Can I use a Smart TV without a Raspberry Pi? Yes. Depending on the brand, you have several options: - **LG commercial displays**: install the native [Obscreen Player for LG webOS](https://docs.obscreen.io/install/player-client/lg-webos). - **Samsung commercial displays**: the native [Samsung Tizen](https://docs.obscreen.io/install/player-client/samsung-tizen) app is coming soon. - **Any other Smart TV with a built-in browser**: open the playlist URL directly in the TV's web browser. See the [Generic Smart TV](https://docs.obscreen.io/install/player-client/generic-smart-tv) page. ## How do I install Obscreen on a Raspberry Pi? First, check out [deployment section](https://docs.obscreen.io/deployment-types) of the documentation. After you chose the type of installation, you'll find the instructions to [install](https://docs.obscreen.io/install) Obscreen on a Raspberry Pi ## How does the fleet screen management feature work? The fleet screen management feature allows you to manage multiple screens from a central location. It is designed to work with the Obscreen Player installed on each screen. Check out the [fleet management feature](https://docs.obscreen.io/features/players/fleet-screen-management) section of the documentation to learn more. ## Does Obscreen support video autoplay? Yes, Obscreen supports video autoplay but be aware that it requires [some configuration](https://docs.obscreen.io/faq#why-aren-t-the-video-starting-automatically). ## Why aren't the video starting automatically? This is "normal" behavior. Videos do not play automatically in Chrome because it requires user interaction with the page (a simple click inside the webpage is enough). If you open the console, you'll see the error: [Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first...](https://goo.gl/xX8pDD) To resolve this, you need to use the Chrome flag `--autoplay-policy=no-user-gesture-required`. If your player is a Raspberry Pi with Obscreen Player installed, this issue doesn't occur because the flag is inserted automatically for you, otherwise you need to add it manually by yourself. ## What kind of API does Obscreen offer for developers? Obscreen offers a REST API to control contents, playlist and slides in Studio instance. You can find the documentation [here](https://docs.obscreen.io/features/advanced/api). ## I'm locked out of the Studio because I forgot my password. How can I reset it? You have to start Studio with `SAFE_MODE=true` environment variable to bypass login and be able to reset the password. --- Source: https://docs.obscreen.io/releases # What's New You can find releases and changelogs on [GitHub](https://github.com/obscreen/obscreen/releases) --- Source: https://docs.obscreen.io/demo # Live Demo ## Try it! Demo Server: [https://demo.obscreen.io](https://demo.obscreen.io/login?username=admin&password=admin) > **Warning** > > It is a temporary live demo, all data will be deleted after `30 minutes`. --- Source: https://docs.obscreen.io/contact-us # Contact Us ## Discord You can join our community [Discord server](https://discord.obscreen.io) to chat with us and other Obscreen users. ## Online form You can also use our [online form](https://www.obscreen.io/contact-us) to contact us. ## Email You can contact us at hello@obscreen.io --- Source: https://docs.obscreen.io/install/intro # Intro To get started with Obscreen, you need to install the Studio (server) and Player (client). Below are the available installation options. ## Studio Setup (Server) The Studio is responsible for managing content and providing the Player with the necessary content to display. You can install it on **Linux**, **macOS**, or **Windows**. [Install Studio](https://docs.obscreen.io/install/studio-server) ## Player Setup (Client) The Player is responsible for displaying the content provided by the Studio. You can run it on a **Raspberry Pi**, any **Linux** computer, a **Smart TV** or any other device with a **browser**. [Install Player](https://docs.obscreen.io/install/player-client) --- Source: https://docs.obscreen.io/install/studio-server # Studio Setup (Server) The Studio serves as the central hub for managing and organizing your content, delivering everything the Player needs to display. In essence, it functions as a Content Management System (CMS) designed specifically for your media. There is two ways to install the Studio: - [Obscreen Cloud](https://docs.obscreen.io/install/studio-server/obscreen-cloud) (recommended) - [Docker](https://docs.obscreen.io/install/studio-server/docker) --- Source: https://docs.obscreen.io/install/studio-server/obscreen-cloud # Studio on Obscreen Cloud Obscreen Cloud is the simplest solution to get started with Obscreen. It's a hosted and managed cloud service that allows you to use Obscreen without having to install or maintain your own server. ## Subscription To use Obscreen Cloud, you need to subscribe to a Basic or Premium plan on the [pricing page](https://www.obscreen.io/pricing). ## Cloud service benefits Obscreen Cloud offers all the usual benefits of cloud services: - **Simplicity**: No installation or technical configuration required. Your instance is ready to use upon delivery. - **Managed maintenance**: Updates, security, and maintenance are automatically handled by our team. - **Availability**: Your instance is accessible 24/7 from anywhere with an internet connection. - **Automatic backups**: Your data is regularly backed up to ensure its security. - **Support included**: Benefit from technical support for your cloud instance. - **Low cost**: For a small monthly fee, you get access to professional infrastructure without any initial investment. ## Instance delivery After purchasing your subscription, the delivery of your instance may take several minutes. You will receive a confirmation email as soon as your instance is ready and you can start using it. > **Initial connection** > > By default, your Obscreen Cloud instance has **no connection** configured. To enable connections, you need to go to **General Settings**, then to the **Security** section of your instance. --- Source: https://docs.obscreen.io/install/studio-server/docker # Studio on Docker These scripts are using docker on linux. Adapt them to your OS if needed. ## Prerequisites ##### 1. Having docker installed ```bash curl -sSL get.docker.com | sh && sudo usermod -aG docker $(whoami) ``` ##### 2. Logout then login again ```bash logout ``` ##### 3. Prepare application data ```bash cd ~ && mkdir -p obscreen/data/db obscreen/data/uploads obscreen/license && cd obscreen ``` ##### 4. Put your license file You can either: - Upload your license file to the Studio Server at first run. - Or place the license file `obscreen.lic` in the `license` directory at the root of the application files using a docker volume. > **License file** > > You need to have a valid license file to use the studio server. Learn more about [how to get a license](https://obscreen.io/pricing). ## > Run with docker compose (recommended) ```bash curl https://raw.githubusercontent.com/obscreen/obscreen/master/docker-compose.yml > docker-compose.yml && docker compose up --detach --pull=always ``` ## > Run with docker run ```bash docker run -d --restart=always --name obscreen --pull=always --net=host \ -v /etc/localtime:/etc/localtime:ro \ -v ./license:/app/license \ -v ./data:/app/data \ -e PORT=5000 \ -p 5000:5000 \ obscreen/obscreen:latest ``` ## Configuration - Application settings are available at `http:///settings` page after run. - Server configuration is editable through environment variables too. ## Troubleshoot Check logs with `docker compose logs -f` ## Upgrade and Restart Containers ### For Docker Compose To pull the latest image: - Go to where the `docker-compose.yml` file is located (`~/obscreen` for manual install or `/usr/share/obscreen/obscreen-studio` for ObscreenOS install) - Stop the container - Pull new container - Restart it with the same options ```bash cd [where your docker-compose.yml file is located] docker compose down docker compose pull docker compose up --detach --pull=always ``` ### For Docker (Single Container) To pull the latest image, stop the container and restart it with the same options (`--pull=always` does the trick), use the following command: ```bash docker stop obscreen docker run -d --restart=always --name obscreen --pull=always --net=host \ -v /etc/localtime:/etc/localtime:ro \ -v ./license:/app/license \ -v ./data:/app/data \ -e PORT=5000 \ -p 5000:5000 \ obscreen/obscreen:latest ``` ``` --- Source: https://docs.obscreen.io/install/player-client # Player Setup (Client) The Player is responsible for displaying the content provided by the Studio. Obscreen now ships **native player apps** for most platforms, while still supporting any device with a modern web browser. ## Native apps Recommended whenever a dedicated app is available for your device. Native apps include kiosk mode, auto-start, offline playback and remote pairing. - [Android](https://docs.obscreen.io/install/player-client/android): phones, tablets, generic Android boxes (Google Play Store) - [Android TV](https://docs.obscreen.io/install/player-client/android-tv): Nvidia Shield, Mi Box, Chromecast with Google TV (Google Play Store) - [Amazon Fire TV](https://docs.obscreen.io/install/player-client/amazon-fire-tv): Fire TV Stick & Fire TV (Amazon Appstore) - [Linux](https://docs.obscreen.io/install/player-client/linux): AppImage, .deb, .rpm (x86_64 & aarch64) - [macOS](https://docs.obscreen.io/install/player-client/macos): native Apple Silicon & Intel app (Mac App Store) - [Windows](https://docs.obscreen.io/install/player-client/windows): Windows 10 / 11, x86_64 & ARM64 (Microsoft Store) - [LG webOS](https://docs.obscreen.io/install/player-client/lg-webos): native app on LG commercial signage panels ## DIY player - [Raspberry Pi](https://docs.obscreen.io/install/player-client/raspberry-pi): additive install or dedicated **Obscreen OS** image ## Web browser - [Browser](https://docs.obscreen.io/install/player-client/browser): Chromium / Firefox on any device - [Generic Smart TV](https://docs.obscreen.io/install/player-client/generic-smart-tv): fallback for Smart TVs without a dedicated app ## Coming soon - [iOS](https://docs.obscreen.io/install/player-client/ios): iPad & iPhone (App Store, in validation) - [Apple TV](https://docs.obscreen.io/install/player-client/apple-tv): tvOS (App Store, in validation) - [Samsung Tizen](https://docs.obscreen.io/install/player-client/samsung-tizen): Samsung commercial signage panels - [Amazon Signage](https://docs.obscreen.io/install/player-client/amazon-signage): Amazon-certified signage displays --- Source: https://docs.obscreen.io/install/player-client/android # Android Turn any Android phone, tablet or TV box into a digital signage player using the native Obscreen Player app. ## About this platform Android is the most popular operating system for digital signage. With **Obscreen Player for Android**, you can repurpose tablets, phones, TV boxes or commercial displays running Android 5.0+ into fully managed signage screens. The app runs in kiosk mode, starts automatically on boot, and connects to your Obscreen instance for remote content management. ## Technical specifications | | | |---|---| | **Operating System** | Android 5.0+ | | **RAM** | 1 GB minimum | | **Resolution** | Up to 4K | | **Storage** | 50 MB free space | | **Network** | Wi-Fi or Ethernet | | **Devices** | Phones, tablets, TV boxes | ## How to install 1. **Download the app** from the [Google Play Store](https://play.google.com/store/apps/details?id=com.obscreen.player) on your Android device. 2. **Connect to your Studio**: open the app and enter your Obscreen instance URL to pair the device. 3. **Assign content**: from your Obscreen dashboard, assign a playlist or schedule to the newly registered screen. 4. **Enable kiosk mode**: lock the device to Obscreen Player so it stays focused on your content, even after a reboot. ## Platform features - **Kiosk mode**: lock the device to display only your signage content. - **Auto-start on boot**: the player launches automatically when the device powers on. - **Screen rotation**: portrait and landscape, including 90°, 180° and 270°. - **Offline playback**: content is cached locally; playback continues if the network is temporarily lost. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/android-tv # Android TV Native Obscreen Player app for Android TV devices. ## About this platform Android TV brings the power of Android to large screens. **Obscreen Player runs natively** on Android TV devices including Nvidia Shield, Xiaomi Mi Box, Chromecast with Google TV and professional Android TV signage displays. The player takes full advantage of the TV-optimized hardware for smooth 4K playback and reliable 24/7 operation. ## Technical specifications | | | |---|---| | **Operating System** | Android TV 7.0+ | | **RAM** | 2 GB recommended | | **Resolution** | Up to 4K HDR | | **Storage** | 50 MB free space | | **Devices** | TV boxes, smart TVs, HDMI dongles | | **Output** | HDMI (CEC supported) | ## How to install 1. **Install from the Play Store**: search for **Obscreen Player** on the Google Play Store on your Android TV device and install it. 2. **Launch and pair**: open the app and enter your Obscreen Studio URL. Use the remote to type the URL or scan the pairing QR code from another device. 3. **Assign a playlist**: go to your Obscreen dashboard and assign content to the freshly registered screen. 4. **Set as default launcher** *(optional)*: make Obscreen Player the default home app so the TV boots straight into your signage content. > **Sideloading** > > If your device cannot access the Play Store (e.g. AOSP boxes), you can sideload the APK from the [GitHub releases page](https://github.com/obscreen/obscreen/releases) using a tool like Downloader or AnExplorer. ## Platform features - **TV-optimized UX**: designed for large screens, with smooth transitions and proper aspect-ratio handling. - **Remote-friendly setup**: pair using a TV remote, or scan a QR code from your phone to speed things up. - **Auto-start**: set Obscreen as the default launcher so the device boots directly into signage. - **Lightweight footprint**: minimal resource usage for stable continuous playback. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/amazon-fire-tv # Amazon Fire TV Affordable digital signage with Amazon Fire TV Stick using the native Obscreen Player app. ## About this platform Amazon Fire TV Stick is one of the most cost-effective ways to deploy digital signage. Under $40, it plugs directly into any HDMI-equipped screen. **Obscreen Player for Fire TV** turns this consumer device into a reliable always-on signage player. It is available on the **Amazon Appstore** and supports all Fire TV Stick generations. ## Technical specifications | | | |---|---| | **Operating System** | Fire OS 5+ | | **RAM** | 1 GB minimum | | **Resolution** | Up to 4K Ultra HD | | **Storage** | 50 MB free space | | **Network** | Wi-Fi (built-in) | | **Output** | HDMI direct connection | ## How to install 1. **Get the app**: find **Obscreen Player** on the Amazon Appstore directly from your Fire TV, or push it remotely from amazon.com. 2. **Pair the device**: open the app and enter your Obscreen Studio URL to register the device. 3. **Configure content**: assign a playlist or schedule from your Obscreen dashboard. 4. **Lock the device**: configure the Fire TV to launch Obscreen Player automatically on boot for a hands-off experience. > **Sideloading** > > If the Amazon Appstore listing isn't yet available in your region, you can sideload the APK from the [GitHub releases page](https://github.com/obscreen/obscreen/releases) using the Downloader app on Fire TV. ## Platform features - **Extremely affordable**: Fire TV Sticks cost a fraction of dedicated signage players while delivering reliable performance for standard signage content. - **Plug & play**: plug into any HDMI port, connect to Wi-Fi, deployment done in minutes. - **4K support**: Fire TV Stick 4K and 4K Max provide ultra-high-definition output. - **Auto-launch on boot**: configure the device to start directly into Obscreen Player, fully autonomous after a power outage. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/linux # Linux Run Obscreen Player on any Linux distribution as a native app. ## About this platform Linux powers a wide range of digital signage hardware, from lightweight mini PCs to repurposed desktops. **Obscreen Player for Linux** ships as `AppImage`, `.deb` or `.rpm` packages and supports both `x86_64` and `aarch64` architectures. Compatible with Ubuntu, Debian, Fedora, Arch and many more. ## Technical specifications | | | |---|---| | **Operating System** | Any Linux distribution (glibc 2.17+) | | **Architecture** | x86_64, aarch64 | | **RAM** | 1 GB minimum | | **Storage** | 100 MB free space | | **Resolution** | Up to 4K | | **Package** | AppImage, .deb, .rpm | ## How to install 1. **Download the package** matching your distribution and architecture from [obscreen.io/players/linux](https://www.obscreen.io/players/linux) or the [GitHub releases page](https://github.com/obscreen/obscreen/releases). 2. **Install or run**: - **AppImage**: `chmod +x obscreen-player.AppImage` then double-click or run from terminal. - **.deb**: `sudo apt install ./obscreen-player.deb` (or `sudo dpkg -i obscreen-player.deb`). - **.rpm**: `sudo dnf install ./obscreen-player.rpm` (or `sudo rpm -i obscreen-player.rpm`). 3. **Pair with your Studio**: launch the app and enter your Obscreen instance URL to register the device. > **Looking for the legacy systemd browser-based player?** > > The previous chromium + systemd install method is still used on Raspberry Pi as the *additive* path. See the [Raspberry Pi page](https://docs.obscreen.io/install/player-client/raspberry-pi) for details if you specifically want a headless browser-based setup. ## Platform features - **Multiple package formats**: AppImage for portable, self-contained execution, or `.deb`/`.rpm` for clean system-wide installs. Available for both `x86_64` and `aarch64`. - **Auto-update**: the player checks for updates automatically and stays up to date without manual intervention. - **Multi-screen support**: drive multiple displays from a single Linux machine, each with independent content. - **Offline playback**: content is cached locally; playback continues if the network is temporarily lost. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in `[obscreen-player-dir]/var/run/play` file: ### Name & Icon ```bash CLIENT_HOSTNAME="My Device" CLIENT_ICON=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash CLIENT_LONGITUDE= CLIENT_LATITUDE= ``` #### 2. Structured address-based positioning ```bash CLIENT_STREET= CLIENT_CITY= CLIENT_STATE= CLIENT_COUNTRY= CLIENT_POSTAL_CODE= ``` #### 3. Query address-based positioning ```bash CLIENT_ADDRESS_QUERY= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/macos # macOS Native digital signage player for Mac. Optimized for Apple Silicon and Retina displays. ## About this platform **Obscreen Player for macOS** is a native app designed for Apple computers. Whether you repurpose a Mac mini as a signage controller or an iMac as a lobby screen, the macOS player takes full advantage of Apple Silicon and Retina displays for ultra-smooth content rendering. Kiosk-like behavior is supported through macOS' built-in single-app mode. ## Technical specifications | | | |---|---| | **Operating System** | macOS 12 Monterey or later | | **Architecture** | Apple Silicon & Intel | | **RAM** | 2 GB minimum | | **Resolution** | Up to 6K (Retina) | | **Storage** | 100 MB free space | | **Devices** | Mac mini, iMac, MacBook | ## How to install 1. **Download the app** from the **Mac App Store** or directly from [obscreen.io/players/macos](https://www.obscreen.io/players/macos). 2. **Launch and pair**: open the app, enter your Obscreen Studio URL, the device registers automatically. 3. **Assign content**: from your Obscreen dashboard, assign a playlist to the Mac screen and content starts playing. ## Platform features - **Apple Silicon optimized**: natively built for M-series chips. Efficient power usage and smooth playback even with high-resolution content. - **Retina display support**: full-resolution rendering on Retina and ProMotion displays for pixel-perfect signage. - **Auto-launch on login**: configure the app to start automatically at login, turning any Mac into a dedicated signage player. - **Silent background mode**: runs quietly in the background without pop-ups or notifications. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/windows # Windows Native digital signage app for Windows 10 and 11 PCs. ## About this platform Windows is the most widely deployed desktop operating system. **Obscreen Player for Windows** is a native app that turns any Windows 10 or 11 PC into a signage player. It supports kiosk mode through Windows Assigned Access, multi-display setups and auto-start at login. An ideal choice for environments with existing Windows infrastructure. ## Technical specifications | | | |---|---| | **Operating System** | Windows 10 / 11 | | **Architecture** | x86_64 and ARM64 | | **RAM** | 2 GB minimum | | **Storage** | 100 MB free space | | **Resolution** | Up to 8K | | **Devices** | PCs, mini PCs, tablets | ## How to install 1. **Download the installer** from the **Microsoft Store** or [obscreen.io/players/windows](https://www.obscreen.io/players/windows). 2. **Install and pair**: run the installer, launch the app, enter your Obscreen Studio URL to register the device. 3. **Enable kiosk mode** *(optional)*: use **Windows Assigned Access** or the built-in kiosk setting to lock the PC on Obscreen Player. ## Platform features - **Native Windows app**: true Windows app with native performance, hardware acceleration and taskbar integration. - **Kiosk mode**: leverage Windows Assigned Access to lock the device on a single signage app. - **Background service**: runs as a lightweight background process, keeping the system responsive. - **Auto-start at login**: launch automatically when Windows boots, with optional auto-login. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). --- Source: https://docs.obscreen.io/install/player-client/lg-webos # LG webOS Native Obscreen Player app on LG webOS Signage commercial displays. ## About this platform LG commercial signage displays run **webOS Signage**, the professional variant of LG's webOS platform. **Obscreen Player for LG webOS** runs natively on the panel itself, eliminating the need for an external media player. LG's webOS Signage is designed for 24/7 commercial operation with features like fail-over switching, auto-recovery and centralized firmware management. ## Technical specifications | | | |---|---| | **Platform** | webOS Signage 4.0+ | | **Resolution** | Up to 8K | | **Chipset** | LG embedded SoC | | **Network** | Wi-Fi, Ethernet, RS-232 | | **Displays** | LG commercial panels | | **Certification** | LG webOS certified | ## How to install 1. **Install the app**: deploy the Obscreen Player app to your LG screen via USB or LG's content management server. 2. **Configure the connection**: enter your Obscreen Studio URL through the on-screen setup wizard. 3. **Assign content**: from your Obscreen dashboard, assign playlists and schedules to the LG webOS screen. ## Platform features - **No external player**: runs natively on the LG panel. No extra hardware means cleaner installs and fewer points of failure. - **webOS Signage platform**: built on LG's professional signage platform with deep integration into the screen's hardware controls. - **Auto-recovery**: webOS Signage includes fail-over and auto-recovery mechanisms for uninterrupted operation. - **Commercial-grade 24/7**: LG commercial displays are built for continuous operation with industrial-grade components and long lifespans. --- Source: https://docs.obscreen.io/install/player-client/raspberry-pi # Raspberry Pi The DIY digital signage player. Compact, silent and energy-efficient: drives any HDMI screen. ## About this platform The Raspberry Pi is the reference micro-computer for digital signage. With Obscreen, you have **two install paths**: - **Additive install**: add the Obscreen player on top of your existing Raspberry Pi OS for a quick setup. - **Obscreen OS**: flash a dedicated, fully managed image so the Pi boots directly into your content with zero configuration. ## Technical specifications | | | |---|---| | **Board** | Raspberry Pi 3B+ / 4 / 5 | | **Architecture** | ARM64 | | **RAM** | 1 GB minimum (2 GB recommended) | | **Storage** | microSD 8 GB+ | | **Resolution** | Up to 4K (Pi 4/5) | | **OS** | Raspberry Pi OS or Obscreen OS | ## Hardware First, grab a Raspberry Pi. Version 4 or later is ideal, but it should run fine on any version with enough RAM, as the browser can be a bit heavy. > **Power supply** > > Make sure you have a power supply with at least 2A of current to avoid any issue. You'll need an SD card with at least 8GB of storage. Then download [Raspberry Pi Imager](https://www.raspberrypi.com/software/). --- ## Option 1: Additive install (on top of Raspberry Pi OS) Add the Obscreen player to your existing Raspberry Pi OS. The player runs alongside your existing system. When you start the Imager, choose `Raspberry Pi OS Lite` under category `Raspberry PI OS (other)`. > **Recommendation** > > Use the `Lite` version of Raspberry Pi OS for better performance. It works with the Desktop version but it's not recommended. ### Software Installation Log into your Raspberry Pi locally or via SSH (by default it's `ssh pi@raspberrypi.local`). Install player autorun by executing following script (will install chromium, x11, pulseaudio and obscreen-player systemd service) ```bash curl -fsSL https://raw.githubusercontent.com/obscreen/obscreen/master/system/client/install-browser-player.sh -o /tmp/install-browser-player.sh && chmod +x /tmp/install-browser-player.sh && sudo /bin/bash /tmp/install-browser-player.sh $USER $HOME ``` > **Info** > > 3rd variable `$STUDIO_URL` after `$HOME` is used to automate the configuration of studio endpoint. > > 4th variable `$PLAYER_BROWSER` after `$STUDIO_URL` is used to set the browser to use for the player. > Available values are: > - `chromium` > - `firefox` > > You can use `--disable-interactive` (at the end of the line) to make the script non-interactive. If previous script successfully finished, then restart your device by executing `sudo reboot` ### How to Restart Use systemctl: `sudo systemctl restart obscreen-player.service` ### Sound Activation > **Warning** > > First reboot your device after the player installation with `sudo reboot` (or by unplugging and replugging the device). Set the audio channel to HDMI: `sudo raspi-config nonint do_audio 1` (`0` is for the 3.5mm jack output). If you have more than one audio device, you can precisely select which one to use by executing `sudo raspi-config` and following these steps: - Select `1 System Options` - Select `S2 Audio` - Select your audio output - Select `Ok` - Select `Finish` ### Screen Configuration Screen configuration is set in file `[obscreen-player-dir]/var/run/play` under these variables: #### `SCREEN_RESOLUTION` You can change it by editing the file and fill it with a supported resolution To get the list of supported resolutions: 1. Run: `DISPLAY=:0 xrandr` 2. Replace `SCREEN_RESOLUTION=auto` with your preferred resolution (see an example below). ```bash SCREEN_RESOLUTION=1920x1080 ``` ### `SCREEN_ROTATE` Possible values are: - For 0° set: `normal` - For 90° set: `left` - For 180° set: `right` - For 270° set: `inverted` ### Pointing and Interaction Configuration Pointing and interaction configuration is set in file `[obscreen-player-dir]/var/run/play` under these variables: ### Mouse cursor options #### `MOUSE_CURSOR_HIDDEN` Set to `true` to hide the mouse cursor on the screen. ``` MOUSE_CURSOR_HIDDEN=true ``` --- ### Touchscreen gestures options #### `TOUCH_ENABLED` Set to `true` to enable touchscreen gesture support. *Default: `true`* ``` TOUCH_ENABLED=true ``` #### `TOUCH_PINCH_DISABLED` Set to `true` to disable pinch gesture detection (to prevent zooming with two fingers). *Default: `false`* ``` TOUCH_PINCH_DISABLED=true ``` #### `TOUCH_VIRTUAL_KEYBOARD` Set to `true` to enable virtual keyboard support. *Default: `false`* ``` TOUCH_VIRTUAL_KEYBOARD=false ``` ### Host Identification Configuration To help you identify and locate your device, you can set the following metadata in `[obscreen-player-dir]/var/run/play` file: ### Name & Icon ```bash CLIENT_HOSTNAME="My Device" CLIENT_ICON=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash CLIENT_LONGITUDE= CLIENT_LATITUDE= ``` #### 2. Structured address-based positioning ```bash CLIENT_STREET= CLIENT_CITY= CLIENT_STATE= CLIENT_COUNTRY= CLIENT_POSTAL_CODE= ``` #### 3. Query address-based positioning ```bash CLIENT_ADDRESS_QUERY= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). ### Playlist Configuration Playlist URL is set in file `var/run/play` under variable `STUDIO_URL`. You can change it by editing the file and fill it with either: > **Playlist URL** > > To connect the player to a specific playlist using its ID > `http:///use/` > **Playgroup URL** > > To connect the player to a specific playgroup using its ID > `http:///group/` --- ## Option 2: Obscreen OS (dedicated image) Flash a ready-made image so the Pi becomes a locked-down, maintenance-free signage player. 1. Download the **Obscreen OS ARM image** from [obscreen.io](https://www.obscreen.io/players/raspberry-pi). 2. Flash it to your microSD card with [Balena Etcher](https://etcher.balena.io/) or Raspberry Pi Imager. 3. Insert the SD card and boot the Pi. The device appears in your Obscreen dashboard automatically. 4. Assign a playlist from your dashboard: content starts playing immediately. ### What you get - **Locked-down OS**: no desktop, no browser, no package manager. Only the player runs. - **OTA updates**: automatic updates keep your screens on the latest version. - **Watchdog recovery**: built-in auto-recovery in case of failure. > **Tip** > > Both install methods support OTA updates. Obscreen OS is recommended for fleets of unattended signage screens; the additive install is better when you want to keep using the Pi for other tasks. --- Source: https://docs.obscreen.io/install/player-client/browser # Browser You can use any modern web browser to run the Obscreen Player. Simply open the player URL in your preferred browser, no extra software installation is required. **Chromium-based browsers and Firefox are both supported.** For **Smart TVs without a dedicated Obscreen app** (i.e. anything other than LG webOS or Samsung Tizen), see the dedicated [Generic Smart TV](https://docs.obscreen.io/install/player-client/generic-smart-tv) page, which covers the same browser-based fallback with TV-specific notes. Be aware that some browsers may not support all HTML5 features, so you may experience some issues with video playback for example. Some browsers may require you to use specific flags to run the player. For example, Chromium requires the `--autoplay-policy=no-user-gesture-required` flag to allow video autoplay. We provide some examples below for Chromium in a Linux environment. ## Chromium Browser (in a linux environment) When you run the browser yourself, don't forget to use these flags for chromium browser: > **Important** > > Sometimes chromium command is named `chromium` or `chromium-browser`. > Don't forget to replace **``** with your central Server Studio instance url. ```bash chromium \ --disk-cache-size=2147483648 \ --disable-features=Translate \ --ignore-certificate-errors \ --disable-web-security \ --disable-restore-session-state \ --autoplay-policy=no-user-gesture-required \ --start-maximized \ --allow-running-insecure-content \ --remember-cert-error-decisions \ --noerrdialogs \ --single-process \ --kiosk \ --incognito \ --window-position=0,0 \ --window-size=1920,1080 \ --display=:0 \ ``` ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). ## Playlist Configuration Just open your web browser and either go to: > **Playlist URL** > > To connect the player to a specific playlist using its ID > `http:///use/` > **Playgroup URL** > > To connect the player to a specific playgroup using its ID > `http:///group/` --- Source: https://docs.obscreen.io/install/player-client/generic-smart-tv # Generic Smart TV For any Smart TV **without a dedicated Obscreen Player app**. The TV runs the player through its built-in web browser. > **Got a supported brand?** > > If your TV is one of the following, prefer the native app: better performance, kiosk mode, auto-recovery and no need for a working browser on the panel: > > - LG commercial display → [LG webOS](https://docs.obscreen.io/install/player-client/lg-webos) > - Samsung commercial display → [Samsung Tizen](https://docs.obscreen.io/install/player-client/samsung-tizen) *(coming soon)* > - Amazon-certified signage → [Amazon Signage](https://docs.obscreen.io/install/player-client/amazon-signage) *(coming soon)* ## How it works Smart TVs equipped with a web browser can act as a player by simply opening the playlist URL. > **Browser limitations** > > Some Smart TV browsers are old WebKit forks and may not support all modern HTML5 features. You may experience reduced video codec compatibility, missing CSS features or autoplay restrictions. For best results, plug an external player (Fire TV Stick, Android TV box, Raspberry Pi…) into an HDMI input. ## Host Identification Configuration To help you identify and locate your device, you can set the following metadata in url's query parameters Example: ``` https:///?hostname=My%20Device&icon=auto&longitude=48.8566&latitude=2.3522` ```` ### Screen Flags These are information about the screen resolution and rotation. ```bash rotate=normal # normal, left, right, inverted resolution=auto # 1920x1080, 1920x1080, 1920x1080, 1920x1080 ``` ### Name & Icon ```bash hostname="My Device" icon=auto # any font-awesome icon name (i.e. fa-desktop, fa-laptop, fa-tablet, fa-mobile, fa-tablet-alt, fa-mobile-alt) ``` > **Search for icons** > > You can browse the free icon catalog [here](https://fontawesome.com/search?ic=free). ### Positioning Choose one of the following options from more precise to less precise location: #### 1. Precise positioning ```bash longitude= latitude= ``` #### 2. Structured address-based positioning ```bash street= city= state= country= postal_code= ``` #### 3. Query address-based positioning ```bash address_query= # (e.g. "1600 Pennsylvania Avenue NW, Washington, DC 20500") ``` See more about customizing the player's URL [here](https://docs.obscreen.io/features/players/customize-web-player). ## Playlist configuration Just open the TV's web browser and either go to: > **Playlist URL** > > To connect the player to a specific playlist using its ID > `http:///use/` > **Playgroup URL** > > To connect the player to a specific playgroup using its ID > `http:///group/` --- Source: https://docs.obscreen.io/install/player-client/ios # iOS > **Coming soon** > > The native Obscreen Player for iPad and iPhone is currently in validation on the App Store. This page will be updated as soon as it ships. ## About this platform Digital signage on iPad and iPhone for environments that already rely on Apple devices. The iOS player will support the same content types and pairing flow as the other native apps. In the meantime, iOS devices can already run Obscreen using **Mobile Safari**. See the [Browser](https://docs.obscreen.io/install/player-client/browser) page. ## Stay informed Follow the [GitHub releases](https://github.com/obscreen/obscreen/releases) or the [supported platforms page](https://www.obscreen.io/players) for availability updates. --- Source: https://docs.obscreen.io/install/player-client/apple-tv # Apple TV > **Coming soon** > > The native Obscreen Player for Apple TV is currently in validation on the tvOS App Store. This page will be updated as soon as it ships. ## About this platform Premium signage experience on Apple TV. The tvOS player will run natively on the device with full remote-friendly pairing and 4K HDR output. ## Stay informed Follow the [GitHub releases](https://github.com/obscreen/obscreen/releases) or the [supported platforms page](https://www.obscreen.io/players) for availability updates. --- Source: https://docs.obscreen.io/install/player-client/samsung-tizen # Samsung Tizen > **Coming soon** > > The native Obscreen Player for Samsung Tizen commercial displays is completed and currently awaiting final validation. This page will be updated as soon as it ships. ## About this platform Samsung commercial signage displays run **Tizen**, Samsung's professional signage operating system. Like the LG webOS app, the Tizen build will run natively on the panel, with no external player needed. ## Stay informed Follow the [GitHub releases](https://github.com/obscreen/obscreen/releases) or the [supported platforms page](https://www.obscreen.io/players) for availability updates. --- Source: https://docs.obscreen.io/install/player-client/amazon-signage # Amazon Signage > **Coming soon** > > The native Obscreen Player for Amazon-certified signage displays is in development. This page will be updated as soon as it ships. ## About this platform Amazon Signage covers professional displays running Amazon's signage stack on certified hardware. ## Stay informed Follow the [GitHub releases](https://github.com/obscreen/obscreen/releases) or the [supported platforms page](https://www.obscreen.io/players) for availability updates. --- Source: https://docs.obscreen.io/learn-more # Learn More [Obscreen](https://obscreen.io) is a tool designed to broadcast content from a server (Studio) to a client (Player). The Studio can be installed on Linux, Windows, or macOS and manages the content. ## How It Works The Player receives a page with a list of media to display. It’s designed to be simple and easy to use, running on a web browser for smooth playback. ## Deployment ### Cloud Version A cloud version is available : create an account on obscreen.io and manage your content from anywhere. Playlist URLs are ready to be loaded in the browser of your choice, on any device (TV, monitor, etc.). An internet connection on the player side is required. ### Self-hosted Version Initially, this project was intended to be installed as an all-in-one solution on a Raspberry Pi connected to a TV (or monitor). However, it is possible to install the server elsewhere and have the Player run on the Raspberry Pi attached to the TV. Alternatively, you can install the server and use the native browser of a Smart TV as the Player, eliminating the need for a Raspberry Pi. Learn more about [deployment types](https://docs.obscreen.io/deployment-types) and how to choose the right one for you. ## Get Started To get started with Obscreen, you need to install the Studio (server) and Player (client). Below are the available installation options. - **Studio Installation:** You can install the Studio on Linux, macOS, or Windows. Detailed instructions for each platform are provided in the [Installation section](https://docs.obscreen.io/install). - **Player Setup:** The Player can run on a Raspberry Pi or a Smart TV. Instructions for both setups are provided in the Player section of the [Installation section](https://docs.obscreen.io/install). --- Source: https://docs.obscreen.io/deployment-types # Deployment Types > **Warning** > > If you are a Cloud user, this section is not relevant for you. You can skip this section. There are two main deployment types: **Standalone** and **Distributed**. ## Standalone Deployments They are the most common and easiest to set up. They are ideal for a simple, single-screen installation. Nevertheless, it's possible to manage multiple screens from a single server using advanced features and configurations. See [Standalone](https://docs.obscreen.io/deployment-types/standalone) for more information or directly choose your preferred deployment type. - [Single Standalone](https://docs.obscreen.io/deployment-types/standalone#single-standalone-setup) - [Repeated Single Standalone](https://docs.obscreen.io/deployment-types/standalone#repeated-single-standalone-setup) - [Managed Multiple Standalone](https://docs.obscreen.io/deployment-types/standalone#managed-multiple-standalone-setup) ## Distributed Deployments They are more complex and require a central server to manage the players. They are ideal for larger installations with multiple screens. See [Distributed](https://docs.obscreen.io/deployment-types/distributed) for more information or directly choose your preferred deployment type. - [Managed Multiple Distributed](https://docs.obscreen.io/deployment-types/distributed#managed-multiple-distributed) --- Source: https://docs.obscreen.io/deployment-types/standalone # Standalone Deployment > **Warning** > > If you are a Cloud user, this section is not relevant for you. You can skip this section. ## Legend ``` [You] You (content manager) [Studio] Studio (server) where media files are stored [Player] Player (client) [Screen] Screen (Tv, monitor, etc.) [Link] Link to server → LAN or WAN link (or HDMI) ``` ## Single Standalone setup > **Topology** > > ``` > [You][Studio] → [Player] → [Screen] > ``` In the **Single Standalone setup** setup, the **Studio** (server) and **Player** (client) are both installed on the same device (e.g., a Raspberry Pi) that is connected to a Screen. This is ideal for a simple, single-screen installation. - **Management**: Managed through a single studio URL for server control. - **Devices**: One all-in-one device (e.g., Raspberry Pi, PC) connected to the Screen. ## Repeated Single Standalone Setup > **Topology** > > ``` > [You][Studio] → [Player] → [Screen] > [You][Studio] → [Player] → [Screen] > [You][Studio] → [Player] → [Screen] > ``` Here, **Repeated Single Standalone setup** setups are running independently, each with their own URL. You have to reach each server URL individually to control them. - **Management**: Individually managed through many different server web endpoint. - **Devices**: Several devices (e.g., multiple Raspberry Pi or PCs) each connected to their own Screen. ## Managed Multiple Standalone Setup > **Topology** > > Arbitrary choice of one Studio Server with `Studio Fleet Management` enabled. > ``` > [You][Studio] → ([Player] → [Screen]) > ↓ > [Link] → [Studio] → [Player] → [Screen] > [Link] → [Studio] → [Player] → [Screen] > [Link] → [Studio] → [Player] → [Screen] > ``` Here, **Managed Multiple Standalone setup** setups are running independently, each with their own URL. To enable this and simplify management, you have to activate **Studio Fleet Management** in settings for one server (choosen arbitrarily as the "main" one) to control all others from a single interface. - **Management**: Centrally managed through a single web page that aggregates the server URLs. - **Devices**: Several devices (e.g., multiple Raspberry Pi or PCs) each connected to their own Screen. Studio Fleet Management allows unified control of all setups. --- > **Tip** > > Any [Player] → [Screen] pair can be replaced with just a browser or a Smart TV with browser capability --- Source: https://docs.obscreen.io/deployment-types/distributed # Distributed Deployment > **Warning** > > If you are a Cloud user, this section is not relevant for you. You can skip this section. ## Legend ``` [You] You (content manager) [Studio] Studio (server) where media files are stored [Player] Player (client) [Screen] Screen (Tv, monitor, etc.) [Link] Link to server → LAN or WAN link (or HDMI) ``` ## Managed Multiple Distributed > **Topology** > > ``` > [You][Studio] > ↓ > [Link] → [Player] → [Screen] > [Link] → [Player] → [Screen] > [Link] → [Player] → [Screen] > ``` In the **Managed Multiple Distributed** configuration, a **Studio Server** distributes content to multiple **Players** (clients), each connected to a Screen and having its own IP address. The server determines the content to display based on device ID (for Obscreen Player) or group's id (for Browser Player) of each Player and finally retrieves the playlist assigned to. - **Management**: Managed through one Studio Server URL. - **Devices**: Multiple Players (e.g., Raspberry Pi, PCs) connected to their own Screens. --- > **Tip** > > Any [Player] → [Screen] pair can be replaced with just a browser or a Smart TV with browser capability --- Source: https://docs.obscreen.io/features # Features Overview - **Simple Architecture.** Starts in 2 seconds, uses any web browser to view media. Dead simple. - **Fancy graphical user interface.** Colorful, modern and easy to use. - **Lightweight.** Minimal dependencies Python application and embeddable SQLite database. - **Flexible Content Rotation.** Set up dynamic playlists to automatically rotate content across your screens. - **Screen Fleet Management.** Easily manage and control multiple screens from a centralized dashboard. - **Authentication Management.** Securely manage user authentication and access permissions. - **USB Embeddable content.** Plays content from flashdrive in offline mode. - **Extendable.** Core API & Plugin system to extend capabilities. - **Multi Languages.** Up to 16 languages supported. - [Screen] **Chromecast.** Cast pictures and iframes to Chromecasts --- # All Features - [Basic Content Types](https://docs.obscreen.io/features/basic-content-types) - [Advanced Content Types](https://docs.obscreen.io/features/advanced-content-types) - [Virtual Content Types](https://docs.obscreen.io/features/virtual-content-types) - [Slide Scheduling](https://docs.obscreen.io/features/slide-scheduling) - [Players](https://docs.obscreen.io/features/players) - [Customize Web Player](https://docs.obscreen.io/features/players/customize-web-player) - [Fleet Screen Management](https://docs.obscreen.io/features/players/fleet-screen-management) - [Administration](https://docs.obscreen.io/features/administration) - [User & Authentication](https://docs.obscreen.io/features/administration/authentication-management) - [Plugin System](https://docs.obscreen.io/features/administration/plugin-system) - [Internationalization](https://docs.obscreen.io/features/administration/internationalization) - [Advanced](https://docs.obscreen.io/features/advanced) - [API](https://docs.obscreen.io/features/advanced/api) - [Offline Mode](https://docs.obscreen.io/features/advanced/offline) - [SSL Support](https://docs.obscreen.io/features/advanced/ssl-support) - [N8N Integration](https://docs.obscreen.io/features/advanced/n8n-integration) - [Environment Variables Setup](https://docs.obscreen.io/features/advanced/environment-variables-setup) --- Source: https://docs.obscreen.io/features/basic-content-types # Basic Content Types Obscreen supports the following basic content types. See each subpage for details on supported formats and display behavior. - [Images](https://docs.obscreen.io/features/basic-content-types/images) - [Videos](https://docs.obscreen.io/features/basic-content-types/videos) - [URLs (Iframe Embed)](https://docs.obscreen.io/features/basic-content-types/urls) --- Source: https://docs.obscreen.io/features/basic-content-types/images # Images Import pictures from your computer. ## Supported formats - `PNG` - `JPEG` - `GIF` - `WebP` - `SVG` ## Display behavior By default, images are displayed to fit 100% height of the browser window. --- Source: https://docs.obscreen.io/features/basic-content-types/videos # Videos Import videos from your computer. ## Supported formats - `MP4` ## Display behavior By default, videos are displayed to fit 100% height of the browser window. Duration is automatically extracted from the video file and used for scheduling. --- Source: https://docs.obscreen.io/features/basic-content-types/urls # URLs (Iframe Embed) Display an iframe embed of a web page. ## Display behavior By default, iframes are displayed to fit 100% width and 100% height of the browser window. --- Source: https://docs.obscreen.io/features/advanced-content-types # Advanced Content Types > **Restricted feature** > > This feature is available for Premium version only Obscreen supports the following advanced content types. See each subpage for details and configuration. - [HTML Editor](https://docs.obscreen.io/features/advanced-content-types/html-editor) - [Youtube Embed](https://docs.obscreen.io/features/advanced-content-types/youtube-embed) - [Camera & Live Streaming](https://docs.obscreen.io/features/advanced-content-types/camera-live-streaming) - [External Storage](https://docs.obscreen.io/features/advanced-content-types/external-storage) - [Composition](https://docs.obscreen.io/features/advanced-content-types/composition) - [Playlist Embed](https://docs.obscreen.io/features/advanced-content-types/playlist-embed) - [Text](https://docs.obscreen.io/features/advanced-content-types/text) --- Source: https://docs.obscreen.io/features/advanced-content-types/html-editor # HTML Editor > **Restricted feature** > > This feature is available for Premium version only Display an HTML content. You can use the HTML editor to create your own HTML content. --- Source: https://docs.obscreen.io/features/advanced-content-types/youtube-embed # Youtube Embed > **Restricted feature** > > This feature is available for Premium version only Display a Youtube video. This is not an api integration so you need to manually set a duration for the video in slide settings. --- Source: https://docs.obscreen.io/features/advanced-content-types/camera-live-streaming # Camera & Live Streaming > **Restricted feature** > > This feature is available for Premium version only Display live feeds from IP cameras, NVRs or any web stream. Streams are ingested by an embedded [go2rtc](https://github.com/AlexxIT/go2rtc) engine and re-broadcasted to the player using MSE, HLS or MJPEG depending on the device capabilities. You can also declare additional sources on top of the main one. They are useful for audio transcoding, adaptive playback or applying FFmpeg filters (e.g. `ffmpeg:rtsp://...#audio=opus`). ## Supported input formats go2rtc accepts the following input formats: - `RTSP` (IP cameras, NVRs) - `RTMP` - `HTTP-FLV` - `HLS` - `MSE` - `FFmpeg` (any source FFmpeg can read: USB cameras, screen capture, local files, transcoded streams, etc.) ## Engine modes By default, go2rtc runs in-process and is managed by Obscreen. A sidecar mode is also available to point Obscreen to an external go2rtc instance through the plugin settings. --- Source: https://docs.obscreen.io/features/advanced-content-types/external-storage # External Storage > **Restricted feature** > > This feature is available for Premium version only Let imagine you have a 1000 pictures folder on your USB stick under a specific directory. You can setup an external storage content type targeting that directory and let Obscreen play content from this folder when USB flashdrive is inserted in the player. --- Source: https://docs.obscreen.io/features/advanced-content-types/composition # Composition > **Restricted feature** > > This feature is available for Premium version only A complete content disposition system which can be used to create complex content scenarios. You can use almost any content type as a composition item. --- Source: https://docs.obscreen.io/features/advanced-content-types/playlist-embed # Playlist Embed > **Restricted feature** > > This feature is available for Premium version only Basically a symbolic link to an existing playlist which can be used to control scheduling at a playlist level. --- Source: https://docs.obscreen.io/features/advanced-content-types/text # Text > **Restricted feature** > > This feature is available for Premium version only Display a text. ## Supported customizations - `Text` - `Font size` - `Font color` - `Font bold` - `Font italic` - `Font underline` - `Text alignment` - `Background color` - `Scrolling effect activation` - `Scrolling speed` - `Scrolling direction` (left or right) - `Scroll speed` - `Single line mode` - `Text margins` --- Source: https://docs.obscreen.io/features/virtual-content-types # Virtual Content Types > **Restricted feature** > > This feature is available for Premium version only Virtual content types are not stored as standalone media. Instead, they are decomposed at import time into one or more underlying basic content items (such as pictures), which are then played back like regular content. Obscreen supports the following virtual content types: - [PDF](https://docs.obscreen.io/features/virtual-content-types/pdf) --- Source: https://docs.obscreen.io/features/virtual-content-types/pdf # PDF > **Restricted feature** > > This feature is available for Premium version only Import a PDF document from your computer. Each page of the PDF is automatically extracted and converted into a picture, allowing the document to be played as a sequence of slides. ## Supported formats - `PDF` ## Behavior Once imported, every page becomes an individual image that can be scheduled, reordered, or reused like any other picture content. --- Source: https://docs.obscreen.io/features/slide-scheduling # Slide Scheduling Obscreen allows you to schedule slides in playlists with 3 different modes (`loop`, `datetime` and `inweek`). ## Loop mode - **Start at** `loop`: Slide will start when playlist start. - **End at** `loop`: Slide will loop indefinitely and sequentially. ## Date & time mode - **Start at** `datetime`: Slide will enter the loop at a specific date & time. - **End at** `loop`: Slide will never leave loop. `datetime`: Slide will leave loop at specified date & time. ## In week mode - **Start at** `inweek`: Slide will enter the loop at a specific day of the week and time. - **End at** `inweek`: Slide will leave leave loop at specified day of the week and time. --- Source: https://docs.obscreen.io/features/players # Players Everything related to how players display content and how a fleet of screens is managed. - [Customize Web Player](https://docs.obscreen.io/features/players/customize-web-player) - [Fleet Screen Management](https://docs.obscreen.io/features/players/fleet-screen-management) --- Source: https://docs.obscreen.io/features/players/customize-web-player # Customize Web Player > **Prerequisite: Allow anonymous web players** > > Customizing the web player through URL & query parameters is only available when **anonymous web players** are allowed. > > Enable it in **`Settings` → `General` → `Player` → `Allow anonymous web players`**. > > When this setting is disabled, web players can no longer connect through a public playlist URL. Only registered players paired with a code can access content. The query parameters described below have no effect in that case. Obscreen provides an URL for each playlist. Player's playlist URL is configurable in two ways: > **Playlist URL** > > To connect the player to a specific playlist using its ID > `http:///use/` > **Playgroup URL** > > To connect the player to a specific playgroup using its ID > `http:///group/` Playlist always starts with an introduction slide showing date & time ([customizable](https://docs.obscreen.io/features/players/customize-web-player#intro)). Then it plays the first content item and endlessly loops through the playlist items according to the schedule. ## Query Parameters Options You can use the following query parameters to configure the player through url parameters (e.g. `http:///?intro=0&autoplay=0&animation_effect=slide&animation_speed=normal&animation_direction=left&loop=0`): ## `intro` **Default value:** `1` **Description:** Show the introduction slide or not **Available values:** `0` or `1` --- ## `rotate` **Default value:** `normal` **Description:** Set the rotation of the player display **Available values:** `normal`, `left`, `right`, `inverted` --- ## `transparent` **Default value:** `0` **Description:** Make the player background transparent or not **Available values:** `0` or `1` --- ## `bgcolor` **Default value:** `000000` **Description:** Set the background color **Available values:** Any valid CSS color value without `#` prefix (e.g. `000000`, `FFFFFF`, `FF0000`, `00FF00`, `0000FF`, etc.) --- ## `animation_effect` **Default value:** `none` **Description:** Set the animation effect **Available values:** `slide`, `fade`, `zoom` or `none` --- ## `animation_speed` **Default value:** `normal` **Description:** Set the animation speed **Available values:** `slow`, `normal` or `fast` --- ## `animation_direction` **Default value:** `normal` **Description:** Set the animation direction (for `slide` effect only) **Available values:** `left`, `right`, `up` or `down` --- ## `autoplay` **Default value:** `0` **Description:** Enable/disable video autoplay or not **Available values:** `0` or `1` --- ## `interactive` **Default value:** `1` **Description:** Enable/disable user interaction or not **Available values:** `0` or `1` --- ## `loop` **Default value:** `0` **Description:** Number of times the playlist will loop **Available values:** Any positive integer or `0` for infinite loop --- ## `debug` **Default value:** `0` **Description:** Enable debug mode or not **Available values:** `0` or `1` --- Source: https://docs.obscreen.io/features/players/fleet-screen-management # Fleet Screen Management > **Restricted feature** > > This feature is available for Premium version only Fleet screen management allows you to manage multiple Players from a single Studio Server instance. ## How It Works ### Example When a player connects to a playgroup URL `http:///group/`, Obscreen Studio will use the playlist of the playgroup to display content on the screen of the player. > **Warning** > > This feature is only available if you have enabled **Core Fleet Player Management** in settings. Additionally, you need to pair players to your Studio Server (Learn more about [how to configure players](https://docs.obscreen.io/features/players/customize-web-player)). ## Step by Step Setup > **Check** > > Make sure you have at least one playlist available! ### Steps to Configure a Player 1. Go to `Devices` section then click on `Players` menu item. 2. Click on `Add Player` button and choose a name for your player. 3. Fill up the `Host` field with the player's IP address and click on `Save` ### Steps to Create a Group 1. Go to `Devices` section then click on `Playgroups` menu item. 2. Click on `Add Playgroup` button and choose a name for your playgroup. 3. Select a playlist to a group and click on `Save`. 4. Now you can click on `Assign Player` button to assign the player you created before to this group. Now, once a request is made by a player to your Studio Server instance, it will: - Identifies the player based on its group address. - Retrieves the group's playlist. - Show corresponding playlist on screen. --- Source: https://docs.obscreen.io/features/administration # Administration Configure how the Studio is managed: users, plugins and languages. - [User & Authentication](https://docs.obscreen.io/features/administration/authentication-management) - [Plugin System](https://docs.obscreen.io/features/administration/plugin-system) - [Internationalization](https://docs.obscreen.io/features/administration/internationalization) --- Source: https://docs.obscreen.io/features/administration/authentication-management # Authentication Management Obscreen provides a very simple way to manage authentication for your Studio instance. ## Enable Authentication 1. Go to `Settings` section then click on `General` menu item. 2. Under `Security` tab, check **Enable Authentication**. 3. Now a new `Security` section will appear, click on `Users` menu item. > **Warning** > > You'll be logged out from the current session. Default credentials are `admin` for both username and password. ## Roles Obscreen implements a comprehensive access control system through user teams (groups) and role-based permissions. - `Owner` there is only one owner per instance. No restrictions apply to owner. - `Admin` there can be multiple admins per instance. No restrictions apply to admins. - `Content Manager` can manage content only (Library and Playlists). - `Device Manager` can manage devices only (Players, Studios and Playgroups). ## Teams Teams allow you to organize users into logical groups, making it easier to manage access to specific content and devices. A user can belong to one team only, and their effective permissions are determined by their role within each team. ## Permissions & Ownership By default, when a user creates a new element (content, playlist, device, etc.), their team will automatically be applied to that element. However, only Owner and Admin users have the ability to edit team ownership: * Navigate to the element's settings * Look for the `Permissions` section in the settings panel * Select the appropriate team to assign ownership * Save the changes This team assignment determines which users can access and modify the element based on their role and team membership. ## Permission Details The following table outlines the specific permissions for each role and team configuration: > **Owner** > > - Full access (`Content`, `Device`, `Security`) > - All permissions can be altered > **Admin** > > - Full access (`Content`, `Device`, `Security`) > - Alter permissions: > - **Team assigned:** can only alter permissions for their team's elements > - **No team assigned:** can alter permissions > **Content Manager** > > - Limited access to `Content` > - Alter permissions: > - **Team assigned:** can only alter permissions for their team's `Content` elements > - **No team assigned:** can alter permissions > **Device Manager** > > - Limited access to `Device` > - Alter permissions: > - **Team assigned:** can only alter permissions for their team's `Device` elements > - **No team assigned:** can alter permissions ## Two-Factor Authentication TOTP is a 2FA method that uses a time-based one-time password (TOTP) to authenticate users. ### How to enable TOTP 1. Click on your name in left menu bar to open `Profile` page. 2. Under `Security` tab, you can **TOTP (Authenticator)** as an authentication method under `Two-Factor Authentication` section. 3. Now a new `Configure` button will appear, click on it to start setup process. ## I'm locked out of the Studio because I forgot my password. How can I reset it? You have to start Studio with `SAFE_MODE=true` environment variable to bypass login and be able to reset the password. --- Source: https://docs.obscreen.io/features/administration/plugin-system # Plugin System Obscreen is built around a modular plugin system. Almost every feature of the Studio: content types, file storage backends, fleet management, integrations: is shipped as a plugin that can be **enabled or disabled** independently. This lets you tailor the Studio to your needs: - **Trim it down** to keep only what you actually use, for a lighter and more focused interface. - **Light it up** to unlock advanced capabilities (extra content types, remote storage, fleet management, white labeling…) when you need them. ## Why use it? - **Tailored UX**: hide content types or integrations your team doesn't use to keep the interface clutter-free. - **Performance & footprint**: disabled plugins don't load their dependencies, services or background workers. - **Security & compliance**: turn off features you don't want exposed (e.g. external API, remote storage, third-party integrations). - **Progressive adoption**: start small and enable plugins one by one as your usage grows. ## What can be toggled? Plugins cover most of the Studio's surface, for example: - **Content types**: Pictures, Videos, URLs, HTML, YouTube, Composition, Playlist Embed, Text, PDF, External Storage, Camera & Live Streaming… - **File handlers**: Local storage, Amazon S3, Cloudflare R2. - **Fleet management**: Player fleet, Studio fleet (multi-Studio). - **Integrations & APIs**: Core API (REST), N8N integration. - **System & branding**: SSL Support, Updater, White Labeling, Code Snippets. Each plugin exposes its own settings page once enabled. ## How to enable a plugin 1. Go to `Settings` and open the `Plugins` menu. 2. Toggle the plugins you need. 3. Configure them through their dedicated settings page if needed. > **Warning** > > Some plugins may require additional configuration, dependencies, or external services. > You may also need to restart your Studio instance to apply changes. > **Tip** > > Disabling a content type plugin doesn't delete existing content of that type: it just hides the ability to create or play it until the plugin is re-enabled. --- Source: https://docs.obscreen.io/features/administration/internationalization # Internationalization Obscreen is designed to be used by people from all over the world. The interface is translated into 17 languages and can be easily extended or improved. ## Supported languages - English `en` - French `fr` - Italian `it` - Spanish `es` - German `de` - Greek `el` - Arabic `ar` - Hindi `hi` - Japanese `ja` - Korean `ko` - Polish `pl` - Portuguese `pt` - Russian `ru` - Thai `th` - Vietnamese `vi` - Chinese `zh` - Turkish `tr` --- Source: https://docs.obscreen.io/features/advanced # Advanced Advanced features for power users, integrators and self-hosted deployments. - [API](https://docs.obscreen.io/features/advanced/api) - [Offline Mode](https://docs.obscreen.io/features/advanced/offline) - [SSL Support](https://docs.obscreen.io/features/advanced/ssl-support) - [N8N Integration](https://docs.obscreen.io/features/advanced/n8n-integration) - [Environment Variables Setup](https://docs.obscreen.io/features/advanced/environment-variables-setup) --- Source: https://docs.obscreen.io/features/advanced/api # Api > **Restricted feature** > > This feature is available for Premium version only Obscreen provides a REST API to manage content, playlists, screens and more. ## Enable Plugin Core API is a system plugin thus you can enable or disable API in `Plugins` settings page. ## Authentication Token authentication is used to authenticate requests to the API. You can get a token in the Studio under any registered user in `Security` page by clicking on `eye` yellow button. Send the token in the `Authorization` header of every request, with or without the `Bearer` prefix: ```bash curl -H "Authorization: Bearer " http:///api/playlists/ ``` A missing token returns `401`, an unknown token returns `403`. Requests run with the permissions of the user owning the token. ## Endpoints Swagger documentation is available on the API. You can access it on the following path `http:///api`. The OpenAPI 2.0 specification is served as JSON on `http:///swagger.json`. > **Tip** > > Use our demo instance to check API endpoints: [`https://demo.obscreen.io/api`](https://demo.obscreen.io/api). --- Source: https://docs.obscreen.io/features/advanced/offline # Using Obscreen Offline > **Restricted feature** > > This feature is available on-demand only ## Installation To start Obscreen in offline mode, you will need to start an additional server. It acts as a license server but locally runs on your device on port `49495`. An internet connection is required for the first activation of the software to convert your license to an offline license. A new license file will be automatically updated. > **No internet at all ?** > > Follow [offline first activation](https://docs.obscreen.io/features/advanced/offline#offline-first-activation) section after installation. ## > Install on Linux For Linux users, you can install all the dependencies and the studio with the following script: ```bash curl -fsSL https://raw.githubusercontent.com/obscreen/obscreen-offline-launcher/refs/heads/main/install-offline-launcher.sh -o /tmp/install-offline-launcher.sh && chmod +x /tmp/install-offline-launcher.sh && sudo /bin/bash /tmp/install-offline-launcher.sh $USER $HOME ``` To see logs you can use: `sudo journalctl -u obscreen-offline-launcher -f` ## Auto restart obscreen-offline-launcher To avoid restarting the server each time you restart your obscreen instance, you can add the following line to your `docker-compose.yml` file: ```yaml services: obscreen: image: obscreen/obscreen:latest # other configurations like ports, volumes, etc. entrypoint: ["obscreen-global-launcher.sh"] ``` Then add a `obscreen-global-launcher.sh` file next to your `docker-compose.yml` file with the following content: 1. Create the file if it doesn't exist ```bash touch obscreen-global-launcher.sh chmod +x obscreen-global-launcher.sh ``` 2. Add the following content to the file: ```bash #!/bin/bash echo "Obscreen container started, triggering systemctl restart for obscreen-offline-launcher..." sudo systemctl restart obscreen-offline-launcher exec "$@" ``` Now each time you start your obscreen container, the obscreen-offline-launcher service will be restarted automatically. ## > Install on Windows For Windows, you have to install the server manually by downloading the latest release from [here](https://github.com/obscreen/obscreen-offline-launcher/releases). ## > Install on MacOS For MacOS, you have to install the server manually by downloading the latest release from [here](https://github.com/obscreen/obscreen-offline-launcher/releases). ## How to Use Just start the server as a python script and Obscreen will automatically detect it. > **Warning** > > You must restart obscreen-offline-launcher service each time you restart your obscreen instance. ## Upgrade There is no automatic upgrade for this. You'll have to do download and install the latest version manually. 1. Re-install (use section from above) - [Linux installation](https://docs.obscreen.io/features/advanced/offline#-install-on-linux) - [Windows installation](https://docs.obscreen.io/features/advanced/offline#-install-on-windows) - [MacOS installation](https://docs.obscreen.io/features/advanced/offline#-install-on-macos) 2. Restart the server - Linux: `sudo systemctl restart obscreen-offline-launcher` - Windows: Restart your server manually - MacOS: Restart your server manually ## Offline First Activation If you have no internet connection, you'll need to manually setup the server. 1. After installation, run the server in print mode using: `python3 obscreen-offline-launcher.py --print` 2. You should see a message like this: ```txt ----- Copy next line ----- eyJzeXNuIjogImRhcndpbiIsICJzeXNpIjogIjA3NzNlMTZkYWJjYjk0YTRiMzMzOTcwZGYzNDk2OWRiYjlhNzVkMzU0ZTcyNjk2MjQ3MzEwMGEzZjIxYWFmYmQiLCAibmlkIjogIjgyOGE4YmExMGQ5YzJiYTQ5MzkxMGJmZWU2NmJkZTMzZWJlZmQyZGRjNWZlZDNmODQ4NDdmMjk1YzI1N2ZkNjIifQ== -------------------------- ``` 3. Copy the text between lines only 4. Go to your [License Dashboard](https://www.obscreen.io/manager/dashboard) and click on the gear icon of your license 5. Go to `Paired device` section, paste the text on the text field then click on `Pair` button. 6. Download your updated license file by clicking on `Download the license file` button and put it on your Obscreen instance folder. 7. Restart your obscreen instance and obscreen offline launcher service. > You should now be able to start Obscreen offline. > **Warning** > > You must restart obscreen-offline-launcher service each time you restart your obscreen instance. ## Switching between online and offline modes Just [contact us](https://docs.obscreen.io/contact-us) if you need to make the switch. --- Source: https://docs.obscreen.io/features/advanced/ssl-support # SSL Support > **Warning** > > If you are a Cloud user, this section is not relevant for you. You can skip this section. Obscreen Studio supports SSL certificates through a dedicated plugin (Core Web SSL). This is particularly useful for companies with strict security requirements. ## How to enable ### Standard SSL Configuration The SSL Certificate Plugin is typically configured through the Studio Server interface after installation at `http:///plugins` in the Plugins section. ### SSL Configuration for Restricted Environments In environments with strict firewall rules that block outbound traffic without a verified SSL certificate, you may encounter a problem where: 1. The application cannot start due to blocked license verification requests 2. You cannot configure the SSL plugin because the app hasn't started yet (unmanage-able `obscreen-studio-launcher` process is started before `obscreen-studio` manage-able process) #### Workaround for Docker Compose Add these environment variables, entrypoint and volume configuration to your `docker-compose.yml`: ```yaml services: obscreen: # ... other configuration ... environment: REQUESTS_CA_BUNDLE: /usr/local/share/ca-certificates/cert.crt # or .pem SSL_CERT_FILE: /usr/local/share/ca-certificates/cert.crt # or .pem http_proxy: "http://:80" https_proxy: "https://:443" entrypoint: > /bin/sh -c "update-ca-certificates && python /app/obscreen-studio-launcher.py" volumes: - ./certs/cert.crt:/usr/local/share/ca-certificates/cert.crt # Mount certificate --- Source: https://docs.obscreen.io/features/advanced/n8n-integration # n8n Integration Obscreen offers native integration with n8n, an open-source workflow automation platform. This integration allows you to automate your digital signage content management directly from your n8n workflows. ## About the n8n-nodes-obscreen Node The community node `n8n-nodes-obscreen` is available on GitHub: [obscreen/n8n-nodes-obscreen](https://github.com/obscreen/n8n-nodes-obscreen) This node allows you to use the Obscreen API in your n8n workflows to fully automate your digital signage. ## Prerequisites To use this integration, you need: 1. **An Obscreen Instance** with the Core API plugin enabled (Premium feature) 2. **Your Obscreen Instance URL** 3. **Your Obscreen API Key** (available in any user's security settings) > **Optional Security Note**: You can configure your instance to permit unauthenticated access to the API. If you do so, you can set a random value as the API Key. ## Installation Follow the installation guide in the [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/). ```bash npm install n8n-nodes-obscreen ``` ## Available Operations ### Content - **List all contents**: Retrieve the complete list of your contents - **Add new content**: Create new content elements - **Update existing content**: Modify content properties - **Delete content**: Remove content from your library - **Get content**: Retrieve details of a specific content - **Get content location**: Locate content in your structure - **Get available content types**: List all supported formats ### Content Folder - **List all content folders**: Browse your folder structure - **Add new content folder**: Create new organization - **Update a folder**: Modify folder properties - **Delete a folder**: Remove a folder from your structure - **Move multiple contents to a folder**: Organize your contents in bulk ### Playlist - **List all playlists**: Retrieve your playlists - **Add a playlist**: Create new content sequences - **Update existing playlist**: Modify order or content - **Delete playlist**: Remove a playlist - **Get playlist**: Retrieve details of a specific playlist - **Get regular slides associated with playlist**: List main content - **Get notifications slides associated with playlist**: List notifications ### Slide - **List all slides**: Browse your slides - **Add a regular slide**: Create standard content - **Add a notification slide**: Create alerts or announcements - **Update existing slide**: Modify slide content - **Delete slide**: Remove a slide - **Get slide**: Retrieve details of a specific slide ### Process - **Refresh player**: Force content update on your screens ## Typical Use Cases ### Content Automation - **Automatic updates**: Synchronize your content with external sources (CMS, databases, APIs) - **Event management**: Automatically create slides for scheduled events - **Dynamic notifications**: Broadcast alerts based on external triggers ### Integration with Other Systems - **CRM/ERP**: Display real-time business data - **Social networks**: Integrate Twitter, Instagram, or LinkedIn feeds - **Weather and news**: Automatically update contextual information - **Booking systems**: Display real-time availability ### Fleet Management - **Mass deployment**: Push content to multiple screens simultaneously - **Preventive maintenance**: Automate checks and updates - **Automated reports**: Generate usage statistics ## Compatibility This node is compatible with n8n version 0.150.0 and above. It has been tested with the latest version of n8n. ## Development and Contribution The project is open-source under MIT license. To contribute or develop: ```bash npm install npm link npm run dev ``` In a separate terminal, start the n8n server: ```bash cd .n8n mkdir custom cd custom npm init npm link @n8n-nodes-obscreen npm start ``` ## Support and Resources - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/) - [GitHub Repository](https://github.com/obscreen/n8n-nodes-obscreen) --- Source: https://docs.obscreen.io/features/advanced/environment-variables-setup # Environment Variables Setup > **Warning** > > If you are a Cloud user, this section is not relevant for you. You can skip this section. ## Network ### `PORT` Set the application port for incoming connections. > Default: `5000` ### `BIND` Define the application bind address for network interfaces. > Default: `0.0.0.0` ### `NO_ZEROCONF` Disable zeroconf networking features. Zeroconf is useful for ObscreenOS users only. > Default: `false` ## Language & Localization ### `SETTING_LANG` Force a specific language for the application. > Default: `(disabled)` ### `SETTING_TIMEZONE` Force a specific timezone for the application. > Default: `(disabled)` # must be a valid timezone string e.g. 'Europe/Paris' ### `FALLBACK_LANG` Specify the fallback language if the primary is unavailable. > Default: `en` ### `LANGS_WHITELIST` Specify languages that users can manage. > Default: `(disabled)` # must be an array of strings e.g. "['en','fr','de']" - [check list](https://docs.obscreen.io/features/administration/internationalization) ## Database ### `DATABASE_ENGINE` Specify the database engine to be used. > Default: `sqlite` **[possible values: `sqlite`, `postgresql`]** ### `DATABASE_DSN` Define the Data Source Name for database connections. > Default: `sqlite:///%application_dir%/data/db/obscreen.db` ### `DATABASE_HOST` Set the host address for the database server. > Default: `(disabled)` ### `DATABASE_PORT` Define the port number for the database server. > Default: `(disabled)` ### `DATABASE_USER` Specify the username for database authentication. > Default: `(disabled)` ### `DATABASE_PASSWORD` Provide the password for database authentication. > Default: `(disabled)` ### `DATABASE_NAME` Set the name of the database to connect to. > Default: `(disabled)` ### `DATABASE_SCHEMA` Define the database schema to be used. > Default: `(disabled)` ## Logging ### `LOG_FILE` Specify the file path for logging output. > Default: `(disabled)` ### `LOG_LEVEL` Set the logging level (e.g., DEBUG, INFO, WARN). > Default: `INFO` **[possible values: `DEBUG`, `INFO`, `WARN`, `ERROR`, `CRITICAL`]** ### `LOG_STDOUT` Enable logging to standard output. > Default: `false` **[possible values: `true`, `false`]** ## System & Security ### `BEHIND_REVERSE_PROXY` Enable reverse proxy support. Forwarded headers are used to determine the client's IP address, hostname, and other information. (X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto) > Default: `false` **[possible values: `true`, `false`]** ### `TRUSTED_PROXIES` Specify the trusted proxies. (X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto) > Default: `(disabled)` # must be a comma separated list, e.g. "127.0.0.1,192.168.1.1" ### `TRUSTED_HOSTS` Specify the trusted hosts. (X-Forwarded-Host) > Default: `(disabled)` # must be a comma separated list, e.g. "example.com,example.org" ### `SAFE_MODE` Enable safe mode with authentication disabled. > Default: `false` ### `EXPOSE_SYSTEM` Display system information. > Default: `true` ### `EXTERNAL_ONLY` Restrict content display to external URLs only. > Default: `false` ### `AUTH_MASTER_PASSWORD` Set a master password for authentication purposes. You still need to have a valid username to be able to login. > Default: `(disabled)` ## Directories ### `DATA_MOUNTPOINT` Define the directory for data mountpoints. > Default: `%application_dir%/data` ### `EXTERNAL_STORAGE_MOUNTPOINT` Set the directory for external storage mountpoints. > Default: `%application_dir%/var/run/storage` ## Overriding in-app Settings In-app Settings are stored in the database, but some settings are editable using environment variables. ### What are Frozen Variables? A frozen variable is an in-app setting that has been overridden by an environment variable. Once frozen, the setting cannot be changed from within the app until the environment variable is removed. If you unfreeze the variable, it will revert to the last value it held while frozen. To create a frozen variable, prefix its name with `FROZEN_VAR_` followed by the actual variable name. For example, to freeze `EXTERNAL_URL` and `DEFAULT_SLIDE_TIME_WITH_SECONDS`, use: ```bash FROZEN_VAR_EXTERNAL_URL=https://example.com FROZEN_VAR_DEFAULT_SLIDE_TIME_WITH_SECONDS=true ``` ### How to identify frozen variable names? You can identify frozen variable names on the `settings` page. Hover over a setting to reveal a link icon. Click the icon, and the page will refresh with the corresponding variable name highlighted. You can then find the variable name in the `highlight` URL parameter. --- # REST API reference Generated from the OpenAPI 2.0 specification of the demo Studio (https://demo.obscreen.io/swagger.json), API version 2025.10.34. Each Studio serves its own spec at `http:///swagger.json` and Swagger UI at `http:///api`. See the API page above for authentication. Base URL: `http://`. Requests and responses use `application/json` unless stated otherwise. ## contents: Operations on contents ### GET /api/contents/ List all contents Parameters: - `folder_id` (query, string): Folder ID - Higher priority than path - `folder_path` (query, string): Folder Path - Lower priority than id - `type` (query, string): Type of the content - `name` (query, string): Partial name of the content Responses: - 200: Success (array of ContentOutput) ### POST /api/contents/ Add new content Content-Type: multipart/form-data Parameters: - `name` (query, string, required): Name of the content - `type` (query, string, required): Type of the content - `parent_folder_id` (query, string): Parent Folder ID - Higher priority than path - `parent_folder_path` (query, string): Parent Folder Path - Lower priority than id - `location` (query, string): Content location (when type is: url, youtube, html, text, external_storage or playlist_embed) - `object` (formData, file): Content location (when type is: picture, html or video) Responses: - 201: Success (ContentOutput) ### GET /api/contents/location/{content_id} Get content location by ID Parameters: - `content_id` (path, integer, required) Responses: - 200: Success ### GET /api/contents/types Get all content types Responses: - 200: Success (array of ContentTypeOutput) ### DELETE /api/contents/{content_id} Delete content Parameters: - `content_id` (path, integer, required) Responses: - 200: Success ### GET /api/contents/{content_id} Get content by ID Parameters: - `content_id` (path, integer, required) Responses: - 200: Success (ContentOutput) ### PUT /api/contents/{content_id} Update existing content Parameters: - `content_id` (path, integer, required) - `name` (query, string, required): Name of the content Responses: - 200: Success (ContentOutput) ## contents-folders: Operations on content folders ### GET /api/contents-folders/ List all folders with their absolute paths Responses: - 200: Success (array of Folder) ### POST /api/contents-folders/ Add a new folder Parameters: - `name` (query, string, required): Name of the folder - `parent_folder_id` (query, string): Parent Folder ID - Higher priority than path - `parent_folder_path` (query, string): Parent Folder Path - Lower priority than id Responses: - 201: Success (Folder) ### GET /api/contents-folders/from-path Get a folder by its path Parameters: - `path` (query, string, required): Path of the folder Responses: - 200: Success (Folder) ### POST /api/contents-folders/move-bulk Move multiple content to another folder Parameters: - `entity_ids` (query, array of integer, required): List of content IDs to move - `parent_folder_id` (query, integer): Parent Folder ID - Higher priority than path - `parent_folder_path` (query, string): Parent Folder Path - Lower priority than id Responses: - 200: Success ### DELETE /api/contents-folders/{folder_id} Delete a folder Parameters: - `folder_id` (path, integer, required) Responses: - 200: Success ### GET /api/contents-folders/{folder_id} Get a folder by its ID Parameters: - `folder_id` (path, integer, required) Responses: - 200: Success (Folder) ### PUT /api/contents-folders/{folder_id} Update a folder Parameters: - `folder_id` (path, integer, required) - `name` (query, string): Name of the folder - `parent_folder_id` (query, string): Parent Folder ID - Higher priority than path - `parent_folder_path` (query, string): Parent Folder Path - Lower priority than id Responses: - 200: Success (Folder) ## playlists: Operations on playlist ### GET /api/playlists/ List all playlists Responses: - 200: Success (array of PlaylistOutput) ### POST /api/playlists/ Create a new playlist Parameters: - `name` (query, string, required): The playlist name - `enabled` (query, string): Is the playlist enabled? - `disable_interaction` (query, string): Disable user interaction? - `loop_mode` (query, string): How contents is played in the playlist (values: sequential, timesync, random) Responses: - 201: Success (PlaylistOutput) ### DELETE /api/playlists/{playlist_id} Delete a playlist Parameters: - `playlist_id` (path, string, required) Responses: - 200: Success ### GET /api/playlists/{playlist_id} Get a playlist by its ID Parameters: - `playlist_id` (path, string, required) Responses: - 200: Success (PlaylistOutput) ### PUT /api/playlists/{playlist_id} Update an existing playlist Parameters: - `playlist_id` (path, string, required) - `enabled` (query, string): Is the playlist enabled? - `disable_interaction` (query, string): Disable user interaction? - `loop_mode` (query, string): How contents is played in the playlist (values: sequential, timesync, random) - `name` (query, string): The playlist name Responses: - 200: Success (PlaylistOutput) ### GET /api/playlists/{playlist_id}/notifications Get notifications associated with a playlist Parameters: - `playlist_id` (path, string, required) Responses: - 200: Success ### GET /api/playlists/{playlist_id}/slides Get slides associated with a playlist Parameters: - `playlist_id` (path, string, required) Responses: - 200: Success ## slides: Operations on slides ### GET /api/slides/ List all slides Responses: - 200: Success (array of SlideOutput) ### POST /api/slides/ Add a new slide Parameters: - `content_id` (query, integer, required): The content ID for the slide - `playlist_id` (query, string, required): The playlist ID to which the slide belongs - `enabled` (query, string): Is the slide enabled? - `duration_mode` (query, string, required): Duration mode: manual, delegate or infinite - `duration` (query, integer): Duration of the slide - `position` (query, integer): Position of the slide - `scheduling` (query, string, required): Scheduling type: loop, datetime or inweek - `datetime_start` (query, string): Start datetime for scheduling (format: Y-m-d H:M) - `datetime_end` (query, string): End datetime for scheduling (format: Y-m-d H:M) - `day_start` (query, integer): Start day for inweek scheduling (format: 1 for Monday to 7 for Sunday) - `time_start` (query, string): Start time for inweek scheduling (format: H:M) - `day_end` (query, integer): End day for inweek scheduling (format: 1 for Monday to 7 for Sunday) - `time_end` (query, string): End time for inweek scheduling (format: H:M) Responses: - 201: Success (SlideOutput) ### POST /api/slides/notifications Add a new slide notification Parameters: - `content_id` (query, integer, required): The content ID for the slide - `playlist_id` (query, string, required): The playlist ID to which the slide belongs - `enabled` (query, string): Is the slide enabled? - `duration` (query, integer): Duration of the slide - `position` (query, integer): Position of the slide - `scheduling` (query, string, required): Scheduling type: datetime or cron - `datetime_start` (query, string): Start datetime for notification scheduling (format: Y-m-d H:M) - `datetime_end` (query, string): End datetime for notification scheduling (format: Y-m-d H:M) - `cron_start` (query, string): Cron expression for notification scheduling start (format: * * * * * * *) Responses: - 201: Success (SlideOutput) ### PUT /api/slides/notifications/{slide_id} Edit an existing slide notification Parameters: - `slide_id` (path, integer, required) - `enabled` (query, string): Is the slide enabled? - `duration` (query, integer): Duration of the slide - `position` (query, integer): Position of the slide - `datetime_start` (query, string): Start datetime for notification scheduling (format: Y-m-d H:M) - `datetime_end` (query, string): End datetime for notification scheduling (format: Y-m-d H:M) - `cron_start` (query, string): Cron expression for notification scheduling start (format: * * * * * * *) - `scheduling` (query, string): Scheduling type: datetime or cron - `content_id` (query, integer): The content ID for the slide - `playlist_id` (query, string): The playlist ID to which the slide belongs Responses: - 200: Success (SlideOutput) ### POST /api/slides/positions Update positions of multiple slides Parameters: - `payload` (body, SlidePositions, required) Responses: - 200: Success ### DELETE /api/slides/{slide_id} Delete a slide Parameters: - `slide_id` (path, integer, required) Responses: - 200: Success ### GET /api/slides/{slide_id} Get a slide by its ID Parameters: - `slide_id` (path, integer, required) Responses: - 200: Success (SlideOutput) ### PUT /api/slides/{slide_id} Edit an existing slide Parameters: - `slide_id` (path, integer, required) - `enabled` (query, string): Is the slide enabled? - `duration_mode` (query, string, required): Duration mode: manual, delegate or infinite - `duration` (query, integer): Duration of the slide - `position` (query, integer): Position of the slide - `datetime_start` (query, string): Start datetime for scheduling (format: Y-m-d H:M) - `datetime_end` (query, string): End datetime for scheduling (format: Y-m-d H:M) - `day_start` (query, integer): Start day for inweek scheduling (format: 1 for Monday to 7 for Sunday) - `time_start` (query, string): Start time for inweek scheduling (format: H:M) - `day_end` (query, integer): End day for inweek scheduling (format: 1 for Monday to 7 for Sunday) - `time_end` (query, string): End time for inweek scheduling (format: H:M) - `scheduling` (query, string): Scheduling type: loop, datetime, or inweek - `content_id` (query, integer): The content ID for the slide - `playlist_id` (query, string): The playlist ID to which the slide belongs Responses: - 200: Success (SlideOutput) ## process: Operations on process ### POST /api/processes/player-refresh Refresh player Responses: - 200: Success (ProcessOutput) ## Models ### ContentOutput - `folder_id` (integer): Folder ID where the content is stored - `id` (integer): Unique identifier of the content - `location` (string): Location of the content - `name` (string): Name of the content - `type` (string): Type of the content ### ContentTypeOutput - `id` (string): ID of the content type - `name` (string): Name of the content type ### Folder - `id` (integer): Unique identifier of the folder - `name` (string, required): Name of the folder - `parent_id` (integer): Parent folder id - `path` (string): Path of the folder ### PlaylistOutput - `disable_interaction` (boolean): Disable user interaction? - `enabled` (boolean): Is the playlist enabled? - `id` (string): The unique identifier of a playlist - `loop_mode` (string): How contents is played in the playlist (values: sequential, timesync, random) - `name` (string, required): The playlist name ### ProcessOutput - `max_polling_interval` (integer): Max polling interval - `status` (string): Status of the process ### SlideOutput - `content_id` (integer): The content ID for the slide - `cron_schedule` (string): Cron expression for scheduling start - `cron_schedule_end` (string): Cron expression for scheduling end - `duration` (integer): Duration of the slide - `duration_mode` (string): Duration mode - `enabled` (boolean): Is the slide enabled? - `id` (integer): The unique identifier of a slide - `is_notification` (boolean): Is the slide a notification? - `name` (string): Name of the slide - `playlist_id` (string): The playlist ID to which the slide belongs - `position` (integer): Position of the slide ### SlidePositions - `positions` (object, required): A dictionary where keys are slide IDs and values are their new positions