Why a CLI
The editor is great. Some jobs still belong in a terminal.
Fifty pages to update, a review before it goes live, a repeatable deploy. Clicking through a GUI is the slow way to do all three.
ElasticFunnels CLI
Meet ef, the ElasticFunnels CLI. Pull your pages, components, backend scripts, and assets into a folder, edit them in Cursor or any editor, and push them back. Let Claude Code, Codex, or your own scripts build and ship the whole funnel.
npm i -g @elasticfunnels/cli ยท Requires Node.js 18 or newer
$ npm i -g @elasticfunnels/cli $ ef init # bind this folder to a brand $ ef pull # pages, components, scripts, assets ✓ Pulled 214 pages, 32 components, 9 scripts, 140 assets $ ef push pages/pricing.ef --direct ✓ Published pricing.ef (revision 8f2a1c)
Why a CLI
Fifty pages to update, a review before it goes live, a repeatable deploy. Clicking through a GUI is the slow way to do all three.
Changing one line across forty landing pages by hand is an afternoon. A loop over ef push is a coffee.
Edits in a builder go straight to the page. With files on disk you branch, open a PR, and merge to publish.
Claude Code and Codex do not use a mouse. They need a command that speaks JSON and returns a clean exit code.
Three commands to live
No dashboard tour. The folder you bind is interchangeable with the VS Code extension.
npm i -g @elasticfunnels/cli and run ef --help. One binary, two dependencies, Node 18 or newer.
ef init stores your brand and API key in .ef/, then adds it to .gitignore so a key never lands in a commit.
ef pull brings everything down. Edit in any tool. ef push sends it back, with a 409 guard if the server moved on.
What ef does
One tool for pages, components, backend scripts, assets, products, and variables.
Build with AI agents
Point Cursor, Claude Code, or Codex at the folder and it drives ef directly: create a page, edit the copy, publish. Clean, predictable output keeps the agent on track.
--json on every command. Data on stdout, logs on stderr, so pipes stay clean.
Stable exit codes: 0 success, 3 auth, 4 conflict, 5 network, 7 not found. Scripts branch on results.
ef push --dry-run prints the plan without touching the server or your disk.
Optimistic concurrency: a stale push returns 409 and exits 4 instead of clobbering newer work.
ef diff shows local-vs-server drift before you push a thing.
$ ef list pages --json | jq '.[] | {id, slug}' { "id": 10633, "slug": "changelog" } { "id": 10650, "slug": "platform/split-testing" } $ ef push --all --dry-run plan: 3 create, 11 update, 0 delete $ ef push pages/about.ef # server moved on ! conflict (409) pull first, then retry $ echo $? 4
CI/CD
Keep your pages in Git. Wire one step into GitHub Actions and every merge to main publishes. Roll back by reverting a commit.
Authenticate with EF_API_KEY, no interactive login on the runner.
Preview branches with --draft, publish main with --direct.
Fast on big brands: pulls and pushes run with bounded concurrency.
name: Deploy funnels on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm i -g @elasticfunnels/cli - run: ef push --all --direct env: EF_API_KEY: ${{ secrets.EF_API_KEY }}
Same files as the extension
The CLI writes the exact efmeta headers the VS Code extension does, into the same folder shape. Prefer the editor some days and the terminal others.
Identical elasticfunnels/ tree: pages, components, scripts, assets, variables.
A .ef file saved by either tool round-trips byte-for-byte.
Optional .ef syntax highlighting for Cursor, VS Code, and VSCodium via ef install-highlighter.
your-funnel/ โโ .ef/ # config + API key (git-ignored) โโ elasticfunnels/ โ โโ pages/ โ โโ components/ โ โโ scripts/ โ โโ assets/ โ โโ variables.json โโ .gitignore
FAQ
Common questions about running ElasticFunnels from the terminal, CI, and AI coding agents like Claude Code, Codex, and Cursor.
Yes. Run ef init to bind a folder, then let Claude Code run ef pull, edit the .ef files, and ef push. It creates, edits, and publishes pages the same way you would by hand.
Yes. The Cursor agent runs ef straight from the terminal, and ef install-highlighter adds .ef syntax highlighting to Cursor, VS Code, and VSCodium.
Yes. Every command takes --json and returns a stable exit code, so Codex, Claude Code, or any agent can branch on the result and publish with ef push --direct.
ef push uses optimistic concurrency. A stale push returns a 409 and exits 4 without writing, so the agent pulls, merges, and retries instead of clobbering newer work.
Set EF_API_KEY once in the environment. The key is stored in .ef/auth (chmod 600), never prints to stdout, and .ef/ is git-ignored automatically.
Pages, components, backend scripts, assets, products, and brand variables, so an agent can scaffold a whole funnel end to end from one folder.
Keep going
Every published version of @elasticfunnels/cli, newest first.
Command reference, auth model, drift detection, and CI recipes.
Read the docs โInstall @elasticfunnels/cli globally. Built-in TypeScript types.
Published for transparency and security review. Open an issue any time.
Browse the repo โStart Building
Create a free brand, run ef init, and pull it into your terminal in under two minutes.