make check to validate the static checks locally. Some requirements can only be verified on real hardware.
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.Running make check
What each check validates
Manifest fields
title, major_version, minor_version, build_version
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:mm_icon_focus_hd, mm_icon_focus_fhd
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.splash_screen_fhd, splash_screen_hd, splash_screen_sd
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.
ui_resolutions=fhd
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.rsg_version=1.2
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.supports_input_launch=1
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.splash_rsg_optimization=1
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.
splash_color, splash_min_time
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.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 |
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.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 thatsource/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 |
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 forsignalBeacon(AppLaunchComplete). This signal must be fired from components/MainScreen/ after the main content screen is ready for user interaction.
OPTIONS key check
Certification checklist 9.1 requires that the player screen does not intercept the OPTIONS key. The check scanscomponents/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 bymake check:
- Version fields present and non-zero in
manifest - Splash screen declared in
manifestwith all three resolution variants supports_input_launch=1setsplash_rsg_optimization=1setsignalBeacon(AppLaunchComplete)fired inMainScreen- On-device login flow (no external browser required)
roInputandroInputEventhandling insource/main.brslaunchDeepLink/inputDeepLinkrouting present- No
eval(), nofile://, nobs_libs_required=v30
Checks that require hardware testing
These cannot be validated bymake 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 |