---
title: "Installing a Beta"
url: "https://control.actana.ai/docs/install/installing-a-beta"
description: "Beta trains: the ref you fetch is the channel, what pins and what tracks, and the CLI-only beta."
updated: 2026-09-01T09:03:00+00:00
---

A beta train installs on metal the same way a release does — same two commands, same checksum verification, same layout. The only thing that changes is which URL you fetch the script from.

**The ref you fetch is the channel.** A script read off a pipe cannot see the URL it came from, so what it installs is decided by the copy of the file on that ref. There is no `--channel` option.

| Want | Fetch `install.sh` from | Installs |
| --- | --- | --- |
| the latest release | `…/actana/control/main/install.sh` | the release of the line `main` carries |
| a specific release | `…/actana/control/vX.Y.Z/install.sh` | that line's release. A release tag never moves, so this is a pin |
| the current beta of a line | `…/actana/control/beta/X.Y/install.sh` | that line's current beta — **or the newest release, if nobody has cut one yet** |
| the same beta, by tag | `…/actana/control/vX.Y.Z-beta/install.sh` | the same as the row above — an alias, **not** a pin |

`install.sh --help` names the line the copy you fetched carries. Which trains are open right now:

```bash
git ls-remote --heads https://github.com/actana/control | grep -i beta
```

**A train with no cut yet falls through to the newest release, quietly.** The script says so before it downloads: its first line is `Installing the Actana Core <version> for <target>.` A bare `x.y.z` where you expected `x.y.z-beta` is that fall-through.

```bash
curl -fsSL https://raw.githubusercontent.com/actana/control/beta/X.Y/install.sh | bash
actana setup
```

**A beta version is `x.y.z-beta`, exactly.** The beta of the `X.Y` line is `X.Y.Z-beta`. There is no counter, dotted suffix, run number, or short sha after the word `beta`. Anything with something appended after `beta` is not a version this project publishes, and `--version` will not find it.

A beta lands **beside** the release of its line (`versions/x.y.z-beta`), not on top of it. When the line promotes, the train branch is deleted — a `beta/X.Y` URL that 404s is the line having shipped; install the release from `main`.

## The only way to pin a beta is `--version`

The two beta rows above are not pins. The `vX.Y.Z-beta` tag moves on every cut, and once the line has a release both rows install the release. The pinned form wins over everything:

```bash
curl -fsSL https://raw.githubusercontent.com/actana/control/main/install.sh | bash -s -- --version X.Y.Z-beta
actana setup
```

`ACTANA_VERSION=X.Y.Z-beta` does the same thing.

`actana update` does **not** follow a beta line. A bare `update` resolves the newest *release* and leaves a newer prerelease where it is. To take a newer cut of the same beta, re-run the one-liner from the train's ref. When that line's release is published, `actana status` says so; that `update` is what moves you onto it.

## A CLI-only beta, without a Core

The npm registry carries **releases only** — `@actana/cli` never has a beta. The beta CLI ships on the GitHub release as an npm tarball:

```bash
npm install -g https://github.com/actana/control/releases/download/vX.Y.Z-beta/actana-cli-X.Y.Z-beta.tgz
```

Every release asset has a `.sha256` beside it; verify before installing:

```bash
curl -fsSL https://github.com/actana/control/releases/download/vX.Y.Z-beta/actana-cli-X.Y.Z-beta.tgz.sha256 | shasum -a 256 -c -
```

`actana --version` should print `x.y.z-beta`. This installs the `actana` command only — no Core bundle, nothing running. A machine with the CLI and no `actana setup` is a pure client: it drives Cores elsewhere (a Docker Compose stack on this machine, or a remote Core) and never becomes a Core itself. The `install.sh` door above is the full-bundle door — it places the Core bundle too, and stops before `actana setup` activates it.

## macOS stock bash

On macOS, `curl … | bash` can fail with `asset…: unbound variable` — the stock bash 3.2 mis-parses the script. Workaround in [Troubleshooting](/docs/install/troubleshooting).

## See also

- [Install in one command](/docs/install/install-core)
- [actana setup](/docs/install/actana-setup)
- [Operating a Core](/docs/core/operating)
- [Install](/docs/install)
