Get STOA running in under 5 minutes π
STOA is an AI-native API Management platform that lets you define APIs once and expose them everywhere (REST, MCP, GraphQL, gRPC).
- Docker (v24+)
- Docker Compose (v2+)
- 4GB RAM minimum (8GB recommended for full observability stack)
- Works on: macOS (Intel/Apple Silicon), Linux, Windows (WSL2)
# 1. Clone the quickstart repo
git clone https://github.com/stoa-platform/stoa-quickstart
cd stoa-quickstart
# 2. Start STOA
docker compose up -d
# 3. Open the Portal
open http://localhost:3000That's it! STOA is now running locally.
| Service | URL | Credentials |
|---|---|---|
| Portal | http://localhost:3000 | admin / admin |
| Grafana | http://localhost:3001 | admin / stoa-demo |
| API | http://localhost:8080 | β |
| Prometheus | http://localhost:9090 | β |
| Keycloak | http://localhost:8081 | admin / admin |
| Username | Password | Role | Tenant |
|---|---|---|---|
admin |
admin |
Platform Admin | ACME |
developer |
developer |
API Publisher | ACME |
consumer |
consumer |
API Consumer | ACME |
| Username | Password | Role | Tenant |
|---|---|---|---|
parzival |
parzival |
API Publisher | Gunters Guild |
art3mis |
art3mis |
API Publisher | Gunters Guild |
sorrento |
sorrento |
Tenant Admin | IOI Corp |
After docker compose up -d, here's a 2-minute tour:
1. Grafana Dashboards (http://localhost:3001)
- STOA Platform Overview β Live traffic by tenant, error rates, latency percentiles
- API Traffic β Requests per API, HTTP methods breakdown
- System Health β Service status, log streams
Metrics start generating immediately thanks to the built-in simulator.
2. API Catalog (http://localhost:3000)
Login as parzival / parzival to see:
- 8 pre-loaded OASIS-themed APIs
- 3 tenants: IOI Corp, Gregarious Games, Gunters Guild
Check Grafana β Alerting β IOI Corp's services have intentionally high error rates to demonstrate alerting capabilities.
- Open http://localhost:3000
- Click Login
- Enter
developer/developer
- Go to APIs β Create API
- Fill in:
- Name:
hello-api - Display Name:
Hello World API - Description:
My first STOA API
- Name:
- Click Create
- In your API, go to Endpoints β Add Endpoint
- Configure:
- Method:
GET - Path:
/hello/{name} - Description:
Say hello to someone
- Method:
- Add a Path Parameter:
- Name:
name - Type:
string - Required:
true
- Name:
- Click Save
- Go to Protocols β MCP
- Click Generate MCP Tool
- STOA automatically creates a Claude-compatible tool:
{
"name": "hello_api__say_hello",
"description": "Say hello to someone",
"input_schema": {
"type": "object",
"properties": {
"name": { "type": "string", "description": "Name to greet" }
},
"required": ["name"]
}
}Via REST:
curl http://localhost:8080/v1/hello/WorldVia MCP (in Claude.ai): Once connected, Claude can use your tool:
"Say hello to Alice using the hello API"
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STOA Platform β
βββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββ€
β Portal βControl Planeβ Keycloak β Redis β Grafana β
β (React) β (FastAPI) β (OIDC) β (Cache) β (Dashboards) β
β :3000 β :8080 β :8081 β :6379 β :3001 β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββ
β β
ββββββββββββ΄βββββββββββ βββββββββββ΄ββββββββββ
β PostgreSQL β β Prometheus β
β :5432 β β :9090 β
βββββββββββββββββββββββ βββββββββββββββββββββ
β
ββββββββββ΄βββββββββ
β Loki β
β :3100 β
βββββββββββββββββββ
| Service | Purpose | Port |
|---|---|---|
| Portal | React Web UI | 3000 |
| Control Plane | FastAPI backend | 8080 |
| Keycloak | Identity & Access | 8081 |
| PostgreSQL | Primary database | 5432 |
| Redis | Cache & sessions | 6379 |
| Grafana | Dashboards | 3001 |
| Prometheus | Metrics | 9090 |
| Loki | Logs | 3100 |
| Metrics Simulator | Demo traffic | - |
# Start all services
docker compose up -d
# View logs
docker compose logs -f
# View specific service logs
docker compose logs -f control-plane
# Stop all services
docker compose down
# Stop and remove volumes (clean reset)
docker compose down -v
# Restart a single service
docker compose restart control-plane# Check service status
docker compose ps
# Check for errors
docker compose logs --tail=50
# Check specific service
docker compose logs control-plane --tail=100# Verify PostgreSQL is healthy
docker compose exec postgres pg_isready -U stoa
# Check database tables
docker compose exec postgres psql -U stoa -c '\dt stoa.*'
# Check OASIS data loaded
docker compose exec postgres psql -U stoa -c "SELECT name, display_name FROM stoa.tenants;"Keycloak can take 30-60 seconds to start. Check:
docker compose logs keycloak | grep "started in"The metrics simulator needs control-plane to be healthy first:
# Check simulator logs
docker compose logs metrics-simulator
# Should see "Historical data generation complete!"Default ports:
- 3000: Portal
- 3001: Grafana
- 8080: API
- 8081: Keycloak
- 9090: Prometheus
Change conflicting ports:
# Edit docker-compose.yml "ports" section, or:
docker compose down
# Edit ports in docker-compose.yml
docker compose up -dSTOA requires ~4GB RAM. Check:
docker stats --no-streamIf running low, you can disable observability temporarily by commenting out the prometheus, grafana, loki, promtail, and metrics-simulator services.
All images are multi-arch and should work automatically. If you see issues:
# Force rebuild
docker compose build --no-cache
docker compose up -d# Stop and remove everything (including data)
docker compose down -v
# Start fresh
docker compose up -d- Full Documentation β Complete guides and API reference
- UAC Contracts β Learn about Universal API Contracts
- MCP Integration β Connect to Claude.ai
- Production Deployment β Kubernetes & Helm charts
We welcome contributions! See CONTRIBUTING.md.
Apache 2.0 β See LICENSE for details.
STOA β The Cilium of API Management
Website β’
Docs β’
GitHub