diff --git a/README.md b/README.md index 406d7a2..c897867 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,17 @@ [![CI](https://github.com/projectblackboxllc/operatorboard/actions/workflows/ci.yml/badge.svg)](https://github.com/projectblackboxllc/operatorboard/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +[![npm](https://img.shields.io/npm/v/operatorboard.svg)](https://www.npmjs.com/package/operatorboard) [![Node 20+](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](package.json) [![TypeScript](https://img.shields.io/badge/TypeScript-strict-informational)](tsconfig.base.json) [![Stack](https://img.shields.io/badge/stack-Next.js%20%2B%20Fastify%20%2B%20SQLite-lightgrey)](apps/) [Docs](docs/) · [Security](SECURITY.md) · [Disclaimer](DISCLAIMER.md) · [Changelog](CHANGELOG.md) · [operatorboard.dev](https://operatorboard.dev) +[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template?template=https://github.com/projectblackboxllc/operatorboard&envs=OPERATORBOARD_API_KEY&OPERATORBOARD_API_KEYDesc=Strong+random+API+key+%28run%3A+openssl+rand+-hex+32%29) +   +[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/projectblackboxllc/operatorboard) +
[![OperatorBoard landing page](docs/screenshots/01-hero.png)](https://operatorboard.dev) @@ -119,40 +124,49 @@ Agents start conservative. As they build a track record — high approval rate, ## Quick start +### One-click cloud deploy + +Deploy the OperatorBoard API in seconds — no terminal required: + +| Platform | Notes | +|---|---| +| [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template?template=https://github.com/projectblackboxllc/operatorboard&envs=OPERATORBOARD_API_KEY&OPERATORBOARD_API_KEYDesc=Strong+random+API+key+%28run%3A+openssl+rand+-hex+32%29) | Auto-generates API key, persistent disk, health checks wired | +| [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/projectblackboxllc/operatorboard) | Uses `render.yaml` blueprint — API key auto-generated | + +> Full stack (API + Dashboard) on cloud: add a second service pointing at `apps/web/Dockerfile` with `NEXT_PUBLIC_API_URL` set to your API URL. For local evaluation, Docker Compose below runs both with one command. + +### Docker (full stack, recommended) + +```bash +# Generate a strong API key and start the full stack +export OPERATORBOARD_API_KEY=$(openssl rand -hex 32) +docker compose up + +# Dashboard → http://localhost:3000 +# API → http://localhost:4100 + +# Include the mock agent for a full demo: +docker compose --profile demo up +``` + ### Local development ```bash -# 1. Clone and install git clone https://github.com/projectblackboxllc/operatorboard.git cd operatorboard pnpm install -# 2. Configure environment cp apps/api/.env.example apps/api/.env cp apps/web/.env.example apps/web/.env -# Set OPERATORBOARD_API_KEY — use a strong random value: -# openssl rand -hex 32 +# Edit apps/api/.env — set OPERATORBOARD_API_KEY to: openssl rand -hex 32 -# 3. Start with demo seed data +# Start with demo seed data OPERATORBOARD_SEED=true OPERATORBOARD_ENABLE_DEV_ROUTES=true pnpm dev # API → http://localhost:4100 # Dashboard → http://localhost:4300 ``` -### Docker (recommended for production evaluation) - -```bash -export OPERATORBOARD_API_KEY=$(openssl rand -hex 32) -docker compose up - -# Dashboard → http://localhost:3000 -# API → http://localhost:4100 - -# Add the mock agent for a full demo: -docker compose --profile demo up -``` - --- ## Architecture diff --git a/packages/cli/package.json b/packages/cli/package.json index 6ac5346..14dbf40 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -13,7 +13,9 @@ "ai", "agents", "governance", "control-plane", "llm", "approval", "operatorboard" ], "type": "module", - "bin": "./dist/cli.js", + "bin": { + "operatorboard": "./dist/cli.js" + }, "files": [ "dist" ], diff --git a/railway.toml b/railway.toml new file mode 100644 index 0000000..705e790 --- /dev/null +++ b/railway.toml @@ -0,0 +1,20 @@ +[build] +builder = "DOCKERFILE" +dockerfilePath = "apps/api/Dockerfile" + +[deploy] +healthcheckPath = "/health" +healthcheckTimeout = 30 +restartPolicyType = "ON_FAILURE" +restartPolicyMaxRetries = 5 + +# Required environment variables: +# OPERATORBOARD_API_KEY — generate with: openssl rand -hex 32 +# +# Optional: +# OPERATORBOARD_SEED=true — load demo data on first boot +# OPERATORBOARD_CORS_ORIGINS — comma-separated allowed origins +# OPERATORBOARD_TASK_TIMEOUT_MS — default 60000 +# +# Full stack (API + Dashboard): use docker-compose.yml locally or +# add a second Railway service pointing at apps/web/Dockerfile. diff --git a/render.yaml b/render.yaml new file mode 100644 index 0000000..12d6436 --- /dev/null +++ b/render.yaml @@ -0,0 +1,33 @@ +## OperatorBoard — Render Blueprint +## Deploys the API control plane. For the full stack (API + Dashboard), +## run docker compose locally or add a second Render service for apps/web. + +services: + - type: web + name: operatorboard-api + runtime: docker + dockerfilePath: ./apps/api/Dockerfile + dockerContext: . + healthCheckPath: /health + autoDeploy: false + disk: + name: operatorboard-data + mountPath: /data + sizeGB: 1 + envVars: + - key: OPERATORBOARD_API_KEY + generateValue: true + - key: PORT + value: 4100 + - key: HOST + value: 0.0.0.0 + - key: OPERATORBOARD_DB_PATH + value: /data/operatorboard.sqlite + - key: OPERATORBOARD_SEED + value: "false" + - key: OPERATORBOARD_ENABLE_DEV_ROUTES + value: "false" + - key: OPERATORBOARD_TASK_TIMEOUT_MS + value: "60000" + - key: NODE_ENV + value: production