> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xano.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Profiles

> Manage multiple CLI profiles for different workspaces, branches, and environments

export const BrowserFrame = props => {
  const {url = "xano.run", maxWidth = 820, className = "", lightSrc, darkSrc, alt = "", children} = props || ({});
  const style = typeof maxWidth === "number" ? {
    maxWidth: `${maxWidth}px`,
    margin: "16px 0"
  } : {
    maxWidth,
    margin: "16px 0"
  };
  const hasSwapImages = Boolean(lightSrc && darkSrc);
  return <div className={`browser-frame ${className}`.trim()} style={style}>
      <div className="browser-frame__top">
        <div className="browser-frame__controls" aria-hidden="true">
          <span className="browser-frame__dot browser-frame__dot--red" />
          <span className="browser-frame__dot browser-frame__dot--yellow" />
          <span className="browser-frame__dot browser-frame__dot--green" />
        </div>
        <div className="browser-frame__address">{url}</div>
      </div>

      <div className="browser-frame__body">
        {hasSwapImages ? <>
            <img className="browser-frame__img--light" src={lightSrc} alt={alt} />
            <img className="browser-frame__img--dark" src={darkSrc} alt={alt} />
          </> : children}
      </div>
    </div>;
};

Profiles let you store multiple configurations and quickly switch between them. Each profile saves an access token, instance, workspace, and branch — so you can target different environments without re-authenticating.

