eekaam.docs

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/cli
eekaam --help

Log 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 login
eekaam auth whoami    # which account am I using?
eekaam auth logout    # clear stored credentials

Dev 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 browser

Working on a theme

theme dev watches the directory and pushes changes as you save. Useful flags:

FlagDefaultWhat it does
--path.Theme directory
--port9292Local server port
--no-openoffDon't open a browser on start
--no-deleteoffKeep 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 reload
eekaam 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 store

Checking 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 check

Managing 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 browser

Sharing a preview

Returns a URL a client can open without an Eekaam account. Expiry is in days, 7 by default, 30 maximum.

eekaam theme share --expires 7

Packaging 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 package

Apps

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 review

Running 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.

FlagWhat it does
--storeDev store to install on (id or subdomain)
--portLocal port your dev server listens on (default: from app_url)
--tunnelTunnel provider (cloudflared, installed automatically)
--no-tunnelDon't open a tunnel — webhooks will not be delivered
--require-tunnelStop if no tunnel can be opened, rather than running without one
--no-serverDon't start the local dev server
--install-pathPath where the app begins an install (default: derived from the redirect URL)
--no-openDon't open a browser
-y, --yesSkip the confirmation of a first deploy, or of a deploy on an Eekaam without dev sessions
eekaam app dev
eekaam app dev --store my-dev-store --port 3000

Deploying

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.

FlagWhat it does
--dry-runShow what would change without pushing
-y, --yesSkip the confirmation prompt
-m, --messageDescribe this version (shown in app versions list)
--allow-deletesDelete 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]] entry

Versions 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 version

Test 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.

FlagWhat it does
--topicWebhook topic to send, e.g. orders/create (required)
--addressPublic https:// URL to send it to (default: the dev session's or install's callback)
--storeDev store to send it from (id or subdomain)

See Testing webhooks for what the payload contains.

eekaam app webhook trigger --topic orders/create
eekaam app webhook trigger --topic app/uninstalled --address https://example.com/webhooks

Credentials

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 secret

Environments

A project can keep one manifest per environment: eekaam.app.toml plus eekaam.app.<name>.toml files, each linked to its own app.

CommandWhat it does
app config linkWrite 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 listList 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 staging

Checking 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.

FlagWhat it does
--jsonPrint the report as JSON
--pathApp 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 check
eekaam app submit --skip-checks

Command reference

CommandDoes
auth login / logout / whoamiManage authentication
store list / create / use / open / resetManage dev stores
store transfer --emailHand a dev store to a client
theme init / push / pull / filesTheme files
theme devLocal server with hot reload
theme checkValidate structure and Liquid
theme packageBuild a marketplace ZIP
theme shareTime-limited preview link
theme list / info / publish / duplicate / rename / delete / openThemes on the active store
app init / link / deploy / info / install / submitApp lifecycle
app devRun an app locally on a dev store, through a tunnel and a dev session
app deploy --message / --allow-deletesLabel the version / delete removed metafield definitions
app versions listList an app's versions and which one is live
app release --versionRelease an approved version, or roll back
app webhook triggerSend a test webhook
app env show / env pullPrint the environment variables, masked / write them to .env
app config link / use / listOne manifest per environment
app explorerGraphQL explorer for a dev store, at http://localhost:3457/graphiql
app checkCheck 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