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
~/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:
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.
How gaia.local works
How gaia.local works
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:
/etc/hosts.
gaia start
Start GAIA services in self-host mode.
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.
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.
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.
- Docker daemon is reachable
- Ports are free or already GAIA’s
- Containers for your setup are running
- API health answers
- Dependencies each answer, from
GET /health/ready - Setup readiness: plans seeded, AI provider configured, admin account created. Missing items are warnings
- Web is reachable
- 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)
- Memory Docker can use: fails under 6 GB, warns under 7.5 GB
- GAIA version: warns when your images aren’t the release this CLI ships
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
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.
~/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
command not found: gaia
command not found: gaia
Reinstall globally and open a new terminal session:
Running in a script or CI
Running in a script or CI
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.
