Quick Start
helm install siclaw oci://ghcr.io/scitix/siclaw/helm/siclaw \
--set llm.provider=anthropic \
--set llm.apiKey=sk-ant-... \
--set llm.model=claude-sonnet-4-20250514
Architecture
In Kubernetes mode, Siclaw uses K8sSpawner for full tenant isolation:
Gateway Pod (Deployment)
├── API server (port 3001)
├── HTTPS/mTLS server (port 3002)
├── K8sSpawner → creates AgentBox pods on demand
└── MySQL connection (required for K8s mode)
AgentBox Pod (per user)
├── Isolated filesystem (emptyDir volume)
├── mTLS client certificate (identity: userId + workspaceId)
├── Skills synced via bundle API (team + personal only)
└── Auto-terminates after 5 minutes idle
Helm Values
Key configuration options:
# values.yaml
replicaCount: 1
llm:
provider: anthropic
apiKey: sk-ant-...
model: claude-sonnet-4-20250514
database:
type: mysql
host: mysql.default.svc.cluster.local
port: 3306
name: siclaw
user: siclaw
password: ...
gateway:
image:
repository: siclaw/siclaw-gateway
tag: latest
service:
type: ClusterIP
port: 3001
agentbox:
image:
repository: siclaw/siclaw-agentbox
tag: latest
resources:
limits:
memory: 512Mi
cpu: 500m
mTLS Security
Gateway and AgentBox communicate over mutual TLS:
- CA certificate: Auto-generated (10-year), stored in database, auto-renewed at 30-day threshold
- Client certificates: Issued per-pod at spawn time, encode
userId + workspaceId in CN/OU
- Protected endpoints:
/api/internal/* on Gateway port 3002
No API keys in pod environment variables — identity is cryptographically bound to the certificate.
Database
Kubernetes mode requires MySQL (SQLite is single-process only):
helm install siclaw ... \
--set database.type=mysql \
--set database.host=mysql.svc.cluster.local \
--set database.name=siclaw \
--set database.user=siclaw \
--set database.password=secret
Common gotcha: use --set-string for numeric Helm values like image tags (e.g., --set-string gateway.image.tag=20260301). Also ensure --set namespace= matches the actual Kubernetes namespace.
Ingress
Example with nginx-ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: siclaw
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
rules:
- host: siclaw.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: siclaw-gateway
port:
number: 3001
WebSocket support is required for real-time investigation updates. Set appropriate proxy timeouts for long-running investigations (up to 5 minutes).