CLI
Command-line interface for creating and managing Fireberry apps
title: "CLI" description: "Command-line interface for creating and managing Fireberry apps"
Fireberry CLI
The Fireberry CLI (@fireberry/cli) is your command-line tool for creating, deploying, and managing Fireberry apps.
Resources:
Installation
npm install -g @fireberry/cli@latestAfter installation, authenticate with your API token:
fireberry initApp Versioning
Every app version is in one of three states:
| State | Description |
|---|---|
| Draft | Work in progress. Only visible to the developer. Created by create or automatically by push when no Draft exists. |
| Live | The published version. Available to your org after install. |
| Deprecated | A previous Live version, superseded when a new version is deployed. Exists for audit history only — cannot be installed or re-deployed. |
Rules:
- There is at most one Draft and one Live version per app at any time.
- Version numbers are sequential integers (V1, V2, V3…), incrementing on each deploy cycle.
Typical lifecycle:
fireberry create → creates Draft V1
fireberry push → updates Draft V1
fireberry deploy → Draft V1 becomes Live; run again later to deploy V2, V3, etc.
fireberry install → makes the Live version available to your org (run once)
After the first deploy, updating your app is just push + deploy. A new Draft is created automatically when you push against a Live version.
Commands
| Command | Description |
|---|---|
fireberry init | Store your authentication token |
fireberry create | Create a new app |
fireberry create-component | Add component to existing app |
fireberry push | Upload changes to the current Draft |
fireberry deploy | Publish the Draft (Draft → Live) |
fireberry install | Install the app on your account |
fireberry debug | Debug component with local dev server |
fireberry delete | Delete an app |
Marketplace commands:
| Command | Description |
|---|---|
fireberry marketplace clone | Fork an existing app into a new, independent app |
fireberry marketplace deploy | Publish the app to the public Fireberry marketplace |
fireberry init
Stores your API token for authentication.
fireberry init [tokenid]| Argument | Description | Required |
|---|---|---|
tokenid | Your Fireberry API token (how to get one) | No (will prompt if omitted) |
Examples:
# Interactive — prompts for token
fireberry init
# Direct — pass token as argument
fireberry init abc123xyzToken storage location:
| Platform | Path |
|---|---|
| macOS | ~/Library/Preferences/Fireberry CLI/config.json |
| Linux | ~/.config/Fireberry CLI/config.json |
| Windows | %APPDATA%/Fireberry CLI/config.json |
fireberry create
Scaffolds a new Fireberry app with your first component using Vite + React.
fireberry create [name]| Argument | Description | Required |
|---|---|---|
name | App name (alphanumeric, underscores, hyphens) | No (will prompt if omitted) |
What it does:
- Creates app directory and
manifest.yml - Registers app with Fireberry backend
- Prompts for your first component:
- Component name
- Component type (record, side-menu, or global-menu)
- Type-specific settings
- Scaffolds a Vite + React project for the component
- Installs dependencies (@fireberry/sdk, @fireberry/ds)
- Builds the component
Example:
fireberry create my-awesome-appGenerated structure:
my-awesome-app/
├── manifest.yml
└── my-awesome-app-component/
├── src/
│ ├── App.jsx
│ ├── main.jsx
│ └── App.css
├── dist/
├── package.json
├── vite.config.js
└── node_modules/
Output example:
Creating app "my-awesome-app"...
✔ App directory "my-awesome-app" created!
📁 Location: /path/to/my-awesome-app
App ID: 1f3a3eca-d551-4cd0-a1d7-4a1f2e431e26
Adding component "my-awesome-app-component"...
Creating Vite React app...
✔ Component created
Installing dependencies...
✔ Dependencies installed
Building component...
✔ Component built
✔ Successfully created component "my-awesome-app-component"!
Component ID: 864fbfb2-e7ca-4e9e-8532-9f02b1e7936f
Type: record
Path: my-awesome-app-component/dist
🎉 Your app is ready!
Next steps:
cd my-awesome-app
fireberry push # Upload to your Draft
fireberry deploy # Publish Draft as Live
fireberry install # Install on your account (once)
WarningApp names must match the pattern
^[a-zA-Z0-9_-]+$. Spaces and special characters are not allowed.
fireberry create-component
Adds a new component to an existing Fireberry app.
fireberry create-component [name] [type]| Argument | Description | Required |
|---|---|---|
name | Component name (will be slugified) | No (will prompt if omitted) |
type | record, side-menu, or global-menu | No (will prompt if omitted) |
What it does:
- Prompts for type-specific settings
- Creates Vite + React project in
[component-name]directory with appropriate template by type - Installs dependencies
- Builds the component
- Updates
manifest.ymlwith new component
Type-Specific Prompts:
| Type | Settings Prompted |
|---|---|
| record | Object type (number), height (S/M/L/XL) |
| global-menu | Display name |
| side-menu | Width (S/M/L) |
Example:
# Interactive mode
fireberry create-component
# With parameters
fireberry create-component analytics-panel global-menuOutput example:
Creating Vite React app for "analytics-panel"...
Running npm create vite@latest...
✔ analytics-panel created
Installing dependencies...
✔ Dependencies installed
Installing Fireberry packages...
✔ Fireberry packages installed
Configuring component...
Building component...
✔ Component built
Adding component to manifest...
✔ Successfully created component "analytics-panel"!
Component ID: 9f02b1e7-8532-864f-bb2e-7936fca4e9e8
Type: global-menu
Path: analytics-panel/dist
Your component "analytics-panel" is ready!
cd analytics-panel
npm run dev # Start development server
npm run build # Build for production
Component templates:
- Record components: Include SDK initialization, context access, example button with API call
- Other components: Simple structure with Design System theming, ready for customization
NoteEach component gets its own
node_modules,package.json, and Vite configuration. This allows components to have different dependencies if needed.
fireberry push
Uploads your component changes to the current Draft version.
fireberry pushRequirements:
- Must run from your app's root directory (where
manifest.ymlis located) - All component paths must exist and contain
index.html
What it does:
- Validates your
manifest.yml - Validates component settings for each type
- Packages each component (tar.gz)
- Uploads to the current Draft on Fireberry servers
Note
pushtargets the Draft version only. If no Draft exists (because the last version is already Live), a new Draft is created automatically before uploading. To make your changes visible to org users, runfireberry deployafter pushing.
Example output:
✔ Manifest loaded successfully
✔ 2 components validated and zipped
Components ready to push:
1. record-view (864fbfb2...) - 45.23 KB
2. side-panel (9f02b1e7...) - 12.87 KB
✔ Components pushed successfully
fireberry deploy
Promotes the current Draft to Live, making it available to org users.
fireberry deployRequirements:
- Must run from your app's root directory
- A Draft version must exist (run
fireberry pushfirst)
What it does:
- Promotes the current Draft to Live
- Deprecates the previous Live version (only from the second deploy onward — on first deploy there is no prior Live version to deprecate)
Example output:
✔ Manifest loaded successfully
✔ App "my-awesome-app" deployed successfully
Version 1 is now Live
NoteAfter deploying, the next
fireberry pushwill automatically create a new Draft (V2, V3, etc.) — you don't need to do anything extra.
fireberry install
Installs your app on your Fireberry account.
fireberry installRequirements:
- Must run from your app's root directory
- A Live version must exist (run
fireberry pushthenfireberry deployfirst)
NoteYou only need to run
installonce. After that, usefireberry push+fireberry deployto update your app — installed users will automatically get the new Live version.
fireberry debug
Enables debugging a component with your local development server. Changes appear instantly with hot module replacement.
fireberry debug <component-id> <url>
fireberry debug <component-id> --stopRequirements:
- Must run from your app's root directory
- A Live version must exist — run
fireberry pushthenfireberry deployfirst
| Argument | Description | Required |
|---|---|---|
component-id | Component UUID from manifest (case-insensitive) | Yes |
url | Local dev server URL: localhost:[port] | Yes (unless using --stop) |
--stop | Stop debug mode and revert to production | No |
Starting debug mode:
- Start your component's dev server:
cd my-component
npm run dev
# Runs on http://localhost:5173- Enable debug mode:
fireberry debug abc-123-def-456 localhost:5173Output:
Loading manifest...
✔ Manifest loaded
Starting debug mode for component abc-123-def-456...
✔ Debug mode started!
Component: abc-123-def-456
URL: localhost:5173
To stop debugging, run: fireberry debug abc-123-def-456 --stop
What happens:
- Fireberry loads the component from your local dev server instead of production
- Changes appear instantly thanks to Vite's hot module replacement
Stopping debug mode:
fireberry debug abc-123-def-456 --stopOutput:
Loading manifest...
✔ Manifest loaded
Stopping debug mode...
✔ Debug mode stopped for component: abc-123-def-456
The component reverts to loading from the production build specified in your manifest.
Finding component IDs:
Component IDs are in your manifest.yml:
components:
- type: record
title: my-component
id: "abc-123-def-456" # This is your component ID
path: my-component/dist
Learn MoreSee Local Development for a complete debugging workflow guide.
Validation:
| Error | Solution |
|---|---|
| Invalid URL format | Use format localhost:5173 (no http://, no 127.0.0.1) |
| Component not found | Check component ID in manifest, or run without ID to see list |
| Manifest not found | Run from directory containing manifest.yml |
fireberry delete
Permanently deletes your app from Fireberry.
fireberry deleteThe CLI will ask for confirmation:
? Are you sure you want to delete app my-awesome-app (1f3a3eca...)?
This action cannot be undone. (y/N)
DangerDeletion is permanent and irreversible. The app will be removed from all accounts where it was installed.
Marketplace Apps
The fireberry marketplace commands publish apps to the public Fireberry marketplace, where any organization can find and install them. This is a separate track from the private-app flow (create → push → deploy → install), which publishes only to your own organization.
The expected flow
You don't start a marketplace app from scratch. Develop your private app first, and once you're satisfied with it, fork it and publish the fork:
cd my-app # 1. your finished private app
fireberry marketplace clone /Users/me/apps/my-app-market # 2. fork → new app id
cd /Users/me/apps/my-app-market # 3. publish from the clone
fireberry marketplace deployCloning is a one-time step per marketplace app; after that you publish updates with marketplace deploy from the cloned folder.
Two different apps, two different manifestsThe clone is not another version of your private app — it's a separate entity with its own
app.idand its own component IDs. Deploying to the marketplace never converts, moves, or promotes the private app.So you maintain two
manifest.ymlfiles in two folders: one for the private app, one for the marketplace app. Runpush,deploy,install, anddebugin the private folder, andmarketplace deployin the clone — every command acts on the manifest in the current directory. Code changes must be applied and published in each folder separately.
fireberry marketplace clone
Copies the current app into a new folder with a fresh identity, so the copy is an independent app rather than a duplicate of the same one. App and component IDs must be unique across Fireberry, so a plain cp -r would leave you with two folders claiming to be the same app — this is the safe way to fork one.
fireberry marketplace clone [dest-folder]| Argument | Description | Required |
|---|---|---|
dest-folder | Full path to the destination folder — must be outside the current app directory | No (will prompt if omitted) |
Requirements: Must be run inside an app directory — it reads manifest.yml from the current directory. No token is needed; clone makes no API calls, so the new app doesn't exist server-side until you deploy it.
What it does:
- Copies everything from the app folder, skipping
node_modulesand the destination itself. - Rewrites the destination's
manifest.ymlwith a new app UUID and a new UUID for every component.
Everything else carries over unchanged — app name, description, icon, and each component's title, path, type, and settings.
It refuses to run if the destination equals the source, exists as a non-directory, or exists and is non-empty.
Pass a full path — a bare folder name will failThe destination is resolved relative to the current directory, which is your app folder — so a bare name like
market-applands inside the app you're cloning, and an app can't be copied into itself:$ pwd /Users/me/fireberry/version-test/sara-version-test $ fireberry marketplace clone ? Destination folder: market-app ✖ Failed to clone app into "market-app" Error: Cannot copy '/Users/me/fireberry/version-test/sara-version-test' to a subdirectory of itself, '/Users/me/fireberry/version-test/sara-version-test/market-app'.Pass the full path to a folder outside the app instead:
fireberry marketplace clone /Users/me/fireberry/version-test/market-app
node_modulesis the only exclusion
.git,.envfiles, and builtdist/output are all copied — check the clone for secrets before sharing it. Component titles are copied too; only IDs change, so rename them in the new manifest if you want them distinguishable.
fireberry marketplace deploy
Publishes the current app's built components to the public Fireberry marketplace.
fireberry marketplace deploycd /Users/me/apps/my-app-market # the cloned app, not the private one
fireberry marketplace deployRequirements: a token from fireberry init, a manifest.yml in the working directory, and components already built — each entry's path must point at existing build output.
What it does:
- Loads
manifest.yml, and validates and readsapp.iconif it's set. - Validates every component and packages each build as
tar.gz— checks that eachpathexists, that all component IDs are unique, and that each type has its required settings. - Prints a per-component summary (title, ID, size in KB), then
POSTs to/services/developer/app/marketplace/deploywith{ components, manifest, icon }.
Required settings by component type:
| Type | Required settings |
|---|---|
record | iconName (string), iconColor (string), objectType (number), height — one of S, M, L, XL |
side-menu | iconName (string), width — one of S, M, L |
global-menu | displayName (iconName is optional) |
Icon rules (when app.icon is set): must be .svg/.png/.jpg/.jpeg, non-empty, and ≤ 500 KB. Its size is reported on success.
Run this from the cloned folder
marketplace deploypublishes whatever app the current directory'smanifest.ymldescribes. Run it inside your private app folder and you publish your private app's identity to the public marketplace.
An app with no components is an error, not a graceful skip — validation fails with No components found in manifest and the deploy aborts. The same applies to push.
push vs. deploy vs. marketplace deploy
These three commands sound similar and are the easiest place to go wrong:
| Command | Endpoint | Payload | Purpose |
|---|---|---|---|
push | /push | components + manifest + icon | Upload components to your own organization while developing |
deploy | /deploy | { appId } only | Publish your private app (Draft → Live) |
marketplace deploy | /marketplace/deploy | components + manifest + icon | Publish to the public marketplace |
marketplace deploy and push send identical payloads — they differ only in destination endpoint, and therefore in which app the payload lands on. Since each reads the manifest.yml in the current directory, running the right command from the wrong folder publishes the wrong app. Confirm which folder you're in before deploying: the private app is updated with push + deploy, and the clone with marketplace deploy.
Manifest Reference
The manifest.yml file defines your app configuration.
Structure
app:
id: "uuid"
name: "string"
description: "string"
icon: "string"
components:
- type: "record"
title: "string"
id: "uuid"
path: "string"
settings: { ... }App Properties
| Property | Type | Required | Description |
|---|---|---|---|
id | UUID | Yes | Unique app identifier |
name | string | Yes | Display name |
description | string | No | Brief description |
icon | string | No | Path to an app icon — .svg, .png, .jpg, or .jpeg, non-empty, max 500 KB |
One manifest per app identityPrivate apps and marketplace apps use the same manifest format, but they are separate apps with separate
app.idvalues — so each keeps its ownmanifest.ymlin its own folder. See Marketplace Apps.
Component Properties
| Property | Type | Required | Description |
|---|---|---|---|
type | string | Yes | record, side-menu, or global-menu |
title | string | Yes | Display name |
id | UUID | Yes | Unique component identifier |
path | string | Yes | Relative path to build files |
settings | object | Yes | Type-specific settings |
Component Settings by Type
Record Component:
settings:
iconName: "task" # Icon in toolbar
iconColor: "#7aae7f" # Hex color
objectType: 5 # Object type (0 - for all types)
height: "M" # Component height: S, M, L, or XLSide Menu Component:
settings:
iconName: "settings" # Icon in nav
width: "M" # S, M, or LGlobal Menu Component:
settings:
displayName: "Analytics" # Menu item text
See AlsoComponent Types for detailed settings documentation.
Multi-Component Example
An app can have multiple components:
app:
id: "1f3a3eca-d551-4cd0-a1d7-4a1f2e431e26"
name: "Complete App"
description: "An app with all component types"
components:
- type: record
title: Record Viewer
id: "comp-1"
path: record-viewer/dist
settings:
iconName: "task"
iconColor: "#7aae7f"
objectType: 5
height: "M"
- type: side-menu
title: Quick Actions
id: "comp-2"
path: quick-actions/dist
settings:
iconName: "lightning"
width: "M"
- type: global-menu
title: Analytics
id: "comp-3"
path: analytics/dist
settings:
displayName: "Analytics"Troubleshooting
| Error | Solution |
|---|---|
| "Unauthorized user" | Re-authenticate: fireberry init |
| "Manifest not found" | Run from directory containing manifest.yml |
| "Component path does not exist" | Check that paths in manifest match your build output |
| "Invalid iconColor format" | Use hex format: #RRGGBB |
| "All component ids must be unique" | Each component needs a unique id |
| Destination is not empty | marketplace clone requires a new or empty folder |
| Icon rejected | Use .svg/.png/.jpg/.jpeg, non-empty, under 500 KB |
| "No components found in manifest" | An empty components: array is an error — add and build a component first |
Next Steps
- Local Development — Master the debug workflow
- SDK — Access context and data in your app
- Design System — Build UIs with Fireberry components
- Component Types — Understand component configurations
Updated 5 days ago
