CLI
Create a valid business profile, request approval, and operate your self-hosted Brand Kit from the NerionX CLI.
NerionX CLI
The Brand Kit is CLI-first: a brand owner operates their approved, self-hosted Spoke + storefront with the nerionx command, talking to the shared Central Hub. New-brand registration remains Hub-owned: start, create brand --profile, and request approval --profile collect and submit the complete CLI business profile through the same Hub approval gate as web onboarding. The CLI cannot bypass validation or operator review. After approval, init and up create the Spoke database, run migrations, seed the admin, and start the Brand Kit.
Native Go CLI — public versioned distribution
The Go binary owns onboarding, profiles, Brand Kit lifecycle, identity, sync, generation, day-2 operations, fleet control, and the bounded Docker agent. Governed tags publish checksummed macOS, Linux, and Windows artifacts to install.nerionx.dev and verify a clean unauthenticated install; those releases carry Sigstore provenance, while a release published manually during a CI outage is checksummed but unsigned and is rejected by NERIONX_REQUIRE_SIGNATURE=1. Explicit legacy compatibility is limited to monorepo/platform maintenance. Fleet capacity certification remains separate acceptance work.
Workflow
- Run
startorcreate brand --profileto complete a valid business profile - Verify the email code and run
request approval --profile; wait for operator approval - Generate the first API key in the approved dashboard, sign in, then run
initandupfrom an empty Brand Kit directory pull products --initial+generate products- Review generated drafts in BrandKit, then test checkout end-to-end before launch
Commands & scripts
# Public native Go CLI for macOS and Linux; installs nerionx and nerionx-agent.
curl -fsSL https://install.nerionx.dev/install.sh | bash
# Windows PowerShell: irm https://install.nerionx.dev/install.ps1 | iex
# Verify this shell is using the native binary. Its help starts with
# "NerionX CLI (Go)". If an older path appears first, remove that stale
# launcher or put the native install directory earlier in PATH, then run
# rehash (zsh) or hash -r (bash).
type -a nerionx
nerionx --version
nerionx --help
# Interactive terminals open the full-screen Bubble Tea wizard. Use arrows or
# Tab to move, Space to order common multi-select choices, A to add any other
# valid ISO code, Enter to continue, Esc to go back, and Ctrl+C to cancel.
nerionx start
# Or create a named profile directly. The CLI validates every required answer:
# contact name/email/phone, company/trading name, complete business address,
# website, one or more regions/languages/currencies, and an optional note.
nerionx create brand --profile 'CityPharmacy'# One invocation, no prompts, and no invented defaults. The command fails if a
# required field is missing or invalid.
nerionx create brand --profile CityPharmacy \
--first-name Ada --last-name Lovelace --email ada@example.com \
--phone +41445550123 --company-name 'City Pharmacy GmbH' \
--trading-name 'City Pharmacy' --address-line1 '1 Market Street' \
--city Zurich --postal-code 8001 --country CH \
--website citypharmacy.example --regions CH,DE \
--languages de,fr --currencies CHF,EUR --non-interactive --json
# Password and email verification stay interactive by default.
nerionx request approval --profile CityPharmacynerionx request approval --profile 'CityPharmacy'
# The CLI asks you to accept the Terms and Privacy Policy, creates the secured
# applicant account, sends an email code, verifies it, then submits the complete
# profile. It reports success only after Hub accepts the approval request.
# Operator review usually takes a few business days.
# Automation is a resumable two-stage flow. Inject secrets from a secret
# manager; never pass passwords or email codes as command-line flags.
NERIONX_ACCOUNT_PASSWORD="$SECRET_PASSWORD" nerionx request approval --profile CityPharmacy --accept-terms --non-interactive --json
# Exit 3 means the email code or browser action is still required.
NERIONX_ACCOUNT_PASSWORD="$SECRET_PASSWORD" NERIONX_VERIFICATION_CODE="$SECRET_CODE" nerionx request approval --profile CityPharmacy --accept-terms --non-interactive --jsonnerionx login
# Paste the Brand Hub API key from the approved brand's setup guide.
nerionx config set hubUrl https://api.nerionx.dev/api/v1
nerionx config sync-identity
# Scaffolds compose + .env (generating secrets) and pulls the kit images,
# authenticating the private image registry with the saved Brand Hub API key.
# The key is passed to Docker over stdin; there is no separate Docker login prompt.
# then creates the Spoke DB, runs migrations inside the image, and starts up.
# Works the same on a laptop and on a server. The Docker Compose CLI plugin is
# required; verify the exact shell first:
docker compose version
mkdir city-pharmacy && cd city-pharmacy
nerionx init --slug city-pharmacy
# If 8000 is already used, keep both values aligned in .env before startup:
# STOREFRONT_PORT=8101
# STOREFRONT_BASE_URL=http://localhost:8101
nerionx up
# A fresh database publishes the built-in Euro Pharmacy theme during first boot. The
# command waits for the public page, which can add about one minute, before it
# reports success. Sync the catalog, then run the full first-order gate. JSON
# reports the entire visible catalog total even though the probe fetches one row.
nerionx pull products --initial
nerionx doctor --json
# A blocked payment check is Hub-owned configuration: a super-admin selects
# this exact brand under Dashboard → Payments and enables a method marked Ready.
# The optional AI warning blocks content generation, not checkout.
nerionx status # containers
nerionx logs spoke --follow # tail the Spoke
nerionx request ssl city-pharmacy.com
nerionx check ssl city-pharmacy.com
# Platform developers only: `nerionx brand:create` and `nerionx provision`
# create a local Spoke from a monorepo checkout.# Regulated vertical or a closed network with no reach to registry.nerionx.dev?
# Distribute the images yourself — the runtime stays containerized (no toolchain
# on the brand box). See docs/runbooks/brand-kit-airgap.md.
# On a machine that CAN pull the images — bundle them (docker save):
nerionx kit export --out ./nerionx-kit-latest
# Carry the folder in, then on the target host — load them (docker load):
nerionx kit import ./nerionx-kit-latest
nerionx init --offline --slug city-pharmacy
# Set HUB_API_KEY in .env from a secret manager before startup.
nerionx up # boots from the loaded images, no registry
# Many hosts? Seed a registry you run inside your network (Zot / registry:2 / Harbor):
nerionx kit import ./nerionx-kit-latest --registry registry.internal:5000 --pushnerionx pull products --initial # bulk download the master catalog from the Hub
nerionx sync --force-event-bus # reconcile local mirror with Hub state
nerionx generate products # queue product drafts for BrandKit review
nerionx generate pages # queue governed page drafts for review
nerionx agent status # check AI job progressnerionx status # container status
nerionx logs spoke --follow # follow Spoke logs
nerionx health --verbose # Hub, Spoke, and API-key checks
nerionx db backup --file ./before-update.sql
nerionx update # pull and restart newer kit images
nerionx theme refresh # take a storefront fix the update shippedHUB_API_URL=https://api.nerionx.dev/api/v1 # the Central Hub
HUB_API_KEY=nx_live_your_brand_key # generated from the setup guide after approval
# HUB_BRAND_ID is optional — the Hub derives the brand from the API key.Fleet roadmap
Go client and Docker agent implemented — Hub deployment and scale certification pending. Fleet v1 commands validate and submit up to 50 active BrandKits through durable Hub runs. Docker v2 validates digest-pinned desired state and communicates with outbound-first, mTLS, bounded agents rather than unrestricted shell or Docker-socket access.
- Exactly 2 pipelines × 50 BrandKits × 100,000 products × 10 variations equals 100,000,000 logical tasks; more than 2 pipelines means at least 150,000,000.
- Cross-brand mutations require an allowlist-scoped NERIONX_FLEET_TOKEN; a normal brand API key never grants authority over other BrandKits.
- The CLI submits desired work and returns a run ID; production Hub workers, quotas, backpressure, checkpoints, and retries still require deployment acceptance.
- Passwords, verification codes, arbitrary shell execution, raw Docker-socket access, and automatic destructive volume operations remain outside unattended automation.
# Native Go command surface. Apply requires a compatible deployed Hub fleet API.
nerionx fleet generate --file campaign.yaml --plan
NERIONX_FLEET_TOKEN="$FLEET_TOKEN" nerionx fleet generate --file campaign.yaml --apply --yes --json
NERIONX_FLEET_TOKEN="$FLEET_TOKEN" nerionx fleet status <run-id> --watch
NERIONX_FLEET_TOKEN="$FLEET_TOKEN" nerionx fleet retry <run-id> --failed-only
nerionx fleet docker plan --file desired-state.yaml
NERIONX_FLEET_TOKEN="$FLEET_TOKEN" nerionx fleet docker apply --file desired-state.yaml --confirm
NERIONX_FLEET_TOKEN="$FLEET_TOKEN" nerionx fleet docker status --allCommand reference
nerionx start— Go-owned: start or resume full-screen Bubble Tea onboarding from the active profile; pipes retain a safe line-oriented fallbacknerionx create brand --profile <name> [--non-interactive]— Go-owned: ask only for missing details or validate a complete one-liner, then privately save the profilenerionx request approval --profile <name>— Go-owned: verify the applicant email and submit the complete profile for operator reviewnerionx profile list|show|edit|use— Go-owned: list, inspect, correct unsubmitted profiles, and switch context without editing JSONnerionx legacy <command> ...— Explicit platform-maintenance compatibility for monorepo provisioning and legacy migrations; never auto-selected for normal operationsnerionx init --slug <slug>— Scaffold an approved brand's Brand Kit — compose + .env with generated secrets, then pull imagesnerionx up— Start the kit — infra, Spoke DB, migrations, admin seed, spoke + storefront; return only when the public page rendersnerionx down [--volumes]— Stop the kit; --volumes also deletes its database and uploadsnerionx status— Show Brand Kit container statusnerionx doctor [--json]— Run every first-order readiness check; report full catalog total, Hub-owned payment blockers, and optional AI generation warnings without stopping at the first failurenerionx logs [service] [-f]— Tail all container logs or one service; -f follows outputnerionx update [--tag] [--dry-run]— Pull newer kit images and recreate Spoke + storefrontnerionx theme refresh [--slug]— Reinstall the storefront theme from the running image. Theme files are copied into your database on first boot and never overwritten, so your Admin edits are safe — but a storefront fix in a newer image only reaches an existing Brand Kit this way. Non-destructive: the previous theme is kept, unpublished.nerionx init --offline— Air-gap: scaffold without registry login/pull — images come from `kit import`nerionx kit export [--out]— Air-gap: save kit images and compose into a portable bundlenerionx kit import <bundle> [--registry --push]— Air-gap: load a bundle or seed a self-hosted registrynerionx login / logout— Authenticate the terminal with a brand API keynerionx config get|set|sync-identity— Manage ~/.nerionx/config.json; sync brand identity from the Hubnerionx select --slug|--domain— Set the active Brand Kit contextnerionx request dns-ready— Verify DNS resolves and record readiness on the Brand Kitnerionx request ssl [domain] / check ssl <domain>— Print the SSL checklist and verify DNS for a production domainnerionx pull products --initial|--recent— Download the master catalog from the Hub over HTTPS; a large initial pull can take several minutes, and --json stays silent until its one final documentnerionx sync --force-event-bus— Reconcile the local mirror with Hub statenerionx push— Publish local prices and approved product content to the storefront feednerionx login|logout / config sync-identity / hub status— Verify and store Hub identity without exposing the API key in normal outputnerionx hub health— Ping the configured Hub health endpointnerionx generate products|pages— Queue review-first product or governed page drafts in BrandKitnerionx agent [--llm --set-api-key --import-intent] / status— Configure review-first AI with a hidden/env key, import intent, or inspect liveness; Admin remains equivalentnerionx pricing --sku | --product --set | --shipping --set | --floor | --sync-rates— Read effective prices or apply ISO-validated local rules that cannot undercut Hub floorsnerionx theme export|import|preview— Move/validate tokens and print preview URLs; live publication stays in BrandKit Adminnerionx orders list|get— List brand orders / fetch order detailnerionx inventory reserve— Verify that Hub stock can satisfy a quantitynerionx webhook [--add --url --events]— List or register outbound order-event webhooksnerionx health --verbose— Check Hub and, when configured, Spoke, Redis, and API-key connectivitynerionx security rotate-keys— Rotate Hub ↔ Spoke secret keysnerionx db migrate|backup|restore— Apply migrations, create 0600 pg_dump backups, or restore with --yes plus an automatic pre-restore backupnerionx service restart— Restart the Brand Kit servicesnerionx fleet generate|status|pause|resume|retry|cancel— Validate, submit, and control durable multi-BrandKit generation runs with idempotency and bounded shardsnerionx fleet docker plan|apply|status|reconcile— Validate digest-pinned desired state and communicate with registered, allowlist-only Docker agentsnerionx provision— Platform developers only — post-approval local monorepo deploymentnerionx brand:create— Platform developers only — local monorepo Spoke provisioningnerionx migrate:native-catalog|migrate:native-orders— Platform maintenance: one-time native catalog/order migrationsnerionx hub db-backup|db-restore— Platform operators only — manage Hub database backupsnerionx destroy brand --force— Platform developers only — tear down a local brand database and files