Skip to content

CLI

Command reference

Every elula command and option, with examples.

This page lists every elula command. Run elula <command> --help for the same details in your terminal.

Most commands act on the app linked to the current folder through .elula.json. If no app is linked, they stop with No project linked. Run: elula init. Commands that take an ID usually accept the first few characters of it (an ID prefix) instead of the full ID.

Many commands accept --json for machine-readable output. That's useful in scripts and for AI agents.

Global options

OptionDescription
--versionPrint the CLI version and exit
--helpShow help for any command
elula --version
elula deploy --help

Auth and setup

elula login

Sign in with Google. Opens your browser and saves the login to ~/.elula/config.json.

OptionDescription
--api-url TEXTElula API address to use. Saved for later commands
--web-url TEXTWeb app address, used for share links. Saved for later commands
elula login
elula login --api-url https://api.example.com

elula logout

Remove the saved login from this machine.

elula logout

elula whoami

Show your name and email, the API address, your active workspace and your role.

OptionDescription
--jsonOutput as JSON, including your permissions
elula whoami

elula org

Show or switch the workspace you're working in. With no subcommand, it runs elula org list.

elula org list lists your workspaces and marks the active one. Options: --json.

elula org switch ORG_REF makes another workspace active. ORG_REF is its slug, name or ID.

elula org list
elula org switch acme

elula github

Connect the Elula GitHub App so Elula can build private repos.

elula github connect opens GitHub in your browser and waits up to two minutes for you to finish. It always prints the link too, in case no browser opens (for example inside an AI agent or over SSH). Run in a repo, it then checks that the App can read that repo.

elula init checks the same thing before it creates the app. If the App isn't installed on the repo's owner, or is installed but wasn't given this repo, it opens the GitHub page that fixes it (and prints the link), then waits up to 5 minutes for access. Public repos can still be built without the App.

elula github status shows whether GitHub is connected. Options: --json.

elula github connect
elula github status

elula update

Download and install the latest CLI version. May ask for your password through sudo.

elula update

Creating and linking apps

elula init

Create an app from the current Git repo and link this folder to it. The repo needs a remote called origin. If an app already exists for this repo (and subdirectory), init links to it instead of creating a new one.

When you don't pass --root-dir, init scans the repo for a monorepo (Turborepo, Nx, Lerna, pnpm workspaces and similar) and asks which apps to set up. Each chosen app gets its own .elula.json in its folder.

OptionDescription
--name TEXTApp name. Defaults to the repo name
--branch TEXTGit branch to deploy. Defaults to your current branch
--env ENVEnvironment label: dev, staging or prod. Default: dev
--framework TEXTFramework preset. Default: auto (detect)
--database / --no-databaseCreate a managed Postgres database. Default: no
--access MODEWho can open the app: private or public. Private needs a verified team domain. Default: the workspace default
--type TYPEservice for an HTTP app, job for a batch task. Default: service
--root-dir TEXTSubdirectory to build from, for example apps/web
--docker-context CONTEXTBuild from the app subdirectory (subdir, default) or the repo root (root, needed when the Dockerfile uses shared monorepo packages)
--region REGIONasia-southeast1 or us-central1. Default: asia-southeast1
elula init
elula init --name my-api --database
elula init --type job
elula init --root-dir apps/web
elula init --root-dir apps/api --docker-context root

Link the current folder to an existing app by ID or ID prefix. You must be the owner or a collaborator.

elula link 3f2a9c1e

elula projects

List your apps with type, environment, region and ID.

OptionDescription
--jsonOutput as JSON
elula projects

elula status

Show the linked app's repo, branch, region, access, database and latest deployment (or latest job run). While a deploy is running it shows how long it has taken so far.

OptionDescription
--jsonOutput as JSON. Includes deploy_progress: step, step number, done, elapsed_seconds, typical_seconds
--wait SECONDSIf a deploy is running, follow it for up to SECONDS (max 600), printing each step. Exits 1 if it failed; 0 when it's live or still running
elula status
elula status --wait 60

elula open

Open the linked app's URL in your browser.

elula open

elula project delete

Delete an app: its Cloud Run service or job, its database and its secrets. This can't be undone. Defaults to the linked app if you don't pass an ID. You must type the app name to confirm. Only the app's owner or a workspace owner or admin can delete it.

OptionDescription
-y, --yesSkip the name confirmation (for scripts)
elula project delete
elula project delete 3f2a9c1e --yes

