Nimbus
Website · Documentation · Quick start
Talk to your cloud.
An AI-powered cloud control plane. One agent that reads your code, understands your architecture, acts on real AWS & GCP credentials, and fixes your repos — all through plain conversation.
What is Nimbus?
Instead of switching between cloud consoles, terminals, CI dashboards and IaC files, you work in one place with an agent that can design infrastructure, deploy it, watch it, and repair the code behind it. Think of it as a senior platform engineer that lives inside your team chat.
Nimbus is built around three ideas:
- Intent-driven operations — describe the outcome you want; Nimbus produces a plan, you approve it, it executes. Reads are autonomous; every write is confirmed.
- One shared workspace per project — channels, cloud connections, machines, repairs and the architecture canvas are shared with your team. Only your private chat with Nimbus stays personal.
- Real execution, with evidence — every claim is grounded in something the agent actually read or ran (a file, a log, a live resource), and every change is auditable.
Features
| 💬 Conversational agent | A ReAct chat loop with tool use — inspect inventory, read logs & telemetry, estimate cost, deploy, and open PRs. Design mode sketches architecture; Agent mode operates the real clouds. |
| 🎨 Live architecture canvas | Ask Nimbus to design a system and watch the nodes render live (React Flow) — load balancer → app → database → cache. |
| ☁️ Multi-cloud | Connect AWS (keys or IAM role, short-lived STS) and GCP (service-account JSON or keyless Connect with Google OAuth) via per-user, per-project MCP servers. |
| 🧭 Live cloud data | Overview, Resources and Cost pull real inventory, telemetry and spend once a cloud is connected. |
| 🛠️ Shared-compute repairs | Connect a laptop or CI runner; Nimbus drives your local Claude Code turn-by-turn to fix a repo, then pushes a branch and opens a PR. Machines are pooled per project. |
| 🔌 GitHub & more | Connect repositories through Composio; the agent reads your code, PRs and CI before acting. |
| 👥 Teams & permissions | Invite by email; per-member toggles for Channels, Machines & repairs, and Cloud & resources. |
| 🔐 Secure by design | Credentials encrypted at rest (AES-256-GCM), never printed or logged; membership-enforced access; server-side audit trail. |
Design infrastructure on a live canvas
Rent a machine on demand · Repair code on real machines
How it works
flowchart LR
A["Web app<br/>chat · canvas · dashboard"] -->|HTTP /api| G
B["Connected machine<br/>@nimbus/cli"] -. "poll · repairs" .-> G
F["Rented machine<br/>Fly"] -. "driven via API" .-> G
G(["Nimbus Agent<br/>ReAct loop + tools"])
G --> SEC["Plan-then-act<br/>writes need approval"]
G --> MCP["Per-user MCP servers"] --> CLOUD["AWS · GCP<br/>full CLI surface"]
G --> CANVAS["Live architecture canvas"]
G --> REPAIR["Repairs → open PR<br/>Claude Code"]
G --> OBS["Cost · logs · telemetry"]
G --> VAULT["Encrypted credential vault<br/>AES-256-GCM"]
classDef agent fill:#FF9900,stroke:#FF9900,color:#111111,font-weight:bold;
classDef box fill:#161b22,stroke:#30363d,color:#e6edf3;
class G agent;
class A,B,F,SEC,MCP,CLOUD,CANVAS,REPAIR,OBS,VAULT box;
You talk to the Nimbus agent from the web app (or @mention it in a channel). It reads your code
and real cloud state, and grounds every answer in evidence — a file, a log line, a live resource.
It acts through per-user MCP servers scoped to your own credentials, giving it the full aws
and gcloud surface. Reads are autonomous; anything that changes a billable resource waits for
your approval. Secrets stay in the encrypted vault and never reach the model. Repairs run on a
machine you connect (your laptop, CI, or a rented one) and come back as a pull request.
Architecture
Nimbus is a React SPA talking to a thin Express API that fans out to services, repositories, agents and per-user cloud MCP servers. A separate CLI worker connects outside machines for repairs.
┌──────────────────────┐ ┌───────────────────────────────────────────────┐
│ Web app (Vite/React)│ /api │ API server (Express) │
│ localhost:5280 │ ─────► │ localhost:8788 │
│ • chat + canvas │ proxy │ │
│ • dashboard │ │ routes/ → HTTP handlers (per resource) │
│ • connections │ │ services/ → cloud, telemetry, cost, spec… │
└──────────────────────┘ │ repositories/ → SQLite persistence │
│ agents/ → ReAct chat loop + analysis │
┌──────────────────────┐ │ tools/ → agent tools (canvas, repair…) │
│ Connected machine │ poll │ libs/ → model, MCP, composio, aws/gcp │
│ @nimbus/cli + Claude │ ◄────► │ mcp/ → aws / gcloud / cloud-run MCP │
│ Code (your laptop) │ (PR) └───────────────────────────────────────────────┘
└──────────────────────┘ │
SQLite (better-sqlite3) · creds encrypted at rest
User identity comes strictly from the session cookie; req.user.id is the isolation
boundary every service and MCP call is scoped to.
Tech stack
- Frontend — React 18, Vite 5, React Router, React Flow,
@ai-sdk/react, react-markdown - Backend — Node ≥ 20, Express,
better-sqlite3, Helmet, Zod - AI — Vercel AI SDK (
ai), Databricks (primary) with OpenRouter cross-provider fallback, Model Context Protocol (@modelcontextprotocol/sdk) - Integrations — Composio (GitHub), AWS & GCP MCP servers, Fly.io (provisioning / rented machines)
Run with Docker (recommended)
The fastest way to run Nimbus. The image bundles everything the cloud MCP servers need —
git, uv (AWS), the gcloud CLI (GCP) and Node — so there's nothing else to install. You only
provide your .env.
git clone https://github.com/hritvikgupta/nimbus.git
cd nimbus
cp .env.example .env
# 1. Generate the master encryption key and append it to .env (protects stored credentials):
echo "NIMBUS_ENC_KEY=$(openssl rand -base64 32)" >> .env
# 2. Open .env and fill in your AI model — LLM_PROVIDER, LLM_MODEL, OPENROUTER_API_KEY.
# (Optional: FLY_API_TOKEN to rent machines, COMPOSIO_API_KEY for GitHub.)
# 3. Run it:
docker compose up --build
# open http://localhost:8788
No
openssl? Usenode -e "console.log(require('crypto').randomBytes(32).toString('base64'))"and paste the result asNIMBUS_ENC_KEY=in.env.
One container serves the app and the API on port 8788. Your data (the SQLite DB + encrypted
connections) persists in the nimbus-data volume across restarts.
Prefer plain
docker?docker build -t nimbus . && docker run -p 8788:8788 --env-file .env -v nimbus-data:/app/server/.data nimbus
To run from source instead (for development), follow the steps below.
Quick start (from source)
Prerequisites
- Node.js ≥ 20 and npm
- An LLM provider — a Databricks serving endpoint or an OpenRouter API key
- (optional) a Composio API key for GitHub, and AWS/GCP credentials to connect real clouds
- For the cloud MCP servers:
uv(AWS) and thegcloudCLI (GCP) — bundled automatically in Docker
1. Install
git clone https://github.com/hritvikgupta/nimbus.git
cd nimbus
npm install
2. Configure
cp .env.example .env
Fill in .env (see Configuration). At minimum, set a NIMBUS_ENC_KEY and one
LLM provider:
# generate the master encryption key
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
3. Set up the cloud MCP servers
The agent talks to your clouds through three MCP servers vendored under
server/mcp/ — AWS (aws-mcp, Python via uvx), Cloud Run
(cloud-run-mcp) and gcloud (gcloud-mcp). Their source lives in the repo; install their
dependencies (and build the gcloud bundle) once:
npm run setup:mcp
This runs npm install for the Node servers, builds gcloud-mcp, and checks for
uv (needed to launch the AWS server). You can skip this if you
only use one cloud — the corresponding server is only spawned when a matching connection exists.
Host prerequisites (the MCP servers shell out to these — install the ones for the clouds you use):
| Cloud | Requires on the host | Why |
|---|---|---|
| AWS | uv |
Launches aws-api-mcp-server (Python); pulls its deps from PyPI on first run. Gives the full call_aws tool. |
| GCP | the gcloud CLI on PATH |
gcloud-mcp executes gcloud commands — the full run_gcloud_command surface. |
Once installed, the agent has the complete AWS and gcloud command surface plus Cloud Run deploy/logs — the servers themselves are the full upstream implementations, not trimmed subsets. You still connect your own cloud credentials in the app (Connections).
4. Run
Nimbus is two processes — the API and the web app. Run them in two terminals:
npm run api # backend → http://localhost:8788
npm run dev # frontend → http://localhost:5280 (proxies /api to :8788)
Open http://localhost:5280, create an account, and the guided walkthrough will introduce the workspace. Connect a repo and a cloud from Connections, then start chatting.
Configuration
All configuration is via environment variables in .env (loaded by npm run api).
| Variable | Required | Description |
|---|---|---|
NIMBUS_ENC_KEY |
yes (prod) | Base64 32-byte master key; encrypts cloud credentials at rest (AES-256-GCM). |
LLM_PROVIDER |
yes | databricks or openrouter. |
LLM_MODEL |
yes | Model id for the selected provider. |
DATABRICKS_HOST / DATABRICKS_TOKEN / DATABRICKS_MODEL |
if databricks | Primary serving endpoint. |
OPENROUTER_API_KEY |
if openrouter | Cross-provider fallback / primary. |
COMPOSIO_API_KEY |
optional | GitHub (and other app) connections. |
GITHUB_TOKEN |
optional | Higher GitHub API rate limits. |
GOOGLE_OAUTH_CLIENT_ID / GOOGLE_OAUTH_CLIENT_SECRET |
optional | GCP keyless Connect with Google. |
FLY_API_TOKEN / FLY_ORG / FLY_REGION / FLY_APP / FLY_MACHINE_IMAGE |
optional | Provisioning & rented machines. |
AGENT_PORT |
optional | API port (default 8788). |
APP_URL |
optional | Public app URL — GCP OAuth redirects + links (dev http://localhost:5280; Docker http://localhost:8788). |
ALLOW_SIGNUP |
optional | false closes registration on public deploys. |
AGENT_DAILY_LIMIT |
optional | Per-user daily cap on expensive agent/cloud actions. |
CORS_ORIGINS |
optional | Comma-separated allowlist; empty = same-origin only. |
DOCS_HOST |
optional | Extra host to serve docs from (besides docs.*). |
OPS_SCAN_MINUTES |
optional | > 0 enables the scheduled incident scan. |
WEBHOOK_BASE |
optional | Public base URL for inbound webhooks. |
What you actually need:
- Always:
NIMBUS_ENC_KEY+ an AI model (LLM_PROVIDER+LLM_MODEL+OPENROUTER_API_KEY, or the Databricks trio). Your provider, your key, your billing. - To rent machines (Fly): your own
FLY_API_TOKEN(+ optionalFLY_*). Leave blank to disable the feature. Rented machines need no public URL — the worker runs inside this server and drives Fly via its API. The person renting supplies their own coding-agent key per rental in the UI. - To connect your own laptop/CI for repairs: nothing here — that machine runs the
@nimbus/cliworker and polls this server, so it is pointed at Nimbus (nimbus start <key> --url https://your-host), not the other way around. - When hosting publicly: set
APP_URLto your real URL (used for GCP OAuth redirects + links), and optionallyWEBHOOK_BASE,CORS_ORIGINS,ALLOW_SIGNUP=false.
Never commit your real
.env. It is gitignored;.env.exampleis the template.
Connect a machine (repairs)
Repairs run on real machines you own via the @nimbus/cli worker. It polls
Nimbus (outbound only — works behind any NAT/firewall); when a fix is dispatched it clones the
repo, drives your local Claude Code to find and fix the issue, and opens a PR.
npm install -g @nimbus/cli
# In the app: Repairs → Connect a machine → Generate key
nimbus start <worker-key>
The machine needs Claude Code (installed + logged in), git, and gh. See
cli/README.md for the full worker docs.
Project structure
nimbus/
├── src/ # React SPA — pages, components, context, styles
├── server/ # Express API
│ ├── server.mjs # thin HTTP entry — mounts routers
│ ├── routes/ # HTTP handlers (one file per resource)
│ ├── services/ # business logic (cloud, telemetry, cost, spec, repair…)
│ ├── repositories/ # persistence (SQLite via better-sqlite3)
│ ├── agents/ # ReAct chat loop + codebase-analysis agent
│ ├── tools/ # agent tools (canvas, repair, telemetry, code…)
│ ├── libs/ # external clients (model, MCP, composio, aws, gcp)
│ ├── mcp/ # AWS / gcloud / Cloud Run MCP servers
│ └── middlewares/ # session auth + cloud scoping
├── cli/ # @nimbus/cli — the connected-machine repair worker
├── docs-site/ # Fumadocs documentation site (statically exported)
├── deploy/ # Fly.io deploy configs (landing + docs)
├── docs/ # architecture & design docs (production-readiness, rented-compute…)
└── public/ # static assets (logos, brand)
Deployment
Nimbus targets Fly.io. The API server also serves the statically-exported
docs site (from docs-site/out) whenever the request host matches docs.*, so docs.yourdomain
needs no separate process.
cd docs-site && npm run build # regenerate docs-site/out
# then deploy the API + built SPA to Fly (see docs/production-readiness)
Production hardening — deploy architecture, security tiers and scaling — is documented under
docs/production-readiness/.
Security
- Credentials encrypted at rest with AES-256-GCM; the master key (
NIMBUS_ENC_KEY) lives only in the environment. - Secrets are never printed, logged, or returned in chat or API responses.
- Plan-then-act — the agent never creates, scales, modifies or deletes a billable resource without showing a plan and getting explicit confirmation.
- Membership-enforced access on the server for every project-scoped action.
- Cloud MCPs run with only the project's credentials; AWS STS / GCP tokens are short-lived.
Found a vulnerability? See SECURITY.md. Please do not open a public issue.
Contributing
Contributions are welcome — see CONTRIBUTING.md for the dev setup, conventions, and PR process.
License
Nimbus is source-available under the Business Source License 1.1. © 2026 Hritvik Gupta.
You may read, self-host, modify, and use it freely — for internal, development, evaluation, and non-commercial purposes. You may not offer Nimbus to third parties as a competing hosted/managed service. On the Change Date (2030-01-01) each released version converts to Apache 2.0.
- Trademarks ("Nimbus", the logo) are reserved — see TRADEMARKS.md.
- Third-party components (the vendored MCP servers under
server/mcp/) keep their own Apache-2.0 licenses — see THIRD-PARTY-NOTICES.md. - Need a commercial or hosting license? Contact the maintainer.
No comments yet
Be the first to share your take.