📚 New to Apparatus? Start with the Documentation Navigator to find what you need. 💡 Visual Learner? Check the inline diagrams in Architecture Guide and Dashboard Tutorial.
Choose the method that fits your needs — npm and Docker are the fastest paths; source installs give you the full development environment.
Requires Node.js 23+.
npm install -g @atlascrew/apparatus
apparatusOpen http://localhost:8090/dashboard. The server, dashboard, and all protocol endpoints start in a single process.
docker run -p 8090:8090 -p 8443:8443 -p 50051:50051 nickcrew/apparatusOpen http://localhost:8090/dashboard. Same platform as the npm package.
Pass environment variables with -e:
docker run -p 8090:8090 -p 8443:8443 \
-e DEMO_MODE=true \
-e ANTHROPIC_API_KEY=sk-... \
nickcrew/apparatusAlso available from GitHub Container Registry: ghcr.io/nickcrew/apparatus.
Use this option when you want to develop Apparatus itself or need fine-grained control over individual components.
Prerequisites: Node.js 23+, pnpm
git clone https://github.com/NickCrew/apparatus.git
cd apparatus
pnpm install
# Generate TLS certificates (self-signed)
mkdir -p certs
openssl req -x509 -newkey rsa:2048 -keyout certs/server.key \
-out certs/server.crt -days 365 -nodes -subj "/CN=localhost"
pnpm build
pnpm startRun Apparatus alongside Chimera (vulnerable web app + API) for a complete testing environment:
git clone https://github.com/NickCrew/apparatus.git
git clone https://github.com/NickCrew/Chimera.git
cd apparatus
docker compose --profile chimera upWait for all services to be healthy (30-60 seconds).
| Variable | Default | Description |
|---|---|---|
HOST |
0.0.0.0 |
Bind address |
PORT_HTTP1 |
8090 |
HTTP/1.1 port |
PORT_HTTP2 |
8443 |
HTTP/2 TLS port |
DEMO_MODE |
false |
Enable all dangerous endpoints without localhost check |
TLS_KEY |
certs/server.key |
TLS private key path |
TLS_CRT |
certs/server.crt |
TLS certificate path |
ANTHROPIC_API_KEY |
— | Claude API key (for AI honeypot and autopilot) |
ENABLE_COMPRESSION |
true |
Enable gzip compression |
BODY_LIMIT |
50mb |
Request body size limit |
CLUSTER_SHARED_SECRET |
— | Cluster authentication token |
| Service | URL | Purpose |
|---|---|---|
| Apparatus Dashboard | http://localhost:8090/dashboard | Real-time testing control & monitoring |
| Apparatus API | http://localhost:8090 | Testing platform endpoints |
| VulnWeb | http://localhost:3000 | Vulnerable web application (12 UIs) |
| VulnAPI | http://localhost:5000 | Vulnerable REST API (450+ endpoints) |
| Apparatus Metrics | http://localhost:8090/metrics | Prometheus metrics (Grafana-compatible) |
| Apparatus Docs | http://localhost:8090/docs | Swagger API documentation |
# Start autopilot
curl -X POST http://localhost:8090/api/redteam/autopilot/start \
-H "Content-Type: application/json" \
-d '{
"target": "http://vuln-web:3000",
"config": {
"interval": 2000,
"maxIterations": 50,
"allowedTools": ["chaos.cpu", "cluster.attack", "mtd.rotate"]
}
}'
# Check status
curl http://localhost:8090/api/redteam/autopilot/status
# Get results
curl http://localhost:8090/api/redteam/autopilot/reports | jq .
# Stop autopilot
curl -X POST http://localhost:8090/api/redteam/autopilot/stop# Test XSS/SQLi/command injection against VulnAPI
curl "http://localhost:8090/redteam/validate?target=http://vuln-api:5000&path=/search&method=GET"
# Test against VulnWeb
curl "http://localhost:8090/redteam/validate?target=http://vuln-web:3000&path=/api/users&method=POST"Open browser to: http://localhost:8090/dashboard
Features:
- Live request feed with SSE streaming
- Traffic heatmap and latency analysis
- Deception honeypot events
- Tarpit defense activity
- System health metrics
# Trigger CPU spike
curl -X POST http://localhost:8090/chaos/cpu \
-d '{"duration": 5000}'
# Allocate memory
curl -X POST http://localhost:8090/chaos/memory \
-d '{"action": "allocate", "amount": 512}'
# Trigger distributed cluster attack
curl -X POST http://localhost:8090/cluster/attack \
-d '{"target": "http://vuln-web:3000/", "rate": 50}'# Create a scenario
curl -X POST http://localhost:8090/scenarios \
-H "Content-Type: application/json" \
-d '{
"name": "coordinated-chaos-test",
"steps": [
{ "id": "1", "action": "chaos.cpu", "params": { "duration": 3000 } },
{ "id": "2", "action": "delay", "params": { "duration": 2000 } },
{ "id": "3", "action": "cluster.attack", "params": { "target": "http://vuln-web:3000/", "rate": 100 } }
]
}'
# Extract scenario ID from response
SCENARIO_ID="sc-1708..."
# Run scenario
curl -X POST http://localhost:8090/scenarios/$SCENARIO_ID/run
# Get execution ID from response
EXECUTION_ID="run-..."
# Monitor execution
curl "http://localhost:8090/scenarios/$SCENARIO_ID/status?executionId=$EXECUTION_ID"# Add WAF rule (Active Shield)
curl -X POST http://localhost:8090/sentinel/rules \
-H "Content-Type: application/json" \
-d '{"pattern": "/admin", "action": "block"}'
# List rules
curl http://localhost:8090/sentinel/rules
# Enable Moving Target Defense (MTD)
curl -X POST http://localhost:8090/mtd \
-d '{"prefix": "secure-xyz123"}'
# Verify MTD requires prefix
curl http://localhost:8090/echo # Returns 404
curl http://localhost:8090/secure-xyz123/echo # Returns 200# Capture PCAP for 30 seconds
curl "http://localhost:8090/capture.pcap?duration=30&iface=eth0" -o traffic.pcap
# Inspect via Wireshark
wireshark traffic.pcap
# View request history
curl http://localhost:8090/history | jq .
# Clear history
curl -X DELETE http://localhost:8090/history# Generate credit card numbers
curl "http://localhost:8090/dlp?type=cc"
# Generate SSNs
curl "http://localhost:8090/dlp?type=ssn"
# Generate fake SQL errors
curl "http://localhost:8090/dlp?type=sql"
# Test if your DLP system detects these# Send webhook to Apparatus
curl -X POST http://localhost:8090/hooks/my-webhook-id \
-H "Content-Type: application/json" \
-d '{"event": "deployment", "version": "1.0.0"}'
# Inspect webhooks received
curl http://localhost:8090/hooks/my-webhook-id/inspect# In apparatus directory
pnpm tuiFeatures:
- Real-time traffic graph
- Request/response details
- Event streams (deception, tarpit, webhooks)
- System metrics (CPU, memory, event loop lag)
- Scenario control
- API status monitoring
GET /echo- Echo back all request detailsGET /sysinfo- System and process informationGET /metrics- Prometheus metricsGET /healthz- Basic health checkGET /health/pro- Advanced health with lag metricsGET /history- Recent request history
GET /dns?target=example.com&type=A- DNS queriesGET /ping?target=host:port- TCP connectivity testGET /generate?size=100mb- Generate bandwidthPOST /sink- Discard uploaded data
GET /redteam/validate?target=...&path=...- Payload validationGET /debug/jwt?token=...- JWT debuggingGET /dlp?type=cc|ssn|email|sql- Sensitive data generationGET /ratelimit- Rate limit testing
GET /deception/history- Honeypot eventsGET /tarpit- Trapped IPsPOST /tarpit/release- Release trapped IPsGET /sentinel/rules- Active Shield (WAF) rulesPOST /mtd- Rotate Moving Target Defense prefix
POST /cluster/attack- Broadcast attack to clusterGET /cluster/members- List cluster nodes
# Start all services
docker-compose up
# Start in background
docker-compose up -d
# View logs
docker-compose logs -f apparatus
# Stop all services
docker-compose down
# Rebuild images
docker-compose build
# Rebuild and restart
docker-compose up --build
# View service status
docker-compose ps
# Execute command in container
docker-compose exec apparatus pnpm test# Check logs
docker-compose logs apparatus
docker-compose logs vuln-web
docker-compose logs vuln-api
# Verify ports are free
lsof -i :8090
lsof -i :3000
lsof -i :5000
# Clean up and restart
docker-compose down -v
docker-compose up --build# Verify Apparatus is running
curl http://localhost:8090/healthz
# Check for build errors
docker-compose logs apparatus | grep -i error
# Clear browser cache (Ctrl+Shift+Del) and refresh# Run tests in container
docker-compose exec apparatus pnpm test
# Run specific test
docker-compose exec apparatus pnpm test -- test/scenarios.test.ts
# Run with verbose output
docker-compose exec apparatus pnpm test -- --reporter=verbose# Verify target is reachable from Apparatus container
docker-compose exec apparatus curl http://vuln-web:3000/health
# Check network
docker network inspect apparatus_security-lab
# Verify firewall rules# Limit Docker container memory
docker-compose.yml: `mem_limit: 512m`
# Clear old deception events
curl -X DELETE http://localhost:8090/deception/history
# Clear request history
curl -X DELETE http://localhost:8090/history- Close browser DevTools (F12) while monitoring
- Reduce SSE client count by refreshing fewer browser tabs
- Use TUI (
pnpm tui) for lighter-weight monitoring
# Just Apparatus
docker-compose up apparatus
# Just Chimera
docker-compose up vuln-web vuln-apiAdd to .bash_profile or .zshrc:
# Start full lab
alias apparatus-lab='cd ~/Developer/apparatus && docker-compose up'
# Just Apparatus
alias apparatus-start='cd ~/Developer/apparatus && pnpm build && pnpm start'
# View dashboard
alias apparatus-dash='open http://localhost:8090/dashboard'
# Run tests
alias apparatus-test='cd ~/Developer/apparatus && pnpm test'
# Terminal UI
alias apparatus-tui='cd ~/Developer/apparatus && pnpm tui'
# Red team start
alias apparatus-redteam='curl -X POST http://localhost:8090/api/redteam/autopilot/start -H "Content-Type: application/json" -d'
# Check status
alias apparatus-status='curl http://localhost:8090/healthz && curl http://localhost:3000/health && curl http://localhost:5000/health'- View All Features - Complete feature catalog
- API Reference - Detailed endpoint documentation
- Architecture Guide - System design and flow
- Chimera Docs - Vulnerable application details