mise dev --agent. This page covers what else you can start.
Run every command from the repository root. Each one starts the databases in Docker first, then runs your code with hot reload.
Choose how you sign in
--agent and --sim act as the user in DEV_USER (default dev@gaia.local). Run mise seed once so that user exists. Both refuse to start when ENV=production.
Be a different user
Be a different user
Start with
DEV_USER=alice@example.com mise dev --agent, and seed the same email with DEV_USER=alice@example.com mise seed.For a single request, send the header X-Dev-User: <email>.Script the replies with --sim
Script the replies with --sim
Put instructions in your message.
[[say:Hello!]] makes GAIA reply “Hello!”. [[tool:<name> {"arg": "value"}]] makes it call a tool first. A message without instructions gets a fixed reply.The format lives in tools/llm-stub/directives.py.Use the real sign-in flow
Use the real sign-in flow
Plain
mise dev shows the login page.- Team members use WorkOS with keys from Infisical:
mise infisical dev. - Outside contributors use
AUTH_MODE=local. SetNEXT_PUBLIC_GAIA_SELFHOST=trueinapps/web/.env, restart, then open localhost:3000/signup. The first account becomes the administrator.
Start more of GAIA
mise dev runs the API and web app. Everything else runs as its own process.
--agent and --sim work only on mise dev and mise dev:vm. The combined commands use the real sign-in flow. For skipped login plus the worker, run mise dev --agent and nx worker api in two terminals.
Why does mise dev:vm exist?
Why does mise dev:vm exist?
Workspace files use JuiceFS, which needs a FUSE mount that macOS and Windows processes can’t make. On plain
mise dev those features raise JuiceFSUnavailable. mise dev:vm runs the API in a Linux container where the mount works.It needs the R2 storage keys in apps/api/.env: R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY, R2_SECRET_KEY and JUICEFS_META_URL_TEMPLATE. Stop mise dev first, since both use port 8000.Ports and several checkouts
mise dev stops if port 8000 or 3000 is taken, and names the process holding it.
To run a second checkout at the same time, such as another git worktree, run this in it:
.env.worktree with free ports, and mise loads it for every task. Delete the file to go back to the defaults. Both checkouts share the same databases.
The databases
mise bootstrap and every mise dev* command start these in Docker.
Your data survives restarts. Stop everything with
nx run docker:docker:down. See Docker for development for profiles and resetting data.
Next
Testing
Which tests to run for your change.

