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

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.

prod dev WHALY ORG acme-uat WORKSPACE objects/*.yaml layouts/ models/*.sql CLAUDE.md 1 wlyctl pull 3 wlyctl push reads the agent guide edits YAML AGENT 2 prompt it, then let it check its work with wlyctl diff you approve the push
prod dev WHALY ORG acme-uat 1 pull 3 push you approve WORKSPACE objects/*.yaml layouts/ models/*.sql CLAUDE.md reads the guide edits YAML AGENT 2 prompt it
  1. 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. 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. 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.

wlyctl.yamlcommitted, no secrets
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
devacme-dev
uatacme-uatdefault
prodacmeprotected

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

    uat is updated

    The loop ends with a push to the default remote.

    $ wlyctl push
    Apply 2 document(s) to 'uat'? y
    ✓ objects/account.yaml
    ✓ layouts/account/account-record.yaml
    uat · acme-uat
  2. 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.

    app.whaly.io/acme-uat
    • Workbenchrevenue-30d computes
    • Workbenchtotals match the warehouse
    • WorkspaceKPI shows on the account page
    uat · acme-uat
  3. 3

    Push to production

    Same folder, same files. Prod is protected, so you type the org name to confirm.

    $ wlyctl push -r prod
    Type "acme" to confirm: acme
    Apply 2 document(s) to 'prod'? y
    ✓ 2 documents updated
    prod · acme
  4. 4

    Your users see it

    They open an account and the new KPI is there.

    Maison Durand
    Orders, last 90 days14
    Revenue, last 30 days48 210 €
    live for end users

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 pull
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. 1

    Log in

    $ wlyctl login
  2. 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. 3

    Start your agent

    $ cd acme && claude

    Or codex, copilot, gemini…