コンテンツにスキップ

Configuration Reference

このコンテンツは、現在ご利用の言語ではまだ提供されていません。

This comprehensive guide covers all configuration options for self-hosted Onetime Secret instances.

Onetime Secret uses multiple configuration files:

  • .env - Environment variables for common settings. Use for simple configuration and Docker deployments without modifying YAML files. (Copy from .env.example)
  • etc/config.yaml - Main application configuration using ERB templates. Environment variables are integrated here, making it easy to see how each setting is applied. (Copy from etc/defaults/config.defaults.yaml)

The main configuration file is etc/config.yaml, which uses ERB templates to integrate environment variables.

Getting started:

  1. Copy the example: cp etc/defaults/config.defaults.yaml etc/config.yaml
  2. Edit values as needed for your deployment
  3. Most common settings can be overridden with environment variables

View the complete configuration file: config.defaults.yaml

Here are the most important sections you’ll likely need to customize:

---
site:
host: <%= ENV['HOST'] || 'localhost:3000' %>
# Turns https/http on or off when generating links
ssl: <%= ENV['SSL'] == 'true' || false %>
# IMPORTANT: After setting the secret, it should not be changed.
# Be sure to create and store a backup in a secure offsite
# location. Changing the secret can lead to unforeseen issues
# like not being able to decrypt existing secrets.
secret: <%= ENV['SECRET'] || nil %>
# API and UI Configuration
interface:
ui:
# Controls whether the web interface is enabled
# When false, only a basic explanation page is shown
enabled: <%= ENV['UI_ENABLED'] != 'false' %>
# Form field visibility flags
# Controls which optional fields appear on the secret creation form.
# All default to true (visible). Set to 'false' to hide from the UI.
# These are independent of API guest_routes, which gate endpoint access.
capabilities:
burn: <%= ENV['UI_CAPABILITIES_BURN'] != 'false' %>
show: <%= ENV['UI_CAPABILITIES_SHOW'] != 'false' %>
receipt: <%= ENV['UI_CAPABILITIES_RECEIPT'] != 'false' %>
recipient: <%= ENV['UI_CAPABILITIES_RECIPIENT'] != 'false' %>
# Header configuration
# Controls branding and navigation in the site header
header:
# Control switch to enable/disable header customization
enabled: <%= ENV['HEADER_ENABLED'] != 'false' %>
# Branding configuration for the masthead logo and site identity
branding:
# Logo lockup: icon + optional text mark in the masthead
logo:
# Vue component name or image URL (e.g. DefaultLogo.vue, /img/logo.svg)
url: <%= ENV['LOGO_URL'] || 'DefaultLogo.vue' %>
alt: <%= ENV['LOGO_ALT'] || 'Share a Secret One-Time' %>
href: <%= ENV['LOGO_LINK'] || '/' %>
# Show the site name as a text mark next to the logo icon.
# Set false for icon-only display; SITE_NAME remains active
# in page titles, MFA labels, and emails regardless.
show_name: <%= ENV['LOGO_SHOW_NAME'] != 'false' %>
# Product name used across the application:
# - Masthead text mark (when logo.show_name is true)
# - Browser page title
# - MFA authenticator app issuer label
# - Outbound email sender name
# Falls back to i18n key if not set.
site_name: <%= ENV['SITE_NAME'] || 'One-Time Secret' %>
# Navigation configuration
navigation:
# Enable/disable header navigation entirely
enabled: <%= ENV['HEADER_NAV_ENABLED'] != 'false' %>
# Footer link configuration (public pages)
# These links appear in the footer of each page
footer_links:
# Global toggle to enable/disable all footer links
enabled: <%= ENV['FOOTER_LINKS'] == 'true' %>
# Organized groups of links
groups:
- name: legal
i18n_key: web.footer.legals
links:
- text: Terms of Service
i18n_key: web.layout.terms_of_service
# Replace with your own terms URL or use relative path like /terms
url: <%= ENV['TERMS_URL'] %>
- text: Privacy Policy
i18n_key: web.layout.privacy_policy
# Replace with your own privacy URL or use relative path like /privacy
url: <%= ENV['PRIVACY_URL'] %>
- name: resources
i18n_key: web.footer.resources
links:
- text: Docs
i18n_key: web.footer.docs
# Replace with your documentation URL
url: <%= ENV['DOCS_URL'] || 'https://docs.onetimesecret.com/' %>
- text: Status
i18n_key: web.COMMON.status
# Replace with your status page URL if you have one
url: <%= ENV['STATUS_URL'] || 'https://status.onetimesecret.com/' %>
- name: support
i18n_key: web.footer.support
links:
- text: About
i18n_key: web.COMMON.about
# Replace with your about page URL
url: <%= ENV['ABOUT_URL'] || 'https://onetimesecret.com/about' %>
- text: Contact
i18n_key: web.footer.contact
url: <%= ENV['CONTACT_URL'] || '/feedback' %>
# Workspace footer links (authenticated users only)
# Separate from footer_links which are for public pages
workspace_links:
# Global toggle to enable/disable all footer links
enabled: <%= ENV['WORKSPACE_LINKS'] == 'true' %>
links:
- text: API Docs
i18n_key: web.footer.api_docs
url: <%= ENV['WORKSPACE_API_DOCS_URL'] || 'https://api.onetimesecret.com/' %>
- text: Branding Guide
i18n_key: web.footer.branding_guide
url: <%= ENV['WORKSPACE_BRANDING_GUIDE_URL'] || 'https://docs.onetimesecret.com/' %>
- text: Feedback
i18n_key: web.TITLES.feedback
url: <%= ENV['WORKSPACE_FEEDBACK_URL'] || '/feedback' %>
# Controls whether the API endpoints are available. When disabled, the API
# is completely disabled. Requests to /api/* will return 404.
api:
enabled: <%= ENV['API_ENABLED'] != 'false' %>
# Guest API routes for anonymous access
# When enabled, /api/v3/guest/* endpoints allow unauthenticated requests
guest_routes:
# Global toggle - disables all guest routes when false
enabled: <%= ENV['API_GUEST_ROUTES_ENABLED'] != 'false' %>
# Fine-grained controls (checked only when enabled=true)
conceal: <%= ENV['API_GUEST_CONCEAL'] != 'false' %>
generate: <%= ENV['API_GUEST_GENERATE'] != 'false' %>
reveal: <%= ENV['API_GUEST_REVEAL'] != 'false' %>
burn: <%= ENV['API_GUEST_BURN'] != 'false' %>
show: <%= ENV['API_GUEST_SHOW'] != 'false' %>
receipt: <%= ENV['API_GUEST_RECEIPT'] != 'false' %>
# Configuration options for secret management
secret_options:
# Default Time-To-Live (TTL) for secrets in seconds
# This value is used if no specific TTL is provided when creating a secret
default_ttl: <%= ENV['DEFAULT_TTL'] || nil %>
# Available TTL options for secret creation (in seconds)
# These options will be presented to users when they create a new secret
# Format: String of integers representing seconds
ttl_options: <%= (ENV['TTL_OPTIONS'] || nil) %>
# Settings for the passphrase field that protects access to secrets
passphrase:
# Require users to enter a passphrase when creating secrets
required: <%= ENV['PASSPHRASE_REQUIRED'] == 'true' || false %>
# Minimum number of characters required for passphrases
# Default to 4 chars to prevent trivially guessable passphrases while
# maintaining backward compatibility with existing integrations.
minimum_length: <%= ENV['PASSPHRASE_MIN_LENGTH'] || 4 %>
# Maximum number of characters allowed for passphrases
maximum_length: <%= ENV['PASSPHRASE_MAX_LENGTH'] || 128 %>
# Enforce complexity requirements (uppercase, lowercase, numbers, symbols)
enforce_complexity: <%= ENV['PASSPHRASE_ENFORCE_COMPLEXITY'] == 'true' || false %>
# How long (in seconds) a generated password remains visible on the
# receipt page after creation. Set to 0 to disable receipt-page display.
generated_value_display_ttl: <%= ENV['GENERATED_VALUE_DISPLAY_TTL'] || 60 %>
# Settings for password generation (when users click "Generate Password")
password_generation:
# Default length for generated passwords
default_length: <%= ENV['PASSWORD_GEN_LENGTH'] || 12 %>
# Character sets to include in generated passwords
character_sets:
# Include uppercase letters (A-Z)
uppercase: <%= ENV['PASSWORD_GEN_UPPERCASE'] != 'false' %>
# Include lowercase letters (a-z)
lowercase: <%= ENV['PASSWORD_GEN_LOWERCASE'] != 'false' %>
# Include numbers (0-9)
numbers: <%= ENV['PASSWORD_GEN_NUMBERS'] != 'false' %>
# Include symbols (!@#$%^&*()_+-=[]{}|;:,.<>?)
symbols: <%= ENV['PASSWORD_GEN_SYMBOLS'] != 'false' %>
# Exclude ambiguous characters (0, O, l, 1, I) to prevent confusion
exclude_ambiguous: <%= ENV['PASSWORD_GEN_EXCLUDE_AMBIGUOUS'] != 'false' %>
# Registration and Authentication settings
authentication:
# Can be disabled altogether, including API authentication.
enabled: <%= ENV['AUTH_ENABLED'] != 'false' %>
# Allow users to create accounts. This can be disabled if you plan
# to create accounts manually or enable during setup when accounts
# can be created and then disabled to prevent any new users from
# creating accounts.
signup: <%= ENV['AUTH_SIGNUP'] != 'false' %>
# Generally if you allow registration, you allow signin. But there
# are circumstances where it's helpful to turn off authentication
# temporarily.
signin: <%= ENV['AUTH_SIGNIN'] != 'false' %>
# By default, new accounts need to verify their email address before
# they can sign in. This is a security measure to prevent spamming
# and abuse of the system. If you're running a private instance or
# an instance for your team or company, you can disable this feature
# to make it easier for users to sign in.
autoverify: <%= ENV['AUTH_AUTOVERIFY'] == 'true' || false %>
# When enabled, the homepage secret form is not available unless
# the user is logged in. Similar to a disabled homepage, but still
# shows the header with logo and navigation links. This allows for
# a more restrictive mode where only authenticated users can create
# secrets while maintaining site navigation and branding.
required: <%= ENV['AUTH_REQUIRED'] == 'true' %>
# Colonel (admin) accounts are managed via the CLI:
# bin/ots customers role promote user@example.com
# bin/ots customers role demote user@example.com
# bin/ots customers role list
# Restrict account creation to specific email domains while allowing
# secret-sharing with any email address. When set, only email addresses
# from the listed domains can create accounts. This is useful for
# organizations that want to limit signups to their own domains while
# still allowing secrets to be shared with anyone.
# Format: List of domain names (e.g., example.com, company.org)
# If empty or not set, signups are allowed from any domain (default).
# Environment variable: ALLOWED_SIGNUP_DOMAIN (comma-separated list)
allowed_signup_domains: <%= ENV['ALLOWED_SIGNUP_DOMAIN']&.split(',')&.map(&:strip) || [] %>
# Links to documentation. For onetimesecret.com, this is
# docs.onetimesecret.com.
support:
host: <%= ENV['SUPPORT_HOST'] || nil %>
# Session configuration
# Controls browser cookie and server-side session behavior.
# Session handling is auth-mode agnostic (works with simple or full mode).
session:
# Session secret for HMAC signing. Falls back to site.secret if not set.
secret: <%= ENV['SESSION_SECRET'] %>
# Session lifetime in seconds (default: 24 hours)
expire_after: 86400
# Cookie name
key: 'onetime.session'
# Require HTTPS for cookies (recommended: true in production)
secure: <%= ENV['SSL'] == 'true' || false %>
# SameSite cookie attribute (strict|lax|none)
# Required for Stripe/OAuth redirects - 'strict' blocks cookies on cross-site GET navigations
same_site: lax
# Prevent JavaScript access to cookies (always true in Rack)
httponly: true
# Security Configuration
# Additional security settings beyond middleware
security:
# Content Security Policy (CSP) Configuration
#
# When enabled, adds Content-Security-Policy headers to responses.
# - Development mode: Less restrictive headers to allow hot reloading
# - Production mode: Strict headers with nonce-based script protection
#
# The nonce is available via `req.env['onetime.nonce']` for custom
# script/style assets. Backend views add it automatically.
#
# ENV: CSP_ENABLED (default: false)
csp:
enabled: <%= ENV['CSP_ENABLED'] == 'true' || false %>
features:
# Incoming Secrets Feature
# Allows anonymous users to send encrypted secrets to pre-configured recipients
# via a dedicated web form at /incoming. Recipients receive email notifications.
incoming:
# Enable or disable the incoming secrets feature
enabled: <%= ENV['INCOMING_ENABLED'] == 'true' || false %>
# Maximum character length for the memo/subject field
memo_max_length: <%= ENV['INCOMING_MEMO_MAX_LENGTH'] || 50 %>
# Default TTL for incoming secrets in seconds (7 days = 604800)
default_ttl: <%= ENV['INCOMING_DEFAULT_TTL'] || 604800 %>
# Optional default passphrase for all incoming secrets (nil = no passphrase)
default_passphrase: <%= ENV['INCOMING_DEFAULT_PASSPHRASE'] || nil %>
# Recipients who can receive incoming secrets
# Each recipient needs an email and optional display name.
# Email addresses are hashed at startup and never exposed in API responses.
#
# Environment Variable Format:
# INCOMING_RECIPIENT_N=email[,name]
# where N is 1, 2, 3, etc. and name is optional
#
# Examples:
# INCOMING_RECIPIENT_1=support@example.com,Support Team
# INCOMING_RECIPIENT_2=security@example.com,Security Team
# INCOMING_RECIPIENT_3=admin@example.com (name defaults to 'admin')
#
recipients:
- <%= ENV['INCOMING_RECIPIENT_1']&.split(',') %>
- <%= ENV['INCOMING_RECIPIENT_2']&.split(',') %>
- <%= ENV['INCOMING_RECIPIENT_3']&.split(',') %>
- <%= ENV['INCOMING_RECIPIENT_4']&.split(',') %>
domains:
enabled: <%= ENV['DOMAINS_ENABLED'] == 'true' || false %>
# The default domain used for link URLs. When not set or empty,
# site.host is used.
default: <%= ENV['DEFAULT_DOMAIN'] || nil %>
# Domain validation and certificate management strategy
# Options:
# - passthrough: No validation or cert management
# - approximated: Use approximated.app API for SSL certs and validation (requires cluster config)
# - caddy_on_demand: Use Caddy's on-demand TLS (requires internal ACME endpoint)
validation_strategy: <%= ENV['DOMAINS_VALIDATION_STRATEGY'] || 'passthrough' %>
# Approximated proxy configuration (required for 'approximated' strategy)
approximated:
api_key: <%= ENV['APPROXIMATED_API_KEY'] || nil %>
proxy_ip: <%= ENV['APPROXIMATED_PROXY_IP'] || nil %>
proxy_host: <%= ENV['APPROXIMATED_PROXY_HOST'] || nil %>
proxy_name: <%= ENV['APPROXIMATED_PROXY_NAME'] || nil %>
vhost_target: <%= ENV['APPROXIMATED_VHOST_TARGET'] || nil %>
# Internal ACME endpoint configuration (for 'caddy_on_demand' strategy)
# This endpoint allows Caddy to verify domains before issuing certificates.
#
# When enabled is true, the ACME app is auto-mounted inside the main
# application process and available on the loopback interface at the
# main app's port (e.g. http://127.0.0.1:3000/api/internal/acme/ask).
#
# When enabled is false, the ACME app must be run as a standalone
# process: rackup apps/internal/acme/config.ru
# It will bind to the listen_address and port configured below.
#
# The listen_address and port settings only apply to standalone mode.
acme:
enabled: <%= ENV['ACME_ENDPOINT_ENABLED'] == 'true' %>
# IP address to bind to in standalone mode (should always be localhost)
listen_address: <%= ENV['ACME_LISTEN_ADDRESS'] || '127.0.0.1' %>
# Port for standalone mode (Caddy's ask directive points here)
port: <%= ENV['ACME_PORT'] || '12020' %>
# Organizations UI
# Shows the organization switcher in the navigation bar. Organizations
# always exist under the hood (every customer has one for Stripe billing).
# This flag controls whether users can see and switch between multiple orgs.
organizations:
enabled: <%= ENV['ENABLE_ORGS'] == 'true' %>
sso_enabled: <%= ENV['ORGS_SSO_ENABLED'] == 'true' %>
custom_mail_enabled: <%= ENV['ORGS_CUSTOM_MAIL_ENABLED'] == 'true' %>
incoming_secrets_enabled: <%= ENV['ORGS_INCOMING_SECRETS_ENABLED'] == 'true' %>
# Main Database Configuration
redis:
# Redis/Valkey connection URI - Compatible with Redis, Valkey, and other
# Redis-compatible servers.
#
# Environment Variable Precedence (highest to lowest):
# 1. VALKEY_URL or REDIS_URL - Explicit connection string
# 2. IN_DOCKER=1 - Force Docker configuration (redis://host.docker.internal:6379)
# 3. AUTO_DETECT_DOCKER=1 - Enable automatic Docker detection via /.dockerenv file
# 4. Default - Local development (redis://CHANGEME@127.0.0.1:6379)
#
# Format: redis://[:password@]host[:port]/[db-number]
# Examples:
# - redis://mypassword@localhost:6379 # Simple password auth
# - redis://user:pass@localhost:6379 # Username/password auth
# - redis://host.docker.internal:6379 # Docker environment
# - redis://127.0.0.1:6379 # Local development
uri: >-
<%=
ENV['VALKEY_URL'] ||
ENV['REDIS_URL'] ||
(ENV['IN_DOCKER'] == '1' || (ENV['AUTO_DETECT_DOCKER'] == '1' && File.exist?('/.dockerenv')) ?
'redis://host.docker.internal:6379' :
'redis://CHANGEME@127.0.0.1:6379')
%>
# Database Mapping Configuration
# By default, all data types use database 0 for simplified connection pooling
# and compatibility with Redis-as-a-Service providers. For advanced setups,
# you can separate data across different Redis logical databases (0-15)
# by setting environment variables or modifying the values below.
dbs:
custom_domain: <%= ENV['VALKEY_DBS_CUSTOM_DOMAIN'] || ENV['REDIS_DBS_CUSTOM_DOMAIN'] || 0 %>
customer: <%= ENV['VALKEY_DBS_CUSTOMER'] || ENV['REDIS_DBS_CUSTOMER'] || 0 %>
metadata: <%= ENV['VALKEY_DBS_METADATA'] || ENV['REDIS_DBS_METADATA'] || 0 %>
secret: <%= ENV['VALKEY_DBS_SECRET'] || ENV['REDIS_DBS_SECRET'] || 0 %>
feedback: <%= ENV['VALKEY_DBS_FEEDBACK'] || ENV['REDIS_DBS_FEEDBACK'] || 0 %>
# Sending Emails
emailer:
# Local Development with Mailpit
# -----------------------------
# Mailpit is a dev SMTP server that captures emails for testing
# Install: brew install mailpit
# Start: mailpit
# Web UI: http://localhost:8025
#
# :mode: smtp # Use SMTP mode for local testing
# :from: secure@onetimesecret.com # Sender address
# :from_name: OTS Support # Sender name
# :host: 127.0.0.1 # Mailpit host
# :port: 1025 # Mailpit default SMTP port
# :user: ~ # No auth needed for Mailpit
# :pass: ~ # No auth needed for Mailpit
# :auth: false # Disable SMTP auth for Mailpit
# :tls: false # Disable TLS for local testing
# Production Settings (for reference)
# ----------------------------------
mode: <%= ENV['EMAILER_MODE'] || 'smtp' %>
region: <%= ENV['EMAILER_REGION'] || 'smtp' %>
from: <%= ENV['FROM_EMAIL'] || ENV['FROM'] || 'CHANGEME@example.com' %>
from_name: <%= ENV['FROM_NAME'] || 'Support' %>
reply_to: <%= ENV['REPLYTO_EMAIL'] || ENV['FROM_EMAIL'] || nil %>
host: <%= ENV['SMTP_HOST'] || 'smtp.provider.com' %>
port: <%= ENV['SMTP_PORT'] || 587 %>
user: <%= ENV['SMTP_USERNAME'] %>
# The double quotes are important b/c credentials can have characters that break YAML parsing.
pass: "<%= ENV['SMTP_PASSWORD'] %>"
auth: <%= ENV['SMTP_AUTH'] || nil %>
tls: <%= ENV['SMTP_TLS'] %>
# Email Provider DNS Validation Settings
# --------------------------------------
# Configuration for sender domain validation strategies. These settings
# control how DNS records are generated for DKIM, SPF, and related email
# authentication when setting up custom mail sender domains.
#
# Each provider has sensible defaults; override only when needed.
# All settings are optional - the system works without this section.
#
email_providers:
# AWS SES configuration
ses:
# AWS region for SES endpoints (affects MX record values)
# Override via EMAIL_PROVIDERS_SES_REGION env var
region: <%= ENV['EMAIL_PROVIDERS_SES_REGION'] || 'us-east-1' %>
# Number of DKIM selectors (SES uses 3 by default)
dkim_selector_count: 3
# SPF include domain
spf_include: amazonses.com
# SendGrid configuration
sendgrid:
# Branding subdomain prefix (appears in CNAME records)
# Override via EMAIL_PROVIDERS_SENDGRID_SUBDOMAIN env var
subdomain: <%= ENV['EMAIL_PROVIDERS_SENDGRID_SUBDOMAIN'] || 'em' %>
# DKIM selector names
dkim_selectors:
- s1
- s2
# SPF include domain
spf_include: sendgrid.net
# Lettermint configuration
#
# Lettermint has TWO separate APIs with different auth:
# 1. Sending API - uses x-lettermint-token header (project token)
# 2. Team API - uses Authorization: Bearer header (team token)
#
# Domain provisioning requires the Team API token.
#
lettermint:
# Project token for Lettermint Sending API (email delivery)
# Required when emailer.mode is 'lettermint'
# Override via LETTERMINT_API_TOKEN env var
api_token: <%= ENV['LETTERMINT_API_TOKEN'] %>
# Team token for Lettermint Team API (domain provisioning)
# Required for custom mail sender domain management
# Override via LETTERMINT_TEAM_TOKEN env var
team_token: <%= ENV['LETTERMINT_TEAM_TOKEN'] %>
# API base URL (for enterprise/on-premise deployments)
# Override via LETTERMINT_BASE_URL env var
api_base_url: <%= ENV['LETTERMINT_BASE_URL'] || 'https://api.lettermint.co/v1' %>
# SPF CNAME subdomain prefix (e.g., 'lm-bounces' creates lm-bounces.yourdomain.com)
# Override via EMAIL_PROVIDERS_LETTERMINT_SPF_CNAME_PREFIX env var
spf_cname_prefix: <%= ENV['EMAIL_PROVIDERS_LETTERMINT_SPF_CNAME_PREFIX'] || 'lm-bounces' %>
# SPF CNAME target domain (Lettermint maintains SPF at this target)
# Override via EMAIL_PROVIDERS_LETTERMINT_SPF_CNAME_TARGET env var
spf_cname_target: <%= ENV['EMAIL_PROVIDERS_LETTERMINT_SPF_CNAME_TARGET'] || 'bounces.lmta.net' %>
mail:
truemail:
# Available validation types: :regex, :mx, :mx_blacklist, :smtp
default_validation_type: :regex
# Required for :smtp validation
verifier_email: <%= ENV['VERIFIER_EMAIL'] || 'CHANGEME@example.com' %>
#:verifier_domain: <%= ENV['VERIFIER_DOMAIN'] || 'example.com' %>
#:connection_timeout: 2
#:response_timeout: 2
#:connection_attempts: 3
#:validation_type_for:
# 'example.com': :regex
#
# Truemail will only validate email addresses that match the
# domains listed in :allowed_domains. If the domain is not
# listed, the email address will always be considered invalid.
allowed_domains_only: false
#
# Email addresses in this list will always be valid.
#:allowed_emails: []
#
# Email addresses in this list will always be invalid.
#:blocked_emails: []
#
# Addresses with these domains will always be valid
#:allowed_domains: []
#
# Addresses with these domains will always be invalid
#:blocked_domains: []
#
# Exclude these IP addresses from the MX lookup process.
#:blocked_mx_ip_addresses: []
#
# Name servers to use for MX et al record lookup.
# Default is CloudFlare, Google, Oracle/OpenDNS servers.
dns:
- 1.1.1.1
- 8.8.4.4
- 208.67.220.220
#:smtp_port: 25
#
# End smtp validation after the first invalid response rather than
# retrying, followed by trying the next server. Can reduce the time
# time to validate an email address, but may not catch all issues.
smtp_fail_fast: false
#
# Parse the content of the SMTP error message to determine if the
# email address is valid. This can be useful for some SMTP servers
# that don't return exact answers.
smtp_safe_check: true
#
# Whether to disable the RFC MX lookup flow. When true, only DNS
# validation will be performed on MX and Null MX records.
not_rfc_mx_lookup_flow: false
#
# Override default regular expression pattern for email addresses
# and/or the content in SMTP error messages.
#:email_pattern: /regex_pattern/
#:smtp_error_body_pattern: /regex_pattern/
#
# Log to the console, a file, or both. The ruby process must have
# write access to the log file. The log file will be created if it
# does not exist. Log file rotation is not handled by the app.
logger:
# One of: :error (default), :unrecognized_error, :recognized_error, :all.
tracking_event: 'error'
stdout: true
# log_absolute_path: '/home/app/log/truemail.log'
internationalization:
enabled: <%= ENV['I18N_ENABLED'] == 'true' || false %>
default_locale: <%= ENV['I18N_DEFAULT_LOCALE'] || 'en' %>
# Date/time display format. Accepts a preset keyword or a date-fns pattern.
# Setting date_format alone controls both date-only and date+time display.
# Set datetime_format only if you need a different format for date+time contexts.
#
# Presets:
# locale - browser-native formatting (default)
# iso8601 - 2026-03-21 / 2026-03-21 14:30:00
# us - 03/21/2026 / 03/21/2026 2:30:00 PM
# eu - 21/03/2026 / 21/03/2026 14:30
# eu-dot - 21.03.2026 / 21.03.2026 14:30
# uk - 21 Mar 2026 / 21 Mar 2026 14:30
# long - March 21, 2026 / March 21, 2026 2:30 PM
#
# Or pass a raw date-fns pattern: https://date-fns.org/docs/format
date_format: <%= ENV['I18N_DATE_FORMAT'] || 'locale' %>
datetime_format: <%= ENV['I18N_DATETIME_FORMAT'] || 'locale' %>
fallback_locale:
ca: [ca_ES, en]
ca-ES: [ca_ES, en]
da: [da_DK, en]
da-DK: [da_DK, en]
de: [de, de_AT, en]
de-AT: [de_AT, de, en]
el: [el_GR, en]
el-GR: [el_GR, en]
fr: [fr_FR, fr_CA, en]
fr-CA: [fr_CA, fr_FR, en]
it: [it_IT, en]
mi: [mi_NZ, en]
mi-NZ: [mi_NZ, en]
pt: [pt_BR, pt_PT, en]
pt-BR: [pt_BR, pt_PT, en]
pt-PT: [pt_PT, pt_BR, en]
sl: [sl_SI, en]
sl-SI: [sl_SI, en]
sv: [sv_SE, en]
sv-SE: [sv_SE, en]
default: [en]
# A list of ISO language codes (e.g., 'en' for English, 'es'
# for Spanish, etc.). There is a corresponding file in
# generated/locales with the same name containing the translated
# text. If it's not selected automatically, users are able to
# select their preferred language by using the toggle in the
# footer or in the settings modal if they're logged in.
locales:
- ar
- bg
- ca_ES
- cs
- da_DK
- de
- de_AT
- el_GR
- en
- eo
- es
- fr_CA
- fr_FR
- he
- hu
- it_IT
- ja
- ko
- mi_NZ
- nl
- pl
- pt_BR
- pt_PT
- ru
- sl_SI
- sv_SE
- tr
- uk
- vi
- zh