<Tip>
  Working in a dedicated project directory? Pin it to a profile with a [project-local `profile.yaml`](#project-local-profile) so commands can't accidentally target the wrong workspace — without passing `-p` on every command.
</Tip>

## Profile Wizard

The profile wizard provides a step-by-step, interactive setup using an access token instead of browser-based login. This is useful for CI/CD environments, self-hosted instances, or when you prefer token-based auth.

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile wizard
  ```
</BrowserFrame>

<Steps>
  <Step title="Enter your access token">
    You'll be prompted to enter your Xano access token (input is hidden for security).

    You can generate an access token from your Xano account settings under **API Access**.
  </Step>

  <Step title="Select your instance">
    The CLI fetches all instances associated with your account. Choose the one you want to work with.

    ```
    ? Select an instance:
    ❯ My Production Instance (us-east-1)
      My Staging Instance (eu-west-1)
    ```
  </Step>

  <Step title="Name your profile">
    Give this profile a name. This lets you maintain multiple profiles for different environments.

    ```
    ? Profile name: (default)
    ```
  </Step>

  <Step title="Select a workspace">
    Choose a workspace from your instance, or skip to configure later.

    ```
    ? Select a workspace (or skip to use default):
    ❯ (Skip workspace)
      My App Backend (123)
      Marketing Site API (456)
    ```
  </Step>

  <Step title="Select a branch">
    If you selected a workspace and it has more than one branch, you'll be asked to choose a branch. Skip to use the live branch.

    ```
    ? Select a branch:
    ❯ (Skip and use live branch)
      v1
      v2-development
    ```
  </Step>
</Steps>

The profile is saved and set as your default. You can create additional profiles to quickly switch between workspaces, branches, or instances.

### Wizard for Other Environments

For self-hosted or beta environments, pass the `-o` flag:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile wizard -o https://my-xano.my-domain.com
  ```
</BrowserFrame>

You can also pre-set the profile name:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile wizard -n production -o https://my-xano.my-domain.com
  ```
</BrowserFrame>

If your instance uses a self-signed TLS certificate, add `--insecure` (`-k`):

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile wizard -o https://my-xano.my-domain.com --insecure
  ```
</BrowserFrame>

***

## List Profiles

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile list
  ```
</BrowserFrame>

Add `-d` for full details including origin URLs, workspace IDs, and masked tokens:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile list -d
  ```
</BrowserFrame>

***

## Create a Profile Manually

For scripting or CI/CD, create a profile directly without the interactive wizard:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile create my-profile \
    -t YOUR_ACCESS_TOKEN \
    -i https://your-instance.xano.io \
    -w WORKSPACE_ID \
    -b BRANCH_LABEL \
    --default
  ```
</BrowserFrame>

| Flag             | Description                                               |
| ---------------- | --------------------------------------------------------- |
| `-t`             | Access token (required)                                   |
| `-i`             | Instance origin URL (required)                            |
| `-a`             | Account origin URL (for self-hosted)                      |
| `-w`             | Workspace ID                                              |
| `-b`             | Branch label                                              |
| `-k, --insecure` | Skip TLS certificate verification (for self-signed certs) |
| `--default`      | Set as the default profile                                |

***

## Edit a Profile

Update any field on an existing profile:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile edit my-profile -w NEW_WORKSPACE_ID
  ```
</BrowserFrame>

To clear a field, use the corresponding `--remove-*` flag:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile edit my-profile --remove-branch
  xano profile edit my-profile --remove-workspace
  ```
</BrowserFrame>

You can also enable or disable insecure mode (self-signed certificate support) on an existing profile:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile edit my-profile --insecure
  xano profile edit my-profile --remove-insecure
  ```
</BrowserFrame>

When a profile has insecure mode enabled, all commands using that profile automatically skip TLS certificate verification.

***

## Get Default Profile

Print the name of the current default profile:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile get
  ```
</BrowserFrame>

***

## Switch Default Profile

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile set my-profile
  ```
</BrowserFrame>

***

## Verify Profile

Check that your profile is configured correctly:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile me
  ```
</BrowserFrame>

This calls the Xano API and returns a summary of your current setup — CLI version, account details, instance, workspace, and branch. Use `-o json` for the full JSON response.

***

## Print Access Token

Output the access token for the default profile (useful for piping to other commands):

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile token
  ```
</BrowserFrame>

***

## Print Workspace ID

Output the workspace ID for the default profile:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile workspace
  ```
</BrowserFrame>

***

## Change Workspace Interactively

Switch the workspace on a profile by selecting from a list of available workspaces:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile workspace set
  ```
</BrowserFrame>

To target a specific profile:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile workspace set -p production
  ```
</BrowserFrame>

***

## Delete a Profile

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile delete my-profile
  ```
</BrowserFrame>

Add `-f` to skip the confirmation prompt.

***

## Using a Profile for a Single Command

Override the default profile for any command with `-p`:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano workspace list -p staging
  ```
</BrowserFrame>

You can also set the `XANO_PROFILE` environment variable:

<BrowserFrame url="Terminal">
  ```bash theme={null}
  export XANO_PROFILE=staging
  xano workspace list
  ```
</BrowserFrame>

<Tip>
  To pin a profile for an entire project directory instead of per command, use a [project-local `profile.yaml`](#project-local-profile). The `-p` flag and `XANO_PROFILE` variable always take precedence over it.
</Tip>

***

## Project-local Profile

Pin a project directory to a specific profile by adding a `profile.yaml` file at its root. Any command run inside the project automatically uses the pinned profile — preventing accidental pushes to the wrong workspace when you forget `-p`.

The CLI discovers `profile.yaml` by searching the current directory and walking up through parent directories (the same way Git locates `.git`).

<Note>
  `profile.yaml` contains **no secrets**. It references a profile *by name* — the access token always stays in `~/.xano/credentials.yaml`. An `access_token` key in `profile.yaml` is rejected.
</Note>

### Generate one with `xano profile use`

<BrowserFrame url="Terminal">
  ```bash theme={null}
  xano profile use staging               # pin profile 'staging' for this project
  xano profile use staging -w 110        # pin and override the workspace
  xano profile use staging --gitignore   # also add profile.yaml to .gitignore
  ```
</BrowserFrame>

This writes a **self-documenting** `profile.yaml` — every overridable field is included as a commented example, so you can edit it without consulting the docs — and offers to add it to `.gitignore`, skipping that prompt when the file is already ignored.

| Flag                             | Description                                                           |
| -------------------------------- | --------------------------------------------------------------------- |
| `-w, --workspace`                | Override the workspace for this project                               |
| `-b, --branch`                   | Override the branch for this project                                  |
| `-i, --instance_origin`          | Override the instance origin URL                                      |
| `-a, --account_origin`           | Override the account origin URL                                       |
| `--gitignore` / `--no-gitignore` | Add (or skip adding) `profile.yaml` to `.gitignore` without prompting |

The generated file looks like this:

```yaml theme={null}
# Xano project-local profile — pins this project to a profile in ~/.xano/credentials.yaml.
# No secrets here: the access token always comes from credentials.yaml.
# Precedence: an explicit -p/--profile or XANO_PROFILE overrides this file entirely.

# Profile to use (a profile name from ~/.xano/credentials.yaml):
profile: staging

# Optional per-project overrides — uncomment and edit any you need:
workspace: 110
# instance_origin: https://your-instance.xano.io
# account_origin: https://app.xano.com
# branch: main
```

### Active-profile banner

When a `profile.yaml` is in effect, every command prints the active target so you always know what you're pointed at:

```
Using profile 'staging' (workspace 110) · profile.yaml
```

This banner is suppressed when you pass `--output json`.

### Selection precedence

The CLI resolves which profile to use in this order:

1. `-p, --profile` flag
2. `XANO_PROFILE` environment variable
3. `profile.yaml` (`profile:` field, plus any field overrides)
4. The default profile in `~/.xano/credentials.yaml`

An explicit `-p/--profile` flag or `XANO_PROFILE` variable **ignores `profile.yaml` entirely**.

<Note>
  The credential-management commands — `xano profile edit`, `xano profile me`, and `xano profile workspace set` — write to `credentials.yaml` and deliberately ignore `profile.yaml`, so a project pin can't redirect them.
</Note>
