Skip to content

Config Reference

Astonish always runs in platform mode, whether backed by SQLite (lightweight local) or PostgreSQL (scalable cloud). Configuration is split between two locations:

  • config.yaml — System-level infrastructure settings (daemon, browser, sandbox, sessions, memory, etc.) shared across all tenants. In Kubernetes, this is rendered from the Helm ConfigMap.
  • Database — Tenant-specific settings (providers, models, tools, credentials) managed through Studio Settings with a 3-tier cascade (Platform → Org → Team).

Architecture

┌─────────────────────────────────────────────────────────────┐
│  Studio Settings UI                                         │
│                                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │
│  │  Providers   │  │  MCP Servers │  │  Team Settings   │  │
│  │  (per-tier)  │  │  (per-tier)  │  │  (web tools,etc) │  │
│  └──────┬───────┘  └──────┬───────┘  └────────┬─────────┘  │
│         │                  │                   │            │
│         ▼                  ▼                   ▼            │
│  ┌─────────────────────────────────────────────────────┐    │
│  │           Database (SQLite or PostgreSQL)            │    │
│  │  Platform Settings → Org Settings → Team Settings   │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  config.yaml (system-level, shared infrastructure)  │    │
│  │  daemon, browser, sandbox, sessions, memory, etc.   │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

Database-Managed Settings (3-Tier Cascade)

These settings are managed through Studio Settings and stored in the database. They cascade with increasing priority:

Platform → Org → Team
(base)            (highest priority)
TierManaged ByScope
PlatformPlatform superadminAll orgs and teams
OrgOrg admin/ownerAll teams in the organization
TeamTeam admin/ownerSingle team

What's in the Database

SettingCascade TiersManaged In
AI Providers (API keys, endpoints, types)Platform → Org → TeamSettings → Providers
Default provider and modelPlatform → Org → TeamSettings → Providers
Web search/extract toolsTeamSettings → General
Context lengthTeamSettings → General
Web server configs (Tavily, Brave, etc.)TeamSettings → General
Memory embedding provider/modelTeamSettings → Memory
Memory entries and embeddingsPersonal / Team / OrgStored per-scope in DB
Chat sessions and historyPersonal / TeamStored per-scope in DB
Sandbox template nameTeamSettings → Sandbox
Disabled toolsTeamSettings → General
MCP serversPlatform → Org → TeamSettings → MCP Servers
Credentials (API keys, tokens)Team (encrypted)Settings → Credentials
Channel configs (Telegram, Email, Slack)PlatformSettings → Channels

Providers are merged additively across tiers — each tier can add new providers or override existing ones by name. Default provider/model override from the closest tier that sets them.

config.yaml — System-Level Settings

These settings live in ~/.config/astonish/config.yaml and are shared across all tenants on the same instance. In Kubernetes, they come from the Helm ConfigMap.

Changing these settings requires org admin or platform admin privileges in cloud deployments.

yaml
# Storage backend (determines database engine)
storage:
  backend: "sqlite"            # sqlite | postgres
  sqlite:
    data_dir: ""               # Default: ~/.local/share/astonish
  postgres:
    platform_dsn: ""           # PostgreSQL connection string
    instance_suffix: ""        # Database name suffix
    max_open_conns: 25
    max_idle_conns: 5
    conn_max_lifetime_minutes: 30
  auth:
    mode: "builtin"            # builtin | oidc
    jwt_secret: ""
    access_token_ttl_minutes: 15
    refresh_token_ttl_days: 90
    allow_registration: true
    require_email_verification: true
    default_org_name: "Default Organization"
    default_org_slug: "default"
    oidc:
      issuer_url: ""
      client_id: ""
      client_secret: ""
      redirect_url: ""
      scopes: ["openid", "profile", "email"]

# Daemon (Studio web server)
daemon:
  port: 9393
  log_dir: ""                  # Default: ~/.config/astonish/logs/
  auth:
    disabled: false
    session_ttl_days: 90

# Chat behavior
chat:
  system_prompt: ""            # Custom system prompt text
  max_tool_calls: 0            # Max tool calls per turn (0 = unlimited)
  max_tools: 0                 # Max tools exposed to model (0 = all)
  auto_approve: false          # Auto-approve tool executions
  flow_save_dir: ""            # Where distilled flows are saved

# Session management
# Note: In daemon mode, sessions are stored in the database.
# These settings only affect the CLI console mode.
sessions:
  compaction:
    enabled: true
    threshold: 0.8             # Context usage threshold to trigger compaction
    preserve_recent: 4         # Number of recent messages to preserve
  cleanup:
    max_age_days: 5            # Auto-delete sessions older than this

