# CLI

Flow CLI allows you to interact with the Flow API via the command line. It supports most functionality found in the control panel. You can create, configure, and destroy Flow resources like Instances, Security Groups, Networks and more. We will add Mac Bare Metal and Object Storage support soon.

### Installation

The CLI is written in Go and the source code is public available: <https://github.com/flowswiss/cli>\
If you have GoLang installed, you can download and install the CLI with

```
go get github.com/flowswiss/cli/cmd/flow
```

otherwise, you will need to download the [Go](https://golang.org) executable for your system.

### Usage

After downloading you first of all need to authenticate the cli with your username and password. **Warning**: those credentials will be stored in `$HOME/.flow/credentials.json`

```
flow auth login --username 'USERNAME' --password 'PASSWORD'
```

alternatively you can also pass `--username USERNAME` and `--password PASSWORD` to every other command or set the environment variables `FLOW_USERNAME` and `FLOW_PASSWORD` to avoid the credentials getting stored in your home directory.

Once you have successfully logged in into your account, you can start manipulating things in your organization. As a first step it would be a good idea to upload your personal ssh key onto our platform. You will need this for every linux virtual machine you deploy.

```
flow compute key-pair create \
    --name 'My first key pair' \
    --public-key ~/.ssh/id_rsa.pub
```

Just to test things out, you can try creating an ubuntu virtual machine using the previously uploaded key pair:

```
flow compute server create \
    --name 'My first virtual machine' \
    --location 'ALP1' \
    --image 'ubuntu-20.04' \
    --product 'b1.1x1' \
    --key-pair 'My first key pair'
```

Further usage manuals can be found in the application itself using the `-h` or `--help` flags or in our usage documentation found [here](https://github.com/flowswiss/cli/blob/master/docs/usage.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.flow.swiss/developer-center/cli.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
