# App Assets
Source: https://docs.titanos.tv/app-assets-specifications
To ensure proper display within the operating system, each application is required to provide a set of assets: icons, backgrounds and logo.
## Icons
We request partners to provide two icon formats, each serving specific purposes:
1. **Main Icon**
* Format: *JPG or PNG, **No transparency***
* Size: *1024x1024px.*
* Usage: *This icon is used for displaying the application on the Home Screen.*
2. **App Store Icon**
* Format: *JPG or PNG, **No transparency***
* Size: *Minimum of 960x540px.*
* Usage: This icon is displayed on the Apps Page and in Search Results.
**Note on the file size:** The size of each file should not exceed 10Mb.
## Logo
To facilitate the possible promotion of your app, we request that you provide us with the logo on a transparent background. This logo could be used in the banners on the Home Screen and on the Apps Page, as well as on the App Detail Page.
1. **Requirements**
* Format: *PNG*
* Size: *Minimum height of 512px. The width depends on the logo dimensions.*
* Maximum file size: *10MB*
2. **Design considerations**
* The logo should appear clear and contrast well against a dark/black background.
* Please crop all empty space around the logo; it should fit tightly inside its area without margins.
## Background
In the latest version of the operating system, each application will have its own detailed page. To enhance the user experience, we request the provision of one to three images that will be used as the background for this page. If more than one image is provided, Titan will chose which one to use.
Example of using Background in the interface
1. **Requirements**
* Format: *JPG or PNG*
* Size: *Minimum of FullHD (1920x1080px); ideally 4K (3840x2160px)*
* Maximum file size: *10MB*
2. **Design considerations**
* Avoid placing any important elements or text in the left half of the image. This area will be overlaid with the application's name and description, potentially obscuring it.
* These images can represent either high quality screenshots of the application or specially designed artworks that reflects the app's theme.
## Screenshots
In the current version of the operating system, we do not use and display application screenshots. However, for compatibility with earlier, unupdated devices released before 2022, we request developers to upload at least one screenshot. The maximum number of screenshots allowed is three.
1. **Requirements**
* Format: *JPG or PNG*
* Size: *Minimum of FullHD (1920x1080px); ideally 4K (3840x2160px)*
* Maximum file size: *10MB*
# FAST Channel Assets
Source: https://docs.titanos.tv/channel-assets-specifications
To ensure proper display within the operating system, each FAST channel is required to provide a set of assets: thumbnail, logo and background.
## Logo
The Logo will be used in the future versions of Titan OS. It could also be used as a watermark.
### Requirements
1. Format: *White PNG with **transparent background***
2. Size: *At least 640px on the longer side*
3. File size: **Should not exceed 1Mb**
### Design considerations
* There should be no padding between the logo and the file boundaries — the logo should extend fully to the edges, regardless of its aspect ratio. No empty space around the edges allowed.
* The logo must be white and contain no colour, but it could have semi-transparent white elements.
* It is strongly recommended to use the full logo, including the channel name. The logo may appear alongside logos of other channels, so it should remain clear and easily identifiable.
***
## Thumbnail
We request partners to provide the channel Thumbnail to be used in the EPG and search results.
### Requirements
1. Format: *JPG or PNG, **No transparency***
2. Size: *At least 640x360px*
3. Aspect ratio: *16:9*
4. File size: ***Should not exceed 1Mb***
### Design considerations
* The best way to make the channel easily recognisable is to use a logo over a contrasting background.
* Ensure the logo is large, clear and (optional) centred.
* Don’t add any additional text or elements to the thumbnail.
***
## Background
The background image serves as a placeholder while the channel stream loads. It should reflect the channel’s theme subtly, without being overly distracting.
### Requirements
1. Format: *JPG or PNG, **No transparency***
2. Size: ***Exactly** 1920x1080px ⚠️*
3. Aspect ratio: *16:9*
4. File size: ***Should not exceed 2Mb ⚠️***
### Design considerations
* Avoid adding any text or elements that might appear interactive or clickable to prevent user confusion.
* Avoid using solid colour fills. If a single-colour background is necessary, consider applying a gradient or pattern to add visual depth.
# Cookies & Local Storage
Source: https://docs.titanos.tv/cookies
The TitanOS application environment provides standard web mechanisms for storing data on the client-side, such as user sessions, preferences, and application state. Our platform supports `Cookies` and `Local Storage`, behaving identically to a modern, secure web browser.
This guide outlines how to use these standard web APIs within your application.
## LocalStorage
This method is used for storing persistent client-side data, such as JWT tokens, user settings (e.g., language preference), or application state. Data stored in `LocalStorage` is specific to your app's origin and persists even after the TV is turned off and on again.
* **Characteristics:** Persistent storage, larger capacity (typically 5-10 MB), data is not sent with every HTTP request.
* **Use via:** Standard JavaScript `window.localStorage` API.
JavaScript Example:
```javascript theme={null}
// Save a JWT token to LocalStorage
const jwtToken = 'your_auth_token_here';
localStorage.setItem('user_token', jwtToken);
// Retrieve the token later
const savedToken = localStorage.getItem('user_token');
if (savedToken) {
console.log('User is authenticated!');
}
// Remove the token (e.g., on logout)
localStorage.removeItem('user_token');
```
## Cookies
Cookies are also fully supported and work as they do in a standard web browser. They are primarily useful when your application's authentication model requires the browser to automatically send session identifiers with every API request to your backend.
* **Characteristics:** Can have an expiration date, smaller capacity (approx. 4 KB), data is sent with every HTTP request to your domain.
* **Use via:** Standard JavaScript `document.cookie` API or via `Set-Cookie` HTTP headers from your server.
JavaScript Example:
```javascript theme={null}
// Set a simple session cookie that expires in 1 day
const expiryDate = new Date();
expiryDate.setDate(expiryDate.getDate() + 1);
document.cookie = `session_id=abc123; expires=${expiryDate.toUTCString()}; path=/`;
```
## Is there a preferable method to use?
Both `LocalStorage` and `Cookies` are fully supported on the TitanOS platform, and the choice of which to use depends on your application's specific architecture and session management strategy. Your team should choose the mechanism that best fits your needs.
However, for most modern client-side storage use cases on a Smart TV application, `LocalStorage` is generally the recommended method due to several key benefits:
**Larger Storage Capacity:** `LocalStorage` offers a significantly larger storage capacity (typically 5-10 MB) compared to the 4 KB limit of cookies. This makes it ideal for caching application data, user profiles, or complex state information.
**Better Performance:** Data stored in `LocalStorage` is not automatically sent with every HTTP request to your server. This reduces network overhead and can improve your application's overall performance, which is especially important on embedded devices.
**Simpler API:** The JavaScript API for `LocalStorage` (`setItem()`, `getItem()`, `removeItem()`) is much cleaner and more straightforward to use than the manual string parsing required for managing document.cookie.
In summary, while both methods are available, we recommend `LocalStorage` for most use cases, such as managing JWT authentication tokens or caching user preferences. `Cookies` remain a perfectly valid option for traditional server-managed sessions or when specific features like `HttpOnly` security are a requirement.
## Alternative Strategy: Server-Side Sessions
While client-side storage is fully supported and often sufficient, some partners may opt for a server-side session management strategy.
In this model, the application state is stored on the partner's backend servers and associated with a unique device identifier. TitanOS provides the Titan SDK through which your application can retrieve a unique `deviceId`. This ID can then be used to create and manage server-side sessions.
This is a valid architectural choice that is fully enabled by our platform, but it is up to each application partner to decide if this model best fits their needs.
# Debugging your app
Source: https://docs.titanos.tv/debugging
This guide provides step-by-step instructions for debugging applications on Titan OS. The process varies slightly depending on your TV manufacturer.
## Debbuging on Philips devices
Ensure both your TV and PC are connected to the same network.
Open the DevView app on your TV. If you're not familiar with DevView, please refer to the [how to test on your TV](https://docs.titanos.tv/devviewinstall) documentation.
* Navigate to the Settings menu.
* Toggle the "Enable Debug Mode" option to ON. Your TV is now ready for debugging.
It should enable the debug mode on this device. From that point your device should becomes visible by chrome inspect.
* Open Chrome on your PC and enter chrome://inspect/devices.
* Check the "Discover network targets" option and click on "Configure."
* Enter the TV's local IP address and port number (e.g., `:9222` or `:7001`). Some devices have the port fixed at `9222`, and some others `7001`. It's expected if only one of them works.
* After configuration, Chrome will display the URLs opened on the TV.
* Click "inspect" to open Chrome Devtools and debug the page loaded on the TV.
## Debbuging on Vestel devices
For Vestel devices, debugging is enabled by default though port `4725`. You can connect to your TV directly without changing any settings in DevView.
* Open Chrome on your PC and enter chrome://inspect/devices.
* Check the "Discover network targets" option and click on "Configure."
* Enter the TV's local IP address and port number (e.g., `:4725`). The port number is fixed at `4725`.
* After configuration, Chrome will display the URLs opened on the TV.
* Click "inspect" to open Chrome Devtools and debug the page loaded on the TV.
## Debugging on Philips 2020-2022
For partners who owns Philips devices from 2020 to 2022, these devices require a special "debug firmware" to enable debugging. This process involves a "package burn" to flash a new firmware version onto the device.
* To get started, you'll need to contact our support team ([apponboarding@titanos.tv](mailto:apponboarding@titanos.tv)) to obtain the correct debug firmware file for your TV model.
* For step-by-step instructions on how to install debug firmware, please see our [Firmware Installation Guide]().
Once the firmware is installed, you can proceed to debug it in your chrome browser by doing the following steps:
* Open Chrome on your PC and enter chrome://inspect/devices.
* Check the "Discover network targets" option and click on "Configure."
* Enter the TV's local IP address and port number (e.g., `:7001`). The port number for Philips from 2020 to 2022 is fixed at `7001`.
* After configuration, Chrome will display the URLs opened on the TV.
* Click "inspect" to open Chrome Devtools and debug the page loaded on the TV.
## Chromium 135+ Compatibility Note
Starting with Chrome version 135 and newer, developers may experience issues where the Network Throttling (under the Network tab) and Local Storage (under the Application tab) in DevTools, appear completely empty when inspecting smart TV applications. This is a known behavior with modern Chromium remote debugging across various TV brands.
If your workflow heavily relies on network performance simulation or inspecting local storage data, please utilize the following workarounds to remain unblocked:
**Downloading a Compatible Chromium Version**
If you strictly require the visual Network Throttling panel or the graphical Local Storage UI, you must use a version of Chrome older than version 135:
* Open your terminal or command prompt.
* Navigate to the folder where you want to download the browser.
* Run the following command to download and extract Chrome version 134:
```bash theme={null}
npx @puppeteer/browsers install chrome@134
```
**Note:** You can replace 134 with any preferred older version stable for your ecosystem. Find more details on how to download other chromium versions at the [Chromium Org: Chrome for testing link](https://www.chromium.org/getting-involved/download-chromium/#chrome-for-testing).
* Open the downloaded executable file inside the newly created folder to launch your dedicated debugging browser.
**Managing Local Storage via the Console**
Alternatively, if you are using Chrome 135+ and only need to read, write, or inspect local storage properties, you can interact with it directly via the Console tab using standard JavaScript methods:
View all stored data:
```javascript theme={null}
console.table(localStorage);
```
Retrieve a specific value:
```javascript theme={null}
localStorage.getItem('KeyName');
```
Set or update a value:
```javascript theme={null}
localStorage.setItem('KeyName', 'Value');
```
Learn how to test your app using DevView.
Learn how to learn how install or update the firmware version.
# Device allowlisting
Source: https://docs.titanos.tv/device-allowlisting
Allowlisting devices is a strategy used to segment, whitelist or block an app for specific devices, allowing the application to adjust its behavior based on the brand or model that the app is running on. This serves several purposes:
* Enabling Titan OS devices access to the application.
* Creating a restricted allowlist of devices permitted to run the app while blocking unauthorized brands or specific models.
* Manually defining playback rules to serve content based on hardware capabilities (e.g., restricting UHD playback on 2K-only devices).
* Blocking the app in specific regions (e.g., when the contract is limited to LATAM devices).
* Displaying a "Not Available on this device" message for specific device segments.
## Identifying Titan OS Devices
To whitelist devices, we recommend using the Titan SDK. The library exposes properties to validate the operating system and the specific platform (model) on which the app is running on.
If your architecture requires the SDK to be imported dynamically, you can verify if a device is running Titan OS by checking the User Agent. This approach is common for cross-platform apps deployed across multiple TV brands. For more details, please refer to [Detecting Titan OS and Saphi](/user-agents-specifications#detecting-titan-os-and-saphi).
**Note:** Checking the User Agent is sufficient if your whitelist allows any Titan OS-powered device to access the application.
## Segmenting Device Groups
Once the SDK is imported, use the Product.platform property (Reference: [Titan SDK Dictionary](/titan-sdk#dictionary)) to identify the specific hardware platform.
Here's an example on how you can use it:
```javascript theme={null}
const deviceInfo = await titanSDK.deviceInfo.getDeviceInfo();
const platform = deviceInfo.Product.platform;
const allowedPlatforms = ['TPM268L', 'TPM266L', 'TPM267L'];
if (allowedPlatforms.includes(platform)) {
// Proceed to home page
} else {
// Display a message that the device is not supported
}
```
The following table is a reference of platforms for you to use in your list. If you need more details about these devies, please refer to the [Device Specifications](/platform-versions) page.
| Device | Region | Platform |
| :---------------------- | :----- | :------- |
| Philips 2026 MT9676 2K | LATAM | TPM268L |
| Philips 2026 MT9676 4K | EU | TPM266E |
| Philips 2026 MT9676 4K | LATAM | TPM266L |
| Philips 2026 MT9620 4K | EU | TPM267E |
| Philips 2026 MT9620 4K | LATAM | TPM267L |
| Philips 2026 NT690E | EU | TPN266E |
| Philips 2026 NT676 | EU | TPN258E |
| Sharp 2026 NT690 2K | EU | TSN257E |
| Philips 2025 NT690 2K | LATAM | TPM256L |
| AOC 2025 NT690 2K | LATAM | TAM256L |
| Philips 2025 NT690 4K | LATAM | TPM257L |
| Philips 2025 NT690 2K | EU | TPN257E |
| Philips 2025 NT690 4K | EU | TPN256E |
| Philips 2025 NT676 4K | EU | TPN258E |
| JVC 2025 MB190 4K | EU | MB190 |
| JVC 2025 MB191 2K | EU | MB191 |
| JVC 2025 NT690 2K | EU | TJN257E |
| Philips 2024 NVT690 2K | EU | TPN247E |
| Philips 2024 NVT690 2K | LATAM | TPN247L |
| Philips 2024 NVT690 4K | EU | TPN246E |
| Philips 2024 NVT690 4K | LATAM | TPN246L |
| AOC 2024 NVT690 4K | LATAM | TAN246L |
| Philips 2024 NVT676 4K | EU | TPN248E |
| Philips 2024 NVT676 4K | LATAM | TPN248L |
| Philips 2023 NVT690 2K | EU | TPN237E |
| Philips 2023 NVT690 4K | EU | TPN236E |
| Philips 2023 NVT676 4K | EU | TPN238E |
| Philips 2022 NVT690 4K | EU | TPN226E |
| Philips 2021 NVT671 4K | EU | TPN216E |
| Philips 2020 MTK9288 2K | EU | TPM207E |
| Philips 2020 MTK9288 2K | LATAM | TPM207L |
| Philips 2020 NVT671 4K | EU | TPN206E |
## Whitelisting via User Agent
As mentioned at the [first topic](/device-allowlisting#identifying-titan-os-devices), whitelisting via User Agent is recommended when you want to allow any Titan OS-powered device to open your app. If that's the case, please refer to the [Detecting Titan OS and Saphi](/user-agents-specifications#detecting-titan-os-and-saphi) topic from the User Agents page.
# DeviceInfo API [Deprecated]
Source: https://docs.titanos.tv/deviceinfoapi
The Device Info API is DEPRECATED and has been replaced by the [Titan SDK](https://docs.titanos.tv/titan-sdk).
This API offers essential services and features for Titan OS through JavaScript functions tailored for accessing TV-specific features and capabilities. With the DeviceInfoAPI, not only do you gain enhanced compatibility, but you can also conveniently access most DeviceAPI functions directly from your development computer.
The values returned by the SDK on computer browsers may differ from those on
TVs. In most cases, running on computer browsers will return a string with the
value of `"unknown"`. Please consider this variation when developing and
testing your applications across different platforms.
You can integrate this script into your app. Ensure that you're using the
latest script to avoid potential compatibility issues. We recommend linking
directly to the our CDN URL.
To access the device info, you first must add an external JS file which will
allow you to read them via an external object.
```javascript theme={null}
```
## DeviceInfo.Channel
Name of the appStore provider
Default: `TitanOS`
Name of the company who manufactured the device
Default: `TPV`
Name of the brand who sells the device
Default: `Philips`
## DeviceInfo.Product
Name of the appStore provider
Default: `"unknown"`
Year of manufacturing
Default: `"unknown"`
Unique identifier of the device
Default: `"unknown"`
Resettable Advertising ID
Default: `"unknown"`
Device Firmware Component ID
Default: `"unknown"`
Installed version number of the firmware
Default: `"unknown"`
## DeviceInfo.Capability
Name of the operating system
Default: `"unknown"`
Type of the browser engine (ex. Webkit, Chrome, etc...)
Default: `"unknown"`
If the device has storage.c
Default: `"unknown"`
Indicates if the device has 3D support.
Default: `"unknown"`
Indicates if the device has Ultra High Definition (UHD) support.
Default: `"unknown"`
Indicates if the device has High Dynamic Range (HDR) support.
Default: `"unknown"`
If the device has WebSocket support
Default: `"unknown"`
If the device has PlayReady support
Default: `"unknown"`
If the device has Widevine Modular support
Default: `"unknown"`
If the device has Widevine Classic support
Default: `"unknown"`
If the device has Adobe HDS support
Default: `"unknown"`
If the device has Apple HLS support
Default: `"unknown"`
If the device has MSSmooth Streaming support
Default: `"unknown"`
If the device has MPEG\_DASH support
Default: `"unknown"`
Device's Digital Rights Management method
Default: `"unknown"`
If the device has OIPF support
Default: `"unknown"`
If the device has EME support
Default: `"unknown"`
Indicates if the device supports numeric keys.
Default: `"unknown"`
Indicates if the device supports color keys.
Default: `"unknown"`
Indicates if the device supports multiscreen functionality.
Default: `"unknown"`
Indicates if the device supports multiple audio tracks.
Default: `"unknown"`
Indicates if the device supports in-band TTML subtitles.
Default: `"unknown"`
Indicates if the device supports out-of-band TTML subtitles.
Default: `"unknown"`
Indicates if the device has Full High Definition (FHD) support.
Default: `"unknown"`
Indicates if the device supports HDR10 High Dynamic Range.
Default: `"unknown"`
Indicates if the device supports Dolby Vision High Dynamic Range.
Default: `"unknown"`
Indicates if the device supports multiple audio tracks.
Default: `"unknown"`
Indicates if the device supports in-band TTML subtitles.
Default: `"unknown"`
Indicates if the device supports out-of-band TTML subtitles.
Default: `"unknown"`
# Testing your app
Source: https://docs.titanos.tv/devviewinstall
This guide will help you to launch your app on your TV. This proccess consists of two parts: Configure your app to be tested in the Partner Portal (web) and setup the DevView (in the device) to launch the app you've configure configured in the Partner Portal.
The DevView is an app available on all Titan OS devices that helps partners to develop and test their apps. It’s basically the DevTool for TitanOS, and it provides a section to launch your app on the Smart TV using the app URL, as well as a section with technical information about the TV, such as resolution, model, and DRM support.
### Add your apps to the Sandbox
Go to [Partner Portal](https://partners.titanos.tv/) on your computer.
If you don’t have access, you can request it in the portal. We will review
and resolve it as soon as possible
Add the apps you want to test in your Sandbox by clicking the button in the
top right corner.
Fill in the required information
### Pair your device
* For Philips 2020-2022 models, you can find it in the Smart TV collection / App Gallery
* For other Titan OS models, you can find it as well in the Apps section on the Lifestyle carousel
This is only for your internal testing purposes. You can later submit your
candidate for official QA and release process in My app-> Add new app
Pictures for illustration purposes only
# Frequently Asked Questions
Source: https://docs.titanos.tv/faq
Commonly asked questions about app development on Titan OS, regularly updated to address open questions. Have a question not listed? Please [contact us](mailto:apponboarding@titanos.tv) for any further enquiries.
***
## Why publish your app and distribute via Titan OS?
Titan OS is the European, independent Linux-based smart TV operating system from Titan OS S.L, the technology, entertainment, and advertising company based in Barcelona. The independent OS is designed for all connected TVs. It is currently integrated in Philips and AOC’s Linux 2024 smart TVs across Europe, soon to be expanded to earlier models.
Titan OS’ mission is to re-think TV, together. By featuring channels prominently on the homepage and seamlessly integrating broadcast and streaming feeds in the EPG, Titan OS is not only improving content discovery for audiences but also increasing the potential reach of advertising.
Titan OS allows for fast and seamless integration of partners and by utilising HTML5, it provides partners with the flexibility to effectively adapt to market demands.
## What type of apps does Titan OS support?
Titan OS is a Linux based system that supports HTML5 web applications.
## How long is the intake process?
The Intake & Quality Assurance process takes between 2 and 4 weeks. For existing HTML5 apps that are already available on other Linux-based Smart TV platforms, most of the effort is focused on remote control button mapping and the implementation of User Agents.
## Are there any variations of the platform to develop for?
No. Philips Legacy Linux TVs are upgraded to be compatible with the recent Titan OS platform. This allows you to distribute your app on models from the year 2020 onwards. That’s 5 model years covered, in just 1 development effort!
## Does Titan OS provide an emulator or sample TVs?
Currently, Titan OS does not provide an emulator/simulator solution. Sample TVs can sometimes be arranged, depending on the partnership. To discuss arranging a sample TV, [contact us](mailto:bteam@titanos.tv).
## How does Titan OS provide support during development and testing?
Titan OS is committed to supporting developers throughout the development and testing lifecycle, and to enabling them to create high-quality applications and services for Titan OS powered devices. Titan OS helps developers and testers by sharing all required information and knowledge to deliver the best experience in their applications.
## What DRM and streaming protocols does Titan OS support?
Please check our [supported DRMs and streaming protocols on our specifications page.](/media-specifications)
## Is there a way to test applications prior to launch?
Yes! If you have a Titan OS device, you can use [our DevView tool](/devviewinstall) to access and test your unpublished apps. Please reach out to your BD representative for more information.
## How do I retrieve the device ID?
Please check our [device API documentation](/deviceinfoapi).
## How do I retrieve the TV language setting?
Please check our [device API documentation](/deviceinfoapi).
## How do I find the TV model code?
To find the model code of your TV, you can typically locate it on the back of the TV itself. Look for a label or sticker that contains information about the TV, including its model number. The model number is usually a combination of letters and numbers, sometimes accompanied by additional information such as the serial number or manufacturing date.
## What is the User Agent returned by the TV?
Please check our [UserAgent documentation](/user-agents) that will provide insight on identifying and parsing of UserAgents.
# FAST Channels
### Why group feeds under an umbrella brand?
Grouping feeds helps you manage related channels more efficiently.
* Duplicate channel information across feeds
* Apply shared assets in one step
* Keep related feeds organized in the dashboard
### Do all localized feeds need to launch at the same time?
No. Each feed has its own lifecycle and can have unique details, timelines, and launch strategy.
You can:
* Launch feeds independently
* Add new feeds later
* Manage onboarding per feed
The system treats each localized feed as a standalone channel within the umbrella.
### What if my localized feeds have different branding or details?
Each feed can be customized independently.
You can:
* Share common information via duplication or bulk actions
* Adjust specific fields such as:
* Channel name
* Genre
* Languages
* Assets
# Firmware
Source: https://docs.titanos.tv/firmware-installation-guide
## What is a Firmware?
Firmware is the software that is permanently programmed into the TV hardware. It provides the low-level instructions the device needs to function.
Unlike applications, which are easily installed, firmware is tightly linked to the device's hardware and requires a more careful installation process. It handles core functions like starting up the device and controlling basic hardware components.
## Firmware use cases
A firmware file is necessary for specific development and diagnostic tasks that are not possible in a standard production environment.
A firmware file is typically only required for a few key use cases:
* **Legacy Devices:** Testing applications on Philips devices from 2020 to 2022.
* **System Diagnostics:** Capturing detailed system logs, monitoring TV behavior, and diagnosing issues.
* **Deep-Level Debugging:** Performing advanced debugging that requires a dedicated environment.
* **Version Updates:** To manually update a development or production firmware to a specific version.
* **Support:** If requested by the Titan OS support team to investigate system issues.
With the exception of option one (about testing applications on Philips devices), the other options are only necessary if requested by the support team.
## Philips devices
### How to check your current firmware
On your Smart TV, go to: Configuration > Update Software > Current software info. The version number will indicate if it's a production or debug version.
| **Production Firmware** | **Debug Firmware** |
| :-------------------------------------------- | :--------------------------------------------------------------------------------- |
| **Versions ending in `1`** (e.g., `249.001`). | **Versions ending in `0`** (e.g., `249.000`). |
| Intended for regular user operations. | Intended for development and debugging, with additional logs and diagnostic tools. |
### How to Get a Firmware File
A firmware file is only available for partners who are in the process of onboarding (certification) or have a commercial agreement with Titan OS.
To obtain the debug firmware for your TV model or to get more details on how to get this support, please contact the Titan OS Partner Support Team at [apponboarding@titanos.tv](mailto:apponboarding@titanos.tv).
### Preparing for installation
**USB drive requirements**
* **USB 2.0** drive with at least **4GB**
* Ensure the USB drive is formatted to **FAT 32**
* Ensure the USB drive remains connected to the TV throughout the process
**File types and their usage**
* **Pkg Embedded File**: Used when switching from production firmware to debug firmware, or vice versa. The file provided is named `pkg.burn.7z`, and it contains all necessary files for this transition.
* **Upgrade Pkg File**: Used for updating the firmware version. This file has the extention `upgrade.pkg`.
### Installing a Debug Firmware
This process is used when switching between production and debug firmware (or vice versa).
Download the `pkg.burn.7z` file and extract its contents. Copy all the
extracted files to the root directory of your prepared USB drive.
Power off the TV by unplugging it from the AC outlet. Insert the USB drive
into one of the TV's USB 2.0 ports. Press and hold the joystick power key
located beneath the remote control sensor on the TV. While holding the key,
plug the TV back into the AC outlet. Hold for about 10-15 seconds before
releasing. The TV will perform an "empty burning" process, installing the
debug firmware.
Once the process is complete, remove the pendrive and manually unplug and
replug the TV. Navigate to **Settings → General Settings → Reinstall to
reset the TV**.
### Updating Firmware
Download the correct debug firmware file for your TV model. Ex:
`PH_2K24_ALL_EU_NT72690_TPN246E_V246.004.147.110_upgrade.pkg` Rename the
file to `upgrade.pkg`.
Copy the `upgrade.pkg` file to the root directory of the USB drive. Insert
the USB drive into the TV. Unplug and replug the TV from the power source to
start the update automatically.
After the update, remove the USB drive to prevent accidental reinstallation.
Navigate to **Settings → General Settings → Reinstall to reset the TV**.
Larn how to debug apps in Titan OS devices
Learn how to get started to the new accessibility functionalities in TitanSDK
# Introduction
Source: https://docs.titanos.tv/introduction
Access technical specifications, guides, and resources tailored to streamline your app integration process onto Titan OS.
## What is Titan OS?
Titan OS is the European, independent Linux-based smart TV operating system from Titan OS S.L, the technology, entertainment, and advertising company based in Barcelona. The independent operating system designed for all connected TVs is currently integrated in Philips and AOC’s Linux 2024 smart TVs across Europe, soon to be expanded to earlier models. Titan OS aims to be the largest independent CTV operating system in Europe and LATAM.
Titan OS’ mission is to re-think TV, together. By featuring channels prominently on the homepage and seamlessly integrating broadcast and streaming feeds in the EPG, Titan OS is not only improving content discovery for audiences but also increasing the potential reach of advertising.
## How to get your app on Titan OS
To deploy your application on Titan OS, developers must create a hosted HTML5 app and provide the URL. If your service is already operational on other Linux-based TV platforms, transitioning it to Titan OS requires minimal additional effort.
Titan OS operates on a Chromium browser, offering support for standard audio and video codecs, streaming protocols, and DRM options, ensuring compatibility with existing video infrastructure.
If you can’t find the information you need, contact the [Support Team](mailto:apponboarding@titanos.tv).
### Next steps
Step by step guide to get your app on Titan OS
Information on how to preview and debug your application on TV
# Media
Source: https://docs.titanos.tv/media
This document provides a detailed breakdown of the media playback capabilities for each device in the TitanOS portfolio. The tables below outline the specific formats, codecs, and DRM systems supported by each platform.
## Media compatibility
**Specifications: Philips 2026**
Video Formats, Protection and Codecs
| Feature | MT9676 2k | MT9676 4k | MT9620 4k | NT690E | NT676 |
| :--------------- | :-------: | :-------: | :-------: | :----: | :---: |
| **MPEG DASH** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **MSS** | ❌ | ❌ | ❌ | ❌ | ❌ |
| **HLS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | ❌ | ✓ | ❌ | ✓ |
| **HDR10** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | MT9676 2k | MT9676 4k | MT9620 4k | NT690E | NT676 |
| :--------------------- | :--------: | :--------: | :--------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 4.4 | 4.4 | 4.0 | 4.0 | 4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | MT9676 2k | MT9676 4k | MT9620 4k | NT690E | NT676 |
| :--------------------- | :--------: | :--------: | :--------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 17 | 17 | 17 | 17.1 | 16.4 |
| **Security Level** | L1 | L1 | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | MT9676 2k | MT9676 4k | MT9620 4k | NT690E | NT676 |
| :------------------------------ | :-------: | :-------: | :-------: | :----: | :---: |
| **Dolby Atmos** | ❌ | 🟡 | ✓ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ | ✓ | ✓ |
**Specifications: Sharp 2026**
Video Formats
| Feature | NVT671 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ❌ |
| **HLS** | ✓ |
| **Dolby Vision** | ❌ |
| **HDR10** | ✓ |
| **HDR10+** | ❌ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 4.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 16.4 |
| **Security Level** | L1 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT671 |
| :------------------------------ | :----: |
| **Dolby Atmos** | ❌ |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ⏳ |
**Specifications: Philips 2025**
Video Formats, Protection and Codecs
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------- | :-------: | :-------: | :------: | :------: | :---: |
| **MPEG DASH** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | ❌ | ❌ | ❌ | ✓ |
| **HDR10** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------------- | :--------: | :--------: | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 4.4 | 4.4 | 4.0 | 4.0 | 4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------------- | :--------: | :--------: | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 16 | 16 | 16.4 | 16.4 | 16.4 |
| **Security Level** | L1 | L1 | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :------------------------------ | :-------: | :-------: | :------: | :------: | :---: |
| **Dolby Atmos** | ❌ | ✓ | ❌ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ | ✓ | ✓ |
**Specifications: JVC 2025**
Video Formats, Protection and Codecs
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------- | :---: | :---: | :----------: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ✓ | ❌ | ❌ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ✓ | ❌ | ❌ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------------- | :----: | :----: | :----------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v4.4 | v4.4 | v4.0 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc | cenc | ctr, cbcs |
DRM - Widevine
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------------- | :---: | :---: | :----------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 3.2 | 3.2 | 16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc | cenc | ctr, cbcs |
Audio Formats and Codecs
| Feature | MB190 | MB191 | HKC NT690 2K |
| :------------------------------ | :---: | :---: | :----------: |
| **Dolby Atmos** | ✓ | ❌ | ❌ |
| **AAC** | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ |
**Specifications: Philips 2024**
Video Formats
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------- | :-------: | :-------: | :----: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | 🟡 | ✓ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v.4.0 | v.4.0 | v.4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v.16.4 | v.16.4 | v.16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------ | :-------: | :-------: | :----: |
| **Dolby Atmos** | ❌ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ |
**Specifications: Philips 2023**
Video Formats
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------- | :-------: | :-------: | :----: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | 🟡 | ✓ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 4.0 | 4.0 | 4.0 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 16.4 | 16.4 | 16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------ | :-------: | :-------: | :----: |
| **Dolby Atmos** | ❌ | 🟡 | ✓ |
| **AAC** | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ |
**Specifications: Philips 2022**
Video Formats
| Feature | NVT690 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ✓ |
| **HLS** | ✓ |
| **Dolby Vision** | ✓ |
| **HDR10** | ✓ |
| **HDR10+** | ✓ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT690 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 4.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | v.16.3 |
| **Security Level** | L1 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 |
| :------------------------------ | :----: |
| **Dolby Atmos** | ✓ |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ✓ |
**Specifications: Philips 2021**
Video Formats
| Feature | NVT671 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ✓ |
| **HLS** | ✓ |
| **Dolby Vision** | ✓ |
| **HDR10** | ✓ |
| **HDR10+** | ✓ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 3.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT671 |
| :--------------------- | :----: |
| **Supports** | ❌ |
| **Version** | ❌ |
| **Security Level** | ❌ |
| **HDCP version** | ❌ |
| **Encryption Schemes** | ❌ |
Audio Formats and Codecs
| Feature | NVT671 |
| :------------------------------ | :----: |
| **Dolby Atmos** | 🟡 |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ✓ |
**Specifications: Philips 2020**
Video Formats
| Feature | MTK9288 | NVT671 |
| :--------------- | :-----: | :----: |
| **MPEG DASH** | ✓ | ✓ |
| **MSS** | ✓ | ✓ |
| **HLS** | ✓ | ✓ |
| **Dolby Vision** | ❌ | ✓ |
| **HDR10** | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ |
| **HLG** | ✓ | ✓ |
DRM - PlayReady
| Feature | MTK9288 | NVT671 |
| :--------------------- | :-----: | :-------: |
| **Supports** | ✓ | ✓ |
| **Version** | ... | 3.0 |
| **Security Level** | ... | SL3000 |
| **HDCP version** | ... | 2.3 |
| **Encryption Schemes** | ... | ctr, cbcs |
DRM - Widevine
| Feature | MTK9288 | NVT671 |
| :--------------------- | :-----: | :----: |
| **Supports** | ✓ | ❌ |
| **Version** | v.16.3 | ❌ |
| **Security Level** | L1 | ❌ |
| **HDCP version** | ... | ❌ |
| **Encryption Schemes** | ... | ❌ |
Audio Formats and Codecs
| Feature | MTK9288 | NVT671 |
| :------------------------------ | :-----: | :----: |
| **Dolby Atmos** | 🟡 | 🟡 |
| **AAC** | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ |
| **Opus** | ✓ | ✓ |
**Note:**
To get more details about each property, check the [Devices Specifications Dictionary](/platform-versions#dictionary).
## Known Issues & Workarounds
* **Devices Affected:** PHILIPS 2020 NVT671 and PHILIPS 2021 NVT671
* **Description:** These device platforms have a known firmware issue that cause playback failures when using DASH with the Widevine DRM system. Playback using DASH with Playready is unaffected and works as expected.
* **Recommendation:**
* For the affected device models, we recommend implementing player logic to prioritize Playready as the DRM system for DASH content. If the player allows, configuring a direct fallback from a Widevine failure to a Playready attempt is also a valid strategy.
* If you have restrictions about having to change the content from Widevine to Playready, we should consider don't launch for this specific device.
## Contact & Feedback
If you encounter a playback issue not listed here, please contact our partner support team at [apponboarding@titanos.tv](mailto:apponboarding@titanos.tv) with the device model, firmware version, and a description of the issue.
# Media Specifications
Source: https://docs.titanos.tv/media-specifications
HTML5-based applications leverage the video tag to deliver streaming services to end users. Titan OS supports a range of standards and formats, adhering to their specifications. However, Titan OS recommends certain video and streaming formats that are widely used and thoroughly tested. Below are the recommended video formats utilized on the Titan OS platform.
## Transport Protocols
* HTTP or HTTPS using HTTP protocol v1.1 and Range requests.
* Transport Layer Security (TLS) version 1.2 with forward security.
* TLS key support 2048 bits for RSA and 256 bits for EC.
* TLS does not use any known insecure cryptographic primitives (e.g., RC4 encryption, SHA-1 certificate signatures).
***
## Progressive Download
Progressive download of video and audio is supported but below notes apply:
* Content which is protected with DRM not supported via progressive download
* In-band subtitles not supported via progressive download
* Exception is Out-of-band subtitles, because they are supported with both streaming and download as they are handled outside of the media scope
Following combinations are supported:
| Container | Audio codecs | Video codecs | DRM | DRM Trigger | In-band subtitles |
| :------------------ | :-------------------------------------------------------------------------------------------- | :--------------- | :--- | :---------- | :---------------- |
| ISO BMFF | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 H.265 | None | None | Not supported |
| MPEG2-TS | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 | None | None | Not supported |
| WebM | Opus | VP9 | None | None | Not supported |
| ADTS / AAC MP3 | AAC-LC HE-AAC v1 HE-AAC v2 MP3 | None | None | None | Not supported |
***
## Adaptive Bitrate streaming protocols
The following Adaptive Bitrate (ABR) streaming protocols MUST be supported:
| Streaming Type | MIME-Types | Notes |
| :------------------------------- | :-------------------------------------------------------------------------- | :-------------------------------------------------- |
| Apple HTTP Live Streaming (HLS) | application/vnd.apple.mpegurl application/x-mpegURL | VoD (append-mode window) and Event (sliding window) |
| MPEG-DASH | application/dash+xml | Main and Live profiles of MPEG-DASH |
| Microsoft Smooth Streaming (MSS) | application/vnd.ms-sstr+xml application/vnd.ms-playready.initiator+xml | |
***
## Apple HTTP Live Streaming (HLS)
We support HTTP Live Streaming Protocol version 3, both Live and On-Demand streams.
Support for the following M3U8 playlist tags is available:
* EXTM3U
* EXTINF
* EXT-X-TARGETDURATION
* EXT-X-MEDIA-SEQUENCE
* EXT-X-KEY
* EXT-X-ENDLIST
* EXT-X-STREAM-INF
* EXT-X-DISCONTINUITY
* EXT-X-VERSION
| Container | Audio codecs | Video codecs | Encryption | Decryption Trigger | In-band subtitles |
| :-------- | :-------------------------------------------------------------------------------------------- | :--------------- | :--------- | :----------------- | :---------------- |
| MPEG2-TS | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 H.265 | None | | Not supported |
| MPEG2-TS | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 H.265 | AES-128 | Manifest | Not supported |
| ADTS | AAC-LC HE-AAC v1 HE-AAC v2 | None | None | | Not supported |
| ADTS | AAC-LC HE-AAC v1 HE-AAC v2 | AES-128 | Manifest | | Not supported |
| MP3 | MP3 | None | None | | Not supported |
| MP3 | MP3 | None | AES-128 | Manifest | Not supported |
***
## Restrictions for HLS content
The following combinations of containers and codecs can be used for MPEG-DASH profiles:
| Container | Audio codecs | Video codecs | DRM | DRM Trigger | In-band subtitles |
| :-------- | :-------------------------------------------------------------------------------------------- | :--------------- | :---------------------- | :---------- | :---------------- |
| ISO BMFF | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 H.265 | None | None | Supported |
| ISO BMFF | AAC-LC HE-AAC v1 HE-AAC v2 MP3 Dolby AC3 Dolby AC4 Dolby E-AC-3 | H.264 H.265 | ClearKey PlayReady | EME | Supported |
| Container | Audio codecs |
| :------------------------------ | :------------------------------------------------------------------------------------------------------- |
| ISO Base Media File Format Live | urn:mpeg:dash:profile:isoff-live:2011 |
| ISO Base Media File Format Main | urn:mpeg:dash:profile:isoff-main:2011 |
| DASH-AVC/264 | urn:com:dashif:dash264 [http://dashif.org/guidelines/dash264](http://dashif.org/guidelines/dash264) |
| DASH-AVC/264 SD | [http://dashif.org/guidelines/dash264#sd](http://dashif.org/guidelines/dash264#sd) |
| DASH-AVC/264 HD | [http://dashif.org/guidelines/dash264#hd](http://dashif.org/guidelines/dash264#hd) |
| DASH-AVC/264 Main | [http://dashif.org/guidelines/dash264main](http://dashif.org/guidelines/dash264main) |
| DASH-AVC/264 Live | [http://dashif.org/guidelines/dash264live](http://dashif.org/guidelines/dash264live) |
***
## Restrictions for MPEG-DASH content
Below is the list of limitations:
| Parameter | Requirements |
| :------------------------------- | :------------------------------- |
| Frame rate | Up to 60fps |
| Audio sample rate | Up to 48000 Hz |
| Number of audio channels | Up to 8 (7+LFE) |
| Media segment file size | Up to 15MB |
| Segment duration | In range 1s - 12s |
| Average bitrate over one segment | Up to 8 Mbit/s (for up to 1080p) |
| Manifest file size | Up to 2MB |
| Number of tracks in one MPD file | Up to 36 |
***
## Microsoft Smooth Streaming (MSS)
Microsoft Smooth Streaming Transport Protocol v2.2, both Live and On-Demand streams.
The following combinations of containers and codecs can be used:
| Container | Audio codecs | Video codecs | DRM | DRM Trigger | In-band subtitles |
| :-------- | :----------------------------------- | :----------- | :-------- | :----------- | :---------------- |
| PIFF v1.1 | AAC-LC HE-AAC v1 HE-AAC v2 | H.264 | None | None | Supported |
| PIFF v1.1 | AAC-LC HE-AAC v1 HE-AAC v2 | H.264 | PlayReady | Manifest | Supported |
| PIFF v1.1 | AAC-LC HE-AAC v1 HE-AAC v2 | H.264 | PlayReady | WebInitiator | Supported |
***
## Restrictions for Smooth Streaming content
Below is the list of limitations :
| Parameter | Requirements |
| :------------------------------- | :------------------------------- |
| Frame rate | Up to 60fps |
| Audio sample rate | Up to 48000 Hz |
| Number of audio channels | Up to 8 (7+LFE) |
| Media segment file size | Up to 15MB |
| Segment duration | In range 1s - 12s |
| Average bitrate over one segment | Up to 8 Mbit/s (for up to 1080p) |
| Manifest file size | Up to 2MB |
***
## Media Source Extensions (MSE)
Media Source Extensions is supported according to the MSE specification.
The following combinations of containers and codecs can be used:
| Container | Audio codecs | Video codecs |
| :-------- | :----------- | :----------- |
| MP4 | AAC/MP3 | H.264/H.265 |
| WebM | Opus | VP9 |
| MP4 | AAC/MP3 | No video |
| WebM | Opus | No video |
| MP4 | No audio | H.264/H.265 |
| WebM | No audio | VP9 |
| MP4 | No audio | AV1 |
| MP4 | AAC/MP3 | AV1 |
***
## Subtitles and Closed Captioning
To display subtitles or Closed Captions, the apps can use WebVTT to the extent that it is supported by the Chromium engine, and MUST support the EBU-TT-D text track profile, which is a subset of the TTML text track format.
Apps can use in-band and out-of-band subtitles (text tracks) according to the table below:
| Media Delivery Method | In-band Subtitles | Out-of-band Subtitles |
| :-------------------- | :---------------- | :-------------------- |
| Progressive playback | Not supported | Supported |
| HLS | Not supported | Supported |
| MPEG-DASH | Supported | Supported |
| Smooth Streaming | Supported | Supported |
| MSE | Not supported | Supported |
# Metadata
Source: https://docs.titanos.tv/metadata
## Metadata Integration & Content Discovery
Titan OS leverages comprehensive Metadata Catalogues from our partners to power a content-centric discovery ecosystem. Integrating your library via a structured metadata feed forms the technical foundation for visibility within the Titan OS environment, ensuring your assets are surfaced directly on the system level where users spend the majority of their discovery time.
By providing high-quality data, your content is seamlessly integrated across all key areas of the User Interface (UI), including:
* **Universal Search:** Titles are fully indexed for precise search queries, ensuring users can find your content instantly by title, genre, or cast.
* **Recommendation Rows:** Partner-specific content rows tailored to user preferences, managed by either the partner or TitanOS.
* **Curated Rows & Sections:** Specific titles are highlighted within editorial rows on the Home Page and specialized content hubs to drive focus to specific library highlights.
* **Content Details Page:** The dedicated informational hub for a title. Rich metadata—such as long descriptions, release year, age ratings, and genres—populates this page to provide context and drive user engagement.
* *Horizontal Content Cards:* The standard content card format used for the Home Page, Watchlist, Top 10 Rows, Search, and other primary grid layouts within the TitanOS UI.
This integration allows Titan OS to ingest, index, and normalize your library, ensuring an accurate and attractive representation of your assets across all system-level touchpoints. For the end-user, this results in a superior experience where relevant content is accurately categorized and easily accessible.
Ultimately, the quality of your metadata directly impacts the efficiency of content matching, deduplication, and deep-linking. This technical synergy ensures a frictionless transition from discovery to playback, significantly enhancing discoverability for app providers and driving long-term engagement for the viewer.
# Feed Delivery & Access Methods
Source: https://docs.titanos.tv/metadata-access-methods
To maintain the integrity of the TitanOS metadata library, we require a reliable method to fetch your content updates. While we support various delivery methods and formats, we prioritize solutions that offer high availability and simple, automated authentication.
## Preferred Method: API Endpoint
Our preferred delivery method is a standard REST API Endpoint. This allows our ingestion engine to poll for updates on a scheduled basis.
* **Authentication:** We support standard, lightweight authentication methods including Basic Auth, API Keys, or Bearer Tokens.
* **Access Requirements:** To minimize the risk of service interruptions, we require an endpoint that does not require IP whitelisting. We utilize a distributed cloud-based ingestion system; therefore, open access (secured by auth) is mandatory for a stable connection.
* **Payload Structure:** A "One-Request" model is preferred. All metadata for a specific title—including descriptions, artwork, and availabilities—should be contained within a single response.
## Alternative: File Download (Server or S3)
If an API is not available, TitanOS can download a static export from your server or a cloud storage provider (e.g., Amazon S3).
* **Consistency:** If hosting a file on your own server, the filename must remain consistent to ensure our automated crawler can locate the file during every sync cycle.
* **Format:** We support both JSON and XML. However, JSON is strongly preferred for its efficiency and ease of mapping.
* **Timeline Impact:** Implementing a file-based or bucket-based workflow requires additional custom configuration and may extend the overall integration timeline.
## Response Architecture
To optimize the intake process, please follow these structural guidelines for your feed:
| Feature | Requirement |
| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- |
| Completeness | Each content object must be "self-contained," including all required metadata, artwork, and availability fields in the same response. |
| Segmentation | The response can be separated by Content Type (e.g., Movies vs. Series) or by Market (e.g., DE, ES, UK) if required by the partner’s internal logic. |
| Encoding | All feeds must be encoded in UTF-8 and delivered via HTTPS. |
| Stability | The structure (keys and nesting) must remain consistent once the integration is live to prevent ingestion failures. |
# Feed Setup
Source: https://docs.titanos.tv/metadata-feed-setup
To ensure a seamless and consistent user experience across all platforms, the precise structuring of metadata is of vital importance. While core specifications—such as IDs, titles, and basic assets—remain uniform across the ecosystem, each content category requires specific extensions to accurately reflect its unique characteristics.
The following sections detail the technical requirements and field definitions for our three primary content feeds. The goal is to standardize global attributes like durations, genre mapping, and availability windows, while incorporating type-specific metadata:
* **Movies:** Focusing on standalone events and cinematographic details.
* **Series:** Organizing hierarchical structures, including season and episode management.
* **Sports:** Managing live dynamics, tournament frameworks, and time-sensitive replay logic.
## Core Metadata
Scroll the table horizontally to see more.
| Field Name | Value & Format | Description | Movies | Series | Seasons | Episodes | Sport |
| :--------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------ | :------------ | :------------ | :------------ | :------------ |
| **id** | `Integer` (e.g. 12345) | ID of the asset | required | required | required | required | required |
| **created\_at** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | UTC timestamp indicating the last time this item was created | required | required | required | required | required |
| **updated\_at** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | UTC timestamp indicating the last time this item was modified | required | required | required | required | required |
| **type** | `Enum`: “movie”, “tv\_show”, “season”, “episode”, “sport\_program” | Type of content | required | required | required | required | required |
| **original\_title** | `String` (e.g. “Inception”) | Official/original title of the content | required | required | required | required | required |
| **titles** | Array of `{ locale: string, title: string }` | Localized titles per language | required | required | required | required | required |
| **synopses** | Array of `{ locale: string, synopsis: string }` | Localized short synopsis (min. 200 characters) | required | required | required | required | required |
| **year** | `Integer` (e.g. 2010) | Year of release | required | required | required | required | required |
| **duration** | `Integer` (seconds) (e.g. 8880) | Total runtime in seconds | required | required | required | required | optional |
| **deeplinkings** | Array of `{ market: string, action: string, device_type: "TV", url: string }` | Deep links for launching TV content in partner apps. [For more details see the deep links section](/metadata-feed-setup#deeplinks). | required | required | required | required | required |
| **availabilities** | Array of objects | Availability of content per country/business model. [See more details in the Availabilities section](/metadata-feed-setup#availabilities) | required | required | required | required | required |
| **availabilities\[].market** | Array of ISO 3166 country code (e.g. “US”) | Target markets | required | required | required | required | required |
| **availabilities\[].business\_model** | `Enum`: “AVOD”, “HVOD”, “RVOD”, “TVOD”, “SVOD”, “EST” | AVOD (free ad-supported), HVOD (subscription + ads), etc. | required | required | required | required | required |
| **availabilities\[].price** | `Number` | The numerical value of the content (e.g., 3.99). | If Applicable | If Applicable | If Applicable | If Applicable | If Applicable |
| **availabilities\[].currency** | ISO 4217 currency code | Currency of the price. (e.g., EUR, GBP, USD). | If Applicable | If Applicable | If Applicable | If Applicable | If Applicable |
| **availabilities\[].video\_quality** | `Enum`: “SD”, “HD”, “UHD” | Supported video resolutions | required | required | required | required | required |
| **availabilities\[].availability\_start** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | UTC timestamp indicating the first day this content is available in the application | optional | optional | optional | optional | optional |
| **availabilities\[].availability\_end** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | UTC timestamp indicating the last day this content is available in the application | optional | optional | optional | optional | optional |
| **artwork\_landscape** | Array of `{ locale: string, url: string }` | Mandatory horizontal artwork with title treatment ($\ge$ 960x540, 16:9). [See more details in the Artwork section](/metadata-feed-setup#artwork) | required | required | required | required | required |
| **screenshot\_landscape** | Array of `{ locale: string, url: string }` | Horizontal screenshot without TT ($\ge$ 1920x1080, desired 4K, 16:9) | required | required | required | required | required |
| **screenshot\_portrait** | Array of `{ locale: string, url: string }` | Optional portrait screenshot ($\ge$ 400px, ideal $\ge$ 800px) | required | required | required | required | required |
| **artwork\_portrait** | Array of `{ locale: string, url: string }` | Optional vertical poster/artwork ($\ge$ 640px, ideal $\ge$ 960px) | required | required | required | required | required |
| **transparent\_logo** | `{ locale: string, url: string }` | Optional logo with transparent background ($\ge$ 400px, ideal $\ge$ 640px) | optional | optional | optional | optional | optional |
| **genres** | Array of `Enum` or TVA genre codes | Must match predefined list (Action, Drama, etc.) We support TV Anytime (TVA) standard for Genres and strongly recommend using TVA genre codes. [Link to section for genres](/metadata-feed-setup#genres) | required | required | required | required | required |
| **dominant\_genre** | `String` (e.g. “Drama”) OR TVA genre code | The master genre for the title. This single value determines where the content appears in category rows and filters. [Link to section for genres](/metadata-feed-setup#genres) | required | required | required | required | If Applicable |
| **classifications** | Array of `{ country: string, minimum_age: integer, code: string, system: string }` | Age restrictions per country. [See more details in the AgeRating section](/metadata-feed-setup#age-rating) | required | required | required | required | required |
| **external\_id** | Array of `{ type: "imdb" \| "tmdb", id: string }` | External content identifier (IMDB or TMDB) | required | required | required | required | optional |
| **actors** | Array of `{ name: string }` | Actor Names | required | required | required | required | N/A |
| **directors** | Array of `{ name: string }` | Director Names | required | required | required | required | N/A |
| **series\_info** | array of object | contains relevant information of the series | N/A | required | N/A | N/A | N/A |
| **series\_info\[].total\_numbers\_seasons** | `Integer` (e.g. 3) | Total numbers of Seasons (for Series) | N/A | required | N/A | N/A | N/A |
| **series\_info\[].total\_numbers\_episodes** | `Integer` (e.g. 36) | Total numbers of Episodes (for Series) | N/A | required | N/A | N/A | N/A |
| **season\_info** | array of object | contains relevant information of the season | N/A | N/A | required | N/A | N/A |
| **season\_info\[].parent\_series\_id** | `Integer` (e.g. 12345) | ID of the series. Correspondents with the content id of the series the season belongs to | N/A | N/A | required | N/A | N/A |
| **season\_info\[].season\_number** | `Integer` (e.g. 2) | Number of the current Season | N/A | N/A | required | N/A | N/A |
| **season\_info\[].total\_number\_episodes** | `Integer` (e.g. 7) | Total numbers of Episodes in this season | N/A | N/A | required | N/A | N/A |
| **episode\_info** | array of object | contains relevant information of the episode | N/A | N/A | N/A | required | N/A |
| **episode\_info\[].parent\_series\_id** | `Integer` (e.g. 12345) | ID of the series. Correspondents with the content id of the series the episode belongs to | N/A | N/A | N/A | required | N/A |
| **episode\_info\[].parent\_season\_id** | `Integer` (e.g. 12345) | ID of the current season this episode belongs to | N/A | N/A | N/A | required | N/A |
| **episode\_info\[].season\_number** | `Integer` (e.g. 2) | Number of the season this episode belongs to | N/A | N/A | N/A | required | N/A |
| **episode\_info\[].episode\_number** | `Integer` (e.g. 4) | Episode number in this season | N/A | N/A | N/A | required | N/A |
| **sport\_event\_info** | | contains relevant information for sport content | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].discipline** | `String` (e.g. “Football”) | | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].sub\_discipline** | `String` (e.g. “U21”, “Heavyweight”) | Used for age groups (e.g. "U21"), weight classes (e.g. "Heavyweight"), or specific disciplines within a sport (e.g. "Beach Soccer") | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].gender** | `Enum`: "male", "female", "mixed" | | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].tournament** | `String` (e.g. “UEFA Champions League”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].league** | `String` (e.g. “Primera Division”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].competition\_stage** | `String` (e.g. “Quarter Final” or “Matchday 12“ or “Qualifying“ or “Race”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].is\_olympic** | `boolean` | indicates if the event is part of olympic games | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].type\_of\_event** | `Enum`: "full\_event", "highlights", "magazine", "documentary", "press\_conference", "interview", "full\_event\_replay" | | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].competitor\_home** | `String` (e.g. “FC Barcelona”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].competitor\_away** | `String` (e.g. “Real Madrid”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].location** | | contains relevant information for event location | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].location\[].country** | `String` (e.g. “Spain”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].location\[].city** | `String` (e.g. “Barcelona”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].location\[].venue** | `String` (e.g. “Spotify Camp Nou”) | | N/A | N/A | N/A | N/A | If Applicable |
| **sport\_event\_info\[].live\_timeline** | | contains relevant information for event timeline | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].live\_timeline\[].start\_time** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | Scheduled start time of the event | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].live\_timeline\[].actual\_start\_time** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | Scheduled start time of the event | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].live\_timeline\[].end\_time** | `ISO 8601` (e.g. “2025-05-19T14:23:00Z”) | Scheduled end time of the event | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].live\_timeline\[].status** | `Enum`: “pre\_event”, “live”, “ended”, "delayed", "postponed", "cancelled" | Indicates the current status of the event | N/A | N/A | N/A | N/A | required |
| **sport\_event\_info\[].live\_timeline\[].is\_restart\_enabled** | `boolean` | indicates if the user can start from the beginning | N/A | N/A | N/A | N/A | required |
## Genres
To maintain a consistent browsing experience and power our recommendation engines, TitanOS requires all content to be tagged with accurate genre metadata. We currently support a native set of fixed genres. We strongly support a industry-standard classification systems like TVA (TV-Anytime) to allow for more granular mapping.
### Genre Standards & Recommendations
TitanOS supports both our internal native genre set and the industry-standard **TV-Anytime (TVA)** classification system.
We strongly recommend providing your genre tags using the TVA standard.
**Why use TVA?**
* **Granularity:** It offers a deeper level of detail than standard lists, allowing for more precise content placement.
* **Future-Proofing:** It ensures your content is ready for upcoming discovery features and advanced algorithms without needing future metadata changes.
* **Maintenance:** Using an industry standard ensures long-term support for your feed as the TitanOS platform evolves.
### Supported Native Genre Set
Currently, TitanOS utilizes a fixed set of primary genres. When providing your feed, please map your internal categories to the following supported values, or TVA values:
| | | |
| :---------- | :------------- | :-------- |
| Action | Adventure | Animation |
| Anime | Classic Movies | Comedy |
| Documentary | Drama | Fantasy |
| Horror | Kids & Family | Musical |
| Mystery | Romance | Sci-Fi |
| Thriller | | |
### The `dominant_genre` Field
In our updated Metadata Schema, we have introduced the `dominant_genre` field. This is the primary value used by the TitanOS UI to place your content into grids, filters, and category rows.
* **Requirement:** Every content record must contain one (1) \`dominant\_genre value.
* **Logic:** While you may provide a list of multiple genres for search and recommendation purposes, the system will prioritize the value in the `dominant_genre` field for all primary UI displays.
* **Fallback:** If you don’t provide the `dominant_genre` field our system may use the first assigned genre in the genre set
### Implementation Guidelines
* \***Standard Mapping:** If using our native set, ensure the spelling and casing match the table above exactly to avoid ingestion errors.
* **TVA Integration:** If you provide TVA codes, our system automatically maps them to the corresponding TitanOS UI category while retaining the granular data for backend optimization.
* **Single Value:** Unlike general genre tags, the dominant\_genre field must contain only one primary classification to ensure consistent UI rendering.
## Artwork
To ensure content is displayed correctly across the TitanOS interface, all visual assets must follow specific technical standards. These requirements prevent display issues such as blurred images, incorrect cropping, or ingestion errors.
### Core Delivery Rules
* **Format & Compatibility:** All images must be delivered in JPEG or PNG format using the sRGB color space.
* **Asset Availability:** Artwork must be hosted on a stable, public-facing server (HTTPS) that allows the TitanOS ingestion system to download the files.
* **Update Logic:** If you change an image, you must update the image URL or the metadata timestamp. Our system caches images, so keeping the same URL for a new image will prevent the UI from updating.
* **Resolution & Scaling:** Always provide the highest required resolution. Images will be scaled down for lower-end devices, but low-resolution source files may be rejected to avoid pixelation on 4K displays.
### UI Safe Zones
When preparing artwork, keep primary visual elements (such as faces or titles) centered. TitanOS may overlay text or other UI elements on the edges of the image.
### Technical Specification Overview
| Requirement | Standard |
| :------------ | :--------------------------------- |
| File Formats | JPEG (.jpg), PNG (.png) |
| Max File Size | 2MB (Recommended for fast loading) |
| Protocol | HTTPS required |
| Color Profile | sRGB |
**Note:** Providing assets that do not match the required aspect ratios (e.g., sending a 4:3 image for a 16:9 slot) will result in automatic cropping or padding, which may distort the intended look of your content.
### Artwork Examples
**artwork\_portrait**
* Aspect ratio: 2:3
* Resolution: Minimum width of 400px (Recommended: 800px or higher)
**screenshot\_portrait**
* Aspect ratio: 2:3
* Resolution: Minimum width of 640px (Recommended: 960px)
**artwork\_landscape**
* Aspect ratio: 16:9
* Resolution: Minimum width of 640px (Recommended: 960px or higher)
**screenshot\_landscape**
* Aspect ratio: 16:9
* Resolution: Minimum width of 1920px (Recommended: 3840px)
**transparent\_logo**
* Size: Minimum width of 400px (Recommended: 640px or higher)
## Deeplinks
Deep links are the primary mechanism for navigating users from the TitanOS discovery interface directly to specific titles within your application. Once an application has passed QA and is live on the platform, deep links must function autonomously and lead directly to the content.
### Technical Preconditions
To ensure a successful integration, your application and metadata must meet the following standards:
* HTML5 Accessibility: The application must be a web-based app accessible via a stable URL.
* Routing Logic: For Single Page Applications (SPAs), the internal routing must be configured to parse incoming URL paths or parameters and resolve the correct view state immediately.
* Destination Targets: We support and recommend two levels of deep linking:
**Content Details:** Leads the user to the movie or series overview page.
**Direct Player (Recommended):** Navigates the user directly into the video player to start playback.
* Geoblocking: Since TitanOS is a global platform, ensure the deep link provided for a specific market (e.g., ES) is not geoblocked for users in that region.
### URL Construction & Structure
For HTML5 applications, the final landing URL is created by appending the content-specific path provided in your metadata to the application’s registered Base URL.
The Formula: `{AppBaseURL} + / + {metadata_path}`
* App Base URL: `https://titanos.partner-app.com`
* Metadata Path: `video/12345`
* Final Result: `https://titanos.partner-app.com/video/12345`
**Example 1: Standard Path Routing**
Best for: Applications using a traditional folder-based structure.
```javascript theme={null}
"deeplinkings": [
{
"market": "DE",
"action": "play",
"device_type": "TV",
"url": "https://titanos.partner-app.com/movies/interstellar-2014"
}
]
```
**Example 2: Direct Player (ID-based)**
Best for: The recommended "Direct to Player" experience using unique content IDs.
```javascript theme={null}
"deeplinkings": [
{
"market": "ES",
"action": "play",
"device_type": "TV",
"url": "https://titanos.partner-app.com/player/550e8400-e29b"
}
```
**Example 3: Query Parameter Routing**
Best for: SPAs or apps that parse IDs via query strings rather than URL paths.
```javascript theme={null}
"deeplinkings": [
{
"market": "GB",
"action": "play",
"device_type": "TV",
"url": "https://titanos.partner-app.com/launch?content_id=998877&autoplay=true"
}
]
```
### Deep Link Action Types & Target Intent
To provide a seamless discovery experience, TitanOS needs to know the exact behavior of an incoming deep link. Partners must categorize their links based on the destination experience to ensure the user journey aligns with the UI action.
**Supported Action Values**
We categorize deep link destinations into two distinct behaviors:
* `action: details` (Content Details Page): Navigates the user to the informational overview or landing page of the asset. This value is **mandatory** for Series and Seasons, as they are containers rather than playable video files.
* `action: play` (Direct Player Launch): Bypasses all menus and launches video playback immediately. This is **strongly preferred** for Movies and individual Episodes to keep the user journey as short as possible.
**Alternative Naming Suggestions**
If you prefer not to use details and play as the explicit values in your feed, here are a few industry-standard alternative pairs you can implement:
* Option A (Intent-Based): details vs. playback
* Option B (UX-Based): landing\_page vs. direct\_play
* Option C (Technical): info\_view vs. player\_view
## Availabilities
The availabilities object is used to define the commercial and technical terms under which a title is offered. This data allows the TitanOS to filter content correctly based on the user's region, their subscription status, and the device's display capabilities.
### Data Structure
Availabilities are delivered as an array of objects. This structure allows a single piece of content to have different business models or video qualities across multiple territories.
**Requirement:** Every content record must contain at least one availability object to be visible in the UI.
### Field Specifications
| Field | Type | Required | Description |
| :------------------ | :----- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------ |
| market | Array | Yes | A list of ISO 3166-1 alpha-2 country codes (e.g., `["US", "DE"]`). |
| business\_model | Enum | Yes | The monetization type (e.g., `AVOD`, `SVOD`). See definitions below. |
| video\_quality | Enum | Yes | The highest resolution supported: `SD`, `HD`, or `UHD`. |
| price | Number | No\* | The numerical price (e.g., `4.99`). Required for TVOD/EST. |
| currency | String | No\* | ISO 4217 code (e.g., `EUR`). Required for TVOD/EST. |
| availability\_start | String | No | ISO 8601 format. When the content becomes visible. When not provided content will be visible from the moment the content is included in the feed. |
| availability\_end | String | No | ISO 8601 format. When the content is removed. When not provided content will be visible from the moment the content is removed from the feed. |
### Supported Business Models
To ensure content appears in the correct UI categories (e.g., "Free” Section), you must map your offer to one of the following enums:
* AVOD: Free, ad-supported video on demand
* SVOD: Subscription-based video on demand
* TVOD: Transactional/Rental (rental / pay-per-view)
* HVOD: Hybrid model (subscription + ads)
* RVOD: Rental video on demand (specifically for limited windows)
* EST: Electronic Sell-Through (digital purchase/buy-to-own)
### Implementation Example
```javascript theme={null}
"availabilities": [
{
"market": ["ES"],
"business_model": "AVOD",
"video_quality": "HD",
"price": null,
"currency": null,
"start_date": null,
"end_date": null
},
{
"market": ["DE"],
"business_model": "TVOD",
"video_quality": "UHD",
"price": 4.99,
"currency": "EUR",
"start_date": "2026-06-01T12:00:00Z",
"end_date": "2026-06-30T23:59:59Z"
},
{
"market": ["GB"],
"business_model": "SVOD",
"video_quality": "HD",
"price": null,
"currency": null,
"start_date": "2024-01-01T00:00:00Z",
"end_date": "2026-12-31T23:59:59Z"
}
]
```
## Age Rating
To ensure regulatory compliance and support parental control features, TitanOS requires accurate age rating metadata for all content. Partners are responsible for providing the official classification for each market where the content is available.
### Data Structure: classifications
Age ratings are provided as an array of objects. This structure allows you to specify different ratings and systems for different territories, as a title may have different legal requirements depending on the country.
Requirement: Every content record must contain at least one classification object. TitanOS reserves the right to withhold publication of content lacking valid age rating information to mitigate legal risks.
| Field | Type | Required | Description |
| :----------- | :------ | :------- | :------------------------------------------------------------- |
| country | String | Yes | ISO 3166-1 alpha-2 country code (e.g., `DE`, `ES`, `GB`). |
| system | String | Yes | The official rating body/system (e.g., `FSK`, `BBFC`, `ICAA`). |
| code | String | Yes | The specific rating code (e.g., `FSK12`, `15`, `PG-13`). |
| minimum\_age | Integer | Yes | The numerical minimum age required (e.g., `12`, `15`, `13`). |
### Implementation Example
In this example, the content is classified for the German market using the FSK system and for the UK market using the BBFC system.
```javascript theme={null}
"classifications": [
{
"country": "DE",
"system": "FSK",
"code": "FSK12",
"minimum_age": 12
},
{
"country": "GB",
"system": "BBFC",
"code": "15",
"minimum_age": 15
}
]
```
### Common Systems & Codes Reference
| Country | System | Example Code | Minimum Age |
| :------ | :----- | :------------------------------- | :------------------ |
| Germany | `FSK` | FSK0, FSK6, FSK12, FSK16, FSK18 | `0, 6, 12, 16, 18` |
| UK | `BBFC` | `U`, `PG`, `12A`, `15`, `18` | `0, 8, 12, 15, 18` |
| Spain | `ICAA` | `TP`, `7`, `12`, `16`, `18` | `0, 7, 12, 16, 18` |
| USA | `MPAA` | `G`, `PG`, `PG-13`, `R`, `NC-17` | `0, 10, 13, 17, 18` |
Standardizing the code and system strings ensures that the TitanOS UI can dynamically display the correct local rating badges for every title, providing a familiar and safe experience for the end-user.
# Metadata Integration Flow
Source: https://docs.titanos.tv/metadata-integration-flow
The TitanOS ingestion engine is designed to transform partner data into a high-performance discovery experience. This page outlines the stages your metadata goes through, from the initial feed intake to the final UI rendering.
## Feed Delivery & Onboarding
The speed of integration depends on the feed structure provided:
* **Fast-Track Integration:** Partners who deliver metadata using the TitanOS Standard Schema (following our example JSONs) can bypass custom mapping phases, leading to a significantly faster "Go-Live" date.
* **Custom Integration:** If a partner provides a proprietary feed format, our engineering team will perform a custom mapping. Please note that this process requires additional development and testing time.
## Technical Integration and Data Processing
The system fetches the feed from the partner’s provided endpoint. We perform an initial validation check to ensure the file is reachable and the structure is readable.
Data is translated from the source format into the internal Titan OS Schema. This ensures all content, regardless of the source, speaks the same technical language within our ecosystem.
To provide a clean user experience, we ensure each unique title appears only once. We identify duplicate content using two methods:
* **ID Matching:** Direct matching via industry-standard IDs (IMDB or TMDB).
* **Probability Scoring:** If IDs are missing, our algorithm calculates a "match score" based on Title, Release Year, Runtime, Cast, and Synopsis.
TitanOS downloads all provided artwork URLs. Images are processed, optimized for TV performance, and cached on our CDN to ensure instant loading for the end-user.
We partner with TMDB to enrich your feed. This stage for example identifies similar content, and flags trending titles specific to each local market and language.
Content is organized into rows based on one of two logic paths:
* **Partner-Managed:** The partner retains full control over the recommendation logic via their own feed.
* **TitanOS-Optimized:** Our proprietary algorithm automatically generates rows based on user engagement and platform trends.
Once the metadata is enriched and validated, the content is pushed to the production environment and becomes visible to users in the TitanOS UI.
## Update Frequency
* **VOD Content:** Processed every 24 hours during nighttime (CET) to minimize impact on system performance.
* **Sports & Live Events:** Processed every 30 minutes to ensure real-time accuracy for schedules and scores.
# Migration to Titan SDK
Source: https://docs.titanos.tv/migration-to-titan-sdk
If you’ve previously developed applications using the [DeviceInfo API](https://docs.titanos.tv/deviceinfoapi) for Philips TVs, migrating to the Titan SDK is the next step toward future-proofing your app for upcoming platforms.
This guide provides a clear path to update your code and ensure compatibility across the expanded Titan OS ecosystem.
## Why migrate to Titan SDK?
The legacy DeviceInfo API was limited:
* Brand-specific (Philips only)
* Restricted set of functionalities
The new Titan SDK offers significant advantages:
* **Unified Development:** Write your code once and run it consistently across all supported Titan OS-powered TVs.
* **New functionalities:** Gain access to features like Accessibility (Text-to-Speech, Text Magnification) and App Control.
* **Future-Proofing:** The Titan SDK will continue to evolve with new capabilities and updates, while the DeviceInfo API will not be maintained from now and removed by the end of the year.
## Step-by-Step Migration Guide
Remove any script references to the old DeviceInfo API from your `index.html` or build process to avoid accidental reliance on the deprecated object.
First, install the SDK from npm.
```bash theme={null}
npm install @titan-os/sdk
```
Then, import the `getTitanSDK` function into your project.
```javascript theme={null}
import { getTitanSDK } from '@titan-os/sdk';
const titanSDK = getTitanSDK();
```
Replace all instances where you accessed properties directly from the global `DeviceInfo` object. Instead, use the asynchronous `titanSDK.deviceInfo.getDeviceInfo()` method.
**Old Way:**
```javascript theme={null}
// Old DeviceInfo API
const modelYear = DeviceInfo.Product.year;
const hasHDR = DeviceInfo.Capability.supportHDR;
if (modelYear === "2023" && hasHDR) {
// ...
}
```
**New Way:**
```javascript theme={null}
// New Titan SDK
const deviceInfo = await titanSDK.deviceInfo.getDeviceInfo();
const modelYear = deviceInfo.Product.year;
const hasHDR = deviceInfo.Capability.supportHDR_DV;
if (modelYear === "2023" && hasHDR) {
// ...
}
```
Thoroughly test your application on various TVs powered or maintained by Titan OS to ensure all functionalities work as expected post-migration. Pay close attention to:
* All device information calls returning correct data.
* Features that relied on old DeviceInfo properties.
* New SDK features you've integrated.
With the Titan SDK integrated, begin exploring and implementing its new functionalities:
* Accessibility: Utilize `titanSDK.accessibility.isTTSSupported()`, `titanSDK.accessibility.startSpeaking()`, `titanSDK.accessibility.onTTSSettingsChange()` and other methods as detailed in the [Accessibility Guide for TitanSDK Apps](\[https://docs.titanos.tv/accessibility]).
* App Control: Leverage `titanSDK.apps.launch()` for streamlined app-to-app interactions.
* Remote Control: Refer to the [Remote Control & Key Handling](\[https://docs.titanos.tv/navigation]) section for unified key mapping.
For projects not using a build system, a CDN-based integration is also available. Please refer to our CDN Integration Guide for more details.
## Migration Map: DeviceInfo API → Titan SDK
Here is a mapping of common DeviceInfo API properties and their Titan SDK equivalents:
| Old `DeviceInfo` Property | New Titan SDK Equivalent (Function & Key) | Notes & Example |
| :----------------------------------------------- | :------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DeviceInfo.Channel.vendor` | `await titanSDK.deviceInfo.getDeviceInfo().Channel.vendor` | Retrieves the vendor name of the device. |
| `DeviceInfo.Channel.brand` | `await titanSDK.deviceInfo.getDeviceInfo().Channel.brand` | Retrieves the brand name of the device. |
| `DeviceInfo.Product.platform` | `await titanSDK.deviceInfo.getDeviceInfo().Product.platform` | Accesses the device's platform name. |
| `DeviceInfo.Product.year` | `await titanSDK.deviceInfo.getDeviceInfo().Product.year` | Retrieves the model year of the device. Example: `const info = await titanSDK.deviceInfo.getDeviceInfo(); console.log(info.Product.year);` |
| `DeviceInfo.Product.deviceID` | `await titanSDK.deviceInfo.getDeviceInfo().Product.deviceID` | Retrieves the unique device identifier. |
| `DeviceInfo.Product.firmwareVersion` | `await titanSDK.deviceInfo.getDeviceInfo().Product.firmwareVersion` | Accesses the firmware version of the device. |
| `DeviceInfo.Product.WhaleAdID` | `await titanSDK.deviceInfo.getDeviceInfo().Product.WhaleAdID` | Retrieves the advertising ID. |
| `DeviceInfo.Product.firmwareComponentID` | `await titanSDK.deviceInfo.getDeviceInfo().Product.firmwareComponentID` | Accesses the firmware component identifier. |
| `DeviceInfo.Capability.os` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.os` | Retrieves the operating system name. |
| `DeviceInfo.Capability.browserEngine` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.browserEngine` | Accesses the browser engine used by the device. |
| `DeviceInfo.Capability.hasStorage` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.hasStorage` | Checks if the device has persistent storage. |
| `DeviceInfo.Capability.support3d` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.support3d` | Checks for 3D content support. |
| `DeviceInfo.Capability.supportUHD` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportUHD` | Checks for Ultra High Definition (UHD) display support. |
| `DeviceInfo.Capability.supportHDR` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportHDR` | Checks for High Dynamic Range (HDR) display support. (Note: New TitanSDK also provides `supportHDR_HDR10` and `supportHDR_DV` for more specific checks.) |
| `DeviceInfo.Capability.supportWebSocket` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportWebSocket` | Checks for WebSocket protocol support. |
| `DeviceInfo.Capability.supportPlayready` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportPlayready` | Checks for Microsoft PlayReady DRM support. |
| `DeviceInfo.Capability.supportWidevineModular` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportWidevineModular` | Checks for Google Widevine Modular DRM support. |
| `DeviceInfo.Capability.supportWidevineClassic` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportWidevineClassic` | Checks for Google Widevine Classic DRM support. |
| `DeviceInfo.Capability.supportClearKey` | - | This property does not appear in the new TitanSDK's capability response. Please verify if still needed or if there's an alternative. |
| `DeviceInfo.Capability.supportPrimetime` | - | This property does not appear in the new TitanSDK's capability response. Please verify if still needed or if there's an alternative. |
| `DeviceInfo.Capability.supportFairplay` | - | This property does not appear in the new TitanSDK's capability response. Please verify if still needed or if there's an alternative. |
| `DeviceInfo.Capability.supportAdobeHDS` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportAdobeHDS` | Checks for Adobe HTTP Dynamic Streaming support. |
| `DeviceInfo.Capability.supportAppleHLS` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportAppleHLS` | Checks for Apple HTTP Live Streaming support. |
| `DeviceInfo.Capability.supportMSSmoothStreaming` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportMSSmoothStreaming` | Checks for Microsoft Smooth Streaming support. |
| `DeviceInfo.Capability.supportMSSInitiator` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportMSSInitiator` | Checks for Microsoft Smooth Streaming Initiator support. |
| `DeviceInfo.Capability.supportMPEG_DASH` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportMPEG_DASH` | Checks for MPEG-DASH streaming support. |
| `DeviceInfo.Capability.drmMethod` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.drmMethod` | Retrieves the primary DRM method used by the device. |
| `DeviceInfo.Capability.supportOIPF` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportOIPF` | Checks for Open IPTV Forum (OIPF) support. |
| `DeviceInfo.Capability.supportEME` | `await titanSDK.deviceInfo.getDeviceInfo().Capability.supportEME` | Checks for Encrypted Media Extensions (EME) support. |
## Common Migration Scenarios & Troubleshooting
**Asynchronous Nature**: Remember that almost all interactions with the Titan SDK are asynchronous. Always use async/await or .then().catch() for proper handling of returned Promises.
**User Agent Differences**: While the SDK provides a unified interface, minor differences in the User Agent string might still exist between device brands. If your application relies on User Agent parsing, ensure it's robust enough to handle variations as detailed on the [https://docs.titanos.tv/user-agents](https://docs.titanos.tv/user-agents).
## Next steps
Learn how to get started to the new accessibility functionalities in TitanSDK
Introduction to the new TitanSDK
# App Testing and Management
Source: https://docs.titanos.tv/partner-portal/app-testing
### DevView Access
Access to testing tools like [DevView](/devviewinstall) requires Partner approval. If access is not already approved, you can request it in the portal and it will be reviewed and resolved as soon as possible.
### Testing App Candidates
In **Sandbox**, add apps to be tested on a TV using DevView.
### Device Management
Pair your devices (TVs) in **Device Management** for testing.
# Organization Management
Source: https://docs.titanos.tv/partner-portal/organization-management
In the **Organization** section, view your team members, invite new ones, and update organization details such as the name and VAT number.
### Organization Switcher
If you belong to multiple organizations, use the organization switcher in the profile menu to toggle between them.
# Submit App for QA and launch
Source: https://docs.titanos.tv/partner-portal/submit-app
### New app for Quality Assurance (QA)
Navigate to the **"Add new app"** section to submit your app for evaluation.
You will need to provide the following:
* A test URL for the Titan OS team to evaluate.
* Required information for testing, such as credentials, DRM details etc.
* Necessary assets for publishing, including the app icon and description.
* For more information on asset specifications, see [Asset Requirements](/app-assets-specifications).
### Submit new app version
To submit an updated version of an already published app, go to the app and choose **"Add new version"**
Provide updated information and indicate the impact of the changes made for the Titan
OS team to be able to evaluate the QA effort needed.
# Device Specifications
Source: https://docs.titanos.tv/platform-versions
This page provides a comprehensive overview of the technical specifications and capabilities for TV models running the Titan OS platform, categorized by model year. This information is crucial for developing and testing applications to ensure optimal performance and feature support on a given device.
## Specifications
**Specifications: Philips 2026**
Platform & Engine
| Feature | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :----------------- | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: |
| **Region** | LATAM | EU | LATAM | EU | LATAM | EU | EU |
| **Brand** | Philips | Philips | Philips | Philips | Philips | Philips | Philips |
| **Platform** | TPM268L | TPM266E | TPM266L | TPM267E | TPM267L | TPN266E | TPN268E |
| **Web Engine** | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 |
| **Titan SDK** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **DeviceInfo API** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Graphics & Display
| Feature | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :------------------------- | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: | :------------: |
| **Application Resolution** | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p |
| **Video Resolution** | 1080p (FHD) | 4k (UHD) | 4k (UHD) | 4k (UHD) | 4k (UHD) | 4k (UHD) | 4k (UHD) |
Memory & CPU
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :-------- | :-------------------------: | :-------------------------: | :-------------------------: | :------------------------: | :------------------------: | :-----------------------------: | :----------------------------: |
| **RAM** | 1GB | 2GB | 1.5GB | 3GB | 3GB | 2GB | 3GB |
| **Flash** | 8GB | 8GB | 8GB | 8GB | 8GB | 8GB | 8GB |
| **CPU** | `CA55 x 4@1.5GHz / G52 MC1` | `Quad CA55@1.3GHz /G52 MC1` | `CA55 x 4@1.5GHz / G52 MC1` | `Quad CA73@1.8GHz/G57 MC1` | `Quad CA73@1.8GHz/G57 MC1` | `Quad CA55@1.3GHz /G52 MC1 2EE` | `Quad CA73@1.3GHz/G52 MC1 2EE` |
Video Formats, Protection and Codecs
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :--------------- | :-------: | :-------: | :-------: | :-------: | :-------: | :----: | :---: |
| **MPEG DASH** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **MSS** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| **HLS** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | ❌ | ❌ | ✓ | ✓ | ❌ | ✓ |
| **HDR10** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ✓ | ❌ | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
DRM - PlayReady
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :--------------------- | :--------: | :--------: | :--------: | :--------: | :--------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 4.4 | 4.4 | 4.4 | 4.0 | 4.0 | 4.0 | 4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | cenc, cbcs | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :--------------------- | :--------: | :--------: | :--------: | :--------: | :--------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 17 | 17 | 17 | 17 | 17 | 17.1 | 16.4 |
| **Security Level** | L1 | L1 | L1 | L1 | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | cenc, cbcs | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :------------------------------ | :-------: | :-------: | :-------: | :-------: | :-------: | :----: | :---: |
| **Dolby Atmos** | ❌ | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Web App Environment
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :------------------------- | :-------: | :-------: | :-------: | :-------: | :-------: | :----: | :---: |
| **React** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **WebGL** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Canvas** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
Device Features & Accessibility
| Hardware | MT9676 2k | MT9676 4k | MT9676 4k | MT9620 4k | MT9620 4k | NT690E | NT676 |
| :------------------------------------- | :-------: | :-------: | :-------: | :-------: | :-------: | :----: | :---: |
| **Discovery Protocols** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| **App Control** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Voice Command/Search** | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Accessibility - Text Magnification** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Airplay** | ❌ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
**Specifications: Philips 2025**
Platform & Engine
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :----------------- | :---------------: | :----------: | :----------: | :----------: | :----------: |
| **Region** | LATAM | LATAM | EU | EU | EU |
| **Brand** | Philips / AOC | Philips | Philips | Philips | Philips |
| **Platform** | TPM256L / TAM256L | TPM257L | TPN257E | TPN256E | TPN258E |
| **Web Engine** | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 | Chromium 122 |
| **Titan SDK** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **DeviceInfo API** | ✓ | ✓ | ✓ | ✓ | ✓ |
Graphics & Display
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :------------------------- | :------------: | :------------: | :------------: | :------------: | :------------: |
| **Application Resolution** | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p | 720p and 1080p |
| **Video Resolution** | 1080p (FHD) | 4k (UHD) | 1080p (FHD) | 4k (UHD) | 4k (UHD) |
Memory & CPU
| Hardware | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :-------- | :-------------------------------: | :-------------------------------: | :-------------------------------: | :-------------------------------: | :------------------------------: |
| **RAM** | 1.5GB | 1.5GB | 1.5GB | 2GB | 3GB |
| **Flash** | 8GB | 8GB | 8GB | 8GB | 8GB |
| **CPU** | `CA53 x 4@1.15GHz / Mali G52 MC1` | `CA53 x 4@1.15GHz / Mali G52 MC1` | `CA53 x 4@1.15GHz / Mali G52 MC1` | `CA53 x 4@1.15GHz / Mali G52 MC1` | `CA73 x 4@1.3GHz / Mali G52 MC1` |
Video Formats, Protection and Codecs
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------- | :-------: | :-------: | :------: | :------: | :---: |
| **MPEG DASH** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | ❌ | ❌ | ❌ | ✓ |
| **HDR10** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------------- | :--------: | :--------: | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 4.4 | 4.4 | 4.0 | 4.0 | 4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :--------------------- | :--------: | :--------: | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Version** | 16 | 16 | 16.4 | 16.4 | 16.4 |
| **Security Level** | L1 | L1 | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc, cbcs | cenc, cbcs | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :------------------------------ | :-------: | :-------: | :------: | :------: | :---: |
| **Dolby Atmos** | ❌ | ✓ | ❌ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ | ✓ | ✓ |
Web App Environment
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :------------------------- | :-------: | :-------: | :------: | :------: | :---: |
| **React** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **WebGL** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Canvas** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
Device Features & Accessibility
| Feature | MT9676 2k | MT9676 4k | NT690 2k | NT690 4k | NT676 |
| :------------------------------------- | :-------: | :-------: | :------: | :------: | :---: |
| **Discovery Protocols** | ❌ | ❌ | ❌ | ❌ | ❌ |
| **App Control** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Voice Command/Search** | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ | ❌ | ✓ | ✓ | ✓ |
| **Accessibility - Text Magnification** | ❌ | ❌ | ✓ | ✓ | ✓ |
| **Airplay** | ❌ | ✓ | ❌ | ✓ | ✓ |
**Specifications: JVC 2025**
Platform & Engine
| Feature | MB190 | MB191 | HKC NT690 2K |
| :----------------- | :----------: | :----------: | :----------: |
| **Region** | EU | EU | EU |
| **Brand** | JVC | JVC | HKC |
| **Platform** | MB190 | NT690 2K | |
| **Web Engine** | Chromium 122 | Chromium 122 | Chromium 122 |
| **Titan SDK** | ✓ | ✓ | ✓ |
| **DeviceInfo API** | ✓ | ✓ | ❌ |
Graphics & Display
| Feature | MB190 | MB191 | HKC NT690 2K |
| :------------------------- | :------: | :---------: | :------------: |
| **Application Resolution** | 720p | 720p | 720p and 1080p |
| **Video Resolution** | 4k (UHD) | 1080p (FHD) | 1080p (FHD) |
Memory & CPU
| Hardware | MB190 | MB191 | HKC NT690 2K |
| :-------- | :------: | :------: | :------------------------------: |
| **RAM** | 2GB | 1.5GB | 1.5GB |
| **Flash** | 4GB eMMC | 4GB eMMC | 8GB |
| **CPU** | `MT9676` | `MT9676` | `CA53 x 4@1.15GHz /Mali G52 MC1` |
Video Formats, Protection and Codecs
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------- | :---: | :---: | :----------: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ✓ | ❌ | ❌ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ✓ | ❌ | ❌ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------------- | :----: | :----: | :----------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v4.4 | v4.4 | v4.0 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc | cenc | ctr, cbcs |
DRM - Widevine
| Feature | MB190 | MB191 | HKC NT690 2K |
| :--------------------- | :---: | :---: | :----------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 3.2 | 3.2 | 16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | cenc | cenc | ctr, cbcs |
Audio Formats and Codecs
| Feature | MB190 | MB191 | HKC NT690 2K |
| :------------------------------ | :---: | :---: | :----------: |
| **Dolby Atmos** | ✓ | ❌ | ❌ |
| **AAC** | YES | YES | YES |
| **E-AC-3 (Dolby Digital Plus)** | YES | YES | YES |
| **Opus** | YES | YES | YES |
Web App Environment
| Feature | MB190 | MB191 | HKC NT690 2K |
| :------------------------- | :---: | :---: | :----------: |
| **React** | ✓ | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ | ✓ |
| **WebGL** | ✓ | ✓ | ✓ |
| **Canvas** | ✓ | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 | 🟡 |
Device Features & Accessibility
| Feature | MB190 | MB191 | HKC NT690 2K |
| :------------------------------------- | :---: | :---: | :----------: |
| **Discovery Protocols** | ❌ | ❌ | ❌ |
| **App Control** | ❌ | ❌ | ❌ |
| **Voice Command/Search** | 🟡 | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ✓ | ✓ | - |
| **Accessibility - Text Magnification** | ❌ | ❌ | - |
| **Airplay** | ❌ | ❌ | ❌ |
**Specifications: Philips 2024**
Platform & Engine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :----------------- | :--------------------------: | :--------------------------: | :-----------------: |
| **Region** | EU | EU | EU |
| **Brand** | Philips | Philips | Philips |
| **Platform** | TPN247E, TPN247L and TAN247L | TPN246E, TPN246L and TAN246L | TPN248E and TPN248L |
| **Web Engine** | Chrome 112 | Chrome 112 | Chrome 112 |
| **Titan SDK** | ✓ | ✓ | ✓ |
| **DeviceInfo API** | ✓ | ✓ | ✓ |
Graphics & Display
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------- | :------------: | :------------: | :------------: |
| **Application Resolution** | 720p and 1080p | 720p and 1080p | 720p and 1080p |
| **Video Resolution** | 1080p (FHD) | 4k (UHD) | 4k (UHD) |
Memory & CPU
| Hardware | NVT690 2K | NVT690 4K | NVT676 |
| :-------- | :--------------------------------: | :--------------------------------: | :-------------------------------: |
| **RAM** | 1.5GB | 2GB | 3GB |
| **Flash** | 8GB | 8GB | 8GB |
| **CPU** | `CA53 x 4 @1.15GHz / Mali G52 MC1` | `CA53 x 4 @1.15GHz / Mali G52 MC1` | `CA73 x 4 @1.3GHz / Mali G52 MC1` |
Video Formats
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------- | :-------: | :-------: | :----: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | 🟡 | ✓ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v.4.0 | v.4.0 | v.4.4 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | v.16.4 | v.16.4 | v.16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------ | :-------: | :-------: | :----: |
| **Dolby Atmos** | ❌ | ✓ | ✓ |
| **AAC** | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ |
Web App Environment
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------- | :-------: | :-------: | :----: |
| **React** | ✓ | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ | ✓ |
| **WebGL** | ✓ | ✓ | ✓ |
| **Canvas** | ✓ | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 | 🟡 |
Device Features & Accessibility
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------------- | :-------: | :-------: | :----: |
| **Discovery Protocols** | ❌ | ❌ | ❌ |
| **App Control** | ✓ | ✓ | ✓ |
| **Voice Command/Search** | 🟡 | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ | ❌ | ❌ |
| **Accessibility - Text Magnification** | ❌ | ❌ | ❌ |
| **Airplay** | ❌ | ❌ | ❌ |
**Specifications: Philips 2023**
Platform & Engine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :----------------- | :--------: | :--------: | :--------: |
| **Region** | EU | EU | EU |
| **Brand** | Philips | Philips | Philips |
| **Platform** | TPN237E | TPN236E | TPN238E |
| **Web Engine** | Chrome 112 | Chrome 112 | Chrome 112 |
| **Titan SDK** | ✓ | ✓ | ✓ |
| **DeviceInfo API** | ✓ | ✓ | ✓ |
Graphics & Display
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------- | :------------: | :------------: | :------------: |
| **Application Resolution** | 720p and 1080p | 720p and 1080p | 720p and 1080p |
| **Video Resolution** | 1080p (FHD) | 4k (UHD) | 4k (UHD) |
Memory & CPU
| Hardware | NVT690 2K | NVT690 4K | NVT676 |
| :-------- | :--------------------------------: | :--------------------------------: | :-------------------------------: |
| **RAM** | 1.5GB | 2GB | 3GB |
| **Flash** | 8GB | 8GB | 8GB |
| **CPU** | `CA53 x 4 @1.15GHz / Mali G52 MC1` | `CA53 x 4 @1.15GHz / Mali G52 MC1` | `CA73 x 4 @1.3GHz / Mali G52 MC1` |
Video Formats
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------- | :-------: | :-------: | :----: |
| **MPEG DASH** | ✓ | ✓ | ✓ |
| **MSS** | ✓ | ✓ | ✓ |
| **HLS** | ✓ | ✓ | ✓ |
| **Dolby Vision** | ❌ | 🟡 | ✓ |
| **HDR10** | ✓ | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ | ✓ |
| **HLG** | ✓ | ✓ | ✓ |
DRM - PlayReady
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 4.0 | 4.0 | 4.0 |
| **Security Level** | SL3000 | SL3000 | SL3000 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :--------------------- | :-------: | :-------: | :-------: |
| **Supports** | ✓ | ✓ | ✓ |
| **Version** | 16.4 | 16.4 | 16.4 |
| **Security Level** | L1 | L1 | L1 |
| **HDCP version** | 2.3 | 2.3 | 2.3 |
| **Encryption Schemes** | ctr, cbcs | ctr, cbcs | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------ | :-------: | :-------: | :----: |
| **Dolby Atmos** | ❌ | 🟡 | ✓ |
| **AAC** | ✓ | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ | ✓ |
| **Opus** | ✓ | ✓ | ✓ |
Web App Environment
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------- | :-------: | :-------: | :----: |
| **React** | ✓ | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ | ✓ |
| **WebGL** | ✓ | ✓ | ✓ |
| **Canvas** | ✓ | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 | 🟡 |
Device Features & Accessibility
| Feature | NVT690 2K | NVT690 4K | NVT676 |
| :------------------------------------- | :-------: | :-------: | :----: |
| **Discovery Protocols** | ❌ | ❌ | ❌ |
| **App Control** | ✓ | ✓ | ✓ |
| **Voice Command/Search** | 🟡 | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ | ❌ | ❌ |
| **Accessibility - Text Magnification** | ❌ | ❌ | ❌ |
| **Airplay** | ❌ | ❌ | ❌ |
**Specifications: Philips 2022**
Platform & Engine
| Feature | NVT690 |
| :----------------- | :-------: |
| **Region** | EU |
| **Brand** | Philips |
| **Platform** | TPN226E |
| **Web Engine** | Chrome 84 |
| **Titan SDK** | ✓ |
| **DeviceInfo API** | ✓ |
Graphics & Display
| Feature | NVT690 |
| :------------------------- | :------------: |
| **Application Resolution** | 720p and 1080p |
| **Video Resolution** | 4k (UHD) |
Memory & CPU
| Hardware | NVT690 |
| :-------- | :-------------------------------: |
| **RAM** | 2GB |
| **Flash** | 4GB |
| **CPU** | `CA53 x 4@1.15GHz / Mali G52 MC1` |
Video Formats
| Feature | NVT690 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ✓ |
| **HLS** | ✓ |
| **Dolby Vision** | ✓ |
| **HDR10** | ✓ |
| **HDR10+** | ✓ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT690 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 4.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT690 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | v.16.3 |
| **Security Level** | L1 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT690 |
| :------------------------------ | :----: |
| **Dolby Atmos** | ✓ |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ✓ |
Web App Environment
| Feature | NVT690 |
| :------------------------- | :----: |
| **React** | ✓ |
| **LightningJS** | ✓ |
| **WebGL** | ✓ |
| **Canvas** | ✓ |
| **Web Libraries** | ✓ |
| **React Native / Flutter** | 🟡 |
Device Features & Accessibility
| Feature | NVT690 |
| :------------------------------------- | :----: |
| **Discovery Protocols** | ❌ |
| **App Control** | ✓ |
| **Voice Command/Search** | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ |
| **Accessibility - Text Magnification** | ❌ |
| **Airplay** | ❌ |
**Specifications: Philips 2021**
Platform & Engine
| Feature | NVT671 |
| :----------------- | :-------: |
| **Region** | EU |
| **Brand** | Philips |
| **Platform** | TPN216E |
| **Web Engine** | Chrome 84 |
| **Titan SDK** | ✓ |
| **DeviceInfo API** | ✓ |
Graphics & Display
| Feature | NVT671 |
| :------------------------- | :------------: |
| **Application Resolution** | 720p and 1080p |
| **Video Resolution** | 4k (UHD) |
Memory & CPU
| Hardware | NVT671 |
| :-------- | :--------------------------------: |
| **RAM** | 2GB |
| **Flash** | 4GB |
| **CPU** | `CA73 x 2@900MHz /G51 MP3@ 500MHz` |
Video Formats
| Feature | NVT671 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ✓ |
| **HLS** | ✓ |
| **Dolby Vision** | ✓ |
| **HDR10** | ✓ |
| **HDR10+** | ✓ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 3.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT671 |
| :--------------------- | :----: |
| **Supports** | ❌ |
| **Version** | ❌ |
| **Security Level** | ❌ |
| **HDCP version** | ❌ |
| **Encryption Schemes** | ❌ |
Audio Formats and Codecs
| Feature | NVT671 |
| :------------------------------ | :----: |
| **Dolby Atmos** | 🟡 |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ✓ |
Web App Environment
| Feature | NVT671 |
| :------------------------- | :----: |
| **React** | ✓ |
| **LightningJS** | ✓ |
| **WebGL** | ✓ |
| **Canvas** | ✓ |
| **Web Libraries** | ✓ |
| **React Native / Flutter** | 🟡 |
Device Features & Accessibility
| Feature | NVT671 |
| :------------------------------------- | :----: |
| **Discovery Protocols** | ❌ |
| **App Control** | ✓ |
| **Voice Command/Search** | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ |
| **Accessibility - Text Magnification** | ❌ |
| **Airplay** | ❌ |
**Specifications: Philips 2020**
Platform & Engine
| Feature | MTK9288 | NVT671 |
| :----------------- | :---------------: | :-------: |
| **Region** | EU | EU |
| **Brand** | Philips | Philips |
| **Platform** | TPM207E / TPM207L | TPN206E |
| **Web Engine** | Chrome 84 | Chrome 84 |
| **Titan SDK** | ✓ | ✓ |
| **DeviceInfo API** | ✓ | ✓ |
Graphics & Display
| Feature | MTK9288 | NVT671 |
| :------------------------- | :------------: | :------------: |
| **Application Resolution** | 720p and 1080p | 720p and 1080p |
| **Video Resolution** | ... | 4k (UHD) |
Memory & CPU
| Hardware | MTK9288 | NVT671 |
| :-------- | :-------------: | :-------------: |
| **RAM** | 1.5GB | 2GB |
| **Flash** | 4GB | 4GB |
| **CPU** | `CA53 x 4/ G52` | `CA53 x 4/ G52` |
Video Formats
| Feature | MTK9288 | NVT671 |
| :--------------- | :-----: | :----: |
| **MPEG DASH** | ✓ | ✓ |
| **MSS** | ✓ | ✓ |
| **HLS** | ✓ | ✓ |
| **Dolby Vision** | ❌ | ✓ |
| **HDR10** | ✓ | ✓ |
| **HDR10+** | ❌ | ✓ |
| **HLG** | ✓ | ✓ |
DRM - PlayReady
| Feature | MTK9288 | NVT671 |
| :--------------------- | :-----: | :-------: |
| **Supports** | ✓ | ✓ |
| **Version** | ... | 3.0 |
| **Security Level** | ... | SL3000 |
| **HDCP version** | ... | 2.3 |
| **Encryption Schemes** | ... | ctr, cbcs |
DRM - Widevine
| Feature | MTK9288 | NVT671 |
| :--------------------- | :-----: | :----: |
| **Supports** | ✓ | ❌ |
| **Version** | v.16.3 | ❌ |
| **Security Level** | L1 | ❌ |
| **HDCP version** | ... | ❌ |
| **Encryption Schemes** | ... | ❌ |
Audio Formats and Codecs
| Feature | MTK9288 | NVT671 |
| :------------------------------ | :-----: | :----: |
| **Dolby Atmos** | 🟡 | 🟡 |
| **AAC** | ✓ | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ | ✓ |
| **Opus** | ✓ | ✓ |
Web App Environment
| Feature | MTK9288 | NVT671 |
| :------------------------- | :-----: | :----: |
| **React** | ✓ | ✓ |
| **LightningJS** | ✓ | ✓ |
| **WebGL** | ✓ | ✓ |
| **Canvas** | ✓ | ✓ |
| **Web Libraries** | ✓ | ✓ |
| **React Native / Flutter** | 🟡 | 🟡 |
Device Features & Accessibility
| Feature | MTK9288 | NVT671 |
| :------------------------------------- | :-----: | :----: |
| **Discovery Protocols** | ❌ | ❌ |
| **App Control** | ✓ | ✓ |
| **Voice Command/Search** | 🟡 | 🟡 |
| **Accessibility - Text-to-Speech** | ❌ | ❌ |
| **Accessibility - Text Magnification** | ❌ | ❌ |
| **Airplay** | ❌ | ❌ |
**Important:**
* Sharp is still not live.
* We're preparing more information to share about the Titan SDK and User Agents.
**Specifications: Sharp 2026**
Platform & Engine
| Feature | NT690 2K |
| :----------------- | :--------: |
| **Region** | EU |
| **Brand** | Sharp |
| **Platform** | TSN257E |
| **Web Engine** | Chrome 122 |
| **Titan SDK** | ✓ |
| **DeviceInfo API** | ❌ |
Graphics & Display
| Feature | NVT671 |
| :------------------------- | :------------: |
| **Application Resolution** | 720p and 1080p |
| **Video Resolution** | 4k (UHD) |
Memory & CPU
| Hardware | MT9676 2k |
| :-------- | :------------------------------: |
| **RAM** | 1.5GB |
| **Flash** | 8GB |
| **CPU** | `CA53 x 4@1.15GHz /Mali G52 MC1` |
Video Formats
| Feature | NVT671 |
| :--------------- | :----: |
| **MPEG DASH** | ✓ |
| **MSS** | ❌ |
| **HLS** | ✓ |
| **Dolby Vision** | ❌ |
| **HDR10** | ✓ |
| **HDR10+** | ❌ |
| **HLG** | ✓ |
DRM - PlayReady
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 4.0 |
| **Security Level** | SL3000 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
DRM - Widevine
| Feature | NVT671 |
| :--------------------- | :-------: |
| **Supports** | ✓ |
| **Version** | 16.4 |
| **Security Level** | L1 |
| **HDCP version** | 2.3 |
| **Encryption Schemes** | ctr, cbcs |
Audio Formats and Codecs
| Feature | NVT671 |
| :------------------------------ | :----: |
| **Dolby Atmos** | ❌ |
| **AAC** | ✓ |
| **E-AC-3 (Dolby Digital Plus)** | ✓ |
| **Opus** | ⏳ |
Web App Environment
| Feature | NVT671 |
| :------------------------- | :----: |
| **React** | ✓ |
| **LightningJS** | ✓ |
| **WebGL** | ✓ |
| **Canvas** | ✓ |
| **Web Libraries** | ✓ |
| **React Native / Flutter** | 🟡 |
Device Features & Accessibility
| Feature | NVT671 |
| :------------------------------------- | :----: |
| **Discovery Protocols** | ❌ |
| **App Control** | ⏳ |
| **Voice Command/Search** | ⏳ |
| **Accessibility - Text-to-Speech** | ⏳ |
| **Accessibility - Text Magnification** | ⏳ |
| **Airplay** | ⏳ |
## Dictionary
| Icon | Description |
| :--- | :----------------------------------: |
| ✓ | Supported |
| ❌ | Not supported |
| 🟡 | Partially supported (Comments below) |
| ... | To be confirmed |
| ⏳ | In progress |
For the "Partially" (🟡) items, check at the item in the dictionary the details about it.
### Platform & Engine
The geographical market (e.g., EU and LATAM) where the device is sold.
The brand of the TV (e.g., Philips and JVC).
A specific internal model or platform identifier (e.g., TPN247E). Developers use this for targeting specific hardware during development and for bug reporting.
The browser engine that renders the application's user interface. Chrome 112 is a great, modern engine. This is one of the most important specs for a web-based app, as it determines which HTML5, CSS, and JavaScript features are supported.
SDK to interact and get information about Titan OS maintained devices. It should be always YES, but it has been added to explicity say that it's supported for each device. See more at the Titan SDK section.
Legacy SDK to interact and get information about Titan OS maintained devices. Only works with Philips and will be deprecated soon.
### Graphics & Display
The resolution of the user interface (UI) layer. A 720p UI will be upscaled by the TV to fit the panel, which can sometimes result in slightly blurry text or graphics. A 1080p UI is much sharper. This is crucial for UI/UX designers and front-end developers.
The maximum resolution for video playback. 1080p (FHD) is Full HD, while 4k (UHD) is Ultra HD. This dictates the quality of the video streams an app should send to the device.
### Video Formats and Codecs
These are the standard adaptive bitrate streaming protocols. They allow the video player to smoothly switch between different quality levels depending on the user's internet speed.
**Important:** From June 30th MSS will be deprecated on Titan OS-powered devices. It will continue working on devices older than 2026, but without support. Re recommend our partners to migrate to another technology.
These are all High Dynamic Range (HDR) formats, which provide better contrast and more vibrant colors. An app needs to know which formats are supported to deliver the best possible picture quality for HDR content.
**NOTES:**
* 2024 - NVT690 4K: Only upported by the model 8109.
* 2023 - NVT690 4K: Supported by models 7608 and 8108 | Not supported by other models.
### DRM - Playready
Indicates whether the Microsoft PlayReady DRM system is supported on the device, which is essential for playing protected content from many services.
Specifies the version of the PlayReady client on the device. This determines compatibility with specific content licenses and advanced security features.
Defines the level of content protection, such as SL2000 or SL3000. Higher levels like SL3000 are required by content providers for streaming premium 4K and HDR content.
Details the supported version of High-bandwidth Digital Content Protection (HDCP) for physical outputs like HDMI. A version of 2.2 or higher is required to play protected 4K content on external displays.
Lists the supported Common Encryption (CENC) schemes. This includes standards like 'cenc' (AES-CTR) and 'cbcs' (AES-CBC), ensuring compatibility with various video streaming formats.
### DRM - Widevine
Indicates whether the Google Widevine DRM system is supported on the device. It is a critical requirement for playing protected content on most modern streaming platforms.
Specifies the version of the Widevine CDM (Content Decryption Module) on the device, which affects compatibility and performance.
Defines the level of content protection. L1 signifies hardware-backed security for playing HD, 4K, and HDR content, while L3 relies on software-level security, typically limited to standard definition.
Details the supported version of High-bandwidth Digital Content Protection (HDCP) for physical outputs like HDMI. A version of 2.2 or higher is necessary for protected 4K playback on external screens.
Lists the supported Common Encryption (CENC) schemes. This includes standards like 'cenc' (AES-CTR) and 'cbcs' (AES-CBC) to ensure playback of differently encrypted video streams.
### Audio Formats and Codecs
A premium, immersive surround sound technology. If YES, the app's video player can pass Atmos audio tracks to the TV's sound system.
**NOTES:**
* 2026 - MT9676 4k: Supported by LATAM devices. Not supported by EU devices.
* 2023 - NVT690 4K: Supported by models 7608 and 8108 | Not supported by models 7008 and 8008.
* 2021 - NVT671: Supported with transcoded - Only EAC3 pass through via eARC.
* 2020 - NVT671: Supported with transcoded - Only EAC3 pass through via eARC.
* 2020 - MTK9288: Supported with transcoded - Only EAC3 pass through via eARC.
A very common and widely supported audio codec.
A high-quality codec often used for surround sound in streaming services.
A versatile and efficient codec for both speech and music.
### Web App Environment
A free and open-source front-end JavaScript library for building user interfaces based on components.
A JavaScript API for rendering high-performance 2D and 3D graphics. Essential for graphically rich UIs, data visualizations, and games.
An HTML5 element used to draw graphics on the fly via JavaScript, often used for charts, animations, and other custom visuals.
A high-performance, WebGL-based framework for creating smooth UIs on low-memory devices like Smart TVs.
**NOTE:**
If you have issues with a blank screen or rendering pages, some partners fixed this by updating the version with a fix made by LightningJS team. Please refer to [Github issue #617 discussion](https://github.com/lightning-js/renderer/issues/617#) for more details.
Support for popular JavaScript libraries like Angular, React, and Vue indicates a modern and robust browser engine.
Clarifies that the development model is web-based (HTML/JS). A "NO" to these frameworks means developers cannot reuse existing mobile apps and must build a dedicated web application.
**NOTE:**
APKs or any other mobile package is currently not supported. If you're using an app in Flutter or React Native, make sure your app is able to generate a web based package.
If your app really needs to be imported using an apk or something related, please contact us.
### Device Features & Accessibility
Allow other devices (like smartphones) on the network to find and communicate with the TV.
SSDP/UPnP/mDNS: General protocols that make the TV visible on the network for services like media sharing.
Feature provided by Titan OS to open apps though [Titan SDK](/titan-sdk-app-control)
**NOTE:**
The feature is currently not available on JVC devices. If you have this feature integrated and your app is available on TVs from multiple manunfacturers, and given that the Titan SDK has an unified interface for multiple devices, we recommend you to implement a fallback or a `try catch` to prevend unexpected errors.
Indicates support for voice input (e.g., via the remote). This allows developers to integrate voice controls into their apps.
**NOTE:**
Voice Command/Search is only supported in the Operating System. Currently it's not available to use in apps. However, based on feedbacks we've received, we've included it in our Roadmap we will work on it in the feature.
Features that assist users with disabilities, which are often legal requirements.
Text to Speech (TTS): A screen reader that vocalizes on-screen text for visually impaired users.
Text Magnification: Allows users to zoom in on parts of the screen for better readability.
AirPlay allows you to stream videos, photos, and music from your device like an iPhone, iPad, or Mac directly to your TV. You can also mirror your device's entire screen, making it simple to share anything you want on the big display.
# Get your app on Titan OS
Source: https://docs.titanos.tv/publishing
## App launch process
If you have an **HTML5** or **HbbTV** app and would like to launch it on Titan OS, please follow the steps below to submit your app for review and prepare it for release.
Ensure your app is fully compatible with [Titan OS
specifications.](/media-specifications). Confirm that the app adheres to the
platform's technical and content requirements.
If you haven’t already, create an account on the **Titan OS Partner Portal**
here: [Titan OS Partner Portal](https://partners.titanos.tv/).
In the Partner Portal, navigate to the **'Add new app'** section to submit your app for evaluation. You will need to provide the following:
* A **test URL** for the Titan OS team to evaluate.
* Required information for testing, such as credentials, DRM details etc.
* Necessary assets for publishing, including the app icon and description.
For more information on asset specifications, see **[Asset Requirements](/app-assets-specifications)**.
If your app is restricted behind a **paywall** or **geoblocking**, whitelist the IPs provided in the QA Information section of the Partner Portal. Ensure you provide the necessary credentials for the QA team to access your content.
Once your submission is received, the **Titan OS QA team** will perform an **Intake Test**. This initial test focuses on critical aspects such as:
* **Playback functionality**
* **Key handling**
This stage ensures that your app’s basic functionality works as expected.
If any issues are identified during the intake test that would block the app from progressing to full QA, an **Intake Report** will be provided. This report will include:
* Steps to reproduce the issues
* Suggestions on how to resolve them
* Supporting visuals (videos or images) to clarify the problem
Once the basic functionality is approved, the team will move forward with a **full QA** to ensure that the app is stable and meets Titan OS standards for release. If any issues are found during this phase, you will receive a detailed **QA Report** similar to the Intake Report, outlining the steps to reproduce, suggestions for fixing, and visuals to explain the issue.
Address and resolve any issues highlighted in the **QA Report** to ensure your app functions smoothly on Titan OS devices. The **Titan OS QA team** is available to provide support and guidance throughout the process.
If applicable, submit your **production URL** for the final round of quality assurance. The Titan OS team will conduct a final sanity check to ensure your app is fully **release-ready**.
Once your app has passed the full QA process, it will be ready for publishing on Titan OS. Make sure that all **terms and conditions** with the **Titan OS Business Development** team have been finalized. For any final steps, contact the [business development team](mailto:bd@titanos.tv)
***
## When to submit updates for QA re-certification?
Major updates that significantly affect app functionality, user experience, or compliance with Titan OS guidelines should always be resubmitted for a quick review. This includes changes to key features such as playback, DRM, or navigation behavior. To ensure compatibility and stability, submit the updated version through the Partner Portal for a quick sanity check.
For smaller updates that do not affect core functionalities, you can push these changes directly to the production URL without resubmission. Examples include minor UI tweaks or bug fixes that don’t impact the core logic of the app.
If you're unsure whether your update requires re-certification, it's always best to check with the Titan OS QA team.
# Navigation
Source: https://docs.titanos.tv/remote-control
While the physical design of remote controls can vary between manufacturers (e.g., Philips, JVC), the core keycodes sent to your application are standardized, with exception of the back button. Your application should be built against this core set of keys to ensure broad compatibility.
## Standard Keys and Keycodes
Every remote control compatible with Titan OS will provide a standard 5-way navigation experience (Up, Down, Left, Right, OK/Enter) along with other essential keys. Your application should listen for keydown events to handle these inputs.
The following table lists the mandatory keys, their intended use, and the corresponding JavaScript key and keyCode values your application will receive.
| **Button** | **`key`** | **`keyCode`** | **Keycode HTML5** |
| ------------ | ----------------------- | ------------- | -------------------------- |
| Enter | `"Enter"` | `13` | `VK_ENTER` |
| Left | `"ArrowLeft"` | `37` | `VK_LEFT` |
| Down | `"ArrowDown"` | `40` | `VK_DOWN` |
| Right | `"ArrowRight"` | `39` | `VK_RIGHT` |
| UP | `"ArrowUp"` | `38` | `VK_UP` |
| 0-9 | `"Numpad0"`-`"Numpad9"` | `48`-`57` | `VK_0` - `VK_9` |
| Back | `"Backspace"` | `8 AND 461` | `VK_BACK or VK_BACK_SPACE` |
| Red | `"ColorFORed"` | `403` | `VK_RED` |
| Green | `"ColorF1Green"` | `404` | `VK_GREEN` |
| Yellow | `"ColorF2Yellow"` | `405` | `VK_YELLOW` |
| Blue | `"ColorF3Blue"` | `406` | `VK_BLUE` |
| Play | `"MediaPlay"` | `415` | `VK_PLAY` |
| Pause | `"MediaPause"` | `19` | `VK_PAUSE` |
| Play/Pause | `"MediaPlayPause"` | `179` | `VK_PLAY_PAUSE` |
| Stop | `"MediaStop"` | `413` | `VK_STOP` |
| Fast fwd | `"MediaTrackNext"` | `417` | `VK_FAST_FWD` |
| Rewind | `"MediaRewind"` | `412` | `VK_REWIND` |
| Channel UP | `"PageUp"` | `33` | `VK_CHANNEL_UP` |
| Channel DOWN | `"PageDown"` | `34` | `VK_CHANNEL_DOWN` |
## Consistent Keycode Event Handling
Every single key press operation consists of corresponding keydown and keyup events. To prevent processing a key twice, act on either the keydown event or the keyup event, not both. Handling both events can lead to overlapping actions. It is most common to act on keydown.
## The Back Button
The button may be physically labeled as "Back", "Return", or with an arrow icon in the remote control. Each partner is free to customize the back behavior in your app, depending on the user experience that you've defined for your pages and states, since it's following the logic of bringing the user to the latest page or state (e.g. exiting player or closing modals). It should also comply with the following specific rules:
* **Exiting the App:** When the Back button is pressed on the app's main screen, the application should exit. It's mandatory prompt the user with a confirmation dialog ("Do you want to exit?").
* **Device compatibility:** Make sure your app is listening to the back button keycode corresponding to all brands included in your scope (e.g. Philips uses the keycode 8 and JVC uses the keycode 461). More details below.
**Note:** When pressed repeatedly from any screen, it must eventually lead the user back to the app's main/home screen. This is a normal behavior and expected.
**Device compatibility**
The back button keycode is different for Philips, Sharp and JVC devices. To ensure compatibility with all devices, your app must listen to all keycodes depending on which brand you're running your app. To do it, you have the option to listen to the device keycode dynamicaly (in runtime), or manually listen to all keycodes for each brand. If you opt to second option, you should make sure your app is aways updated with the keycodes for the devices in your scope.
Using the `TitanSDK.DeviceInfo.getKeyCodes()` function from the TitanSDK to listen to the codes dynamically:
```javascript theme={null}
document.addEventListener("keydown", async (e) => {
// Dynamically updates values safely (e.g. on JVC Vestel 461 and Philips 8)
const keyCodes = await TitanSDK.deviceInfo.getKeyCodes();
switch (e.keyCode) {
case keyCodes.BACK.keyCode:
e.preventDefault(); // Note: Prevents default browser back behavior and make sure your app is runing your custom logic.
// If on the main app screen, confirm exit
if (isUserOnMainScreen()) {
showExitConfirmation();
} else {
// Otherwise, navigate back within the app
window.history.go(-1);
}
break;
// ... other key cases
}
}, true);
// This is to use in the "confirm" button of your exit confirmation modal
function exitApp() {
// Use the Titan OS API if available, otherwise fall back to window.close()
if (typeof SmartTvA_API !== "undefined" && SmartTvA_API.exit) {
SmartTvA_API.exit();
} else {
window.close();
}
}
```
Alternatively you can listen to each brand's back button keycode:
* Identify the brand with Titan SDK
* Apply a condition to handle the keyCode `8` for Philips and `461` for JVC.
Sample Custom Back Key Handling
```javascript theme={null}
document.addEventListener("keydown", async (e) => {
const deviceInformation = await TitanSDK.deviceInfo.getDeviceInfo();
const brand = deviceInformation.Channel?.brand;
// For full compatibility, handle 8 for Philips and 461 for JVC
const BACK_KEY_CODE = brand === 'Philips' ? 8 : 461;
switch (e.keyCode) {
case BACK_KEY_CODE:
e.preventDefault(); // Prevents default browser back behavior
// If on the main app screen, confirm exit
if (isUserOnMainScreen()) {
showExitConfirmation();
} else {
// Otherwise, navigate back within the app
window.history.go(-1);
}
break;
// ... other key cases
}
}, true);
// This is to use in the "confirm" button of your exit confirmation modal
function exitApp() {
// Use the Titan OS API if available, otherwise fall back to window.close()
if (typeof SmartTvA_API !== "undefined" && SmartTvA_API.exit) {
SmartTvA_API.exit();
} else {
window.close();
}
}
```
**Notes:**
* The codes above is just a logical example for you to understand the flow. We recommend you to use your own logic based on this one to make sure your app is doing what is expected for your needs.
* To give the preference to your logic, use the `e.preventDefault()`. This prevents default browser back behavior and make sure your app is runing your custom logic.
## Manufacturer-Specific Remotes
This section details the physical remote controls for specific TV brands running Titan OS. While the core keycodes above remain the same, some remotes may have additional keys.
**Important:** Keys not listed in the core keycode table (e.g., Settings, Source, branded app buttons like Netflix) are handled by the OS. Events for these keys will not be sent to your application.
## Philips Remotes
Unique Keys:
Ambilight Key: This key is handled by the system to control the TV's Ambilight feature. It does not generate an event for the application.
Settings (Gear Icon): Opens the main TV settings menu. This is a system-level action.
## JVC Remotes
JVC remotes may have a different layout, including dedicated media or branded application buttons.
Unique Keys:
Branded App Keys (e.g., YouTube, Prime Video): These keys are shortcuts to launch the respective applications. They are handled by the system and cannot be intercepted by your app. If your app is in the foreground, pressing one of these keys will cause your app to be suspended and the new app to launch.
Source/Input Key: Opens the TV's input selection menu (e.g., HDMI 1, AV). This is a system-level action.
## OSKB
Titan OS features a system keyboard that is automatically displayed on the screen when the focus is placed in an input field. Referred to as the on-screen keyboard (OSKB), it serves as the primary text input method for Titan OS. Utilising the system keyboard is optional - it is possible to use your own on-screen keyboard solution if preferred or required.
### System keyboard UI
Titan OS’ OSKB incorporates variations in its user interface across different devices to ensure usability. However, it generally adheres to the following characteristics:
* Emerges from the bottom of the screen
* Occupies 100% of the screen width
* Occupies 1/3 of the screen height
* Initially set to English language; future updates will align with the device's country settings
The OSKB supports multiple layouts, including:
* Standard QWERTY
* Alpha-numeric
* Standard numeric with numbers 0-9
* Standard numeric with alternate characters such as %, +
### Custom keyboard
If the system keyboard does not meet your application’s requirements or if you seek UI consistency within your app, you can define a custom keyboard. Considerations for implementing a custom keyboard include:
* Keyboard usability
* UI coherence with the application
* Smooth focus movement
Enabling a custom keyboard will require adjustments to the input box, such as adding disabled properties, etc.
## Common Issues and Troubleshooting
Actions are triggered twice due to handling both keydown and keyup events.
**Solution:**
Ensure the app handles only one of the events, preferably the keydown event.
The app listens for the wrong keycode (e.g., 27 instead of 8).
**Solution:**
Update the app to use the correct keycode (8) or the constant window\.VK\_BACK for better readability.
The back key does not perform the expected action, such as navigating to the previous screen.
**Solution:**
Verify the keycode handling in the app and ensure it aligns with TitanOS standards. Check if VK\_BACK is implemented correctly in the app’s code.
Pressing the back key exits the app instead of navigating within it.
**Solution:**
Ensure the back key functionality is limited to navigation within the app and only exits the app from the main menu or home screen.
When pressing the back key during video playback, an intermediate screen is briefly displayed before returning to the content page.
**Solution:**
Review and adjust the key event handling and navigation logic to ensure that pressing the back key during playback directly returns to the content page without intermediate screens. Ensure proper state management to avoid temporary state changes that cause intermediate screens to display.
When a user presses the Enter key in an `` tag, it triggers the platform OSKB (On-Screen Keyboard). This may cause two keyboards to appear on the screen. This behavior can be adjusted by following one of the approaches below.
**Solution:**
* **Avoid using `` tags**: Instead of using the `` tag, implement the input field using a different element, such as a `
`. This allows you to use the app's OSKB without interference from the platform OSKB.
* **Use `` tags with Platform OSKB**: If you prefer to use the `` tag, ensure that only the platform OSKB is called and not the app's OSKB. This ensures a consistent user experience without triggering multiple keyboards.
# Changelog
Source: https://docs.titanos.tv/sdk-changelog
## SDK Release [v1.12.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.12.0)
* **Feat:** Added audio description (AD) accessibility support
* **Feat:** Added enable/disable controls for the native screen reader
* **Fix:** Correctly report Text Magnification as not supported on Vestel.
* **Fix:** Fixed accessibility typing for PublicTMSettings.
## SDK Release [v1.11.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.11.0)
* **Feat:** Add getKeyCodes method to device info — retrieve supported key codes for the current device
## SDK Release [v1.10.3](https://www.npmjs.com/package/@titan-os/sdk/v/1.10.3)
* **Fix:** supportUHD capability on JVC Vestel MB190
* **Fix:** launch native apps (Youtube & Netflix) with deeplinks
* **Fix:** onTTSSettingsChange incorrectly triggered by startSpeaking, causing undefined error
## SDK Release [v1.10.2](https://www.npmjs.com/package/@titan-os/sdk/v/1.10.2)
* **Fix:** Resolve issue with isReady promise timing out unexpectedly
## SDK Release [v1.10.1](https://www.npmjs.com/package/@titan-os/sdk/v/1.10.1)
* **Fix:** Text-to-Speech returns enabled false even if it's enabled on JVC Vestel MB191
## SDK Release [v1.10.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.10.0)
* **Fix:** Fix supportWidevineClassic for Philips
* **Feat:** Create new properties for HDR10+ and HLG
* **Fix:** Add AOC platform detection to display the correct value in brand
## SDK Release [v1.9.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.9.0)
* **Fix:** Support for JVC HKC: Add JSV platform support with detection and SDK integration
* **Fix:** Set playready and widevineModular to true for philips
* **Fix:** Hiding Scroll bar on JVC: Hide sysinfo element to avoid affecting layout
* **Fix:** AppControl second parameter doesn't work properly: Support dynamic URLs
## SDK Release [v1.8.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.8.0)
* **Fix:** Remove rate/volume/pitch from public TTS settings API
* **Fix:** DolbyAtmos returns "unknown" on 690 2K (2023, 2024 and 2025)
* **Fix:** Product.ifa's value doesn't sync to tv.
* **Feat:** Implement Titan SDK for Vestel MB181/MB180 devices
* **Fix:** SDK accessibility functions doesn't work when SDK is imported dynamically
* **Refact:** SDK NPM forces to install rollbar
## SDK Release [v1.7.2](https://www.npmjs.com/package/@titan-os/sdk/v/1.7.2)
* **Fix:** Vestel MB190/MB191 App2App on DevView is not correctly
* **Fix:** Apps with CSP rules break when opening the app
* **Fix:** Vestel MB190/MB191 App2App on DevView is not working
## SDK Release [v1.7.1](https://www.npmjs.com/package/@titan-os/sdk/v/1.7.0)
* **Fix:** Intermittent issue prevents to access DevView
## SDK Release [v1.7.0](https://www.npmjs.com/package/@titan-os/sdk/v/1.7.0)
* **Fix:** Disable AppControl whitelist
## SDK Release [v1.6.2](https://www.npmjs.com/package/@titan-os/sdk/v/1.6.2)
* **Fix:** Disable AppControl whitelist
* **Feat:** SDK on NPM
The SDK was not available in NPM before the version
[v1.6.2](https://www.npmjs.com/package/@titan-os/sdk/v/1.6.2). Before it, the
SDK was being served as CDN URL only.
# Security & Trust
Source: https://docs.titanos.tv/security-and-tools
The Titan OS platform maintains a list of trusted Root Certificate Authorities (CAs) to ensure secure TLS/SSL connections. When your application makes an HTTPS request, the server's certificate must be issued by a CA on this list for the connection to succeed. You will typically not need to consult this list. However, it can be a valuable diagnostic tool if you are experiencing platform-specific network connection failures that you suspect are related to a TLS handshake error.
## Supported Root Authorities
| | | |
| :----------------------------------- | :---------------------------------------------------------- | :----------------------------------------------------------- |
| AAA Certificate Services | emSign Root CA - G1 | QuoVadis Root CA 3 G3 |
| ACCVRAIZ1 | Entrust Root Certification Authority | QuoVadis Root Certification Authority |
| Actalis Authentication Root CA | Entrust Root Certification Authority - EC1 | SECOM Security Communication RootCA2 |
| AddTrust Class 1 CA Root | Entrust Root Certification Authority - G2 | SECOM Trust.net - Security Communication RootCA1 |
| AddTrust External CA Root | Entrust Root Certification Authority - G4 | Secure Global CA |
| AffirmTrust Commercial | Entrust.net Certification Authority (2048) | SecureSign RootCA11 |
| AffirmTrust Networking | E-Tugra Certification Authority | SecureTrust CA |
| AffirmTrust Premium | FNMT-RCM - SHA256 | Sonera Class2 CA |
| AffirmTrust Premium ECC | GDCA TrustAUTH R5 ROOT | SSL.com EV Root Certification Authority ECC |
| Amazon Root CA 1 | GeoTrust Global CA | SSL.com EV Root Certification Authority RSA R2 |
| Amazon Root CA 2 | GeoTrust Primary Certification Authority | SSL.com Root Certification Authority ECC |
| Amazon Root CA 3 | GeoTrust Primary Certification Authority - G2 | SSL.com Root Certification Authority RSA |
| Amazon Root CA 4 | GeoTrust Primary Certification Authority - G3 | Staat der Nederlanden EV Root CA |
| Atos TrustedRoot 2011 | GeoTrust Universal CA | Staat der Nederlanden Root CA - G2 |
| Autoridad de Certificacion | | |
| Firmaprofesional CIF A62634068 | | |
| GeoTrust Universal CA 2 | Staat der Nederlanden Root CA - G3 | |
| Baltimore CyberTrust Root | Global Chambersign Root | Starfield Class 2 CA |
| Buypass Class 2 Root CA | Global Chambersign Root - 2008 | Starfield Root Certificate Authority - G2 |
| Buypass Class 3 Root CA | GlobalSign (Organizational unit : GlobalSign Root CA - R2) | Starfield Services Root Certificate Authority - G2 |
| CA Disig Root R2 | GlobalSign (Organizational unit : GlobalSign Root CA - R3) | SwissSign Gold CA - G2 |
| Certigna | GlobalSign (Organizational unit : GlobalSign Root CA - R6) | SwissSign Platinum CA - G2 |
| Certigna Root CA | GlobalSign ECC Root CA - R4 | SwissSign Silver CA - G2 |
| certSIGN ROOT CA | GlobalSign ECC Root CA - R5 | Symantec Class 1 Public Primary Certification Authority - G4 |
| Certum CA | GlobalSign Root CA | Symantec Class 1 Public Primary Certification Authority - G6 |
| Certum Trusted Network CA | Go Daddy Class 2 CA | Symantec Class 2 Public Primary Certification Authority - G4 |
| Certum Trusted Network CA 2 | Go Daddy Root Certificate Authority - G2 | Symantec Class 2 Public Primary Certification Authority - G6 |
| CFCA EV ROOT | Government Root Certification Authority - Taiwan | SZAFIR ROOT CA2 |
| Chambers of Commerce Root | GTS Root R1 | TeliaSonera Root CA v1 |
| Chambers of Commerce Root - 2008 | GTS Root R2 | thawte Primary Root CA |
| Chunghwa Telecom Co., Ltd. ePKI Root | | |
| Certification Authority | | |
| GTS Root R3 | thawte Primary Root CA - G2 | |
| COMODO Certification Authority | GTS Root R4 | thawte Primary Root CA - G3 |
| COMODO ECC Certification Authority | Hellenic Academic and Research Institutions ECC RootCA 2015 | TrustCor ECA-1 |
| COMODO RSA Certification Authority | Hellenic Academic and Research Institutions RootCA 2011 | TrustCor RootCert CA-1 |
| Cybertrust Global Root | Hellenic Academic and Research Institutions RootCA 2015 | TrustCor RootCert CA-2 |
| DigiCert Assured ID Root CA | Hongkong Post Root CA 1 | Trustis Limited - Trustis FPS Root CA |
| DigiCert Assured ID Root G2 | Hongkong Post Root CA 3 | T-TeleSec GlobalRoot Class 2 |
| DigiCert Assured ID Root G3 | IdenTrust Commercial Root CA 1 | T-TeleSec GlobalRoot Class 3 |
| DigiCert Global Root CA | IdenTrust Public Sector Root CA 1 | TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 |
| DigiCert Global Root G2 | ISRG Root X1 | TWCA Global Root CA |
| DigiCert Global Root G3 | Izenpe.com | TWCA Root Certification Authority |
| DigiCert High Assurance EV Root CA | LuxTrust Global Root 2 | UCA Extended Validation Root |
| DigiCert Trusted Root G4 | Microsec e-Szigno Root CA 2009 | UCA Global G2 Root |
| DST Root CA X3 | NetLock Arany (Class Gold) Főtanúsítvány | USERTrust ECC Certification Authority |
| D-TRUST Root CA 3 2013 | Network Solutions Certificate Authority | USERTrust RSA Certification Authority |
| D-TRUST Root Class 3 CA 2 2009 | OISTE WISeKey Global Root GA CA | Verisign Class 1 Public Primary Certification Authority - G3 |
| D-TRUST Root Class 3 CA 2 EV 2009 | OISTE WISeKey Global Root GB CA | Verisign Class 2 Public Primary Certification Authority - G3 |
| EC-ACC | OISTE WISeKey Global Root GC CA | Verisign Class 3 Public Primary Certification Authority - G3 |
| EE Certification Centre Root CA | QuoVadis Root CA 1 G3 | VeriSign Class 3 Public Primary Certification Authority - G4 |
| emSign ECC Root CA - C3 | QuoVadis Root CA 2 | VeriSign Class 3 Public Primary Certification Authority - G5 |
| emSign ECC Root CA - G3 | QuoVadis Root CA 2 G3 | VeriSign Universal Root Certification Authority |
| emSign Root CA - C1 | QuoVadis Root CA 3 | XRamp Global Certification Authority |
# Submit a channel
Source: https://docs.titanos.tv/submit-fast-channel
### Create your channel
Start by creating a new channel in the Partner Portal.
Click **Create channel** and fill in the information for the **umbrella brand**.
***
### Umbrella brand name
The umbrella brand represents the branding of a channel, while localized versions may have different names or flavors. This name is used for internal organization only.
* Typically an English or internal-facing name
* Can also match the public channel name
Use this to group and manage related channel feeds more efficiently.
***
### Add localized feeds
Localized feeds represent variations of your channel for different markets.
Each feed can differ based on:
* Scheduling
* Audio or subtitle languages
* Programming or content rights
* EPG differences
Even if the video feed from the technical provider is the same, differences in metadata (e.g. subtitles or EPG) require a separate localized feed here in Partner Portal.
If your channel is identical across all markets, you only need to create one localized feed.
***
### Channel name (customer-facing)
The **channel name** is what viewers will see.
Make sure this reflects the correct punctuation and capitalization according to your branding for each localized feed. This should not be an internal feed name
***
### Duplicate feed information
If multiple localized feeds share similar details, you can duplicate an existing feed to save time.
* Copy all fields from an existing feed
* Adjust only the differences (e.g. language, markets)
***
### Apply assets across feeds
Artwork is often shared across feeds. You can apply the same assets to one or multiple feeds.
* Apply images to all feeds
* Modify individual feeds later if needed
***
# Titan SDK
Source: https://docs.titanos.tv/titan-sdk
Titan SDK is a comprehensive library that provides a unified interface for interacting with Titan OS-powered TVs. It simplifies access to core TV features and helps you build apps that run consistently across the expanding Titan OS ecosystem.
This guide will help you integrate the Titan SDK into your applications.
## Why should I use the new Titan SDK?
Migrating to the Titan SDK ensures your app is ready for the next generation of Titan OS devices and capabilities.
It replaces the legacy DeviceInfo API with a forward-looking SDK that supports multi-brand compatibility and enables integration with new platform features including Text-to-Speech, Text Magnification, and App Control.
## Get started with Titan SDK
Ensure your device is compatible with the SDK by checking the [Platform Specifications](https://docs.titanos.tv/platform-versions).
Install the SDK into your project using npm.
```bash theme={null}
npm install @titan-os/sdk
```
Import the getTitanSDK function from the package and call it to get your SDK instance.
```javascript theme={null}
import { getTitanSDK } from '@titan-os/sdk';
const titanSDK = getTitanSDK();
console.log(titanSDK);
```
For projects not using a build system, a CDN-based integration is also available. Please refer to our [CDN Integration Guide](/titan-sdk-cdn) for more details.
## Supported brands and models
The Titan SDK is designed to support all TVs powered or maintained by Titan OS, offering a consistent integration experience across brands and devices.
Today, this includes:
* Selected Philips TVs from 2020 models
* Selected JVC TVs starting from 2025 models
As Titan OS expands to more brands and devices, the SDK will ensure your app remains compatible with minimal adjustments.
For the most up-to-date list of supported devices and their capabilities, please visit our [platform versions page](https://docs.titanos.tv/platform-versions).
## Accessibility
The SDK provides tools to integrate Text-to-Speech (TTS) and Text Magnification. These features are part of our ongoing effort to make TVs more accessible and to comply with the European Accessibility Act (EAA) requirements.
Accessibility support is initially available on:
* Philips 2025 models
* JVC 2025 models
We are actively working to expand accessibility support to additional features and future models.
For a comprehensive guide on integrating accessibility into your app, please refer to our [Accessibility Integration Guide](https://docs.titanos.tv/accessibility).
## App Control
App Control allows your application to interact with and launch other applications on the Titan OS platform. This feature, while not new, is now fully integrated into the Titan SDK, initially providing the capability to open other apps.
For more information, please visit our [App Control page](https://docs.titanos.tv/app-control).
## Migration from DeviceInfo API to Titan SDK
To help you transition from the DeviceInfo API to the new Titan SDK, we have prepared a dedicated migration guide and practical code examples.
Visit our [Migration to Titan SDK page](https://docs.titanos.tv/migration-to-titan-sdk) to get started.
## Dictionary
The library exposes a structured set of objects and functions to interact with the Titan OS environment.
In this section, you’ll find a detailed dictionary of key components, organized for easier reference.
### Device Information
| Object/Function Name | Type | Description |
| :--------------------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------- |
| `deviceInfo` | Object | Contains functions to retrieve device-specific information. |
| `deviceInfo.getDeviceInfo()` | Function | Retrieves detailed device information, including hardware and software specifics. Tailor experiences based on these capabilities. |
**getDeviceInfo()** Return Properties
The `getDeviceInfo()` function returns an object containing information about the device's channel, product details, and some high-level capabilities. Below are the properties you can expect from the returned object:
| Property Path | Type | Description | Example Value |
| :------------------------------------ | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------- |
| `Channel` | Object | Contains information related to the device's channel and app store context. | |
| `Channel.appStore` | string | The name of the application store the device primarily uses. | `TitanOS` |
| `Channel.vendor` | string | The vendor of the channel or platform. | `TPV` |
| `Channel.brand` | string | The brand associated with the channel or platform. | `Philips` |
| `Product` | Object | Contains details specific to the device product. | |
| `Product.platform` | string | The platform name of the device. | `TPN258E` |
| `Product.year` | string | The model year of the device. | `2025` |
| `Product.deviceID` | string | A unique identifier for the device. | `b5778bff-de7f-5688-a815-cbf05a26fed0` |
| `Product.firmwareVersion` | string | The version of the device's firmware. | `058.002.179.041` |
| `Product.firmwareComponentID` | string | The identifier for the device's firmware component. | `TPN258E` |
| `Product.mac` | string | The MAC address of the device's network interface. | `94:bd:be:64:ed:f7` |
| `Product.WhaleAdID` | string | The advertising ID. | `27aa044c-0951-9ee2-9870-676d183a3d12` |
| `Product.language` | string | The device's configured language. | `en` |
| `Product.country` | string | The device's configured country. | `BG` |
| `Product.ifa` | string | The Identifier for Advertisers (IFA) or Device Advertising Identifier. | `883e340c-8877-464a-ab50-68f4ef62f955` |
| `Product.ifaType` | string | The type of Identifier for Advertisers (e.g., `dpid`). | `dpid` |
| `Capability` | Object | Contains flags indicating the device's supported features and technologies. | |
| `Capability.os` | string | The operating system of the device. | `Linux` |
| `Capability.browserEngine` | string | The browser engine used by the device. | `Blink` |
| `Capability.supportPlayready` | `boolean \| "unknown"` | Indicates support for Microsoft PlayReady DRM. | |
| `Capability.supportWidevineModular` | `boolean \| "unknown"` | Indicates support for Google Widevine Modular DRM. | |
| `Capability.support3d` | boolean | Indicates support for 3D content display. | |
| `Capability.supportKeyNumeric` | boolean | Indicates if numeric keys (0-9) are supported on the remote control. | |
| `Capability.supportKeyColor` | boolean | Indicates if color keys (Red, Green, Yellow, Blue) are supported. | |
| `Capability.supportMultiscreen` | boolean | Indicates if the device supports multi-screen functionality. | |
| `Capability.multiaudioSupport` | boolean | Indicates if multiple audio tracks are supported for media playback. | |
| `Capability.TTMLInbandSupport` | boolean | Indicates support for TTML (Timed Text Markup Language) in-band subtitles. | |
| `Capability.TTMLOutofbandSupport` | boolean | Indicates support for TTML (Timed Text Markup Language) out-of-band subtitles. | |
| `Capability.supportUHD` | boolean | Indicates support for Ultra High Definition (UHD) display resolution. | |
| `Capability.supportFHD` | boolean | Indicates support for Full High Definition (FHD) display resolution. | |
| `Capability.supportHDR` | boolean | Indicates support for HDR High Dynamic Range | |
| `Capability.supportHDR_HDR10` | boolean | Indicates support for HDR10 High Dynamic Range. | |
| `Capability.supportHDR_DV` | boolean | Indicates support for Dolby Vision High Dynamic Range. | |
| `Capability.supportMultiAudio` | boolean | Indicates support for multiple audio tracks in general. | |
| `Capability.supportTTMLInband` | boolean | Indicates support for in-band TTML captions. | |
| `Capability.supportTTMLOutofband` | boolean | Indicates support for out-of-band TTML captions. | |
| `Capability.supportAdobeHDS` | boolean \| "unknown" | Indicates support for Adobe HTTP Dynamic Streaming. | |
| `Capability.supportWidevineClassic` | boolean \| "unknown" | Indicates support for Google Widevine Classic DRM. | |
| `Capability.supportDolbyAtmos` | boolean | Indicates support for Dolby Atmos audio technology. | |
| `Capability.supportWebSocket` | boolean | Indicates support for WebSocket communication. | |
| `Capability.supportEME` | boolean | Indicates support for Encrypted Media Extensions (EME). | |
| `Capability.hasStorage` | boolean | Indicates if the device has persistent local storage available. | |
| `Capability.supportAppleHLS` | boolean | Indicates support for Apple HTTP Live Streaming (HLS). | |
| `Capability.supportMSSmoothStreaming` | boolean | Indicates support for Microsoft Smooth Streaming. | |
| `Capability.supportMSSInitiator` | boolean | Indicates support for Microsoft Smooth Streaming Initiator. | |
| `Capability.supportMPEG_DASH` | boolean | Indicates support for MPEG-DASH streaming. | |
| `Capability.drmMethod` | string | The primary Digital Rights Management (DRM) method employed by the device. | `OIPF` |
| `Capability.supportOIPF` | boolean | Indicates support for Open IPTV Forum (OIPF) standards. | |
| `getKeyCodes() ` | function | Returns the remote control keycodes corresponding to the device brand on which your app is running. These keycodes can be used in the keyup or keydown event. For more details, refer to: [Link to how to handle the back button](/remote-control#the-back-button). | |
### Accessibility
| Object/Function Name | Type | Description |
| :---------------------------------------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
| `accessibility` | Object | Provides functions to interact with the TV's accessibility features. |
| `accessibility.isTTSSupported()` | Function | Checks if Text-to-Speech (TTS) is supported and enabled on the current device. Returns `true` or `false`. |
| `accessibility .isTextMagnificationSupported()` | Function | Determines if text magnification is supported by the device. Returns `true` or `false`. |
| `accessibility.getTTSSettings()` | Function | Retrieves the TV's current Text-to-Speech settings, including rate, pitch, and volume, for a personalized auditory experience. |
| `accessibility.getTMSettings()` | Function | Retrieves the TV's current Text Magnification settings, such as zoom levels and text contrast. |
| `accessibility.startSpeaking()` | Function | Initiates Text-to-Speech for a given string, speaking the text through the TV's audio output based on current TTS settings. |
| `accessibility.stopSpeaking()` | Function | Stops any currently active Text-to-Speech output. Allows for control over speech interruption. |
| `accessibility.onTTSSettingsChange()` | Function | Registers a callback for when TTS settings are changed by the user. Enables your app to react to these adjustments. |
| `accessibility.onTMSettingsChange()` | Function | Registers a callback for when Text Magnification settings are changed by the user. Allows your app to update its UI based on new preferences. |
| `accessibility .onTTSConfigurationChange()` | Function | Registers a callback for global TTS configuration changes, such as default voice or language. |
| `accessibility .onTMConfigurationChange()` | Function | Registers a callback for global Text Magnification configuration changes. |
### App Management & Remote Control
| Object/Function Name | Type | Description |
| :------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------- |
| `apps` | Object | Contains functions for overall application management. |
| `apps.launch()` | Function | Initiates the launch of another application. Takes a parameter for the app to be launched, and optionally data to pass along. |
| `getRemoteControlKeyMap()` | Function | Retrieves the current key mapping for the TV's remote control. Understands button to action correlations. |
| `setRemoteControlKeyMap()` | Function | Allows customization or overriding of the TV's default remote control key mapping. Useful for specific app behaviors. |
| `onRemoteControlKeyMapChange()` | Function | Registers a callback when the remote control key mapping changes. Helps your app synchronize with user or system adjustments. |
## TypeScript
The Titan SDK includes full TypeScript support. All types are bundled with the npm package, so you'll get autocompletion and type-checking right out of the box.
```typescript theme={null}
import { getTitanSDK, TitanSDK, DeviceInfo } from '@titan-os/sdk';
const titanSDK: TitanSDK = getTitanSDK();
async function logDeviceInfo() {
const deviceInfo: DeviceInfo = await titanSDK.deviceInfo.getDeviceInfo();
console.log(deviceInfo.Product.brand);
}
```
For more guidance on integrating typescript, please refer to our [Typescript page](https://docs.titanos.tv/typescript).
## Real-World Examples & Resources
To see these features in action and to understand more about the integration, in addition to the following next pages listed at the end of this page, explore the following examples on GitHub:
* **[Example 1: Exploring Device Info](https://github.com/Titan-OS/titan-sdk-examples/tree/master/10-example-npm-exploring-device-info)**: Demonstrates retrieving device information.
* **[Example 2: Text-to-Speech with Navigation](https://github.com/Titan-OS/titan-sdk-examples/tree/master/11-example-npm-text-to-speech-3)**: A fake carousel of movies with TTS speaking the values from the 'aria-label'.
* **[Example 3: Text Magnification](https://github.com/Titan-OS/titan-sdk-examples/tree/master/12-example-npm-text-magnification)**: Applies text magnification to labels\`.
* **[Example 4: App Control](https://github.com/Titan-OS/titan-sdk-examples/tree/master/13-example-npm-app-control)**: Applies text magnification to labels\`.
* **[Example 5: Typescript](https://github.com/Titan-OS/titan-sdk-examples/tree/master/14-example-npm-typescript)**: Carousel of movies with Typescript\`.
Other examples, but using **CDN URL instead of NPM**:
* **[Example 6: Hello Titan](https://github.com/Titan-OS/titan-sdk-examples/tree/master/1-example-hello-titan)**
* **[Example 7: Exploring Device Info](https://github.com/Titan-OS/titan-sdk-examples/tree/master/2-example-exploring-device-info)**
* **[Example 8: Text-to-Speech](https://github.com/Titan-OS/titan-sdk-examples/tree/master/3-example-text-to-speech-1)**
* **[Example 9: Text-to-Speech with text content](https://github.com/Titan-OS/titan-sdk-examples/tree/master/4-example-text-to-speech-2)**
* **[Example 10: Text-to-Speech with Navigation](https://github.com/Titan-OS/titan-sdk-examples/tree/master/6-example-text-to-speech-3)**
* **[Example 11: Text Magnification](https://github.com/Titan-OS/titan-sdk-examples/tree/master/5-example-text-magnification-1)**
## Content Security Policy (CSP)
If your app uses Content Security Policies (CSP), you might need to allow our domain. Our SDK connects to services on `*.titanos.tv` (like for crash reports or updates). Please add `*.titanos.tv` to your CSP's allowed connections (e.g., connect-src) to ensure everything works smoothly. This helps avoid issues where your app might block essential SDK features.
If you have rules for iFrames (e.g., `frame-src` and `child-src`), it's recommended to add our domain to your whitelist as well, but it's not obrigatory. If your company policies requires to avoid the need of allowing our iFrame, it should not prevent you to use the library, but it will display an error/warning in the logs and some features might be affected, such as the App Conttrol.
## known issues
The IFA (Identifier for Advertising) is currently not being returned for 2020-2022 Philips devices.
We are actively working on a solution. In the meantime, please feel free to reach out to us at [titan-sdk-support@titanos.tv](mailto:titan-sdk-support@titanos.tv) if you require guidance on addressing this issue temporarily.
The Capability.supportDolbyAtmos property, returned by the getDeviceInfo function, has the following behaviors:
* 2020-2023 devices: Returns "unknown" instead of a boolean value.
* 2024 NT676 and 2025 NT690 4K models: Returns false when it should return true.
We are currently working to resolve these discrepancies. For the moment, please refer to our [Platform Versions](https://docs.titanos.tv/platform-versions) page to verify Dolby Atmos support for your device.
The firmwareVersion property returns invalid data for some devices, such as preventing access to the correct firmware version though SDK.
We are currenly working to resolve this issue for the devices affected, but in the meantime, if you want to get this information you can extract it from the user agent. If you decide to do it for the moment, please make sure the implementation covers all the TV brands, as depending on the brand the User Agent structure might change. To see how to extract it, please access the [User Agent page](https://docs.titanos.tv/user-agents).
This issue only happens if your app whitelists domains in the CSP Policies, but should not prevent you to use the Titan SDK. Given that the SDK uses iFrame behind the scenes, CSP blocks one of our components, but then it recover and use another component as a fallback.
Our team is working on a new approach for it. For the moment, you can ignore the error.
Make sure you are testing your app using DevView, which is our official way to test apps. Please refer to [Testing your app](/devviewinstall) for more details.
## Contact us
We welcome your feedback and encourage you to share any thoughts or suggestions as you test the SDK. Please email us at [titan-sdk-support@titanos.tv](mailto:titan-sdk-support@titanos.tv) with your questions or comments.
## Next steps
Learn how to migrate from the DeviceInfo API to the new TitanSDK
Learn how to get started to the new accessibility functionalities in TitanSDK
# Accessibility Guide
Source: https://docs.titanos.tv/titan-sdk-accessibility
Titan OS offers accessibility features designed to help you create inclusive applications for Smart TVs. This guide will walk you through implementing Text-to-Speech (TTS) and Text Magnification (TM) across Titan OS devices.
## Core Accessibility features
Titan OS provides the following features for enhancing accessibility:
### Text-to-Speech (TTS)
Converts on-screen text into spoken audio, enabling navigation for visually impaired users. In the Titan OS ecosystem, the implementation strategy depends on the device brand:
* **Philips Devices:** Integration though [Titan SDK](/titan-sdk). The application must explicitly invoke the Titan SDK’s startSpeaking() function to trigger speech.
* **JVC Devices:** Integration is Native. The device uses an automatic screen reader that interprets standard WAI-ARIA attributes (e.g., aria-label, role). Developers should rely on standard web accessibility practices rather than SDK methods for these devices.
### Text Magnification (TM)
Text Magnification (TM) allows users to increase font size and contrast for better readability.
Unlike TTS, this feature is consistently managed through the Titan SDK across all devices. When a user enables magnification in the OS system settings, the SDK exposes this preference to your application. You are responsible for detecting this property and programmatically adjusting your UI's text scaling to match the requested size.
## Getting Started
This section provides practical steps and code snippets to begin integrating accessibility features into your TitanOS application.
### Basic TTS and TM Setup using the Titan SDK
Before using TTS or TM, it's essential to check if the feature is supported by the device and if the user has enabled it in the TV's operating system settings. The `getTTSSettings()` function (and `getTMSettings()`) will return an `enabled` property indicating the user's preference in the TV's home screen settings.
* **Checking Support & User Settings:**
```javascript theme={null}
async function checkAccessibilitySupport() {
try {
const { accessibility } = titanSDK;
const ttsSupported = await accessibility.isTTSSupported();
const tmSupported = await accessibility.isTextMagnificationSupported();
console.log(`Text-to-Speech Supported: ${ttsSupported}`);
console.log(`Text Magnification Supported: ${tmSupported}`);
if (ttsSupported) {
const ttsSettings = await accessibility.getTTSSettings();
console.log(`TTS is enabled by user: ${ttsSettings.enabled}`);
// ttsSettings will return an object like: {"enabled": false} if disabled
}
if (tmSupported) {
const tmSettings = await accessibility.getTMSettings();
console.log(`Text Magnification is enabled by user: ${tmSettings.enabled}, scale: ${tmSettings.scale}`);
}
} catch (error) {
console.error("Error checking accessibility support:", error);
}
}
// Call this function early in your app's lifecycle
checkAccessibilitySupport();
```
### Programmatic Text-to-Speech Control
The Titan SDK's `startSpeaking()` function provides direct control over the TV's speech output. It does not automatically read content from your DOM elements or ARIA attributes. As the developer, you are responsible for extracting the specific text you wish to be spoken and passing it as a string (or an array of strings) to this function.
For example, you might extract text from a focused element's `textContent`, `innerText`, or its `aria-label` attribute.
* **Initiating Speech:**
```javascript theme={null}
const speakElementText = asyn elementId => {
try {
const { accessibility } = titanSDK;
// Ensure TTS is supported and enabled before attempting to speak
const ttsSupported = await accessibility.isTTSSupported();
const ttsSettings = await accessibility.getTTSSettings();
if (!ttsSupported || !ttsSettings.enabled) {
console.warn("TTS is not supported or not enabled by the user.");
return;
}
const element = document.getElementById(elementId);
if (element) {
// Example: Prioritize aria-label, fallback to textContent
const textToSpeak = element.getAttribute('aria-label') || element.textContent || element.innerText;
if (textToSpeak) {
await accessibility.startSpeaking(textToSpeak);
console.log(`Speaking: "${textToSpeak}"`);
} else {
console.warn("No text found to speak for element:", elementId);
}
}
} catch (error) {
console.error("Error speaking text:", error);
}
}
// Example usage (assuming an HTML element with id="myButton" or similar)
// document.getElementById('myButton').addEventListener('focus', () => speakElementText('myButton'));
```
Your GitHub examples provide more complete implementations:
* **[Example: Text-to-Speech](https://github.com/Titan-OS/titan-sdk-examples/tree/master/3-example-text-to-speech-1)**: Basic demonstration of calling `startSpeaking`.
* **[Example: Text-to-Speech with Navigation](https://github.com/Titan-OS/titan-sdk-examples/tree/master/4-example-text-to-speech-2)**: Shows extracting text from `aria-label` and using it with navigation.
**Note:** It's important to mention that, as explained at the [Text-to-Speech (TTS)](/titan-sdk-accessibility#text-to-speech-tts) topic, this feature is only available for Philips devices. In the next topic you will get more information on how to enable and disable it depending on the device brand. If your app is on Philips devices, the the implementation using the Titan SDK should be enouth.
* **Stopping Speech:**
```javascript theme={null}
import { accessibility } from '@titanos/sdk'; // Assuming 'sdk' instance is available
// Call this to immediately stop any ongoing speech
accessibility.stopSpeaking();
```
### TTS Implementation across device brands (Brand Check)
As mentioned, JVC devices utilize a native accessibility reader that automatically announces focused elements based on ARIA attributes. Invoking `startSpeaking()` on these devices may result in conflicting audio or redundant speech. Conversely, Philips devices require the SDK to trigger speech.
To handle this, you should check the device brand during initialization and conditionally execute the TTS logic.
* **Implementation:**
```javascript theme={null}
// 1. Initialize logic variable (you can use your prefered state management)
let useSDKTTS = true;
async function setupAccessibilityLogic() {
try {
const { deviceInfo, accessibility } = titanSDK;
// A. Check Device Brand
const info = await deviceInfo.getDeviceInfo();
const brand = info.Channel?.brand || '';
console.log(`Device Brand detected: ${brand}`);
// If JVC, we disable the SDK manual calls to avoid conflict with Native Reader
if (brand && brand.toUpperCase().includes('JVC')) {
useSDKTTS = false;
return;
}
// B. If not JVC (e.g., Philips), check if User enabled TTS in OS
const isSupported = await accessibility.isTTSSupported();
const settings = await accessibility.getTTSSettings();
// Check if supported AND if the user actually enabled it in settings
if (!isSupported || !settings || !settings.enabled) {
useSDKTTS = false;
return;
}
// Only if brand is valid AND user enabled TTS, we use the SDK
useSDKTTS = true;
} catch (error) {
console.warn("Could not determine device brand or settings, defaulting to safe mode (SDK TTS off)", error);
useSDKTTS = false;
}
}
// 2. Use the variable in your focus handler
async function handleFocus(event) {
// Only call startSpeaking if logic determined we should use SDK
if (useSDKTTS) {
const { accessibility } = titanSDK;
await accessibility.stopSpeaking(); // Clear previous speech
const textToSpeak = event.target.getAttribute('aria-label');
if (textToSpeak) {
await accessibility.startSpeaking(textToSpeak);
}
}
// If useSDKTTS is false (JVC), the TV's native reader handles the ARIA label automatically.
}
// Call setup once on app load
setupAccessibilityLogic();
```
**Note:** As mentioned previously, this approach of detecting which device you're running in depends on which devices your app is published. If your app is only on JVC devices, you should use the automatic Screen Reader. If it's only published on Philips devices, only the SDK is needed. If it's published on both devices, you will need this device check.
### Responding to User Preferences
Users can enable or disable accessibility features from the TitanOS home screen settings. Your application should listen for these changes and adapt its behavior accordingly.
* **Monitoring Accessibility Settings:**
```javascript theme={null}
const { accessibility } = titanSDK;
// Listen for TTS setting changes
const unsubscribeTTS = accessibility.onTTSSettingsChange((settings) => {
console.log('TTS settings changed:', settings);
if (settings.enabled) {
console.log('TTS was enabled by the user in OS settings.');
// Optionally enable your accessibility reader here
// accessibility.enableReader({ verbosity: 'standard' });
} else {
console.log('TTS was disabled by the user in OS settings.');
// Optionally disable your accessibility reader here
// accessibility.disableReader();
}
});
// Listen for Text Magnification setting changes
const unsubscribeTM = accessibility.onTMSettingsChange((settings) => {
console.log('Text Magnification settings changed:', settings);
if (settings.enabled) {
console.log(`Text Magnification enabled: Scale ${settings.scale}x.`);
// Apply UI changes for larger text (e.g., adjust document.documentElement.style.fontSize)
document.documentElement.style.fontSize = `${settings.scale}em`;
} else {
console.log('Text Magnification disabled.');
// Reset text size
document.documentElement.style.fontSize = '';
}
});
// Remember to unsubscribe from listeners when they are no longer needed
// unsubscribeTTS();
// unsubscribeTM();
```
## Testing Your Accessible App
Thorough testing is vital to ensure your app is truly accessible.
* **Manual Testing with Remote Control:**
* Navigate your entire application using only the TV remote's D-Pad (directional buttons) and the OK/Enter button.
* Ensure every interactive element (buttons, links, inputs) is reachable and highlightable.
* Verify that when the Accessibility Reader is enabled, all relevant elements are announced correctly as focus moves.
* Test dynamic content updates (e.g., loading messages, form errors) to ensure they are spoken.
* **Live Testing on TV:**
* Test directly on Philips 2025 and JVC 2025 TV models with Accessibility settings (TTS, Text Magnification) enabled/disabled via the OS home screen. This provides the most accurate user experience.
## Real-World Examples & Resources
To see these features in action and understand more about the integration, explore these examples on GitHub:
* **[Example: Text-to-Speech with Navigation](https://github.com/Titan-OS/titan-sdk-examples/tree/master/11-example-npm-text-to-speech-3)**: A fake carousel of movies with TTS speaking the values from the 'aria-label'.
* **[Example: Text-to-Speech](https://github.com/Titan-OS/titan-sdk-examples/tree/master/3-example-text-to-speech-1)**: A fundamental example of using `startSpeaking`.
* **[Example: Text-to-Speech with text content](https://github.com/Titan-OS/titan-sdk-examples/tree/master/4-example-text-to-speech-2)**: Shows TTS with a text extracted from the text content.
* **[Example: Text Magnification](https://github.com/Titan-OS/titan-sdk-examples/tree/master/12-example-npm-text-magnification)**: Applies text magnification to labels\`.
We are committed to receiving feedback and continuously improving our documentation and examples.
## Next steps
Learn how to migrate from the DeviceInfo API to the new TitanSDK
Introduction to the new TitanSDK
# App Control
Source: https://docs.titanos.tv/titan-sdk-app-control
App Control enables your application on Titan OS to launch other applications and, optionally, direct them to specific content (deeplink). This functionality is now fully integrated with the Titan SDK.
This feature is protected and requires your app to be whitelisted. Please, send an e-mail to [titan-sdk-support@titanos.tv](mailto:titan-sdk-support@titanos.tv) asking your app to be authorized.
## How to use it
```typescript theme={null}
titanSDK.apps.launch(code: string, query?:string): Promise
```
### Code parameter
The universal identifier of the application to be launched. Example: `netflix`, `primevideo`, `youtube`, etc. You can find these codes in the Partner Portal under the **Resources -> [App Control](https://partners.titanos.tv/partners/app-control)** section.
### Query parameter
The query parameter is a set of information appended to an app launch command. It allows you to:
* Send data to the target application
* Open a specific video, detail page or a user profile.
*Important:* The format and usage of these query parameters are defined by the application you are trying to open, not by Titan OS. Titan OS only handles launching the application and passing these parameters. For example, to open a specific movie on Netflix or a video on YouTube, you'll need to use the deeplink format that those applications themselves recognize.
### Error Handling
The promise may be rejected with an error object containing:
* `code` (string): A machine-readable error code indicating the type of error. Currently there's only one code already mapped: `APP_NOT_FOUND` - The application specified by `code` does not exist
* `message` (string): A human-readable message providing more details about the error.
**Important**: With the App code, we validate if the app exists and is available in the user's current country market and TV model.
Launching the Application:
* Success: If the application is valid and available, it is launched with the optional `query`. The promise resolves successfully.
* Failure: If the application is not valid or unavailable, the promise is rejected with a specific error code.
### Example Usage
```javascript theme={null}
// Launching an app without query
titanSDK.apps.launch('app-id')
.then(() => {
console.log("App launched successfully.");
})
.catch((error) => {
console.error(`Error (${error.code}): ${error.message}`);
});
// Launching an app with query or deeplink
titanSDK.apps.launch("app-id", "?/content-id")
.then(() => {
console.log("App launched with the specified video.");
})
.catch((error) => {
console.error(`Error (${error.code}): ${error.message}`);
});
```
To see this feature in action explore the following examples on GitHub:
* **[Example: Text Magnification](https://github.com/Titan-OS/titan-sdk-examples/tree/master/8-example-app-control)**: App Control\`.
# Titan SDK with CDN
Source: https://docs.titanos.tv/titan-sdk-cdn
This guide explains how to integrate the Titan SDK into your project using the Content Delivery Network (CDN) URL method.
It's an alternative to the NPM method. This approach is ideal for simple projects, quick prototypes, or environments that do not use a build system with npm (like Vite or Webpack).
For modern and robust applications, we recommend using the [npm installation method](/titan-sdk), as it provides version management.
## How to Use
CDN integration is straightforward and involves just two steps.
To begin, add the following \
```
After the script is loaded, it will create a global object named TitanSDK on the window object. You can access it directly in your JavaScript files to start using the SDK's functionalities.
```javascript theme={null}
// The TitanSDK variable is now globally available
const titanSDK = TitanSDK;
console.log('Titan SDK has been loaded:', titanSDK);
```
## Usage Example
Here is a practical example of how to fetch device information using the CDN method. Note that, just like the npm version, function calls are asynchronous.
```javascript theme={null}
document.addEventListener('DOMContentLoaded', async () => {
try {
// 1. Access the global variable
const titanSDK = TitanSDK;
// 2. Call the function to get device information
const deviceInfo = await titanSDK.deviceInfo.getDeviceInfo();
// 3. Log the information to the console
console.log('TV Brand:', deviceInfo.Product.brand);
console.log('Model Year:', deviceInfo.Product.year);
} catch (error) {
console.error('Failed to use the Titan SDK:', error);
}
});
```
## Next Steps
View the main documentation and the recommended npm installation method.
Consult the detailed guide for migrating from the old DeviceInfo API.
# How to Use the Titan SDK with TypeScript
Source: https://docs.titanos.tv/typescript
The Titan SDK is built in JavaScript and delivered via a CDN, meaning it's not a standard npm module. As a result, your modern TypeScript project won't automatically have access to its type definitions. To get the benefits of autocompletion and type-checking, you'll need to manually integrate the type declaration file (`.d.ts`) we provide.
## Integrating the TitanSDK types
Here is a suggestion on how to integrate our type declarations into your project.
**1. Download the .d.ts File**
First, get the declaration file and save it locally. You can do this by opening the CDN URL in your browser and saving the content or by using a command-line tool like curl.
**Note:** The interface should not change, but sometimes we might add new properties to the SDK. The declaration file (`d.ts`) is updated automatically once we add something new to the interface.
Example URL: [https://sdk.titanos.tv/sdk/sdk.d.ts](https://sdk.titanos.tv/sdk/sdk.d.ts)
Recommended Location: Create a new folder, src/types, and save the file there. This keeps your project organized and separate from your main code.
Your project structure should look like this after this step:
```
├ /your-project
├─└─ /src
├────└── /types
├────└───└── /sdk.d.ts <-- The downloaded file
├────└── /App.tsx
├─└── /tsconfig.json
```
**2. Declare the Global Variable**
The library's main variable (TitanSDK) is available on the global window object when the script is loaded via the CDN. However, TypeScript needs to be told about this to avoid errors. You must declare that this global variable exists and what its type is.
Create a new file, src/types/globals.d.ts, and add the following code. This file is a special declaration file that tells TypeScript to "merge" your new type definitions with the built-in window object. If you already have a declaration file, just post this code there.
```TypeScript theme={null}
// src/types/globals.d.ts
// Import the type definition from the sdk.d.ts file you just saved.
import { TitanSDK } from './sdk.d.ts';
// Use declaration merging to add the TitanSDK property to the global Window interface.
declare global {
interface Window {
TitanSDK: TitanSDK;
}
}
// This empty export is necessary to make this file a module
// and prevent it from being treated as a global script.
export {};
```
**3. Use the Types in Your Code**
Once the global variable is declared, you can use `window.TitanSDK` directly in your TypeScript or JavaScript files. Your code editor will now provide IntelliSense, autocompletion, and type-checking for all the functions and properties defined in the .d.ts file.
You no longer need to import the types or variables; TypeScript automatically links them based on their names.
TypeScript in action in a React Component:
## Real-World Examples & Resources
To see these it in action and understand more about the integration on our GitHub examples repository:
* **[Example: Using Typescrip](https://github.com/Titan-OS/titan-sdk-examples/tree/master/7-example-typescript)**: A simple carousel with TTS using React + Vite + Typescript.
We are committed to receiving feedback and continuously improving our documentation and examples.
## Next steps
Introduction to the new TitanSDK
Learn how to migrate from the DeviceInfo API to the new TitanSDK
# Updates
Source: https://docs.titanos.tv/updates
## Deprecation of MSS Support
Titan OS will end support for MSS across TV platforms by June 30, 2026.
This change aligns with current industry standards, where HLS and MPEG-DASH (ideally CMAF-packaged) are the supported and recommended streaming formats across Connected TV platforms.
What this means for you: If your app or content delivery currently relies on MSS, you must migrate to HLS and/or MPEG-DASH to ensure continued compatibility with Titan OS devices. MSS should be considered a legacy format and should not be used for new deployments or updates.
## New Titan SDK changelog section
Keep your Titan SDK updated! We are constantly improving the it. If you are unable to upgrade immediately due to internal versioning policies, please monitor the [Titan SDK Changelog](/sdk-changelog) to stay informed about essential updates and compatibility fixes.
## Managing Cookies and Local Storage
We've published a new documentation page: "Managing Cookies and Local Storage."
This has been a frequent question from our partners, and this new guide clarifies how to handle client-side storage and session management on the TitanOS platform using standard web APIs.
You can find the new page here: [Cookies and Local Storage](/cookies)
## Titan SDK is Now on npm!
To support modern development workflows, the Titan SDK is now officially available as an npm package. This change makes it easier to integrate and manage the SDK in your applications.
Key advantages:
**Dependency Versioning:** You can now lock the SDK to a specific version in your package.json, ensuring stable and predictable builds.
**Modern libraries:** Seamlessly integrate the SDK with bundlers like Vite, Webpack, and other modern development tools.
**TypeScript:** The package comes with bundled type definitions for a great developer experience with autocompletion and type safety.
Our documentation has been updated to reflect this new, recommended approach. Check out the [Get Started](/titan-sdk) guide to learn more.
## Technical documentation refresh
We’ve made a major refresh of our Titan OS technical docs
**Highlights:**
* **Device capabilities:** Expanded details to help your app run better across devices
* **User agents:** Clarified formats and detection guidance
* **Titan SDK:** New SDK replacing the Device Info API, with a migration guide and best-practice use cases
* **Media specifications:** Updated audio/video, DRM, and streaming requirements
* **Testing on devices:** Updated guidance for testing across brands and manufacturers
* **Issues & troubleshooting:** Consolidated common issues and fixes
* **JVC 2025 devices:** Added device and support details
We continuously update the documentation and welcome your feedback. Please send suggestions or report gaps to [apponboarding@titanos.tv](mailto:apponboarding@titanos.tv).
## New Titan SDK
In the coming weeks, Titan OS is pleased to announce the launch of the Titan SDK, a new and improved library that will replace the current Device Info API script.
The new SDK will offer extended functionality, including:
* Device capabilities.
* Accessibility settings (e.g. text-to-speech, text magnification).
* App control features (including app-to-app linking).
* Most up-to-date features and support to upcoming Titan OS devices from new manufacturers.
This change will require changing the current Device Info script to the new SDK in the future, so make sure you have this change planned.
👉 Important: The new Titan SDK is not yet available, so no action is needed at this time! We will notify you once it’s officially released in the coming weeks, along with clear instructions on how to update.
If you don't know what Device Info is, we suggest you to read the following topic:
🔗 [https://docs.titanos.tv/deviceinfoapi](https://docs.titanos.tv/deviceinfoapi)
If you’re interested in testing the beta version, feel free to reach out.
Let us know if you have any questions in the meantime.
# User Agents
Source: https://docs.titanos.tv/user-agents-specifications
A User Agent (UA) is a text string automatically sent by the browser to web servers.
In general, it identifies the browser, device type, and operating system. For Titan OS, some developers may choose using the User Agent as a strategy to perform some logics before importing the Titan SDK, such as:
* Applying device specific logic (for example, whitelisting support for certain models)
* Performing a quick check if the device is running Titan OS before loading the SDK
* Fallback for the TitanSDK for values such as Firmware version, Model and Year.
The User Agent provides information such as:
* If it's a Titan OS device
* Browser and engine version
* Device model and platform
* Firmware version and release year
We only recommend the usage of the User Agent to perform some quick logics if needed, similar to the strategies listed above. It depends on your app architecture and it's up to the engineer to determine if it would be helpful to improve your app performance.
For example, a common scenario is an application that runs on multiple operating systems. In that case, it's a valid strategy to check if the app is running on Titan OS before importing the Titan SDK. However, if the app is dedicated to Titan OS, this check is not needed.
To conclude, the usage of the User Agent is recommended only if it improves somehow the performance of your app. For retrieving specific information about the device, such as the model and firmare version, use the Titan SDK instead.
## User Agent Structure
User Agents are structured but not static, it means that its values may vary depending on the platform, model, or firmware version. For this reason, applications should extract only the relevant parts (for example: if it's a Titan OS and, if needed, the firmware or model) instead of using the full string as an identifier.
Each device has a User Agent that follows a consistent structure, although individual fields differ. Below are examples showing how User Agents are structured for different manufacturers:
### Philips devices
### JVC devices
These images illustrate which parts of the User Agent represent the Operating System, browser version, platform, model, Titan OS version, and other details.
### Philips devices (2020–2022)
Some Philips models released between 2020 and 2022 run an OS called Saphi, identified as WhaleTV/ or SmartTvA/ in the User Agent.
For example:
`... TV_NT72690_2022/... WhaleTV/2.0 ...`
`... TV_NT72671_2021/... SmartTvA/5.0.0 ...`
These devices are not Titan OS, but they are maintained by Titan OS and are fully supported by the Titan SDK.
If your application supports Saphi, you can detect these devices by checking for the presence of WhaleTV/ or SmartTvA/ in the User Agent.
## Detecting Titan OS and Saphi
The presence of `TitanOS/` in the User Agent always indicates a Titan OS device.
The presence of `WhaleTV/` or `SmartTvA/` indicates a Saphi device (2020–2022 Philips).
Example:
```javascript theme={null}
function detectOS(ua) {
if (ua.includes("TitanOS/")) {
return "Titan OS";
}
if (ua.includes("WhaleTV/") || ua.includes("SmartTvA/")) {
return "Saphi (WhaleTV)";
}
return "Other";
}
```
## Extracting Values Programmatically
The Titan SDK is the recommended way to retrieve device information such as platform, model, or Titan OS version. It is actively maintained and tested to ensure stability across devices and firmware versions.
In some situations, developers also choose to parse the User Agent directly as a lightweight alternative. This can be useful when:
* Performing a quick check if the device is running Titan OS before loading the SDK
* Applying device specific logic (for example, whitelisting support for certain models)
**⚠️ Note:** Do not hardcode or whitelist full User Agent strings. Always parse only the fields you need.
**Philips Example**
UA sample (2025, NT690 4K):
```
Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.4147.62 Safari/537.36 OPR/46.0.2207.0 OMI/4.24, TV_NT72690_2025_4K / (Philips, , wired) CE-HTML/1.0 NETTV/4.6.0.8 SignOn/2.0 SmartTvA/5.0.0 TitanOS/3.0 en Ginga
```
```javascript theme={null}
function parsePhilipsUA(ua) {
return {
OS: (ua.match(/\b(TitanOS)\b/) || [])[1], // e.g. "TitanOS"
brand: (ua.match(/\((Philips)[.,;]/i) || [])[1], // e.g. "Philips"
model: (ua.match(/TV_([A-Za-z0-9_]+)/) || [])[1], // e.g. "MT9676_2025_4K"
year: (ua.match(/TV_[A-Za-z0-9]+_([0-9]{4})/) || [])[1], // e.g. "2025"
resolution: (ua.match(/TV_[A-Za-z0-9]+_[0-9]{4}_([0-9A-Za-z]+)/) || [])[1], // e.g. "4K"
};
}
parsePhilipsUA(navigator.userAgent);
```
Expected result:
```javascript theme={null}
{OS: 'TitanOS', brand: 'Philips', model: 'NT72690_2025_4K', year: '2025', resolution: '4K'}
```
**JVC Example**
UA sample (2025, Vestel MB190):
```
Mozilla/5.0 (Linux ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.128 Safari/537.36 OMI/4.24.3.93.MIKE.227 Model/Vestel-MB190 VSTVB MB100 FVC/9.0 (VESTEL; MB190; ) HbbTV/1.7.1 (+DRM; VESTEL; MB190; 0.9.0.0; ; _TV__2025;) TitanOS/3.0 (Vestel MB190 VESTEL) SmartTvA/3.0.0
```
```javascript theme={null}
function parseVestelJVC_UA(ua) {
return {
OS: (ua.match(/\b(TitanOS)\b/) || [])[1], // e.g. "TitanOS"
brand: (ua.match(/\(([A-Za-z]+);/) || [])[1], // e.g. "VESTEL" ou "JVC"
model: (ua.match(/\(.*;\s*([A-Za-z0-9-]+);/) || [])[1], // e.g. "MB190"
year: (ua.match(/_TV__([0-9]{4});/) || [])[1], // e.g. "2025"
};
}
parseVestelJVC_UA(navigator.userAgent);
```
Expected result:
```javascript theme={null}
{OS: 'TitanOS', brand: 'VESTEL', model: 'MB190', year: '2025'}
```
Recommended practices:
* Parse only the fields you need
* Use the Titan SDK whenever full and reliable device information is required
* Use User Agent parsing mainly as a first filter or fallback
* The examples provided at this page are just for context. Prefer to create or adapt these to fit your specific needs.
## Platform Reference by Year
Titan OS platforms evolve each year. At the [Device Specifications](https://docs.titanos.tv/device-specifications) page you the reference of platforms used by release year. Note that, as mentioned in the [topic](/user-agents-specifications#philips-devices-2020–2022), Philips devices have a different OS name for old devices (2020-2022).