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

> ## Agent Instructions
> Unmute compiles to exactly three targets. Pipecat and LiveKit are code targets: compile writes a Python project you run. SLNG is a hosted target: compile writes a deployment body and SLNG runs the agent, so it has no `unmute dev`. Those three are the only values `provider` accepts in `targets.yaml`. Deepgram and ElevenLabs appear in these docs as model vendors, which is not the same thing as a target, and `slng` is both.
> The Go structs in `internal/spec` and `internal/ir` are the schema truth. Check a field against them, or run `unmute validate`, rather than against what you remember.

# unmute dev

> Every flag, with defaults, and what the command does not do.

```text expandable wrap theme={null}
$ unmute dev --help
Compile, run the agent locally, and talk to it in the browser.

With no agent-dir, the package is the current directory, so you can cd into an agent and run this with no arguments.

Usage:
  unmute dev [agent-dir] [flags]

Flags:
      --bot-port string      host port for the local agent runtime (with Compose, UNMUTE_DEV_PORT) (default "7860")
  -h, --help                 help for dev
      --no-open              do not open the browser automatically
      --port string          port for the local dev UI (default "8765")
      --source stringArray   seed a fact the call carries: --source from_number=+34600111222 (repeatable; the local stand-in for a caller ID, read by prefetch)
      --target string        target instance name (required without a TTY when multiple exist)
      --var stringArray      seed an input variable for this session: --var name=value (repeatable; the local stand-in for the dispatch payload)
      --verbose              follow container/agent logs on stderr (default: write to the log file only)
```

## One mode: the browser

`unmute dev ./agent` compiles the package, starts the selected target's runtime,
and opens a page you talk through. Pipecat runs under `uv`; LiveKit runs under
Docker Compose. That is the whole command.

There is no phone mode. A phone call reaches an agent that is deployed, so
telephony is tested after you deploy: `unmute compile ./agent`, deploy the
emitted project, then call the number. The emitted `README.md` has the setup
steps for the route you chose.

## Flags in detail

<ResponseField name="--target" type="string">
  The target instance name, exactly one. Not needed when the package declares a
  single target. With several targets, a terminal gets a picker and a non
  terminal gets an error listing the choices. Unlike `validate` and `compile`,
  this flag is not repeatable.
</ResponseField>

<ResponseField name="--port" type="string" default="8765">
  The port of the local page you talk through. Left unset, a busy default gives
  way to a free port, and the printed URL names it.
</ResponseField>

<ResponseField name="--bot-port" type="string" default="7860">
  The host port the agent uses. Pipecat passes it to the local `uv` process.
  Compose paths receive it as `UNMUTE_DEV_PORT`. Left unset, a busy default
  gives way to a free port.
</ResponseField>

<ResponseField name="--no-open">
  Do not open the browser. The URL is still printed.
</ResponseField>

<ResponseField name="--verbose">
  Follow the container and agent logs on standard error. Without it, they go
  only to `build/<target>/dev.log`.
</ResponseField>

<ResponseField name="--var" type="name=value">
  Seed an input variable for this session. Repeatable. Only variables declared
  with `source: call_start` can be seeded; values are parsed against the
  declared type, and an undeclared name is refused. This is the local stand in
  for the dispatch payload production sends.
</ResponseField>

<ResponseField name="--source" type="name=value">
  Seed a fact the call itself carries, such as the caller's number. Repeatable.
  Only the eight facts a call carries are accepted (`from_number`, `to_number`,
  `call_id`, `direction`, `carrier`, `connection`, `session_id`, `stream_id`); a
  name that is not one is refused. This is the local stand in for a caller ID.

  It seeds the **fact**, which a `prefetch:` entry then reads, so the run
  exercises the pre-fetch, the confirmation marking and the read back. On a real
  call the carrier's own value wins: a seed only fills in what the route gave
  nothing for.

  `--source` and `--var` are different flags for different jobs. Do not reach for
  `--var` to seed a caller's number: that writes the variable directly, skips the
  pre-fetch, marks nothing as awaiting confirmation, and lets a local run act on a
  number it never read back. The run would pass a path a real call fails.
</ResponseField>

## Flags that were removed

`--telephony`, `--carrier`, `--public-url`, `--to` and `--no-webhook` ran a
phone call on this machine. They are gone, and passing one now gets cobra's
`unknown flag` error.

There is no local replacement for them. Telephony is verified on a deployed
agent: `unmute compile ./agent`, deploy the emitted project, follow the
Telephony setup section of its README, then call your number.

## Errors it checks first

```text wrap theme={null}
unmute: dev examples/salon-concierge: multiple targets declared; pass --target <name>: livekit (livekit), pipecat (pipecat)
unmute: dev examples/salon-concierge: target instance "nope" is not declared
```

Both are checked before a local process or Docker is touched.

## Environment

The run's environment is your shell, then `.env` and `.env.local` in the current
directory, then `.env` and `.env.local` in the package directory. Later files
win. When the current directory is the package directory, each file is read
once.

## Cleanup

Ctrl-c stops the Compose stack or the direct `uv` process. Named data volumes
are kept.

## Where to go next

<Columns cols={2}>
  <Card title="unmute resources" icon="list" href="/reference/cli/resources">
    List what your SLNG organisation offers before you write a name.
  </Card>

  <Card title="Telephony" icon="phone" href="/telephony/overview">
    How a phone call reaches a deployed agent.
  </Card>
</Columns>
