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
| Option | Description |
|---|---|
--version | Print the CLI version and exit |
--help | Show 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.
| Option | Description |
|---|---|
--api-url TEXT | Elula API address to use. Saved for later commands |
--web-url TEXT | Web 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.
| Option | Description |
|---|---|
--json | Output 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.
| Option | Description |
|---|---|
--name TEXT | App name. Defaults to the repo name |
--branch TEXT | Git branch to deploy. Defaults to your current branch |
--env ENV | Environment label: dev, staging or prod. Default: dev |
--framework TEXT | Framework preset. Default: auto (detect) |
--database / --no-database | Create a managed Postgres database. Default: no |
--access MODE | Who can open the app: private or public. Private needs a verified team domain. Default: the workspace default |
--type TYPE | service for an HTTP app, job for a batch task. Default: service |
--root-dir TEXT | Subdirectory to build from, for example apps/web |
--docker-context CONTEXT | Build from the app subdirectory (subdir, default) or the repo root (root, needed when the Dockerfile uses shared monorepo packages) |
--region REGION | asia-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
elula link
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.
| Option | Description |
|---|---|
--json | Output 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.
| Option | Description |
|---|---|
--json | Output as JSON. Includes deploy_progress: step, step number, done, elapsed_seconds, typical_seconds |
--wait SECONDS | If 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.
| Option | Description |
|---|---|
-y, --yes | Skip 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.
| Option | Description |
|---|---|
-y, --yes | Skip 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.
| Option | Description |
|---|---|
--no-wait | Start the deploy and return right away. Follow it with elula status --wait 60. --no-logs does the same |
--logs / --no-build-logs | Stream the full build log, or don't. Default: stream only in a terminal |
--force | Cancel 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.
| Option | Description |
|---|---|
--pr INTEGER | Preview this open PR instead of the current branch's |
--no-wait | Start the preview and return right away (--no-logs does the same) |
--logs / --no-build-logs | Stream 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.
| Option | Description |
|---|---|
--limit INTEGER | How many to show. Default: 10 |
--json | Output 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.
| Option | Description |
|---|---|
-y, --yes | Skip 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.
| Subcommand | Description |
|---|---|
env list | List 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 pull | Write variables to a .env file. Option: --file TEXT (default .env). Secrets are written commented out |
env delete KEY | Delete 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
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.
| Subcommand | Description | ||
|---|---|---|---|
db server | Show the workspace's database server: not created, being created, ready or failed. Options: --json | ||
db server create | Create 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 provision | Create 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 FILE | Run a SQL migration file and record it. Options: --name TEXT (defaults to the file name), --down FILE (rollback SQL) | ||
db migrations | List migration history. Options: --json | ||
db query SQL | Run 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.
| Option | Description |
|---|---|
--min INTEGER | Minimum instances. 0 lets the app scale to zero when idle |
--max INTEGER | Maximum instances |
--concurrency INTEGER | Requests one instance handles at the same time (default 80) |
--cpu-always / --no-cpu-always | Keep CPU on between requests. Needs at least 1 min instance, so it sets min to 1 if it was 0 |
--memory TEXT | Memory per instance, for example 512Mi or 1Gi |
--cpu TEXT | CPU per instance, for example 1 or 2 |
--port INTEGER | Port 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.
| Command | Description |
|---|---|
domains / domains list | Custom domains for the linked app and their status (waiting for DNS, verified, live). Options: --all (whole workspace), --json |
domains add HOSTNAME | Add 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 HOSTNAME | Check 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 HOSTNAME | Print the DNS records again |
domains remove HOSTNAME | Stop 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.
| Option | Description |
|---|---|
--deployment TEXT | Deployment ID or ID prefix |
elula logs elula logs --deployment 9b1c
elula runtime-logs
Show the app's live output (stdout and stderr).
| Option | Description |
|---|---|
--since TEXT | Time window: 10m, 30m, 1h or 3h. Default: 10m |
--search TEXT | Only 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.
| Option | Description |
|---|---|
--status CLASS | Which responses to show: errors, 2xx, 3xx, 4xx or 5xx. errors means 4xx and 5xx. Default: errors |
--limit INTEGER | How many, 1 to 200. Default: 50 |
--json | Output as JSON |
elula http-logs elula http-logs --status 5xx --limit 100
elula metrics
Summarize requests by status class, error rate, CPU and memory.
| Option | Description |
|---|---|
--hours HOURS | Time window: 1, 6 or 24. Default: 1 |
--json | Output 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.
| Option | Description |
|---|---|
--json | Output as JSON |
elula health || echo "app is down"
elula scan
Show the latest dependency and secret scan: vulnerable packages and leaked secrets.
| Option | Description |
|---|---|
--run | Start a new scan instead of showing the latest |
--json | Output 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.
| Subcommand | Description |
|---|---|
access public | Make 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-public | Ask a workspace owner or admin to make the app public. Recorded in the audit log |
access withdraw | Withdraw your pending request |
access private | Make the app private again |
elula access elula access request-public elula access private
elula collaborators
Manage who can view or edit the linked app.
| Subcommand | Description |
|---|---|
collaborators list | List collaborators. Options: --json |
collaborators add EMAIL | Add a collaborator, or change their role. Option: --role ROLE, viewer (default) or editor. The person must have signed in to Elula once |
collaborators remove EMAIL | Remove 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.
| Subcommand | Description |
|---|---|
approvals approve APPROVAL_ID | Approve a request (ID or ID prefix) |
approvals deny APPROVAL_ID | Deny 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.
| Option | Description |
|---|---|
--no-wait | Start the run and return right away |
elula job run elula job run --no-wait
elula job list
List recent job runs and their status.
| Option | Description |
|---|---|
--limit INTEGER | Number of runs to show |
--json | Output 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.
| Subcommand | Description |
|---|---|
schedule list | List schedules. Options: --json |
schedule add | Add a schedule. Options: --cron TEXT (required), --timezone TEXT (IANA name, default UTC), --description TEXT, --enabled / --no-enabled (default enabled) |
schedule update SCHEDULE_ID | Change a schedule. Options: --cron TEXT, --timezone TEXT, --description TEXT |
schedule pause SCHEDULE_ID | Stop a schedule from firing without deleting it |
schedule resume SCHEDULE_ID | Resume a paused schedule |
schedule delete SCHEDULE_ID | Delete 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.
| Subcommand | Description | |
|---|---|---|
pages publish PATH | Publish 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 PATH | Replace a page's content and keep its URL. SLUG is everything after /p/. Option: --open | |
pages list | List your pages | |
pages open SLUG | Open a page in your browser | |
pages rm SLUG | Delete 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.
| Option | Description |
|---|---|
-f, --file FILE | Read the secret from a file |
--expires INTEGER | Minutes until it's deleted. Default: 1440 (24 hours). Max: 43200 (30 days) |
--max-views INTEGER | Delete after this many views |
--password TEXT | Require a password to view |
--to EMAIL | Only 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.
| Option | Description |
|---|---|
--password TEXT | Password, if the secret has one |
-o, --output PATH | Save 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.
| Subcommand | Description |
|---|---|
sends list | List your sent secrets, newest first. Options: --json |
sends status ID_OR_LINK | Check whether a secret is still available. Options: --json |
sends revoke ID_OR_LINK | Delete 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.
| Option | Description |
|---|---|
--copy | Copy to the clipboard instead of printing (uses pbcopy on macOS, xclip on Linux) |
elula docs elula docs --copy