Configuration Reference

Complete reference for interlace.yaml, located at the project root. Every field has a default — a project works with no config file at all. All paths resolve relative to the project root.

Full Example

name: my-project
default_dialect: duckdb
default_engine: default

# The warehouse (the synthesised "default" engine)
database: 'ducklake:postgres:${WAREHOUSE_DSN}'
data_path: s3://my-bucket/warehouse/
metadata_schema: my_project_meta

secrets:
  lake:
    type: s3
    key_id: ${AWS_ACCESS_KEY_ID}
    secret: ${AWS_SECRET_ACCESS_KEY}
    region: eu-west-2

engines:
  pg:
    type: postgres
    database: 'postgresql://[email protected]:5432/analytics'

attach:
  crm: crm.duckdb
  erp: 'postgres:host=db.internal dbname=erp'

model_paths: [models]
parallelism: 4
state_path: .interlace/state.db
stream_path: .interlace/streams.db

Top-Level Fields

FieldTypeDefaultDescription
namestr"interlace"Project name (also the default warehouse catalog alias)
databasestr"ducklake:.interlace/warehouse.ducklake"Warehouse URI — see engine URIs
default_dialectstr"duckdb"SQL dialect models are written in
enginesmapping{}Named engines — see engine fields
default_enginestr"default"Engine unpinned models run on
aliasstrproject nameWarehouse catalog’s ATTACH alias
data_pathstrDuckLake data location (local dir or s3://...)
metadata_schemastrCatalog schema holding this warehouse’s DuckLake metadata
secretsmapping{}Secrets created on the engine at open — see secrets
attachmapping{}Databases to ATTACH: alias: uri
quack_tokenstrToken for quack: databases (or INTERLACE_QUACK_TOKEN)
model_pathslist[str]["models"]Where models are discovered
parallelismint (min 1)4Models building concurrently (--parallelism overrides)
state_pathstr".interlace/state.db"Control-plane SQLite database
stream_pathstr".interlace/streams.db"Durable stream log (SQLite WAL)

Engine URIs

The database string determines the engine type:

FormMeaning
ducklake:.interlace/warehouse.ducklakeDuckLake, local catalog file (the default)
ducklake:postgres:dbname=lake host=db.internalDuckLake, catalog hosted in Postgres
warehouse.duckdbPlain DuckDB file
:memory:In-memory DuckDB
quack:localhost:4213Warehouse served by interlace serve --quack

Postgres as an execution engine is declared under engines: with type: postgres (never via the top-level database), and requires the adbc extra:

engines:
  pg:
    type: postgres
    database: 'postgresql://user@host:5432/dbname'

Every Postgres DSN — engine, DuckLake catalog, or attach: — must name a host explicitly (host=, a URI host, service=, or PGHOST/PGSERVICE).

Engine Fields

Each entry under engines: accepts:

FieldTypeDefaultDescription
typestr"ducklake"duckdb, ducklake, quack, or postgres
databasestrPath/URI (falls back to the DuckLake default)
dialectstrfrom typeSQL dialect (duckdb-family → duckdb, postgres → postgres)
aliasstrengine nameCatalog ATTACH alias
data_pathstrDuckLake data location
metadata_schemastrDuckLake metadata schema
secretsmapping{}Per-engine secrets
attachmapping{}Per-engine ATTACHes
quack_tokenstrToken when database is quack:

An engine named default overrides the synthesised warehouse engine entirely.

Secret Fields

Each entry under secrets: becomes a CREATE SECRET on the engine at open — how a DuckLake warehouse on object storage authenticates:

FieldDefaultDescription
type"s3"Secret type
key_id""Access key ID
secret""Secret access key
endpointhost[:port], no scheme (MinIO, R2, …); unset = AWS default
regionRegion
url_stylepath for MinIO-style endpoints
use_ssltrue/false
scopePin the secret to a prefix, e.g. s3://bucket

Environment Variable Interpolation

${VAR} anywhere in the file is substituted before YAML parsing — from the process environment first, then from a .env file next to interlace.yaml:

database: 'ducklake:postgres:${WAREHOUSE_DSN}'
  • Only the braced ${VAR} form is recognised (no $VAR, no ${VAR:-default})
  • Unset variables stay as literal ${VAR}; if one survives into the warehouse config, startup fails with the variable named — never a silent empty string
  • The .env parser accepts comments, blank lines, an optional export prefix, and quoted values; it never modifies your process environment

Environment Variables Read by Interlace

VariableEffect
INTERLACE_ENVDefault for --env
INTERLACE_QUACK_TOKENToken for quack: databases
PGHOST / PGSERVICESatisfy the Postgres host requirement