---
title: "How to Create a Custom Digital Signage App | EasySignage"
description: "Learn how to build a custom digital signage app with EasySignage. Package your HTML as a .zip, upload it, and read player attributes to adapt every screen."
url: https://easysignage.com/how-to/apps/how-to-create-a-custom-digital-signage-app/
---

# 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](https://easysignage.com/help/custom-apps/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](https://app.easysignage.com/) 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](https://easysignage.com/help/custom-apps/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:

```html
<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](https://easysignage.com/help/custom-apps/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.

## 🔗 Helpful Links

-   [Digital Signage Custom Apps](https://easysignage.com/help/custom-apps/digital-signage-custom-apps/)

-   [Website Dynamic URL Variables](https://easysignage.com/help/apps/digital-signage-website-dynamic-url-variables/)

-   [How to Display a Website on Digital Signage](https://easysignage.com/how-to/apps/how-to-display-website-on-digital-signage/)

-   [What is Digital Signage](https://easysignage.com/what-is-digital-signage/)
