Keeping a dashboard session active on an unattended TV/Kiosk display<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } table { border-collapse: collapse; width: 100%; margin: 16px 0; } th, td { border: 1px solid #ccc; padding: 8px 10px; text-align: left; } th { background: #f5f5f5; } pre { background: #f5f5f5; padding: 12px; overflow-x: auto; border-radius: 4px; } code { font-family: Consolas, Monaco, monospace; } blockquote { border-left: 4px solid #ccc; margin: 16px 0; padding: 8px 16px; background: #fafafa; } hr { border: none; border-top: 1px solid #ddd; margin: 32px 0; } Issue Dashboards displayed continuously on a TV or kiosk-style screen can hit the platform's session inactivity timeout, since no user interaction (mouse/keyboard) occurs on the screen. This article outlines three approaches to keep the session alive for this specific use case, ranked from simplest to most involved. Choose the option that best fits your environment and support model. Applies To Next expperience dashboards, Performance Analytics dashboards, or any Now Experience/Workspace page displayed unattended on a screenFor Core UI (.do pages), option 1 and 2 apply Summary of Options #OptionWhere it runsEffortOngoing maintenance1Browser auto-refresh extensionClient browser onlyLowNone (until browser/extension updates)2Core UI ScriptServiceNow UI Script (Core UI/Legacy only)MediumCustomer-maintained script3UI Builder client script ("Session Keep-Alive")UIB pageMedium–HighCustomer-maintained script Support statement: All three options below rely on either third-party browser tooling or customer-authored/customer-maintained scripts. None of them are ServiceNow-supported product features, they are workarounds. ServiceNow does not test, certify, or provide break/fix support for the extension or script contents. Please validate any option in a non-production/test session before rolling it out to a production kiosk display. Option 1: Browser Auto-Refresh Extension The simplest option. Install a lightweight browser extension (e.g., Super Simple Auto Refresh, or an equivalent extension for your browser) on the kiosk machine and configure it to reload the dashboard tab on a fixed interval, for example, every 5 minutes. A full page reload re-establishes the session as long as the interval is shorter than the session timeout. Setup Steps On the machine driving the TV/kiosk display, install a page auto-refresh extension from your browser's extension store.Open the dashboard URL in the tab you want to keep alive.Configure the extension's refresh interval to a value comfortably shorter than your instance's session timeout (e.g., every 5 minutes for a typical 20–30 minute timeout).Leave the tab open and active. Considerations Support: Browser extensions are third-party software, not provided or vetted by ServiceNow. Install and evaluate them per your organization's security/browser-extension policy.Simplicity: No server-side configuration or scripting required, this is the fastest option to stand up.Limitation: A full page reload will briefly flash/reset the dashboard on every refresh, which may be visually noticeable on a shared screen. If the dashboard takes several seconds to render, factor that into the interval you choose. Option 2: Core UI Script (Requires a Companion Core UI/Legacy Tab) The dashboard itself continues to run in Next Experience. However, a UI Script can only execute while a Core UI/Legacy UI page is open in the browser. Since browser sessions are shared across all tabs in the same browser, keeping one Core UI/Legacy tab open alongside the dashboard tab is enough to keep the entire session, including the Next Experience dashboard alive. A ready-to-use UI Script is attached to this article. To use it: Setup Steps Download the attached UI Script file from this article (sys_ui_script_b5dacd27ff79c310a73cffffffffff5c.xml).In your instance, navigate to System UI > UI Scripts and create a new UI Script (or import the attached one).In the script, update the following values for your environment: The target user sys_id the keep-alive should apply toThe ping/timeout interval Save and activate the UI Script.Open the Next Experience dashboard as normal in one browser tab.In a second tab in the same browser, open any Core UI/Legacy page (for example, http://<INSTANCE>.service-now.com/now/nav/ui/classic/params/target/incident_list.do) and leave that tab open alongside the dashboard tab. Important Constraint This UI Script only executes on Core UI/Legacy pages. It will not run inside a Next Experience page. It does not need to run on the same tab as the dashboard. As long as one Core UI/Legacy tab (e.g., incident_list.do) stays open in the same browser as the Next Experience dashboard tab, the session ping keeps the whole browser session alive. If the Core UI/Legacy tab is closed or navigated away, the keep-alive stops running and the session can time out again. Considerations Support: This is a customer-authored script maintained by your team. ServiceNow does not support or maintain the script's contents going forward.Extra tab required: This approach requires dedicating a second browser tab solely to keeping a Core UI/Legacy page open. Factor this into your kiosk browser setup (e.g., pin both tabs, disable tab auto-close).Best fit: Environments already comfortable managing a multi-tab kiosk browser session. Option 3: UI Builder Client Script ("Session Keep-Alive") For dashboards embedded in a UI Builder (UIB) page (e.g., via the Dashboard page template), you can add a client script to the page that pings the instance on an interval, keeping the session alive for as long as that UIB page is open — in a single tab, with no companion Core UI tab required. Setup Steps Create a new UIB page (or open the existing one) using the Dashboard page template as described in the ServiceNow docs above.In the page's Client Scripts, create a new script named SessionKeepAlive.Paste the script below and update the placeholder values for your environment. Add event Click on the "Body" in left hand side "Content" window.Goto "Events" tab (right hand side panel) of Body.Click on "Add event mapping.Select "Page ready", click on "Continue" and then select the client script we created in step 2. Click on "Continue" and then "Add". Save and publish the page.Load this UIB page on the kiosk display in place of the dashboard's direct URL. Sample Script /** * @param {params} params * @param {api} params.api * @param {any} params.event * @param {any} params.imports */ function handler({ api, event, helpers, imports }) { helpers.timing.setTimeout(function () { // 1. CONFIG const TARGET_USER = ""; const INITIAL_DELAY = 1000; // delay before first run, in ms const PING_INTERVAL = 1000 * 60 * 5; // 5 minutes const EMBEDDABLES_TOUCH_SESSION = "/api/now/uxframework/touch-session"; const TOUCH_SESSION = "/api/now/uisession/touch-session"; const sessionExtensionUrl = this.ux_globals && this.ux_globals.isEmbeddableFlow ? EMBEDDABLES_TOUCH_SESSION : TOUCH_SESSION; // 2. Only run for the target user const currentUser = api.context.session.user; if (!currentUser || currentUser.sys_id !== TARGET_USER) { return; } // 3. Ping operation — keeps the session alive via touch-session endpoint function ping() { helpers .snHttp(sessionExtensionUrl, { method: "POST", }) .then(function () { // Session touch succeeded — no action needed }) .catch(function () { // Session touch failed — fail silently to avoid disrupting the UI; // consider surfacing this via a monitored metric if visibility is needed }); } // 4. Run once, then repeat on interval ping(); helpers.timing.setInterval(ping, PING_INTERVAL); }, INITIAL_DELAY); } Configuring the placeholders: TARGET_USER: The sys_id of the user account the kiosk session logs in as. You can find this on the user's record in User Administration > Users.PING_INTERVAL: How often (in milliseconds) the script pings the instance. Choose a value comfortably shorter than your session timeout. Considerations Support: This is a customer-authored script maintained by your team, not a ServiceNow-supported feature.Scope: The keep-alive is scoped to the configured TARGET_USER, so it only pings when that specific account is logged in — confirm this matches the account used on the kiosk machine.Best fit: Dashboards delivered via UI Builder/Now Experience pages, where Option 2's companion-tab requirement doesn't apply. Known Limitation: "Extend Session" Warning May Still Appear Even with the keep-alive ping running, the Next Experience shell may still display a session-expiration warning (e.g., "Extend Session?") on an unattended kiosk display. This happens because the warning is typically driven by a mechanism separate from the server-side session refresh performed above: Client-side idle detection: The warning is commonly triggered by an absence of real user interaction (mouse movement, keyboard input, clicks/touches) tracked entirely in the browser, independent of whether background keep-alive requests are succeeding. A background ping is not treated as user activity by this detector.Absolute session lifetime: Some instances enforce a maximum session duration measured from login time (via security policy or SSO configuration), rather than idle time. If this is configured, no amount of keep-alive traffic will prevent the warning or a forced re-authentication, since it isn't based on activity at all. In either case, if no one is present to click "Extend Session" before its own countdown elapses, the platform may still redirect to the login page even though the keep-alive script's pings are succeeding in the background. Suggested enhancement: If the warning turns out to be idle-detection-based, dispatching a periodic synthetic interaction event alongside the existing ping can prevent the shell from ever considering the tab idle. For example: function simulateActivity() { document.dispatchEvent(new MouseEvent('mousemove', { bubbles: true, cancelable: true, clientX: Math.floor(Math.random() * window.innerWidth), clientY: Math.floor(Math.random() * window.innerHeight) })); } Call simulateActivity() on the same interval as the keep-alive ping. Verify in your environment that this actually resets the shell's idle timer before relying on it the exact event(s) the idle detector listens for can vary by ServiceNow version. If the warning instead turns out to be driven by an absolute session lifetime or SSO-enforced re-authentication policy, it cannot be worked around client-side and requires a configuration change to the relevant security/SSO settings. Recommendation If you just need a quick, no-code fix and can install browser extensions on the kiosk machine, start with Option 1.If you're comfortable maintaining a small UI Script and can dedicate a second browser tab to a Core UI/Legacy page alongside the Next Experience dashboard tab, use Option 2.If you'd rather keep everything in a single tab and the dashboard is delivered through UI Builder/Now Experience, use Option 3. In all cases, test the chosen option in a non-production session first, and confirm behavior after any browser or platform upgrade, since browser extension APIs and UI script/UIB behavior can change between releases.