# Publish HTML as an app


> Turn a page an assistant just made into a Screenly app, wrapped for unattended playback, installed and deployed in one step.
`edge_app_publish_from_html` takes HTML and publishes it as a Screenly [edge app](/docs/developers/edge-apps/). Ask an assistant to **upload this as a Screenly app** and this is the tool it calls.

It is the shortest path from "make me a dashboard" to that dashboard being on a wall.

## What it does

**Wraps the page for unattended signage.** A screen has no mouse and no keyboard, so anything that needs a click never advances. The wrapper rotates tab panels and carousel slides on its own, which is the difference between a page that works on a laptop and one that works on a wall.

**Completes a fragment.** If the assistant hands it a fragment rather than a whole document, it is wrapped into a complete page.

**Creates an instance.** The app appears in your Content library ready to add to a playlist, rather than existing only as an app definition.

**Deploys it.**

## Updating it later

Publish again with the same name and it updates the app you published before, rather than creating a second one.

That works because the tool remembers the app id by name on the machine it published from. Two consequences worth knowing:

**From a different machine, the memory is not there.** Pass the `app_id` explicitly to target a specific app.

**Prefer passing `app_id` when you know it.** It is unambiguous, and it does not depend on the name matching exactly.

## Where it fits

Then it is ordinary content. Add the instance to a [playlist](/docs/playlists/), give it a duration, and assign the playlist to screens. Nothing about it is special once it exists.

## What to be careful about

This tool is annotated destructive, because publishing again over a remembered name replaces what was there.

The page is also, at that point, on screens. Anything it fetches is fetched from the device, and anything hard-coded in it is visible to anyone who can read the app. Credentials belong in [secrets](/docs/apps/setting-up/settings-and-secrets/), not in the HTML.