One prompt.
Live for every user.
Pull your Whaly org as YAML, let your coding agent edit it, push it back to your users.
$ curl -fsSL https://cdn.whaly.io/wlyctl/install.sh | bash
- macOS
- Linux
- Windows via WSL
- 1wlyctl pull
- 2Coding agent edits YAML
- 3wlyctl push
- 4Live for your users
Works with your coding agent
Bring the agent you already use.
wlyctl is plain files and a CLI. Any agent that can edit a file and run a command can drive the loop, and every pull hands it the same guide to the Whaly format.
- Claude Code
$ claude - Codex
$ codex - GitHub Copilot
$ copilot - Cursor
$ cursor-agent - Gemini CLI
$ gemini - Mistral Vibe
$ vibe
Or any other agent that edits files and runs shell commands.
How it works
Pull, prompt, push. Then do it again.
Every change to a Whaly org becomes a small edit to a text file. That is the format coding agents are best at. wlyctl handles the round trip to the server.
- 1
Pull
wlyctl pull mirrors the org into the folder: one YAML file per object, link, layout and source, plus your dbt models. It also writes CLAUDE.md and a using-wlyctl skill, so the agent knows the format before you type a prompt.
- 2
Prompt your coding agent
Ask for the change in plain words. The agent edits the YAML and SQL, runs wlyctl diff to see exactly what would change, and fixes what is blocked.
- 3
Push
wlyctl push shows one plan and asks once. It applies in dependency order and records what it wrote, so the next pull starts clean. Commit, and start the next turn.
Remotes
One folder. Every environment.
A workspace holds one customer's configuration and talks to as many Whaly orgs as you add. Build on dev, validate on uat, ship to prod, all from the same files.
version: 1 remotes: dev: org: acme-dev uat: org: acme-uat warehouse: wh_88Zq prod: org: acme warehouse: wh_91Kd protected: true warehouseMap: databases: { acme-uat: acme-prod } default: uat
Each command targets the default remote unless you name one. Files are keyed by referenceId, which is the same in every org, so the folder you pulled from uat pushes cleanly to prod.
$ wlyctl remote add dev acme-dev $ wlyctl push dev # try it on dev $ wlyctl diff -r prod # preview prod $ wlyctl push -r prod # type the org name to confirm
From uat to your users
A person signs off before prod.
The agent's work lands on uat first. Someone checks it in the Whaly app, then pushes the same files to production, where your end users see it.
-
1
uat is updated
The loop ends with a push to the default remote.
uat · acme-uat$ wlyctl push Apply 2 document(s) to 'uat'? y ✓ objects/account.yaml ✓ layouts/account/account-record.yaml
-
2
You review it
Open uat in the Whaly app. Check the model and metric in the Workbench, then the account page in the Workspace.
uat · acme-uat- Workbenchrevenue-30d computes
- Workbenchtotals match the warehouse
- WorkspaceKPI shows on the account page
-
3
Push to production
Same folder, same files. Prod is protected, so you type the org name to confirm.
prod · acme$ wlyctl push -r prod Type "acme" to confirm: acme Apply 2 document(s) to 'prod'? y ✓ 2 documents updated
-
4
Your users see it
They open an account and the new KPI is there.
live for end usersOrders, last 90 days14Revenue, last 30 days48 210 €
What it manages
The whole project, in one tree.
Everything that defines a Whaly project is a file you can read, review in a pull request and roll back with git.
acme/ ├── wlyctl.yaml # remotes ├── CLAUDE.md # agent guide ├── .claude/skills/using-wlyctl/ ├── sources/hubspot.yaml ├── models/ │ ├── 1-core/stg-orders.{sql,yml} │ └── 2-marts/fct-orders.{sql,yml} ├── objects/ │ ├── account.yaml │ └── order.yaml ├── object-links/account-orders.yaml ├── layouts/account/account-record.yaml ├── agents/account-coach.yaml └── document-templates/account/account-review.yaml
- SourcesConnectors and the tables they sync
- Modelsdbt SQL with a generated project; run, preview and roll back
- ObjectsProperties, dimensions, metrics and relationships
- Object linksHow records relate across objects
- LayoutsRecord pages and emails, widget by widget
- AgentsThe assistants configured in your org
- Document templatesGenerated documents attached to objects
- Renames and checkswlyctl mv renames everywhere; wlyctl doctor finds dangling references
Start your first loop.
- macOS
- Linux
- Windows via WSL
$ curl -fsSL https://cdn.whaly.io/wlyctl/install.sh | bash
- 1
Log in
$ wlyctl login - 2
Clone your org
$ wlyctl clone https://app.whaly.io/acme
Paste your org's URL from the browser. Creates ./acme and pulls it.
- 3
Start your agent
$ cd acme && claudeOr codex, copilot, gemini…