Load and Test Locally

Load a built presence into the Nowly extension with a pre-built dev package or a zip drop.

After nowly build <slug>, you still need to get that bundle into a browser. There are two local loading methods. Neither talks to the Nowly API.

1. Pre-built extension (nowly extension)

This is the usual first-time path, especially if you only cloned the presences repository. The CLI downloads a ready-made Chrome dev build (or copies a local one), then bakes your compiled presence into it.

nowly build youtube
nowly extension youtube

You can pass several slugs:

nowly extension youtube github figma

Then:

  1. Open chrome://extensions and enable Developer mode
  2. Load unpacked and select dist/extension-dev
  3. Open the target site with Discord Desktop and Nowly Host running

The presence is installed from dev-presences.json as soon as the extension starts. After you change code, rebuild, rerun nowly extension <slug>, and reload the unpacked extension.

To use a local extension build instead of the CDN zip:

nowly extension youtube --from ../nowly/apps/extension/dist/chrome

nowly extension writes an unpacked folder. It is the right tool when you do not already have Nowly loaded in the browser.

Full Nowly monorepo

If you cloned nowly (with presences as a submodule), you can bake every built presence into the extension:

nowly build youtube
pnpm build:extension:dev

Load apps/extension/dist/chrome unpacked. Reload after each rebuild.

2. Zip drop (nowly pack)

Use this when Nowly is already loaded (unpacked or a store build with developer mode). You only rebuild the presence, not the whole extension.

nowly pack youtube

That command builds the presence, then zips dist/presences/youtube/ into dist/packs/youtube.zip. The zip must contain at least metadata.json and bundle.js. Nested folders are fine.

Then in the side panel:

  1. Open SettingsAdvanced
  2. Enable Developer mode (always on for unpacked builds)
  3. Expand Debug
  4. Drop the .zip (or browse to it)

The presence installs as a local source. Unpacked boot pruning does not remove it. Unsigned zips are accepted only on an unpacked build or with developer mode on. Store builds without developer mode still require a signed release from the API.

After each code change:

nowly pack youtube

Drop the new zip again. You do not need to reload the unpacked extension unless you changed the extension itself.

Which method to pick

| Situation | Method | |---|---| | First setup, or no Nowly in the browser | nowly extension <slug> | | Nowly already loaded, iterate on one presence | nowly pack <slug> then drop the zip | | You work in the full nowly monorepo | pnpm build:extension:dev |

See also CLI.