# Quickstart (/quickstart)

<Steps>
<Step>
### Install [#install]

```bash
curl -fsSL https://setup.cuelo.dev/install | bash
```

On Windows: `powershell -c "irm setup.cuelo.dev/install.ps1 | iex"`. Homebrew,
uv, pip and Docker are covered in [Installation](/installation). Running
endpoints needs [uv](https://docs.astral.sh/uv/).
</Step>

<Step>
### Add your keys [#add-your-keys]

Cuelo reads credentials from a `.env` file in the current directory, or from
the environment. The defaults need a Smallest key for speech and one LLM key:

```bash title=".env"
SMALLEST_API_KEY=...
CEREBRAS_API_KEY=...      # or ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY
```

Every provider and its variable is listed in [Providers](/reference/providers).
</Step>

<Step>
### Start the default agent [#start-the-default-agent]

```bash
cuelo start
```

This serves the default agent and the dashboard on
[http://127.0.0.1:4141](http://127.0.0.1:4141) and opens the **Talk** page.
Pick a preset or write a prompt, press **Connect** and speak. The first start
downloads the turn-taking model weights.
</Step>

<Step>
### Look at the call [#look-at-the-call]

Open **Calls** in the dashboard. Each call has both audio channels, the
transcript, every turn-taking decision and a latency breakdown per turn. See
[Dashboard](/observe/dashboard).
</Step>

<Step>
### Own the code [#own-the-code]

When you want a fixed persona, your own tools or a different stack, create a
project:

```bash
cuelo init support-agent
cd support-agent
cuelo dev
```

`cuelo init` writes `config.cuelo` and generates the Python project.
`cuelo dev` serves it on `:4141`, regenerates when you save `config.cuelo`,
reloads when you change Python, and serves the dashboard on `:4142`. Continue
with [Projects](/build/projects).
</Step>
</Steps>

## Connect your own client [#connect-your-own-client]

The server speaks the [OpenAI Realtime API](/connect/realtime-api). With
the OpenAI SDK, point the base URL at Cuelo:

```python
from openai import AsyncOpenAI

client = AsyncOpenAI(base_url="http://127.0.0.1:4141/v1", api_key="unused")
async with client.realtime.connect(model="cuelo") as conn:
    await conn.session.update(session={"instructions": "You are a concise barista."})
    ...
```

Audio is PCM16 mono at 24 kHz in both directions.