Configuration Overview
The mailiam.config.yaml file is your email infrastructure as code - a single configuration file that defines domains, forms, collections, and projects.
Philosophy
Section titled “Philosophy”mailiam treats email infrastructure like modern development treats application infrastructure:
- Configuration as Code - Your email setup lives in version control
- Declarative Configuration - Describe what you want, not how to achieve it
- Environment Parity - Same config structure across dev, staging, production
- Git Workflow - Changes are reviewed, tested, and deployed like code
Basic Structure
Section titled “Basic Structure”# mailiam.config.yaml - The complete structure
# Domain-based email infrastructuredomains: mysite.com: forwarding: "*@mysite.com": "me@gmail.com" forms: contact: template: "professional" replies: true projects: main: templates: "./templates/" branding: "./brand/"
# Form collections for organizationcollections: company: name: "Company Forms" settings: rateLimit: 100 spamProtection: true forms: support: name: "Support Form" email: "support@company.com"
# Global settingssettings: defaultRegion: "us-east-1" timeout: 30000 retries: 3
# Environment variablesenv: production: apiEndpoint: "https://api.mailiam.dev" staging: apiEndpoint: "https://staging-api.mailiam.dev"Configuration Sections
Section titled “Configuration Sections”Domains
Section titled “Domains”The domains section defines your custom domain-based email infrastructure:
domains: mycompany.com: # Email forwarding rules forwarding: "*@mycompany.com": "team@gmail.com" "support@mycompany.com": "help@company.com"
# Domain-based forms forms: contact: template: "professional" replies: true replyTo: "support@mycompany.com"
# Project organization projects: main: name: "Main Website" templates: "./templates/" branding: "./branding/"
# Domain settings settings: spamProtection: "strict" rateLimit: 100 trackOpens: trueCollections
Section titled “Collections”The collections section organizes forms under namespaced URLs:
collections: # Collection slug (used in URLs) support: name: "Support Forms" description: "Customer support and help forms"
# Collection-level settings settings: rateLimit: 50 spamProtection: true requireApiKey: false
# Forms within collection forms: technical: name: "Technical Support" email: "tech-support@company.com" settings: rateLimitPerMinute: 5 customMessage: "We'll respond within 4 hours"
billing: name: "Billing Questions" email: "billing@company.com" settings: customMessage: "Billing team will respond within 24 hours"Global Settings
Section titled “Global Settings”settings: # Default region for deployments defaultRegion: "us-east-1"
# Request timeout (milliseconds) timeout: 30000
# Number of retries for failed requests retries: 3
# Default rate limiting defaultRateLimit: 100
# Global spam protection level defaultSpamProtection: "normal"
# Enable analytics by default enableAnalytics: true
# Default cache settings caching: enabled: true ttl: 3600Configuration Workflows
Section titled “Configuration Workflows”Initialize New Project
Section titled “Initialize New Project”# Create new project with domainmailiam init mycompany.com
# This creates:# - mailiam.config.yaml# - .mailiam/ directory for local state# - templates/ directory (if --templates flag used)# - .gitignore with mailiam-specific entriesEdit Configuration
Section titled “Edit Configuration”# Edit main configurationvim mailiam.config.yaml
# Validate syntax before deployingmailiam config validate
# Preview changes without deployingmailiam push --dry-runDeploy Changes
Section titled “Deploy Changes”# Deploy to productionmailiam push
# Deploy to specific environmentmailiam push --env staging
# Deploy with verbose outputmailiam push --verboseSync Remote Changes
Section titled “Sync Remote Changes”# Pull latest configuration from remotemailiam pull
# Pull specific environmentmailiam pull --env staging
# Force overwrite local changesmailiam pull --forceEnvironment Management
Section titled “Environment Management”Environment-Specific Configs
Section titled “Environment-Specific Configs”# File structure for multiple environmentsmailiam.config.yaml # Production (default)mailiam.config.dev.yaml # Developmentmailiam.config.staging.yaml # Stagingmailiam.config.test.yaml # TestingEnvironment Variables
Section titled “Environment Variables”# Use environment variables in configurationdomains: mysite.com: forwarding: "*@mysite.com": "{{ env.ADMIN_EMAIL }}" forms: contact: webhookUrl: "{{ env.WEBHOOK_URL }}"
# Environment-specific valuesenv: production: ADMIN_EMAIL: "admin@company.com" WEBHOOK_URL: "https://app.company.com/webhook" staging: ADMIN_EMAIL: "staging@company.com" WEBHOOK_URL: "https://staging.company.com/webhook"Deploy to Environments
Section titled “Deploy to Environments”# Developmentmailiam push --env dev
# Stagingmailiam push --env staging
# Production (default)mailiam pushmailiam push --env productionAdvanced Configuration
Section titled “Advanced Configuration”Template and Asset Paths
Section titled “Template and Asset Paths”domains: mycompany.com: projects: main: # Relative paths from config file templates: "./templates/" branding: "./assets/branding/"
# Absolute paths templates: "/usr/src/app/templates/"
# Remote URLs templates: "https://cdn.company.com/email-templates/"Conditional Configuration
Section titled “Conditional Configuration”domains: mycompany.com: forms: contact: # Different settings based on environment settings: spamProtection: "{{ env.NODE_ENV == 'production' ? 'strict' : 'normal' }}" rateLimit: "{{ env.NODE_ENV == 'development' ? 1000 : 50 }}"
# Conditional features features: analytics: "{{ env.ENABLE_ANALYTICS | default(true) }}" debugging: "{{ env.NODE_ENV == 'development' }}"Includes and Modularity
Section titled “Includes and Modularity”# Main configurationdomains: mycompany.com: # Include external configuration files forwarding: !include forwarding.yaml forms: !include forms/forms.yaml projects: !include projects/projects.yaml
# forwarding.yaml"*@mycompany.com": "team@gmail.com""support@mycompany.com": "help@company.com"
# forms/forms.yamlcontact: template: "professional" replies: truenewsletter: template: "marketing" listId: "main-newsletter"Configuration Validation
Section titled “Configuration Validation”Schema Validation
Section titled “Schema Validation”# Validate configuration syntaxmailiam config validate
# Validate against specific schema versionmailiam config validate --schema-version 2.0
# Strict validation (catch warnings as errors)mailiam config validate --strictPre-deployment Checks
Section titled “Pre-deployment Checks”# Check configuration and preview changesmailiam push --dry-run
# Validate all referenced files existmailiam config validate --check-files
# Test configuration against staging environmentmailiam config test --env stagingCommon Validation Errors
Section titled “Common Validation Errors”# ❌ Invalid YAML syntaxdomains: mysite.com forwarding: # Missing colon after domain
# ❌ Invalid email formatforwarding: "*@mysite.com": "not-an-email"
# ❌ Duplicate keysforms: contact: template: "professional" contact: # Duplicate key template: "casual"
# ❌ Missing required fieldscollections: support: # Missing 'name' field forms: tech: {} # Missing form nameVersion Control Integration
Section titled “Version Control Integration”Git Workflow
Section titled “Git Workflow”# 1. Create feature branchgit checkout -b add-newsletter-form
# 2. Update configurationvim mailiam.config.yaml
# 3. Test changesmailiam push --env dev --dry-run
# 4. Deploy to developmentmailiam push --env dev
# 5. Commit changesgit add mailiam.config.yamlgit commit -m "Add newsletter signup form"
# 6. Create pull requestgit push origin add-newsletter-form
# 7. After review, deploy to productionmailiam push --env production.gitignore Recommendations
Section titled “.gitignore Recommendations”# mailiam local state.mailiam/mailiam.lock
# Environment-specific files (if they contain secrets)mailiam.config.*.yaml!mailiam.config.example.yaml
# Template compilation cachetemplates/.cache/templates/dist/
# Logsmailiam.log*.logSecrets Management
Section titled “Secrets Management”# ❌ Don't commit secretsdomains: mysite.com: webhooks: url: "https://api.service.com/webhook" apiKey: "sk-1234567890abcdef" # Don't do this!
# ✅ Use environment variablesdomains: mysite.com: webhooks: url: "{{ env.WEBHOOK_URL }}" apiKey: "{{ env.WEBHOOK_API_KEY }}"CLI Configuration Commands
Section titled “CLI Configuration Commands”View Configuration
Section titled “View Configuration”# Show current configurationmailiam config show
# Show specific sectionmailiam config show domains.mysite.com
# Show in different formatsmailiam config show --output jsonmailiam config show --output yamlEdit Configuration
Section titled “Edit Configuration”# Edit with default editormailiam config edit
# Edit with specific editormailiam config edit --editor code
# Edit specific environmentmailiam config edit --env stagingConfiguration Management
Section titled “Configuration Management”# Set configuration valuesmailiam config set domains.mysite.com.settings.rateLimit 200
# Get specific valuesmailiam config get domains.mysite.com.forwarding
# Reset to defaultsmailiam config reset
# Import configuration from filemailiam config import backup.yamlBest Practices
Section titled “Best Practices”1. Configuration Structure
Section titled “1. Configuration Structure”- Keep it organized - Use clear sections and consistent indentation
- Document complex rules - Add comments explaining business logic
- Use meaningful names - Form and collection names should be descriptive
- Group related items - Keep similar forms/settings together
2. Environment Management
Section titled “2. Environment Management”- Start simple - Begin with single config, add environments as needed
- Use environment variables - Keep secrets out of configuration files
- Test before deploying - Always validate and dry-run changes
- Document environments - Maintain clear documentation of env differences
3. Version Control
Section titled “3. Version Control”- Commit frequently - Small, focused changes are easier to review
- Write clear commit messages - Explain what changed and why
- Use pull requests - Get team review for configuration changes
- Tag releases - Mark stable configurations with version tags
4. Validation and Testing
Section titled “4. Validation and Testing”- Validate locally - Run
mailiam config validatebefore committing - Test in staging - Deploy to staging environment first
- Monitor deployments - Check status after deploying changes
- Keep backups - Maintain working configuration backups
Your mailiam.config.yaml file is the single source of truth for your email infrastructure - treat it with the same care you give to application code.