# Semantic memory
# Note: Memory content (entries, embeddings) is stored in the database.
# These settings control the embedding engine and search behavior.
memory:
  enabled: true
  embedding:
    provider: "auto"           # auto | openai | ollama | openai-compat
    model: ""
    base_url: ""
    api_key: ""
  chunking:
    max_chars: 1600
    overlap: 320
  search:
    max_results: 6
    min_score: 0.35

# Browser automation
browser:
  headless: false
  viewport_width: 1920
  viewport_height: 1080
  no_sandbox: null
  chrome_path: ""              # Custom Chromium binary
  user_data_dir: ""
  navigation_timeout: 30       # Seconds
  proxy: ""
  remote_cdp_url: ""           # Connect to existing Chrome instance
  fingerprint_seed: ""
  fingerprint_platform: ""
  handoff_bind_address: "127.0.0.1"
  handoff_port: 9222

# Sub-agent delegation
sub_agents:
  enabled: true
  max_depth: 2                 # Maximum delegation depth
  max_concurrent: 5            # Max parallel sub-agents
  task_timeout_sec: 300        # Per-task timeout

# Skills system
skills:
  enabled: true
  user_dir: ""                 # Custom skills directory
  extra_dirs: []               # Additional skill directories
  allowlist: []                # Restrict to specific skills

# Agent identity (for web registrations)
agent_identity:
  name: ""
  username: ""
  email: ""
  bio: ""

# Job scheduler
scheduler:
  enabled: true

# Container sandbox
sandbox:
  enabled: false
  privileged: false
  backend: "incus"             # incus | k8s | openshell
  network: ""
  limits:
    memory: "4GB"
    cpu: 2
    processes: 500
    requests:
      cpu_millis: 100
      memory_mib: 256
  prune:
    orphan_check_hours: 0
    idle_timeout_minutes: 10
  kubernetes:                  # Only for backend: k8s
    namespace: "astonish-sandboxes"
    sandbox_image: "ghcr.io/sap/astonish-sandbox-base:latest"
    overlay_mode: "fuse"       # fuse | kernel | auto
    layers_pvc_name: "astonish-layers"
    uppers_pvc_name: "astonish-uppers"
  openshell:                   # Only for backend: openshell
    gateway_addr: ""
    gateway_tls: true
    sandbox_image: "ghcr.io/sap/astonish-sandbox-openshell:latest"
    network_policy:
      presets: ["default"]
      extra_endpoints: []

# Security
security:
  secret_scanner:
    enabled: true
    entropy_threshold: 4.0
    min_token_length: 16

Kubernetes: Helm ConfigMap

In Kubernetes deployments, the Helm chart renders only the infrastructure settings into the ConfigMap. Provider and tenant settings are managed via Studio Settings (stored in the database):

yaml
# What the Helm chart renders into config.yaml
storage:
  backend: "postgres"
  postgres:
    instance_suffix: ""
    max_open_conns: 25
    max_idle_conns: 5
    conn_max_lifetime_minutes: 30
  auth:
    mode: "builtin"
    access_token_ttl_minutes: 15
    refresh_token_ttl_days: 90

sandbox:
  backend: "k8s"               # or "openshell"
  limits:
    memory: "2GB"
    cpu: 2
    processes: 500
  kubernetes:
    namespace: "astonish-sandbox"
    sandbox_image: "ghcr.io/sap/astonish-sandbox-base:latest"
    overlay_mode: "fuse"

Secrets (master key, JWT secret, platform DSN) are injected as environment variables from Kubernetes Secrets — never in the ConfigMap.

Environment Variable Substitution

Any value in config.yaml can reference environment variables using ${VAR_NAME} syntax:

yaml
storage:
  postgres:
    platform_dsn: "${ASTONISH_PLATFORM_DSN}"

Initial Setup

The astonish setup wizard creates the initial configuration:

bash
astonish setup

This walks you through selecting a storage backend (SQLite or PostgreSQL), configuring your first AI provider, and bootstrapping the platform database with an initial organization and admin user.

Managing Settings

WhatWhere to Configure
Providers, models, API keysStudio Settings → Providers (stored in DB)
MCP serversStudio Settings → MCP Servers (stored in DB)
CredentialsStudio Settings → Credentials (encrypted in DB)
Browser, daemon, sandboxStudio Settings → System sections (writes to config.yaml, requires admin)
Infrastructure (storage, auth)Helm values (Kubernetes) or astonish setup (local)

See Providers for supported AI backends and MCP Servers for tool extension.