elula project set-region

Move an app to asia-southeast1 or us-central1. Defaults to the linked app. Elula redeploys the last successful image in the new region, then deletes the old one. The database stays where it is. A deployed service gets a new URL; the old one keeps serving until the new one is up.

OptionDescription
-y, --yesSkip the confirmation prompt
elula project set-region us-central1

Deploying

elula deploy

Build and deploy the linked app. It builds the branch on your Git remote, so commit and push first; the CLI warns about uncommitted or unpushed changes. Exits with code 1 if the deploy fails. For a job, deploy builds the job image; run it with elula job run.

It says how long deploys of this app usually take, then shows each step with the time so far:

Deploying my-app. This usually takes about 4 minutes.
[1/4] Queued  0:02
[2/4] Building the image  0:09
      still building the image… 1:39 (usually about 4 minutes in total)
[3/4] Updating Cloud Run  3:02
[4/4] Live  3:48
Deploy successful! (3:48)

In a terminal, the build log streams between the steps. When the output isn't a terminal (an AI agent, CI, or a pipe), it prints only the steps and a "still …" line every 30 seconds, and the end of the build log if the build fails.

elula run is the same command.

OptionDescription
--no-waitStart the deploy and return right away. Follow it with elula status --wait 60. --no-logs does the same
--logs / --no-build-logsStream the full build log, or don't. Default: stream only in a terminal
--forceCancel any deployment in progress first
elula deploy
elula deploy --force
elula deploy --no-wait && elula status --wait 60

elula preview

Deploy a preview of an open pull request. With no options, it finds the open PR for your current branch. GitHub must be connected.

OptionDescription
--pr INTEGERPreview this open PR instead of the current branch's
--no-waitStart the preview and return right away (--no-logs does the same)
--logs / --no-build-logsStream the full build log, or don't. Default: stream only in a terminal

elula preview list lists active previews and their URLs. Options: --json.

elula preview remove [PR_NUMBER] removes a preview. Defaults to the current branch's PR.

elula preview
elula preview --pr 12 --no-wait
elula preview list
elula preview remove 12

elula deployments

List recent deployments with ID, status and commit.

OptionDescription
--limit INTEGERHow many to show. Default: 10
--jsonOutput as JSON

elula deployments show DEPLOYMENT_ID shows one deployment: status, commit, URL, preview and error. Options: --json.

elula deployments
elula deployments --limit 25
elula deployments show 9b1c

elula rollback

Roll back to an earlier successful deployment. With no ID, it goes back to the successful deployment before the current one. It reuses the built image, so there is no rebuild.

OptionDescription
-y, --yesSkip the confirmation prompt
elula rollback
elula rollback 9b1c -y

elula cancel

Cancel the deployment that's in progress for the linked app.

elula cancel

Configuration

elula env

Manage the app's environment variables.

SubcommandDescription
env listList variables and secrets. Options: --json
env set KEY=VALUE ...Set one or more plain variables
env secret KEY=VALUE ...Set one or more secret variables, stored encrypted
env pullWrite variables to a .env file. Option: --file TEXT (default .env). Secrets are written commented out
env delete KEYDelete a variable or secret
elula env set NODE_ENV=production LOG_LEVEL=info
elula env secret STRIPE_KEY=sk_live_xxx
elula env list
elula env pull --file .env.local
elula env delete LOG_LEVEL
Note: Variables starting with NEXT_PUBLIC_ or VITE_ are baked in at build time. Set them before you deploy. See Environment variables and secrets.

elula db

Manage the app's Postgres database. With no subcommand, it shows the database name, user and instance. Options: --json.

