4K Select: documenting the system component responsible for 5-minute display force-off (power-service-core → forceDisplayOff)

Posting this primarily for the public record, with a question for staff at the end…

Symptom

After ~5 minutes of input idle, the display turns off and the foreground app is killed. When the user wakes the device with the remote, they land on the Vega profile picker rather than the previously-foregrounded app. This happens despite:

  • LIFESPAN_POLICY.PERMANENT set via useSetLifespanCallback() from @amazon-devices/react-native-kepler (TimeoutManager)

  • useSetTimeoutCallback(60*60*24*365) (1-year timeout)

  • An actively-playing VideoPlayer session with loop = true, holding a MediaControlFocus, looping a 1-second silent MP4 (the “active media playback exemption” referenced in the certification test [5])

  • An actively-playing AudioPlayer session for alert audio

  • All required media services declared in manifest.toml (media.playersession.service, audio.stream, audio.control, audio.system, etc.)

  • Settings → Display & Sounds → Ambient Experience → Ambient Preferences → Advanced Settings set to maximum (8 hr / 15 min) per the staff guidance

Log excerpt

(DSN redacted, all timestamps in UTC, sequence is unedited.) 12:29:54.093 lcm_service[969]: lcm-idle-handler: Screensaver disabled by policy 12:29:54.094 lcm_service[969]: api:PowerManagerExt:forceDisplayOff be called 12:29:54.097 powerd[1348]: ACE_MW_POWER:ace_power_mgr_disable_subsystem: disable subsys(DISPLAY), power-service-core
12:29:54.098 powerd[1348]: ace_power_mgr_flags_subsystem_vote: name=DISPLAY, isDisable=T, ToZeroStateTransition happened!
12:29:54.111 lcm_service[969]: lcm-display-registry: display[0]: Suspending display, force suspend false
12:29:54.111 lcm_service[969]: lcm-display-context: display[0]: Clearing backstack, clear all true
12:29:54.134 lcm_service[969]: lcm-display-registry: Killed processes in response to display disconnection: 12040 23853
12:29:54.264 lcm_service[969]: lcm-server: Deregistering application with clientPid 12040 and package id after crash
12:29:57.638 hdmiManagerd[1273]: EventHelper: DISPLAY ON ← user pressed remote 12:29:58.085 lcm_service[969]: lcm-server: Received launch request for pkg://com.amazon.vega.profilepicker.main

What the log shows 1. The screensaver path is successfully suppressed: lcm-idle-handler reports Screensaver disabled by policy at 12:29:54.093. So LIFESPAN_POLICY.PERMANENT worked for what it was scoped to do. 2. In the very next millisecond, a separate code path — api:PowerManagerExt:forceDisplayOff, called by the power-service-core actor — directly disables the DISPLAY subsystem.

3. As a downstream effect, LCM clears the backstack and kills the foreground PIDs (12040 = our app, 23853 = the prior launcher).

4. When the user wakes the device, the profile picker is launched as the new foreground because there is no full-screen component left on the backstack.

The two policies are independent. The screensaver-disable knob does not reach the display-power-off path.]

Specific question for staff: Confirming our reading: on the Fire TV Stick 4K Select / Vega OS, there is no public manifest privilege, Kepler API, or vda shell command that overrides power-service-core’s forceDisplayOff invocation. The only path for unattended 24/7 use cases is to choose hardware running Fire OS (e.g., the Amazon Signage Stick). Is that an accurate summary as of May 2026?

If a future Vega SDK release does expose a privileged display-keep-alive mechanism (analogous to Fire OS’s wake lock), a follow-up reply on this thread would help the community a lot. Searches for the power-service-core and forceDisplayOff strings currently surface nothing.

Hi @VIPRTV

Welcome to Amazon Developer Community!!

Thank you for the exceptionally detailed analysis. Your log interpretation is accurate, and this is a well-documented investigation.

Confirming your reading: Yes, that is an accurate summary as of May 2026.

Based on the current Vega OS documentation and platform behavior:

  1. LIFESPAN_POLICY.PERMANENT and useSetTimeoutCallback() control the app lifecycle (screensaver suppression, backstack behavior, app timeout). As your logs confirm, these work correctly — the screensaver was disabled by policy.

  2. power-service-core’s forceDisplayOff is a separate, lower-level system path that operates independently of the app lifecycle layer. There is no public manifest privilege, Kepler API, or VDA shell command that allows a 3P app to override this display power-off behavior on Vega OS.

  3. The Vega OS documentation explicitly states:
    “Apps cannot override screensaver & low power mode settings.”

    The user-configurable maximum via Settings → Display & Sounds → Ambient Experience is 8 hours - there is no option to disable it entirely.

  4. Active media playback (VideoPlayer with loop, AudioPlayer) does suppress the screensaver, but as your logs show, it does not prevent the display power-off path from executing.

For unattended 24/7 / signage use cases:

On Fire OS, apps can use Android wake locks, and signage apps can contact Amazon to be exempted (Requirements for Multimedia Apps (Fire TV) | Amazon Fire TV) from the 4-hour “Are you still watching?” prompt. The Amazon Signage Stick (Fire OS-based) is the supported hardware for this use case.

On Vega OS, no equivalent mechanism exists today. There is no wake lock API, no display-keep-alive privilege, and no exemption process documented.

We are flagging this as a feature request internally - specifically the need for a privileged display-keep-alive mechanism for signage/kiosk use cases on Vega OS. If a future SDK release exposes this capability, we will update this thread.

Warm Regards,
Ivy