CLI

Use the Nowly CLI to create, build, validate, and test presences locally.

The Nowly CLI is published as @nowly/cli on npm. Install it globally:

pnpm i -g @nowly/cli

Interactive Mode

Run the CLI without arguments to open an interactive menu:

nowly

Create a Presence

nowly init "Netflix"

Build Presences

Build every presence:

nowly build

Build one presence:

nowly build youtube

Rebuild on file changes (reload the unpacked extension after each rebuild, or re-drop the zip if you use pack):

nowly build youtube --watch
nowly pack youtube --watch

Test a Presence Locally

There are two ways to load a built presence without the Nowly API. Full walkthrough: Load and Test Locally.

Pre-built extension

If you only cloned the presences repository (the common case for contributors), use nowly extension to get a ready-to-load dev build without the full nowly monorepo:

nowly build youtube
nowly extension youtube

This downloads the latest dev extension build from the CDN, bundles the presence(s) you list, and writes a dev-presences.json file into it. Then:

  1. Open chrome://extensions, enable Developer mode
  2. Load unpacked → select the generated dist/extension-dev folder
  3. The presence installs automatically — no API server, no install page, no Custom API URL needed

After editing the presence, rebuild and rerun nowly extension <slug>, then reload the extension.

To use a specific local extension build instead of the CDN one, pass --from:

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

Zip drop

If Nowly is already loaded as an unpacked development build, pack the presence and drop it in the Debug panel:

nowly pack youtube

The zip is written to dist/packs/youtube.zip. Drop it on Settings → Advanced → Debug. Unsigned zips only work on unpacked builds, not Chrome Web Store installs. Developer mode only reveals the Debug UI.

If you have the full monorepo

If you cloned nowly itself (with presences as a submodule), you can build the extension with every presence baked in directly:

pnpm build:extension:dev

Rebuild the changed presence then the extension after each change:

nowly build youtube
pnpm build:extension:dev

Reload at chrome://extensions — the presence is already installed and ready to use.

List Presences

nowly list

Validate Metadata

nowly validate