> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tappify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Live preview in your sandbox

> Mount the build you are editing on your sandbox project, on the real host page.

`--live` installs the build you are serving on your sandbox project and prints the host URL, so
you see your widget where an owner would see it: the real page, the real date range, real data
for that project.

```bash theme={null}
tappify extension dev --live
```

```
Serving starter on http://localhost:5273/remoteEntry.js and installed on your sandbox project.
Open https://app.tappify.ai/projects/prj_…/analytics to use it in the host.
```

<Steps>
  <Step title="A dev install is created">
    On your vendor account's sandbox project, with your local remote entry recorded against it
    and every scope your manifest asks for granted. The host loads that URL for that install
    only — no other project can. The first run also registers the extension with the Tap Store
    under your vendor. An install an owner made on that project is left alone: the session stops
    rather than rewrite its scopes.
  </Step>

  <Step title="Your working manifest becomes the draft release">
    The session sends the manifest you are editing, so a contribution you have not published
    still renders. It overwrites the draft release only; a live or in-review release is never
    touched. While a release is in review the CLI says so and the session runs against the
    published contributions instead.
  </Step>

  <Step title="You edit, it reloads">
    Component changes reload. Manifest changes rewrite the types, and the contribution appears
    or moves on the next reload.
  </Step>

  <Step title="Ctrl+C ends the session">
    The dev install is paused and its local URL cleared, so nothing points at a dead port
    afterwards. A session you walk away from expires after twelve hours.
  </Step>
</Steps>

## Your server during a live preview

This is where a procedure is first answered: the portal preview registers no server handler, so
nothing there calls one. Tappify relays procedures, tools and actions from its own servers, and
those cannot reach `http://localhost`. Give the session a URL Tappify can call:

```bash theme={null}
tappify extension dev --live --server https://your-tunnel.example.com
```

See [Local server during live preview](/extensions/test/local-server) for the tunnel.

Without `--server`, the relay uses your manifest's `server.sandboxBaseUrl`, falling back to
`server.baseUrl`. The starter ships a placeholder there, so a first run without the flag shows
the widget's error card rather than a number. An extension with no server does not need the flag.

## If nothing renders

| What you see                                                                 | Why                                                                                                                        |
| ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `Starter didn't load — remoteEntry.js timed out after 8s.`                   | The local server stopped, or the port moved. Restart `dev --live`                                                          |
| The widget is not on the page at all                                         | The slot belongs to another page. Check `page` and `slot` against [Pages and slots](/extensions/reference/pages-and-slots) |
| `This vendor has no sandbox project, so a dev session has nowhere to mount.` | Run `tappify vendor create`                                                                                                |
| `Starter needs storage:write on Northlight`                                  | Your manifest asks for a scope the dev install predates. Restart the session to regrant it                                 |
