# How to Run a Self-Hosted AI Agent with nanobot

This guide sets up nanobot as a self-hosted AI agent runtime on your own
machine or server. The result is a gateway process that can serve the WebUI,
chat apps, automations, and API integrations.

## What you will build

- a nanobot config and workspace under your control
- a model provider connected through `config.json`
- a long-running `nanobot gateway`
- optional browser, chat app, and API access

## When to use this

Use this path when you want local or server-side ownership of the agent process,
workspace files, memory files, and provider keys. It is also the right path when
the agent must keep running after one terminal command finishes.

## Install

```bash
python -m pip install nanobot-ai
nanobot onboard --wizard
nanobot agent -m "Hello!"
```

Complete the CLI check before deploying the gateway. A deployment problem is
much easier to debug after the provider and model are known to work.

## Minimal working example

For chat apps, automations, and WebSocket delivery, start the gateway:

```bash
nanobot gateway
```

For the browser surface, use the WebUI launcher instead. It can start and manage
the local gateway for you:

```bash
nanobot webui
```

Or connect a channel in `~/.nanobot/config.json`, then keep the same gateway
process running for messages.

## Production notes

- Use Docker, systemd, or a macOS LaunchAgent when the process should survive
  terminal exits.
- Give every deployed instance a distinct config path, workspace path, and port
  set.
- Keep secrets in environment variables and start the service from the same
  environment.
- Use health checks against the gateway or API process, not chat app delivery as
  the only signal.

## Security notes

- Bind local-only services to `127.0.0.1` unless you intentionally expose them.
- Set an API key before binding the OpenAI-compatible API to a public interface.
- Prefer pairing for DM-capable chat apps, and keep any static `allowFrom`
  allowlists strict.
- Enable `tools.restrictToWorkspace`; on Linux, use the bubblewrap sandbox for
  shell execution.

## Troubleshooting

- Run `nanobot status` with the same `--config` and `--workspace` flags used by
  the service.
- Run `nanobot gateway --verbose` while debugging channel startup.
- Check port conflicts if the WebUI, WebSocket channel, or API endpoint fails to
  bind.

## Related nanobot docs

- [Deployment](../deployment.md)
- [Multiple Instances](../multiple-instances.md)
- [Configuration](../configuration.md)
- [Chat Apps](../chat-apps.md)
- [OpenAI-Compatible API](../openai-api.md)
