Skip to main content
Tesslate OpenSail

Overview

All OpenSail configuration is environment-driven. The canonical reader is orchestrator/app/config.py (Pydantic settings). Feature flags live in orchestrator/app/config_features.py. Frontend runtime config reads window._env_.*; build-time config reads VITE_*. Use this page together with:
  • Repo-root .env.example and .env.prod.example
  • docs/guides/environment-variables.md (the exhaustive reference)
  • Kustomize overlays under k8s/overlays/*/backend-patch.yaml
After changing a variable, restart the affected service. In Docker: docker compose restart orchestrator. In Kubernetes: kubectl rollout restart deploy/orchestrator -n tesslate.

Required core

SECRET_KEY
string
required
JWT signing and general crypto fallback. Never reuse across environments. Generate with python3 -c "import secrets; print(secrets.token_urlsafe(32))".
DEPLOYMENT_MODE
string
default:"docker"
docker, kubernetes, or desktop. Selects orchestrator backend, DB driver, task queue, and pub/sub.
DATABASE_URL
string
SQLAlchemy async URL. Docker default points at the postgres service. Desktop mode resolves to SQLite automatically.
INTERNAL_API_SECRET
string
Shared secret for cluster-internal callers (Volume Hub GC, btrfs CSI) hitting /api/internal/*. Desktop mode ignores.

Database

Redis, pub/sub, task queue

Desktop mode uses LocalTaskQueue (asyncio + apscheduler) and LocalPubSub (in-process). No Redis required.

LiteLLM and agent

Auth and cookies

ALGORITHM
string
default:"HS256"
JWT signing algorithm.
ACCESS_TOKEN_EXPIRE_MINUTES
number
default:"30"
Access token TTL.
REFRESH_TOKEN_EXPIRE_DAYS
number
default:"14"
Refresh token TTL.
CSRF_SECRET_KEY
string
Separate key for CSRF tokens. Falls back to SECRET_KEY.
CSRF_TOKEN_MAX_AGE
number
default:"86400"
CSRF token TTL seconds.
Set true in production.
lax, strict, or none.
Scope cookies to apex, e.g. .tesslate.com, for subdomain access.
CORS_ORIGINS
string
Comma-separated allowed origins.
ALLOWED_HOSTS
string
Host header allowlist.

OAuth providers

All optional. Absence of credentials disables the provider gracefully.

SMTP and 2FA

S3 and object storage

Kubernetes (user-project runtime)

Volume Hub and btrfs CSI

Messaging channels and gateway

MCP (Model Context Protocol)

Stripe and billing

Frontend

Domain, ports, Traefik

Desktop

Observability

Feature flags (Tesslate Apps)

Apps features are gated by TSL_FEATURE_* booleans. Default is off except governance policies. The env variable is the dotted flag name upper-cased with dots replaced by underscores: apps.publish becomes TSL_FEATURE_APPS_PUBLISH.

Testing

CI sets SECRET_KEY=test-secret-key-*, DEPLOYMENT_MODE=docker, LITELLM_API_BASE=http://localhost:4000/v1, LITELLM_MASTER_KEY=test-key, and points DATABASE_URL at Postgres on port 5433.

Environment comparison

Next steps

Deployment

Production paths: Docker, Kubernetes, AWS EKS.

Architecture

How the orchestrator, agent, and storage fit together.

Authentication

JWT, OAuth, email 2FA, API keys, and desktop pairing.

API reference

REST surface overview and OpenAPI spec pointer.