Skip to main content
Every gaia command for running your own GAIA. Contributor commands (gaia init, gaia setup, gaia dev) are in the developer CLI docs.
gaia bridge lets the agent run commands on a machine. See Device Bridge.

gaia up

Installs and starts GAIA. It needs Docker, not Git. On a fresh machine it downloads this release’s setup files into ~/gaia. GAIA is served on one port: the web app at / and the API at /api/v1. Before anything downloads, gaia up checks the machine: enough memory and disk (the same limits as gaia doctor), Docker Compose new enough, the ports free, and for --domain that its DNS points here. A DNS mismatch is a warning, never a stop, since DNS may still be changing. Options:
A later gaia up without --domain keeps serving the domain an earlier run set. Until its certificate arrives, the ready card sends you to http://localhost on the server, and gaia status shows the certificate on its HTTPS row. On Linux, if your user can’t reach Docker, gaia up adds it to the docker group and relaunches itself, so the same command finishes.

gaia.local on your network

Without --domain, gaia up also names GAIA http://gaia.local, so phones and other computers on your network open it by name. If another GAIA on the network already has it, this one takes gaia-2.local (up to gaia-9.local) and keeps that name on later runs. --no-local-name turns it off.
It uses portless. gaia up installs it with npm (Node.js 24 or newer) and, on Linux, avahi-utils. Its proxy runs as a startup service on plain HTTP port 80, so other devices see no certificate warning. On Linux, a small gaia-local-name-ipv6 service also announces the host’s IPv6 address, so Apple devices don’t wait about 5 seconds per lookup. The service runs as root, so gaia up asks for your sudo password the first time.If the name can’t be set up (port 80 taken, avahi not running, old Node.js), gaia up still finishes and says why. With --domain there is no gaia.local, because Caddy needs port 80.

A local domain with HTTPS

A --domain that no public authority can certify (.test, .internal, .home.arpa, .local, .localhost, .example, .invalid) gets a certificate from Caddy’s own authority. Devices warn until they trust its root. Copy the root with:
Each device must also resolve the name to the server, for example with a line in /etc/hosts.

gaia start

Start GAIA services in self-host mode.
Options:
In developer mode, use gaia dev instead of gaia start.

gaia logs

Stream logs for currently running services.
  • Self-host mode: streams Docker service logs.
  • Developer mode: streams Docker logs and, when available, app logs.

gaia stop

Stop running GAIA services.
Options:
By default, gaia stop runs in safe mode and only targets GAIA-managed processes.

gaia status

Check health and latency of GAIA services and of every backing service the API depends on.
It also calls the API’s GET /health/ready and lists MongoDB, PostgreSQL, Redis, RabbitMQ and ChromaDB with latency and, on failure, the error and a command to inspect it.

gaia doctor

Diagnose a GAIA installation: docker, services and setup checks.
Runs these checks in order and prints a mark for each, with the fix on the next line when one fails or warns:
  1. Docker daemon is reachable
  2. Ports are free or already GAIA’s
  3. Containers for your setup are running
  4. API health answers
  5. Dependencies each answer, from GET /health/ready
  6. Setup readiness: plans seeded, AI provider configured, admin account created. Missing items are warnings
  7. Web is reachable
  8. Disk on Docker’s data root: fails under 2 GB free (15 GB before the first install, for the images), warns under 5 GB (18 GB)
  9. Memory Docker can use: fails under 6 GB, warns under 7.5 GB
  10. GAIA version: warns when your images aren’t the release this CLI ships
Checks that depend on an earlier failure are listed as “Not checked” with the reason. Each bot you added gets its own row. It exits 1 only when a blocking check fails, so setup warnings never break scripts or CI. Output is plain text, ready to paste into a bug report:

Port Conflict Handling

If a port GAIA needs is taken, gaia up names the program holding it and moves GAIA to the next free port, saying so. In a script without --yes it stops instead and names the --web-port to pass. Ports you chose — --web-port, or 80 and 443 for --domain — never move: gaia up stops and says what holds them. The choice is saved to infra/docker/.env and reused by gaia start, gaia logs and gaia status.

Upgrading

Updating GAIA

Each CLI version ships one tested GAIA release. gaia update downloads and checks that release, pulls its images, swaps in its setup files, pins GAIA_VERSION in infra/docker/.env and restarts. If the download or pull fails, nothing changes. Volumes, .env files and backups/ stay. To get a newer GAIA, update the CLI first, then run gaia update. Installs from an older gaia up are converted on their next update. See Upgrades.

Updating the CLI


gaia uninstall

Remove GAIA from this computer.
It asks before removing anything, then separately whether to delete your data (default no). Before deleting, it offers a backup to ~/gaia-backups. It removes GAIA’s containers, networks and images, the gaia.local name, the install folder and ~/.gaia. Kept data stays in its Docker volumes, with the .env files that unlock it, so a later gaia up picks it back up. Options: It only removes the install gaia up recorded, and refuses a development copy. Last, remove the CLI itself:

Troubleshooting

Reinstall globally and open a new terminal session:
Without a terminal the self-host commands print plain text, one line per step, and never wait for input (the developer wizards gaia init and gaia setup still need one). Pass --yes to let gaia up install Docker and move taken ports on its own.