Skip to content

Getting Started

Goal: go from zerofirst working chat (with sane defaults) as quickly as possible.

Fastest chat: open the Control UI (no channel setup needed). Run edwin dashboard and chat in the browser, or open http://127.0.0.1:18789/ on the gateway host. Docs: Dashboard and Control UI.

Recommended path: use the CLI onboarding wizard (edwin onboard). It sets up:

  • model/auth (OAuth recommended)
  • gateway settings
  • channels (WhatsApp/Telegram/Discord/Mattermost (plugin)/...)
  • pairing defaults (secure DMs)
  • workspace bootstrap + skills
  • optional background service

If you want the deeper reference pages, jump to: Wizard, Setup, Pairing, Security.

Sandboxing note: agents.defaults.sandbox.mode: "non-main" uses session.mainKey (default "main"), so group/channel sessions are sandboxed. If you want the main agent to always run on host, set an explicit per-agent override:

json
{
  "routing": {
    "agents": {
      "main": {
        "workspace": "~/.edwin/workspace",
        "sandbox": { "mode": "off" }
      }
    }
  }
}

0) Prereqs

  • Node >=22
  • pnpm (optional; recommended if you build from source)
  • Recommended: Brave Search API key for web search. Easiest path: edwin configure --section web (stores tools.web.search.apiKey). See Web tools.

macOS: if you plan to build the apps, install Xcode / CLT. For the CLI + gateway only, Node is enough. Windows: use WSL2 (Ubuntu recommended). WSL2 is strongly recommended; native Windows is untested, more problematic, and has poorer tool compatibility. Install WSL2 first, then run the Linux steps inside WSL. See Windows (WSL2).

bash
curl -fsSL https://edwinpai.com/install.sh | bash

Installer options (install method, non-interactive, from GitHub): Install.

Windows (PowerShell):

powershell
iwr -useb https://edwinpai.com/install.ps1 | iex

Alternative (global install):

bash
npm install -g edwin@latest
bash
pnpm add -g edwin@latest

2) Run the onboarding wizard (and install the service)

bash
edwin onboard --install-daemon

What you’ll choose:

  • Local vs Remote gateway
  • Auth: OpenAI Code (Codex) subscription (OAuth) or API keys. For Anthropic we recommend an API key; claude setup-token is also supported.
  • Providers: WhatsApp QR login, Telegram/Discord bot tokens, Mattermost plugin tokens, etc.
  • Daemon: background install (launchd/systemd; WSL2 uses systemd)
    • Runtime: Node (recommended; required for WhatsApp/Telegram). Bun is not recommended.
  • Gateway token: the wizard generates one by default (even on loopback) and stores it in gateway.auth.token.

Wizard doc: Wizard

Auth: where it lives (important)

  • Recommended Anthropic path: set an API key (wizard can store it for service use). claude setup-token is also supported if you want to reuse Claude Code credentials.

  • OAuth credentials (legacy import): ~/.edwin/credentials/oauth.json

  • Auth profiles (OAuth + API keys): ~/.edwin/agents/<agentId>/agent/auth-profiles.json

Headless/server tip: do OAuth on a normal machine first, then copy oauth.json to the gateway host.

3) Start the Gateway

If you installed the service during onboarding, the Gateway should already be running:

bash
edwin gateway status

Manual run (foreground):

bash
edwin gateway --port 18789 --verbose

Dashboard (local loopback): http://127.0.0.1:18789/ If a token is configured, paste it into the Control UI settings (stored as connect.params.auth.token).

⚠️ Bun warning (WhatsApp + Telegram): Bun has known issues with these channels. If you use WhatsApp or Telegram, run the Gateway with Node.

3.5) Quick verify (2 min)

bash
edwin status
edwin health
edwin security audit --deep

4) Pair + connect your first chat surface

WhatsApp (QR login)

bash
edwin channels login

Scan via WhatsApp → Settings → Linked Devices.

WhatsApp doc: WhatsApp

Telegram / Discord / others

The wizard can write tokens/config for you. If you prefer manual config, start with:

Telegram DM tip: your first DM returns a pairing code. Approve it (see next step) or the bot won’t respond.

5) DM safety (pairing approvals)

Default posture: unknown DMs get a short code and messages are not processed until approved. If your first DM gets no reply, approve the pairing:

bash
edwin pairing list whatsapp
edwin pairing approve whatsapp <code>

Pairing doc: Pairing

From source (development)

If you’re hacking on Edwin itself, run from source:

bash
git clone https://github.com/jonesj38/edwin.git
cd edwin
pnpm install
pnpm ui:build # auto-installs UI deps on first run
pnpm build
edwin onboard --install-daemon

If you don’t have a global install yet, run the onboarding step via pnpm edwin ... from the repo. pnpm build also bundles A2UI assets; if you need to run just that step, use pnpm canvas:a2ui:bundle.

Gateway (from this repo):

bash
node edwin.mjs gateway --port 18789 --verbose

7) Verify end-to-end

In a new terminal, send a test message:

bash
edwin message send --target +15555550123 --message "Hello from Edwin"

If edwin health shows “no auth configured”, go back to the wizard and set OAuth/key auth — the agent won’t be able to respond without it.

Tip: edwin status --all is the best pasteable, read-only debug report. Health probes: edwin health (or edwin status --deep) asks the running gateway for a health snapshot.

Next steps (optional, but great)

Built with VitePress