How to Create a Custom Digital Signage App?

Learn how to create a custom digital signage app with EasySignage by packaging your own HTML as a .zip and playing it on any screen, online or offline.

What is a custom digital signage app?

A custom digital signage app is your own website, packaged as a .zip file and played on your screens like any other media. The package holds your HTML, CSS, JavaScript, images, and fonts. Because the whole app is stored on the device, it keeps playing when the internet drops.

Custom apps are the right choice when the built-in apps do not cover what you need, such as a branded dashboard, a live queue display, a production KPI board, or a menu board driven by your own API. Custom apps were previously called Offline HTML.

For the complete reference, see Digital Signage Custom Apps .

 

How do I create a custom digital signage app?

To create and play a custom digital signage app:

  • Build your app as a normal website, with index.html at the top level
  • Reference every asset with a relative path so the app runs with no internet connection
  • Package the folder contents as a .zip file
  • Go to the Management Console and open Media
  • Upload the .zip package
  • Add the media item to a playlist
  • Assign the playlist to a screen

 

Requirement: the entry point must be named index.html and sit at the top level of the .zip, not inside a subfolder.

 

Do I need to write code to try it?

No. EasySignage provides a ready-made sample package that displays every value your screen delivered, so you can confirm the workflow before you build anything. Download it from Digital Signage Custom Apps , upload it as media, and play it on a screen.

 

Does a custom digital signage app work offline?

Yes. The package is stored on the device, so a custom app keeps playing during a network outage. Anything your app fetches from the internet at runtime, such as an external API, still needs a connection, so cache or provide a fallback for that data.

 

How do I make one app show different content on each screen?

EasySignage passes player attributes into every custom app: the player ID, the screen name, the screen or display-unit ID, the resolution, the location, and your custom tags. Your app reads those values and changes what it shows, so one package covers hundreds of screens.

The attributes arrive through two channels:

  • window.easysignage: a global JavaScript object injected before your own scripts run

  • A URL query string on every render, such as index.html?player_id=PL-abc123&tags.zone=north, which still works when a strict Content-Security-Policy blocks the injected script

Copy the easysignage.js reader from the sample package and call one function:

<script src="easysignage.js"></script>
<script>
  var panel = EasySignage.read();
  var zone = (panel.tags && panel.tags.zone) || 'default';
  // show the content that matches this screen's zone tag
</script>

For the full attribute list, the tag rules, and worked examples, see Digital Signage Custom Apps .

 

Can I use tags to target screens?

Yes. Tags are the custom key:value labels you assign to your screens, such as zone:north, store:42, or lang:ar. Your app reads them as an object:

  • panel.tags.zone returns "north"

  • panel.tags.all returns every tag as a comma-separated key:value string

Up to 20 tags are carried to the device. Tags are case-sensitive, so prefer lowercase keys.

 

Can I reuse a Broadsign creative?

Partly. EasySignage uses the same Broadsign key names, including display_unit_id, display_unit_resolution, frame_resolution, campaign_id, and display_unit_lat_long, so your field names carry over.

However, window.BroadSignObject was removed. A creative that reads that global no longer receives player attributes and must be updated to use EasySignage.read() or window.easysignage.

 

Why is my custom digital signage app not displaying?

If the screen shows nothing after the package plays:

  • Confirm the entry file is named index.html and sits at the top level of the .zip
  • Confirm every asset uses a relative path, not an absolute path or a local file path
  • Load your scripts as classic scripts, with no type="module", so they run on older Tizen, webOS, and BrightSign webviews
  • Test locally first by opening index.html with a query string appended, such as index.html?player_id=TEST&resolution=1080x1920&tags.zone=north

If the player attributes are missing but the page renders, a strict Content-Security-Policy is probably blocking the injected script. Use the easysignage.js reader, which falls back to the URL query string automatically.