Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 32 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

<br/>

[![OperatorBoard landing page](docs/screenshots/01-hero.png)](https://operatorboard.dev)
Expand Down Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
],
Expand Down
20 changes: 20 additions & 0 deletions railway.toml
Original file line number Diff line number Diff line change
@@ -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.
33 changes: 33 additions & 0 deletions render.yaml
Original file line number Diff line number Diff line change
@@ -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
Loading