Tools
Eekaam CLI
Eekaam CLI
The Eekaam CLI builds themes, ships apps and manages dev stores from your terminal. It is the fastest way to work on a theme — eekaam theme dev runs a local server with hot reload, so you edit a Liquid file and see the change without uploading anything by hand.
Install
Builds are published for macOS (Intel and Apple silicon), Linux (x64 and arm64) and Windows x64. The binary installs as eekaam.
npm install -g @eekaam/clieekaam --helpLog in
This opens your browser, you approve the session, and the CLI stores the credentials in ~/.eekaam/config.json. Everything else assumes you are logged in.
eekaam auth logineekaam auth whoami # which account am I using?
eekaam auth logout # clear stored credentialsDev stores
Theme commands run against an active dev store. Create one, then select it:
Dev stores are free and disposable. eekaam store reset restores the sample catalogue when you have made a mess of it, and eekaam store transfer --email client@example.com hands a finished store to a client.
eekaam store create "My test store"
eekaam store list
eekaam store use <store-id>
eekaam store open # open it in a browserWorking on a theme
theme dev watches the directory and pushes changes as you save. Useful flags:
| Flag | Default | What it does |
|---|---|---|
--path | . | Theme directory |
--port | 9292 | Local server port |
--no-open | off | Don't open a browser on start |
--no-delete | off | Keep remote files when you delete a local one |
The rest of the file commands:
eekaam theme init my-theme # scaffold a new Loom theme
cd my-theme
eekaam theme dev # local server on :9292, hot reloadeekaam theme push # upload every file to the active dev store
eekaam theme pull # download the store's files over your local copy
eekaam theme files # list what is on the storeChecking a theme
Validates structure and Liquid syntax against the same rules the upload pipeline applies, so a theme that passes here will not be rejected for structure. Run it before packaging. --fail-on-warning makes warnings exit non-zero, which is what you want in CI.
eekaam theme checkManaging themes on the store
eekaam theme list
eekaam theme info <theme-id>
eekaam theme publish <theme-id> # make it the live theme
eekaam theme duplicate <theme-id>
eekaam theme rename <theme-id> "New name"
eekaam theme delete <theme-id>
eekaam theme open <theme-id> # preview in a browserPackaging for the theme store
Runs theme check first, then writes a ZIP named {name}-{version}.zip. --output sets the path; --no-check skips validation, which is not recommended — the marketplace runs the same checks on upload and will reject what you skipped.
See Theme requirements for the rules, and The theme store for what happens after you upload.
eekaam theme packageApps
app init scaffolds an app and writes its eekaam.app.toml manifest in the current directory. The manifest always subscribes to app/uninstalled and app/scopes_update, even with a local app URL. app install puts the draft on one of your own dev stores without admin approval, which is how you test before submitting.
eekaam app init --name "My app" --handle my-app
eekaam app dev # run it locally on a dev store
eekaam app link <handle> # bind this directory to an existing app
eekaam app deploy # push the local manifest
eekaam app info # what the server currently has
eekaam app install # install the draft on a dev store
eekaam app check # check the project against the review rules
eekaam app submit # check, then submit for admin reviewRunning an app locally
Opens a public tunnel to your local server, starts a dev session that points the app at it on one dev store, starts your dev server and opens the install. The dev session applies to your dev store only; the app's saved config and your manifest are not changed. It is refreshed every five minutes and ended when the command exits. The first run in a directory that is not linked yet deploys the manifest, to create the app.
Saving eekaam.app.toml while it runs pushes URL, scope, webhook and extension changes into the session. Press k to send a test webhook, g to open GraphiQL (at http://localhost:3457/graphiql), and q or Ctrl-C to stop. See Develop locally for the whole loop.
| Flag | What it does |
|---|---|
--store | Dev store to install on (id or subdomain) |
--port | Local port your dev server listens on (default: from app_url) |
--tunnel | Tunnel provider (cloudflared, installed automatically) |
--no-tunnel | Don't open a tunnel — webhooks will not be delivered |
--require-tunnel | Stop if no tunnel can be opened, rather than running without one |
--no-server | Don't start the local dev server |
--install-path | Path where the app begins an install (default: derived from the redirect URL) |
--no-open | Don't open a browser |
-y, --yes | Skip the confirmation of a first deploy, or of a deploy on an Eekaam without dev sessions |
eekaam app deveekaam app dev --store my-dev-store --port 3000Deploying
Shows the diff between the manifest and the server, asks, then pushes. Webhooks with a local callback are left out, with a line saying so; app dev sends those in its dev session.
| Flag | What it does |
|---|---|
--dry-run | Show what would change without pushing |
-y, --yes | Skip the confirmation prompt |
-m, --message | Describe this version (shown in app versions list) |
--allow-deletes | Delete metafield definitions that were removed from the manifest |
eekaam app deploy --message "Adds the reviews widget"eekaam app deploy --allow-deletes # the manifest dropped a [[metafields]] entryVersions and releases
app release makes an approved version the one stores run. Releasing an older approved version is how you roll back. --version takes a version label or id, and -y/--yes skips the confirmation.
eekaam app versions list # every version, newest first; * marks the live one
eekaam app versions list --json # the same, as JSON
eekaam app release --version 1.3.0 # release an approved versionTest webhooks
Sends a test webhook for a topic and reports the status and duration. It exits 1 when the app did not accept it. eekaam app webhooks trigger is the same command.
| Flag | What it does |
|---|---|
--topic | Webhook topic to send, e.g. orders/create (required) |
--address | Public https:// URL to send it to (default: the dev session's or install's callback) |
--store | Dev store to send it from (id or subdomain) |
See Testing webhooks for what the payload contains.
eekaam app webhook trigger --topic orders/createeekaam app webhook trigger --topic app/uninstalled --address https://example.com/webhooksCredentials
A project needs no .env: app dev passes every variable to your dev server. The CLI keeps the client secret in .eekaam/credentials.json (git-ignored), because Eekaam stores it hashed and cannot return it.
env show prints EEKAAM_CLIENT_ID, EEKAAM_CLIENT_SECRET, EEKAAM_WEBHOOK_SECRET and EEKAAM_SCOPES as KEY=value lines, each secret masked to its last four characters.
env pull writes the same four to .env, leaving your other keys alone. It does not write EEKAAM_APP_URL, which changes on every app dev run. --rotate issues a new client secret and invalidates the old one.
eekaam app env show # print the app's environment variables, secrets masked
eekaam app env show --reveal # print the secrets in full
eekaam app env pull # write them to .env, for running without the CLI
eekaam app env pull --rotate # also issue a new client secretEnvironments
A project can keep one manifest per environment: eekaam.app.toml plus eekaam.app.<name>.toml files, each linked to its own app.
| Command | What it does |
|---|---|
app config link | Write a config file from an existing app and link it. --name picks the file, --app the app (handle or id), --force overwrites |
app config use <name> | Make a config the default for app commands. default switches back to eekaam.app.toml |
app config list | List the config files and the app each is linked to |
--config <name> | On any app command: use eekaam.app.<name>.toml and its app for this command |
See Environments.
eekaam app config link --name staging --app my-app-staging
eekaam app config use staging
eekaam app config list
eekaam app deploy --config stagingChecking an app
Runs the automated App review guidelines rules against the project in the current directory: its manifest and its source files. Each finding is an error or a warning, with its rule id. It exits non-zero when there is at least one error, so it can gate CI. Warnings alone do not fail it.
| Flag | What it does |
|---|---|
--json | Print the report as JSON |
--path | App project directory (default .); the CLI walks up to the nearest eekaam.app.toml |
app submit runs the same checks first and stops if any error is found. --skip-checks submits without running them. Reviewers check every rule anyway, so skipping only moves a failure to review.
See Building an app for the full app lifecycle.
eekaam app checkeekaam app submit --skip-checksCommand reference
| Command | Does |
|---|---|
auth login / logout / whoami | Manage authentication |
store list / create / use / open / reset | Manage dev stores |
store transfer --email | Hand a dev store to a client |
theme init / push / pull / files | Theme files |
theme dev | Local server with hot reload |
theme check | Validate structure and Liquid |
theme package | Build a marketplace ZIP |
theme share | Time-limited preview link |
theme list / info / publish / duplicate / rename / delete / open | Themes on the active store |
app init / link / deploy / info / install / submit | App lifecycle |
app dev | Run an app locally on a dev store, through a tunnel and a dev session |
app deploy --message / --allow-deletes | Label the version / delete removed metafield definitions |
app versions list | List an app's versions and which one is live |
app release --version | Release an approved version, or roll back |
app webhook trigger | Send a test webhook |
app env show / env pull | Print the environment variables, masked / write them to .env |
app config link / use / list | One manifest per environment |
app explorer | GraphQL explorer for a dev store, at http://localhost:3457/graphiql |
app check | Check an app against the automated review rules |
Add --help to any command for its flags.
Configuration
Credentials and the active store live in ~/.eekaam/config.json. The CLI talks to https://api.eekaam.com by default; --api-url points it somewhere else, which you only need when working against a self-hosted or staging instance.
Updated 17 September 2026