Skip to content

Configuration

Komand is configured through environment variables and appsettings.json files. Environment variables take precedence, using the __ (double underscore) separator for nested keys.

VariableRequiredDefaultDescription
DOTNET_ENVIRONMENTNoProductionRuntime environment (Development or Production)
ASPNETCORE_ENVIRONMENTNoProductionASP.NET Core environment (Gateway only)
ConnectionStrings__OrleansYes (prod)PostgreSQL connection string
VariableRequiredDefaultDescription
Jwt__SecretKeyYes (prod)Dev keySigning key for JWT tokens (min 32 chars)
Jwt__IssuerNokomand.aiJWT issuer claim
Jwt__AudienceNokomand.aiJWT audience claim
Jwt__ExpirationMinutesNo60Access token lifetime
Jwt__RefreshExpirationDaysNo7Refresh token lifetime
VariableDefaultDescription
RateLimits__ApiPermitLimit100Max API requests per window
RateLimits__ApiWindowSeconds60API rate limit window (seconds)
RateLimits__ChatPermitLimit30Max chat messages per window
RateLimits__ChatWindowSeconds60Chat rate limit window (seconds)

Rate-limited requests receive HTTP 429 Too Many Requests with the standard error envelope.

VariableDefaultDescription
Cors__AllowedOrigins(none in prod)Allowed origins for cross-origin requests

In production, if Cors__AllowedOrigins is not set, no origins are allowed — secure by default. Set this to your dashboard domain:

Terminal window
Cors__AllowedOrigins=https://komand.your-domain.com
VariableDefaultDescription
SEQ_URLhttp://localhost:5341Seq log ingestion URL (Docker Compose reference; .NET apps read Seq URL from Serilog config in appsettings.json)
VariableDefaultDescription
GrainLimits__MaxTurnsPerSession100Max conversation turns before trimming
GrainLimits__MaxSessionsPerAgent100Max active sessions before eviction
GrainLimits__MaxMemoryEntries1000Max memory key-value pairs per agent
GrainLimits__MaxMemoryValueLength100000Max characters per memory value
GrainLimits__MaxSkills10000Max skills in the global registry
GrainLimits__MaxToolExecutionTimeoutMinutes30Max skill execution timeout
VariableDefaultDescription
POSTGRES_DBkomandDatabase name
POSTGRES_USERkomandDatabase user
POSTGRES_PASSWORDDatabase password
VariableDefaultDescription
VITE_API_URL(same origin)Backend API base URL
VITE_SIGNALR_URLSignalR hub endpoint for real-time updates

When DOTNET_ENVIRONMENT=Development:

FeatureBehaviour
Grain storageIn-memory (no PostgreSQL required)
ClusteringLocalhost single-node
RemindersIn-memory
SwaggerEnabled at /swagger
CORSAllows all localhost origins
LoggingVerbose, console output
JWT secretDev default (insecure, fine for local dev)

Development mode is designed for local development — you can run the silo and gateway without any external services.

When DOTNET_ENVIRONMENT=Production:

FeatureBehaviour
Grain storagePostgreSQL via ADO.NET
ClusteringPostgreSQL ADO.NET (multi-silo capable)
RemindersPostgreSQL ADO.NET
SwaggerDisabled
CORSRestricted to configured origins only
LoggingStructured, shipped to Seq
JWT secretMust be configured (startup fails if missing or insecure)
Connection stringRequired (startup fails if missing)
{
"ConnectionStrings": {
"Orleans": "Host=postgres;Database=komand;Username=komand;Password=your-password"
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Orleans": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "Seq",
"Args": { "serverUrl": "http://localhost:5341" }
}
]
},
"GrainLimits": {
"MaxTurnsPerSession": 100,
"MaxSessionsPerAgent": 100,
"MaxMemoryEntries": 1000,
"MaxMemoryValueLength": 100000,
"MaxSkills": 10000,
"MaxToolExecutionTimeoutMinutes": 30
}
}
{
"ConnectionStrings": {
"Orleans": "Host=postgres;Database=komand;Username=komand;Password=your-password"
},
"Jwt": {
"Issuer": "komand.ai",
"Audience": "komand.ai",
"SecretKey": "replace-in-production-min-32-chars",
"ExpirationMinutes": 60,
"RefreshExpirationDays": 7
},
"RateLimits": {
"ApiPermitLimit": 100,
"ApiWindowSeconds": 60,
"ChatPermitLimit": 30,
"ChatWindowSeconds": 60
},
"Cors": {
"AllowedOrigins": ["https://your-domain.com"]
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Orleans": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "Seq",
"Args": { "serverUrl": "http://localhost:5341" }
}
]
}
}

Configuration sources are loaded in this order (later sources override earlier ones):

  1. appsettings.json — base defaults
  2. appsettings.{Environment}.json — environment-specific overrides
  3. Environment variables — highest priority

Example: GrainLimits__MaxTurnsPerSession=200 as an environment variable overrides the value in appsettings.json.

The Gateway processes requests through this middleware stack in order:

OrderMiddlewarePurpose
1Exception handlerMaps exceptions to HTTP status + ApiResponse<T> envelope
2Serilog request loggingLogs request method, path, status, duration
3CorrelationIdReads/generates X-Request-Id, pushes to log context
4Rate limiterEnforces per-window request limits
5CORSCross-origin request validation
6AuthenticationJWT Bearer token validation
7AuthorisationRole and policy checks
8UserContextExtracts user claims, sets Orleans RequestContext
9Static filesServes React SPA from wwwroot/
10EndpointsAPI routes and SignalR hub
11SPA fallbackRoutes unmatched paths to index.html

The /health endpoint verifies:

CheckMethodTimeout
Orleans siloPings SkillRegistryGrain("global")5 seconds
PostgreSQLConnection health check5 seconds

Returns HTTP 200 when all checks pass, HTTP 503 when any check fails.

ServicePortProtocolPurpose
Gateway API5000HTTPREST API + Dashboard + SignalR
Orleans Silo11111TCPInter-silo communication
Orleans Gateway30000TCPClient-to-silo communication
PostgreSQL5432TCPDatabase
Seq UI5341HTTPLog viewer dashboard
Seq Ingest5342HTTPLog ingestion endpoint

Both the silo and gateway use Serilog with structured logging:

SettingDefault
Default levelInformation
Microsoft overrideWarning
Orleans overrideWarning
System overrideWarning
SinksConsole + Seq
EnrichmentFromLogContext (includes correlation ID)
Silo propertyApplication: Komand.Silo
Gateway propertyApplication: Komand.Gateway

To increase logging verbosity for debugging:

Terminal window
# Via environment variable
Serilog__MinimumLevel__Default=Debug
# Or for a specific namespace
Serilog__MinimumLevel__Override__Orleans=Information

For instances handling many concurrent conversations:

Terminal window
GrainLimits__MaxSessionsPerAgent=500
GrainLimits__MaxTurnsPerSession=200
RateLimits__ChatPermitLimit=100
RateLimits__ChatWindowSeconds=60

For instances with many marketplace skills:

Terminal window
GrainLimits__MaxSkills=50000

For skills that need extended execution time (e.g., browser automation, data processing):

Terminal window
GrainLimits__MaxToolExecutionTimeoutMinutes=60

For agents that store large amounts of context:

Terminal window
GrainLimits__MaxMemoryEntries=5000
GrainLimits__MaxMemoryValueLength=500000