Getting started
Bestie is a local-first AI companion and controlled action runtime. Install it locally, connect an LLM provider, verify the setup with Doctor, then use terminal chat, channels, cron, tools, memory, and the local web console from the bestie CLI.
Use the public npm package for normal installs.
Run onboarding. Store secrets in `~/.bestie/.env`, not in config JSON.
Run Doctor before trusting chat, channels, cron, memory, MCP, or tools.
Use chat, Telegram, Zalo, cron, daemon/service, and `bestie ui` when the local runtime is healthy.
Prerequisites
Section titled “Prerequisites”- Node.js 24+ and npm.
- Permission to install a global npm package.
- An LLM provider supported by
bestie llm setup, such as OpenAI, Anthropic, Gemini, OpenRouter, Groq, Ollama, or a custom compatible endpoint. - An API key stored in
~/.bestie/.env, never in~/.bestie/config.json. - Optional: Telegram or Zalo bot credentials for channel runtimes.
At minimum, your env file should contain the variable referenced by the active LLM profile’s apiKeyEnv:
OPENAI_API_KEY=sk-your-key-hereUse the real key for your provider and keep it out of screenshots, logs, issues, and docs.
Secret rule: config files should name environment variables; only `~/.bestie/.env` should contain provider keys or bot tokens.
Install from npm
Section titled “Install from npm”npm install -g bestie-agentbestie onboardbestie doctorThe package exposes the bestie command.
Install with curl
Section titled “Install with curl”The source installer installs the npm package and then hands off to onboarding. Use it when you prefer the one-line bootstrap path:
curl -fsSL https://www.bestieagent.com/install.sh | bashIf you prefer to inspect the script first:
curl -fsSL https://www.bestieagent.com/install.sh -o install.shcat install.shbash install.shCommon setup commands
Section titled “Common setup commands”bestie --helpbestie onboardbestie onboard --skip-provider-testbestie llm providersbestie llm setup --provider openai --set-defaultbestie llm setup --provider gemini --set-defaultbestie llm test --model openai/gpt-4.1bestie statusbestie logsbestie doctorbestie doctor --jsonbestie doctor --fix--skip-provider-test creates local files without making the provider test call. Treat setup as incomplete until Doctor passes.
Start chatting
Section titled “Start chatting”Run terminal chat:
bestie chatUseful terminal chat commands:
/help/status/memory/memory pause/memory resume/pendingTry a small first message:
Summarize your current status in one sentence.Open the local web console
Section titled “Open the local web console”Bestie includes a local web console for runtime status, Doctor, providers, character, memory, channels, approvals, MCP, tools, and settings.
bestie uiFor terminal-only or smoke-friendly runs:
bestie ui --no-openbestie ui --port 8717bestie ui --port 0 --no-openThe UI uses the same ~/.bestie/ runtime files as the CLI and must not return raw .env values.
Add channels
Section titled “Add channels”Configure Telegram:
bestie channels telegram setupbestie channels telegram whoamibestie channels telegramConfigure Zalo:
bestie channels zalo setupbestie channels zalo --oncebestie channels zaloRun channel diagnostics:
bestie channels doctorbestie channels doctor --channel telegram --connectbestie channels doctor --channel zalo --connectRun background targets
Section titled “Run background targets”Use daemon mode for manual background processes:
bestie daemon start --channel telegrambestie daemon start --channel zalobestie daemon start --channel cronbestie daemon status --channel allUse the user service when the operating system should start configured targets for you:
bestie service installbestie service statusbestie service restartAvoid running daemon and service for the same target at the same time.
Verify the setup
Section titled “Verify the setup”bestie doctorbestie statusbestie memory statusbestie channels doctorA healthy first setup should have valid config, required env vars present, readable character files, writable logs, and a working provider profile.
Provider troubleshooting
Section titled “Provider troubleshooting”Start with:
bestie doctorbestie statusbestie llm test --model <provider/model>Common failures:
Provider request timed out: the endpoint responded too slowly. Try again, use a faster model, or increasellm.timeoutMs.Could not reach the provider endpoint: check the active profile’sbaseUrl, DNS, VPN/proxy settings, and provider status.Provider authentication failed: check the API key in~/.bestie/.envand the active profile’sapiKeyEnv.Provider rate limit reached: wait or check quota and billing.Provider returned an unusable response: confirm the selected model ref is supported by the configured provider profile.
Example timeout override:
{ "llm": { "timeoutMs": 120000 }}The default timeout is 300000 ms. Set a lower or higher value only when your provider and operating constraints call for it. Retry defaults are conservative: llm.maxRetries is 1 and llm.retryDelayMs is 500 ms.
