Prefer to run nao on your own infrastructure? See the Deployment Guide. The organization and project model below is the same in both.
Step 1: Create your account
Go to app.getnao.io/signup and sign up with email and password, or with Google. On your first sign-in, nao automatically creates a workspace (your organization) with you as its admin - there is no separate setup wizard. If you sign up with a Google address whose domain already has a nao Cloud workspace, you can be added to that existing workspace instead. Already have an account? Sign in at app.getnao.io/login.Step 2: Add your first project
A fresh workspace has no project yet. A project holds one agent’s context, data connections, chats, and members. There are two ways to create one.Option A: Import from GitHub
If your nao project already lives in a GitHub repository (a folder containingnao_config.yaml), import it straight from the browser:
- From the empty-project screen, choose Import from GitHub.
- Authorize the nao GitHub app on the account or organization that owns the repo.
- Pick the repository and branch that holds your
nao_config.yaml.
The repository picker only lists repos the nao GitHub app can access. If yours isn’t listed, add it to the app’s installation on GitHub.
Option B: Deploy from the CLI
If you build context locally with the CLI, push it to your workspace withnao deploy.
-
Build your project locally - see the Quickstart:
- In the Cloud UI, open Settings -> Organization Settings, find the Organization API Keys card, and click Create key. Copy it - it’s shown only once.
-
From the project folder, deploy to your Cloud workspace:
project_name in nao_config.yaml. Deploying a new name creates a project; deploying an existing name replaces its context in place.
See the nao deploy reference below for all command flags, default exclusions, .naoignore, and create-vs-update behavior.
Step 3: Configure the project
Your data connections, rules, and semantics are defined innao_config.yaml and your context folder - edit them locally and re-deploy (or push to the connected Git branch). A few things are set directly in the Cloud UI:
- Environment variables and budgets - open Settings -> Project Settings & Budget.
- Models and agent capabilities - open Settings -> Agent, then choose the Models or Capabilities tab.
- MCP servers - open Settings -> Agent -> MCP servers.
- Messaging integrations - open Settings -> Integrations & MCP, then choose Slack, Teams, Telegram, WhatsApp, or Mattermost.
Context Builder
Structure the databases, repos, rules, and semantics your agent reads from
Step 4: Invite your team
Add teammates from Settings -> Members: invite by email and pick a role. Each new member signs in with their email and the generated password. Members join projects to get access to that project’s chats, context, and data - manage each project’s members under Settings -> Team. For roles and permissions, see Admin Setup.On Cloud, users who sign in with a Google address on your workspace’s claimed domain can join automatically - no manual invite needed.
Step 5: Start chatting
Open your project and ask a question in plain English. The agent uses your project’s context to write SQL, run it against your connected warehouse, and return results and charts.nao deploy reference
Thenao deploy command packages a local nao project and uploads it to a remote nao instance. It is the bridge between a project built locally with nao init / nao sync and a Cloud (or self-hosted) instance that runs chats, scheduled jobs, and integrations against that project.
Prerequisites
- A remote nao instance URL (Cloud workspace or your self-hosted deployment).
- An organization-level API key - create one from Settings -> Organization Settings -> Organization API Keys (see Step 2, Option B).
- A local project with a valid
nao_config.yamlthat has aproject_namefield.
Command
Run from the project directory (the folder that containsnao_config.yaml), or point at it with --path:
What gets uploaded
nao deploy builds a gzipped tarball of the project folder and uploads it to <url>/api/deploy. The server extracts the archive, reads project_name from nao_config.yaml, and either creates a new project or updates the existing one with the same name.
These paths are always skipped when building the archive: .git, .venv, .env, node_modules, __pycache__, repos, *.pyc.
Add a .naoignore file at the project root to exclude extra files (one pattern per line, # for comments):
Create vs update
The server looks up a project by(organization, project_name):
- If no project with that name exists, a new one is created (
status: "created"). - If one already exists, its context folder is replaced with the uploaded content (
status: "updated").
Errors
Authentication failed. Check your API key.- the API key is missing, revoked, or does not belong to the target organization.No nao_config.yaml found in current directory- run from a project root or pass--path.nao_config.yaml is missing a 'project_name' field- addproject_name: my_projectat the top ofnao_config.yaml.Could not connect to <url>- check the URL and that the instance is reachable from your network.
What’s next
Context Builder
Structure the databases, repos, rules, and semantics your agent reads from
Host multiple projects
Run several projects in one workspace with a project switcher
Git Repository Setup
Automate context deploys with GitHub Actions
Chat Interface
Stories, memory, automations, and admin tools