Full Configuration Reference
Full Configuration Reference
flow8 has three configuration layers applied in order:
.env— environment variables loaded at startupconfig/config.yml— YAML config with${VAR}substitution via ViperDBSystemConfig— database-level overrides (applied at runtime, no restart needed)
config/config.yml — Complete Schema
app: server: port: ${SERVER_PORT} # HTTP listen port (default: 4454) url: ${API_URL} # Base API URL for internal calls
channels: portRange: ${CHANNEL_PORT_RANGE} # Ports for channel runtimes (default: 7701-7799)
cors: debug: false allowedOrigins: ${ALLOWED_ORIGINS} # Comma-separated allowed origins allowedMethods: [GET, POST, PUT, OPTIONS] allowedHeaders: [Accept, Authorization, Content-Type] allowCredentials: true
auth: session: cookie: domain: ${COOKIE_DOMAIN} # Cookie domain (empty = current domain) lifeTime: 3600 # Session TTL in seconds oauth2: microsoft: endpoint: auth: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize" token: "https://login.microsoftonline.com/common/oauth2/v2.0/token" me: "https://graph.microsoft.com/v1.0/me" clientId: ${MICROSOFT_CLIENT_ID} clientSecret: ${MICROSOFT_CLIENT_SECRET} scope: ${MICROSOFT_SCOPE} external: jwt: secret: ${EXTERNAL_JWT_SECRET} salt: bytes: 32 # Salt size for bcrypt password hashing
apps: autoregister: forceUpdate: ${APPS_FORCEUPDATE} # Force module re-registration on startup create: ${APPS_AUTOCREATE} # Auto-create missing module entries
api: meta: size: max: 100 # Maximum page size for list endpoints default: 25 # Default page size
output: ui: unitFieldMaxBytes: ${UNIT_OUTPUT_UI_MAX_BYTES} # Max bytes per field in UI output display
audit: log: fieldMaxBytes: ${AUDIT_LOG_FIELD_MAX_BYTES} # Max bytes per field in audit log entries
websocket: readDeadline: 30 # WS connection read timeout (seconds) pingPeriod: 15 # WS ping interval (seconds)
alert: channel: email: from: ${ALERT_EMAIL_FROM} smtp: host: ${ALERT_EMAIL_HOST} port: ${ALERT_EMAIL_PORT} auth: user: ${ALERT_EMAIL_USER} pass: ${ALERT_EMAIL_PASS}
retention: default: cadence: ${RETENTION_DEFAULT_DAYS} # Default retention duration (e.g., "30d") entries: ${RETENTION_DEFAULT_ENTRIES} # Default max entries per flow cleanup: interval: ${RETENTION_CLEANUP_INTERVAL} # Job run frequency (e.g., "2m") batchSize: ${RETENTION_CLEANUP_BATCH_SIZE} # Records deleted per run enforcedMin: flows: cadence: all: ${RETENTION_ENFORCED_MIN_FLOWS_ALL_CADENCE} filtered: ${RETENTION_ENFORCED_MIN_FLOWS_FILTERED_CADENCE} entries: ${RETENTION_ENFORCED_MIN_FLOWS_ENTRIES} audit: cadence: ${RETENTION_ENFORCED_MIN_AUDIT_CADENCE}
caps: storage: ${CAPS_STORAGE} # Enable file storage capability soffice: ${CAPS_SOFFICE} # Enable LibreOffice conversion tesseract: ${CAPS_TESSERACT} # Enable Tesseract OCR magick: ${CAPS_MAGICK} # Enable ImageMagick processing
mcp: server: host: "localhost" port: 4445 # MCP server port auth: jwt: secret: ${MCP_JWT_SECRET}
openai: api_key: ${OPENAI_API_KEY} generation: flow: limitPerDay: 100 # Max AI-generated flows per day per user.config.yaml — Storage & Plugin Paths
path: in: "./drops" # Inbound drop location storage: "./storage" # Base storage directory tmp: "./storage/tmp" # Temporary processing files db: "./storage/db" # JSON database snapshots reserved: "./storage/reserved" out: "./storage/out" data: root: "./storage/data" # User data root files: "./storage/data/.files" # Internal file storage logs: "./storage/logs" # Application log files plugins: "./pkg/plugins" # Plugin directory root soffice: "/Applications/LibreOffice.app/Contents/MacOS/soffice" # LibreOffice binary
ext: supported: [".tiff", ".pdf", ".docx"] # Allowed upload extensions excluded: [".DS_Store"] # Always rejected
qrcode: domain: "https://go.u8x.io/d/" # QR code base URL
plugins: - "ad" # Enabled plugin module namesDBSystemConfig — Runtime Overrides
The system_config MongoDB collection holds a single document per installation. Changes take effect immediately without a restart. Fields include:
- AI: default provider, model, and parameters
- Notification: email notification settings
- Retention: policy overrides that supplement
.envvalues - Execution: global execution settings (max concurrent plays, default timeout)
Query or update via the admin API or directly in MongoDB Express.
Viper Resolution
Viper resolves ${VAR_NAME} tokens in config/config.yml by looking up the environment variable VAR_NAME. If the variable is not set, the token is replaced with an empty string. Use .env to set values; they are auto-loaded at startup before Viper processes the YAML.