> ## Documentation Index
> Fetch the complete documentation index at: https://globaliptv.misidev.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Certification

> How to pass Roku 2026 certification requirements for the GlobalTV channel.

Roku certification is required before a channel can go public in the Channel Store. Run `make check` to validate the static checks locally. Some requirements can only be verified on real hardware.

<Info>
  `make check` is a development aid, not a substitute for Roku's official certification review. Use it to catch issues early, but always test on hardware before submitting.
</Info>

## Running make check

```bash theme={null}
make check
```

A passing run produces output like this:

```text theme={null}
>>> [check] Verificando manifest para certificación Roku 2026...

  ✓ OK:    title=
  ✓ OK:    major_version=
  ✓ OK:    minor_version=
  ✓ OK:    build_version=
  ✓ OK:    mm_icon_focus_hd=
  ✓ OK:    mm_icon_focus_fhd=
  ✓ OK:    splash_screen_fhd=
  ✓ OK:    splash_screen_hd=
  ✓ OK:    splash_screen_sd=
  ✓ OK:    ui_resolutions=fhd
  ✓ OK:    rsg_version=1.2
  ✓ OK:    supports_input_launch=1
  ✓ OK:    splash_rsg_optimization=1
  ✓ OK:    splash_color=
  ✓ OK:    splash_min_time=

  → manifest OK — todos los campos de certificación presentes.

>>> [check] Verificando imágenes obligatorias...

  ✓ OK:    images/logo-hd.png
  ✓ OK:    images/logo-fhd.png
  ✓ OK:    images/splash-fhd.png
  ✓ OK:    images/splash-hd.png
  ✓ OK:    images/splash-sd.png
  ✓ OK:    images/globaltv-logo.png

  → Imágenes OK.

>>> [check] Verificando bs_const prohibido...

  ✓ OK: eval() no encontrado.
  ✓ OK: file:// no encontrado.
  ✓ OK: bs_libs_required=v30 no encontrado.

>>> [check] Verificando main.brs — deep link obligatorio...

  ✓ OK: roInput presente en main.brs
  ✓ OK: roInputEvent presente en main.brs
  ✓ OK: deep link handling presente en main.brs

>>> [check] Verificando signalBeacon...

  ✓ OK: signalBeacon(AppLaunchComplete) en MainScreen

>>> [check] Verificando OPTIONS en PlayerScreen...

  ✓ OK: OPTIONS no interceptado en PlayerScreen.

>>> [check] COMPLETO.
```

***

## What each check validates

### Manifest fields

<AccordionGroup>
  <Accordion title="title, major_version, minor_version, build_version">
    These four fields define the channel identity and version shown in the Channel Store. All must be present and non-empty. `build_version` must be higher than the previously submitted value — the store rejects duplicate build numbers.

    Current values in `manifest`:

    ```text theme={null}
    title=GlobalTV
    major_version=1
    minor_version=0
    build_version=7
    ```
  </Accordion>

  <Accordion title="mm_icon_focus_hd, mm_icon_focus_fhd">
    Home-screen icons displayed when the channel tile is focused. Both HD and FHD variants are required. They must use `pkg:/` paths.

    ```text theme={null}
    mm_icon_focus_hd=pkg:/images/logo-hd.png
    mm_icon_focus_fhd=pkg:/images/logo-fhd.png
    ```
  </Accordion>

  <Accordion title="splash_screen_fhd, splash_screen_hd, splash_screen_sd">
    Splash screen images shown while the channel loads. All three resolution variants are required for certification. The check looks for the field names; the actual files are validated separately.

    ```text theme={null}
    splash_screen_fhd=pkg:/images/splash_fhd.png
    splash_screen_hd=pkg:/images/splash_hd.png
    splash_screen_sd=pkg:/images/splash_sd.png
    ```
  </Accordion>

  <Accordion title="ui_resolutions=fhd">
    Declares that the channel supports full HD (1920×1080). The check script looks for the string `ui_resolutions=fhd`. The manifest currently declares `ui_resolutions=fhd,hd`, which satisfies this requirement.
  </Accordion>

  <Accordion title="rsg_version=1.2">
    The check script looks for `rsg_version=1.2` in the manifest. The manifest currently declares `rsg_version=1.3`, which is a superset and satisfies the requirement at runtime, but the string check will report a failure because `1.2` is not literally present.

    To fix: either change the manifest to `rsg_version=1.2` (if 1.3 features are not needed) or update the `make check` script to accept `1.3` as passing.
  </Accordion>

  <Accordion title="supports_input_launch=1">
    Enables the channel to be launched via a deep link input event. Required for any channel that handles deep links. When this field is set, `roInput` and `roInputEvent` handling in `source/main.brs` become mandatory.

    ```text theme={null}
    supports_input_launch=1
    ```
  </Accordion>

  <Accordion title="splash_rsg_optimization=1">
    Enables the SceneGraph splash screen optimization, which reduces apparent launch time by letting the RSG runtime render the splash before the full scene graph is initialized. Required for 2026 certification.

    ```text theme={null}
    splash_rsg_optimization=1
    ```
  </Accordion>

  <Accordion title="splash_color, splash_min_time">
    `splash_color` sets the background fill shown behind the splash image (e.g. `#1a1a2e`). `splash_min_time` sets the minimum display duration in milliseconds (`1500` = 1.5 s). Both fields are required.

    ```text theme={null}
    splash_color=#1a1a2e
    splash_min_time=1500
    ```
  </Accordion>
