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:
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 /<SW version> (Philips, <CTN>, wired) CE-HTML/1.0 NETTV/4.6.0.8 SignOn/2.0 SmartTvA/5.0.0 TitanOS/3.0 en Ginga
function parsePhilipsUA(ua) {
  return {
    titanOS: (ua.match(/TitanOS\/([0-9.]+)/) || [])[1],
    platform: (ua.match(/TV_([A-Za-z0-9]+)/) || [])[1],         // NT72690
    year: (ua.match(/TV_[A-Za-z0-9]+_([0-9]{4})/) || [])[1],   // 2025
    resolution: (ua.match(/TV_[A-Za-z0-9]+_[0-9]{4}_([0-9A-Za-z]+)/) || [])[1], // 4K
    model: (ua.match(/\(Philips,\s*([^,]+),/) || [])[1],       // PUS8309
  };
}

parsePhilipsUA(navigator.userAgent);
Expected result:
{titanOS: '3.0', platform: 'NT72690', year: '2025', resolution: '4K', model: '<CTN>'}
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
function parseVestelUA(ua) {
  return {
    titanOS: (ua.match(/TitanOS\/([0-9.]+)/) || [])[1],
    platform: (ua.match(/Model\/([A-Za-z0-9-]+)/) || [])[1],   // Vestel-MB190
    model: (ua.match(/\(VESTEL;\s*([A-Za-z0-9-]+);/) || [])[1], // MB190
    year: (ua.match(/_TV__([0-9]{4});/) || [])[1],             // 2025
  };
}

parsePhilipsUA(navigator.userAgent);
Expected result:
{titanOS: '3.0', platform: 'Vestel-MB190', 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

Platform Reference by Year

Titan OS platforms evolve each year. At the Device Specifications page you the reference of platforms used by release year. Note that, as mentioned in the topic, Philips devices have a different OS name for old devices (2020-2022).