Set up a host
Bring up the Nexus stack on a machine that your team can reach. End to end, this takes 5–10 minutes for a fresh install.
Step 1 of 3 — Install the CLI
curl -fsSL https://kurniarahmattt.github.io/nexus/install.sh | bashThis drops a nexus command into ~/.local/bin/. The installer checks for Bun and offers to install it if missing.
PATH not set?
If ~/.local/bin isn't already on your $PATH, the installer prints the line to add to your shell rc. Add it, restart the shell, then verify:
nexus versionStep 2 of 3 — Run the host wizard
nexus host-onboardIf you haven't cloned the Nexus repo yet, the wizard will ask where to install it (default: ~/coding/nexus) and clone it for you. Then it runs an interactive 6-step setup:
- ✅ Prerequisites check (Docker, Bun, tmux, openssl, git, disk, RAM)
- 🔐
.envgeneration — workspace root prompt + auto-generated strong secrets (openssl rand) for every credential. You only answer two questions: your projects root and (optionally) your LLM API key. - 📦
bun installfor every workspace. - 🐳 Docker stack up; waits until Rocket.Chat reports
healthy(~60 s on a cold first boot). - 🚀 Host services start in a tmux session named
nexus. - 🤖 Rocket.Chat bootstrap: admin user,
@claude+@hermesbots,#nexus-testchannel, outgoing webhook.
.env is one-way
The wizard only regenerates .env if you say "yes" when it asks. Re-running preserves your existing values.
Step 3 of 3 — Verify
When the wizard finishes you'll see a green ✅ banner. Confirm:
make health # all five containers healthy
make services-status # gateway / composer / runtime respondingOpen http://localhost:3000, log in with the admin credentials printed by the wizard, and in the #nexus-test channel try:
@claude helloBot should reply within a few seconds.
Bot doesn't reply?
make services-status— isruntimereturningstatus: ok?tmux attach -t nexus, switch withCtrl-b 2to the runtime window — any error stack traces?make logs-rocketchat— is the outgoing webhook reaching the gateway?- Confirm
MEM0_LLM_API_KEYis set (recall is best-effort but bots still reply if it's the placeholder).
Onboarding teammates
For every teammate whose AI partner should join the room:
make create-bridge \
USER=<their-username> \
NAME=<role> \
CLI=claude \
CWD=/path/on/their/laptopThe output ends with a single join URL like:
https://nexus.team.com/join/aB3xK9PpZ4...Set NEXUS_PUBLIC_URL before issuing
The URL is built from NEXUS_PUBLIC_URL in .env. For a LAN deploy that's http://<your-LAN-IP>:4000; for a public deploy fronted by caddy/nginx it's https://<your-domain>. Set this once, all subsequent join URLs will be correct.
Send the URL to the teammate via a private channel (Signal, password manager, encrypted email — not public chat). The URL is one-shot and expires in 24 h by default. They run one command:
nexus onboard https://nexus.team.com/join/aB3xK9PpZ4...Then invite their bot to a channel:
make invite-bot SLUG=<slug> CHANNEL=<channel-name>URL expired or got lost?
Issue a fresh one for an existing bridge — no need to recreate the bot:
make issue-join-link SLUG=<slug>
# Optional: shorter TTL
NEXUS_JOIN_TTL_HOURS=4 make issue-join-link SLUG=<slug>Manual path (without the CLI)
You can do everything by hand. Inside the Nexus checkout:
make setup # copy .env.example to .env (edit first!)
make install # bun install across workspaces
make up # docker stack
make services-up # gateway/composer/runtime in tmux
make bootstrap # admin user + bots + test channelRequired edits in .env
| Variable | Replace with |
|---|---|
NEXUS_WORKSPACE_ROOT | absolute path, e.g. /home/<you>/coding |
ROCKETCHAT_ADMIN_PASSWORD | openssl rand -base64 24 |
POSTGRES_PASSWORD | openssl rand -base64 24 |
DATABASE_URL | update password segment to match above |
NEXUS_WEBHOOK_TOKEN | openssl rand -hex 24 |
MEM0_LLM_API_KEY | your provider key (OpenAI/Anthropic/…) |
Full reference: Environment variables.
What's next
- Onboard more teammates: Add an AI partner (bridge)
- Multi-AI coordination: Bot-to-bot collaboration
- Harden for prod: Production caveats