SubcommandDescription
db serverShow the workspace's database server: not created, being created, ready or failed. Options: --json
db server createCreate the workspace's database server (owners; once per workspace). Options: `--size starter\small\large (about $10 / $30 / $60 a month, billed by Google; default starter), --wait (check until it's ready, up to 20 min), -y` (skip the cost confirmation, for scripts and AI agents). Safe to re-run
db provisionCreate a database for an app made without --database. Owner only. Needs the database server to be ready. Redeploy afterwards so the app gets DATABASE_URL
db migrate FILERun a SQL migration file and record it. Options: --name TEXT (defaults to the file name), --down FILE (rollback SQL)
db migrationsList migration history. Options: --json
db query SQLRun a SQL query. Options: --json
elula db server create --size starter --wait
elula db
elula db provision
elula db migrate migrations/001_users.sql --down migrations/001_users_down.sql
elula db migrations
elula db query "SELECT count(*) FROM users"

See Databases.

elula scale

Change instances, concurrency, memory, CPU or port without rebuilding. With no options, it prints the current settings and what they mean.

OptionDescription
--min INTEGERMinimum instances. 0 lets the app scale to zero when idle
--max INTEGERMaximum instances
--concurrency INTEGERRequests one instance handles at the same time (default 80)
--cpu-always / --no-cpu-alwaysKeep CPU on between requests. Needs at least 1 min instance, so it sets min to 1 if it was 0
--memory TEXTMemory per instance, for example 512Mi or 1Gi
--cpu TEXTCPU per instance, for example 1 or 2
--port INTEGERPort your app listens on
elula scale
elula scale --min 1 --max 5 --memory 1Gi --cpu 1

elula domains

Serve the linked app on a hostname you own. Adding and removing need a workspace owner, a connected Google Cloud and an active plan. See Custom domains.

CommandDescription
domains / domains listCustom domains for the linked app and their status (waiting for DNS, verified, live). Options: --all (whole workspace), --json
domains add HOSTNAMEAdd the hostname to the linked app and print the CNAME and A records to create. You type the hostname again to confirm. Running it again prints the same records. Options: --wait (keep checking until it verifies, up to 15 minutes), --json, -y/--yes (skip typing it again, for scripts and AI agents)
domains verify HOSTNAMECheck DNS and the certificate, and route the domain to the app once ready. Exits 0 when verified, 1 when not yet. Options: --wait, --json
domains records HOSTNAMEPrint the DNS records again
domains remove HOSTNAMEStop serving the domain and delete its certificate and routing. You type the hostname again to confirm. Option: -y, --yes (skip that)
elula domains add app.example.com
elula domains verify app.example.com --wait
elula domains
elula domains remove app.example.com

Observability

elula logs

Show the build logs for the latest deployment, or a specific one.

OptionDescription
--deployment TEXTDeployment ID or ID prefix
elula logs
elula logs --deployment 9b1c

elula runtime-logs

Show the app's live output (stdout and stderr).

OptionDescription
--since TEXTTime window: 10m, 30m, 1h or 3h. Default: 10m
--search TEXTOnly lines containing this text (case-insensitive)
elula runtime-logs
elula runtime-logs --since 1h --search error

elula http-logs

Show recent HTTP requests to the app, newest first: method, path, status and latency.

OptionDescription
--status CLASSWhich responses to show: errors, 2xx, 3xx, 4xx or 5xx. errors means 4xx and 5xx. Default: errors
--limit INTEGERHow many, 1 to 200. Default: 50
--jsonOutput as JSON
elula http-logs
elula http-logs --status 5xx --limit 100

elula metrics

Summarize requests by status class, error rate, CPU and memory.

OptionDescription
--hours HOURSTime window: 1, 6 or 24. Default: 1
--jsonOutput as JSON, with the raw time series
elula metrics
elula metrics --hours 24

elula health

Print one word: up, down, deploying or unknown. Exits with code 1 when the app is down.

OptionDescription
--jsonOutput as JSON
elula health || echo "app is down"

elula scan

Show the latest dependency and secret scan: vulnerable packages and leaked secrets.

OptionDescription
--runStart a new scan instead of showing the latest
--jsonOutput as JSON
elula scan --run
elula scan

Access and team

elula access

Show whether the app is private or public, and any pending request to make it public.

SubcommandDescription
access publicMake the app public. Workspace owners and admins can do this, and members too when the workspace policy allows it without approval. Option: -y, --yes
access request-publicAsk a workspace owner or admin to make the app public. Recorded in the audit log
access withdrawWithdraw your pending request
access privateMake the app private again
elula access
elula access request-public
elula access private

See Private and public apps.

elula collaborators

Manage who can view or edit the linked app.

SubcommandDescription
collaborators listList collaborators. Options: --json
collaborators add EMAILAdd a collaborator, or change their role. Option: --role ROLE, viewer (default) or editor. The person must have signed in to Elula once
collaborators remove EMAILRemove a collaborator
elula collaborators add sam@example.com --role editor
elula collaborators list
elula collaborators remove sam@example.com

elula approvals

For workspace owners and admins: list pending requests, such as requests to make an app public. Options: --json.

SubcommandDescription
approvals approve APPROVAL_IDApprove a request (ID or ID prefix)
approvals deny APPROVAL_IDDeny a request (ID or ID prefix)
elula approvals
elula approvals approve 51e0

Jobs

These commands work on apps created with elula init --type job. Build the job with elula deploy before you run or schedule it.

elula job run

Start a job run and wait for it to finish. Exits with code 1 if the run fails or is cancelled. Press Ctrl+C to stop watching; the run keeps going.

OptionDescription
--no-waitStart the run and return right away
elula job run
elula job run --no-wait

elula job list

List recent job runs and their status.

OptionDescription
--limit INTEGERNumber of runs to show
--jsonOutput as JSON
elula job list --limit 20

elula job cancel

Cancel a running job run by ID or ID prefix.

elula job cancel 7d3e

elula job schedule

Run the job on a cron schedule. Cron expressions have 5 fields: minute, hour, day of month, month, day of week.

SubcommandDescription
schedule listList schedules. Options: --json
schedule addAdd a schedule. Options: --cron TEXT (required), --timezone TEXT (IANA name, default UTC), --description TEXT, --enabled / --no-enabled (default enabled)
schedule update SCHEDULE_IDChange a schedule. Options: --cron TEXT, --timezone TEXT, --description TEXT
schedule pause SCHEDULE_IDStop a schedule from firing without deleting it
schedule resume SCHEDULE_IDResume a paused schedule
schedule delete SCHEDULE_IDDelete a schedule
elula job schedule add --cron "0 9 * * 1-5" --timezone "Asia/Kuala_Lumpur" --description "Daily digest"
elula job schedule add --cron "*/30 * * * *" --no-enabled
elula job schedule list
elula job schedule update 4a1b --cron "0 10 * * 1-5"
elula job schedule pause 4a1b
elula job schedule resume 4a1b
elula job schedule delete 4a1b

See Jobs and schedules.

Pages and secrets

elula pages

Publish HTML files or folders as shareable pages.

SubcommandDescription
pages publish PATHPublish a file or folder and print the link. Options: --title TEXT, --random (unguessable URL instead of /p/<handle>/<title>), --private / --public, --handle TEXT (claim your handle on first publish, for scripts), --open
`pages access SLUG private\public`Make a page private (sign-in required) or public
pages update SLUG PATHReplace a page's content and keep its URL. SLUG is everything after /p/. Option: --open
pages listList your pages
pages open SLUGOpen a page in your browser
pages rm SLUGDelete a page. The link stops working at once. Option: -y, --yes

A folder needs at least one .html file, ideally index.html. The first time you publish with a readable URL, the CLI asks you to pick a handle.

elula pages publish ./deck.html
elula pages publish ./site/ --title "Q3 Review"
elula pages publish ./secret.html --random
elula pages update sam/q3-review ./site/
elula pages rm sam/q3-review -y

See Pages.

elula send

Encrypt a secret on your machine and print a share link. The decryption key is in the link after # and is never sent to the server. Pass the secret as text, with --file, or through stdin.

OptionDescription
-f, --file FILERead the secret from a file
--expires INTEGERMinutes until it's deleted. Default: 1440 (24 hours). Max: 43200 (30 days)
--max-views INTEGERDelete after this many views
--password TEXTRequire a password to view
--to EMAILOnly this person, signed in with this email, can open it
elula send "db-password-123" --expires 60 --max-views 1
elula send -f .env.production --to sam@example.com
cat key.pem | elula send --password hunter2

elula reveal

Decrypt a share link and print the secret, or save it to a file.

OptionDescription
--password TEXTPassword, if the secret has one
-o, --output PATHSave to this file
elula reveal "https://app.example.com/s/abc123#key"
elula reveal "https://app.example.com/s/abc123#key" -o .env

elula sends

List the secrets you've sent: state (active, expired or used up), views and expiry. With no subcommand, it runs the list. Options: --json.

SubcommandDescription
sends listList your sent secrets, newest first. Options: --json
sends status ID_OR_LINKCheck whether a secret is still available. Options: --json
sends revoke ID_OR_LINKDelete a secret so its link stops working. Option: -y, --yes
elula sends
elula sends status 8c2f
elula sends revoke 8c2f -y

See Sharing secrets.

Other

elula docs

Print a plain-text reference of Elula for AI assistants. You must be logged in.

OptionDescription
--copyCopy to the clipboard instead of printing (uses pbcopy on macOS, xclip on Linux)
elula docs
elula docs --copy

See Use Elula with your AI.