Skip to content

Configuration

Nothing in this repository may name a host, a domain, or a secret. Those are facts about a deployment, so everything arrives through the environment and .env.example documents what. bin/check-boundary enforces it, in CI as well as locally.

THINGS_HOST_SUFFIX the suffix tenant subdomains hang off — things.test in development
PORT 4242 in development
THINGS_PUBLIC_ORIGIN public origin for the MCP endpoint when tunnelling to a client that cannot reach .test. Must be stable — OAuth redirect URIs register against it. Blank when not tunnelling
POSTGRES_HOST / POSTGRES_PORT / POSTGRES_USER / POSTGRES_PASSWORD the primary database
OPENSEARCH_URL the query path
PG_BIN_PATH set when the linked pg_dump is older than the server in compose.yml

Solid Queue runs in a second database, in development as well as production — a queue that only exists in one environment is a queue whose failures are only discovered there.

S3_ENDPOINT / S3_REGION / S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY the development MinIO, and any s3 resource configured from the environment
THINGS_FILESYSTEM_ROOTS colon-separated roots a filesystem resource may be rooted under

THINGS_FILESYSTEM_ROOTS is unset by default, and that makes the filesystem type unusable. That is the right default for a server holding more than one tenant’s catalog: an unrooted filesystem resource is a path traversal with extra steps.

ENCRYPTION_PRIMARY_KEY
ENCRYPTION_DETERMINISTIC_KEY
ENCRYPTION_KEY_DERIVATION_SALT

The values in .env.example are development-only and named so you cannot mistake them for anything else. Generate real ones anywhere credentials are actually stored:

Terminal window
bin/rails db:encryption:init
MASKS_ISSUER_TEMPLATE the tenant’s issuer, as a template over its subdomain

Tokens are rejected unless iss matches this and aud matches the tenant’s own /mcp URL. There is no local minting path — this application verifies and never signs.

THINGS_ITERATORS_DISABLED stops every iteration job everywhere

This one is for the operator, not a tenant — it is the big red switch. Per-tenant and per-resource switches are rows in gates, set from the application.

Two more limits are application configuration rather than environment: mcp_limit rate-limits the caller per minute, and run_budget caps how many runs one token may start per hour. See MCP tools.