</AccordionGroup>

### Image files

The check verifies these files exist on disk:

| File                       | Required for                               |
| -------------------------- | ------------------------------------------ |
| `images/logo-hd.png`       | HD home-screen icon (`mm_icon_focus_hd`)   |
| `images/logo-fhd.png`      | FHD home-screen icon (`mm_icon_focus_fhd`) |
| `images/splash-fhd.png`    | FHD splash screen                          |
| `images/splash-hd.png`     | HD splash screen                           |
| `images/splash-sd.png`     | SD splash screen                           |
| `images/globaltv-logo.png` | In-app branding asset                      |

<Note>
  The manifest declares splash images with underscores (`splash_fhd.png`) while the `make check` image check looks for hyphens (`splash-fhd.png`). Verify that both the manifest paths and the actual filenames on disk are consistent. If they differ, either rename the files or update the `make check` script to match.
</Note>

### Code checks

| Check                                           | Why it matters                                                                       |
| ----------------------------------------------- | ------------------------------------------------------------------------------------ |
| No `eval()` calls in `source/` or `components/` | `eval()` is explicitly prohibited by Roku certification and is a security risk       |
| No `file://` references                         | All asset paths must use `pkg:/` — `file://` references fail at runtime on device    |
| No `bs_libs_required=v30` in manifest           | The `v30` library was removed in Roku OS 11.5; its presence causes channel rejection |

### Deep link checks

These checks verify that `source/main.brs` implements the deep link contract required when `supports_input_launch=1` is declared in the manifest.

| Check                                             | Certification rule                                                   |
| ------------------------------------------------- | -------------------------------------------------------------------- |
| `roInput` present in `main.brs`                   | Checklist 8.1 — must create `roInput` object to receive input events |
| `roInputEvent` handled in `main.brs`              | Must handle `roInputEvent` from the message loop                     |
| `launchDeepLink` or `inputDeepLink` in `main.brs` | Must route deep links through named handlers                         |

GlobalTV supports `mediaType=live` deep links, handled through `launchDeepLink` and `inputDeepLink` in `source/main.brs` and `components/MainScene.brs`.

### Beacon check

Roku measures channel launch time by looking for `signalBeacon(AppLaunchComplete)`. This signal must be fired from `components/MainScreen/` after the main content screen is ready for user interaction.

```brightscript theme={null}
m.top.signalBeacon("AppLaunchComplete")
```

Without this beacon, Roku's automated testing cannot measure launch performance, and the channel will not pass certification.

### OPTIONS key check

Certification checklist 9.1 requires that the **player screen** does not intercept the OPTIONS key. The check scans `components/PlayerScreen/PlayerScreen.brs` for the string `options`. If found, it emits a warning to verify that any handler returns `false` (passes the key through rather than consuming it).

***

## Certification status

### Checks already passing

These points are implemented in the codebase and verified by `make check`:

* Version fields present and non-zero in `manifest`
* Splash screen declared in `manifest` with all three resolution variants
* `supports_input_launch=1` set
* `splash_rsg_optimization=1` set
* `signalBeacon(AppLaunchComplete)` fired in `MainScreen`
* On-device login flow (no external browser required)
* `roInput` and `roInputEvent` handling in `source/main.brs`
* `launchDeepLink` / `inputDeepLink` routing present
* No `eval()`, no `file://`, no `bs_libs_required=v30`

### Checks that require hardware testing

These cannot be validated by `make check` and must be verified manually on a physical device:

| Requirement                          | How to test                                                                                                 |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------- |
| Channel launch time ≤ Roku threshold | Time from channel launch to `AppLaunchComplete` on real hardware                                            |
| Playback start time                  | Time from channel selection to first frame of live video                                                    |
| Voice keyboard on password field     | Invoke voice input on the login password field using the Roku remote                                        |
| Deep linking end-to-end              | Send a `mediaType=live` deep link from the Roku home screen and verify the channel opens the correct stream |
| OPTIONS key pass-through in player   | Press OPTIONS during playback and confirm no unintended overlay appears                                     |
