[{"data":1,"prerenderedAt":1613},["ShallowReactive",2],{"search":3,"content-guide\u002Ffeature-flags":442,"surround-\u002Fguide\u002Ffeature-flags":1608},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,323,327,331,335,339,343,347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,426,430,434,438],{"path":5,"title":6,"description":7},"\u002Fguide","Guide","Product guides for Owlat — a modular, self-hosted email platform. Learn how to send campaigns, run a personal mailbox, manage a team inbox, and more.",{"path":9,"title":10,"description":11},"\u002Fguide\u002Fgetting-started","Welcome to Owlat","Set up your Owlat workspace and send your first email — from deploying the stack to verifying a domain, building your audience, and launching a campaign.",{"path":13,"title":14,"description":15},"\u002Fguide\u002Fcontact-properties","Contact Properties","Custom fields that extend built-in contact data with your own values for segmentation.",{"path":17,"title":18,"description":19},"\u002Fguide\u002Ftopics","Topics","Topics are explicit audience groups you manage by hand — ideal for opt-in subscribers, imported cohorts, and organized contact buckets you target with campaigns.",{"path":21,"title":22,"description":23},"\u002Fguide\u002Fsegments","Segments","Build dynamic, rule-based contact groups from properties, email activity, and topic membership, re-evaluated from current data each time they're used.",{"path":25,"title":26,"description":27},"\u002Fguide\u002Fforms","Forms","Form Endpoints collect new contacts from your website or landing pages by exposing a public endpoint that accepts submissions and feeds them into a topic.",{"path":29,"title":30,"description":31},"\u002Fguide\u002Fcampaigns","Campaigns & Reporting","Build and send marketing campaigns to a topic or segment with the five-step wizard, optional A\u002FB testing, and full delivery reporting.",{"path":33,"title":34,"description":35},"\u002Fguide\u002Fab-testing","A\u002FB Testing","Compare two variants of a campaign on a test group, then automatically or manually send the winning version to the rest of your audience.",{"path":37,"title":38,"description":39},"\u002Fguide\u002Fautomations","Automations","Send emails automatically based on triggers, delays, and conditions — build welcome series, trial flows, and follow-ups once and let Owlat run them.",{"path":41,"title":42,"description":43},"\u002Fguide\u002Ftransactional","Transactional Emails","One-to-one emails your application triggers in response to a user action — password resets, order confirmations, welcome emails, and similar notifications.",{"path":45,"title":46,"description":47},"\u002Fguide\u002Fcreate-campaign","Create a Campaign","Walk through Owlat's five-step campaign wizard: Basics, Audience, Content, A\u002FB Test, and Review & Send.",{"path":49,"title":50,"description":51},"\u002Fguide\u002Fsend-campaign","Send & Monitor a Campaign","How to send your campaign and track its performance with real-time metrics.",{"path":53,"title":54,"description":55},"\u002Fguide\u002Fquick-start","Quick Start","The fastest path from a blank Owlat workspace to a live email campaign, from your first template through sending and reviewing results.",{"path":57,"title":58,"description":59},"\u002Fguide\u002Ftransactional-setup","Transactional Email Setup","Set up and send transactional emails like password resets and order confirmations via the Owlat API and SDKs.",{"path":61,"title":62,"description":63},"\u002Fguide\u002Fdeliverability","Deliverability","Verify sending domains, manage your blocklist, monitor sending reputation, and stay compliant so your emails reach the inbox.",{"path":65,"title":66,"description":67},"\u002Fguide\u002Fapi-keys-webhooks","API Keys & Webhooks","Create API keys for programmatic access and set up outbound webhooks to receive real-time notifications for email and contact events.",{"path":69,"title":70,"description":71},"\u002Fguide\u002Ffeature-flags","Feature flags","Owlat is modular — every feature listed in this guide can be turned on or off. This page is the user-facing overview of how to do it.",{"path":73,"title":74,"description":75},"\u002Fguide\u002Fteam-permissions","Team & Permissions","Use role-based access to control what each member of your organization can do, with Owner, Admin, and Editor roles.",{"path":77,"title":78,"description":79},"\u002Fguide\u002Faudit-logs","Audit Logs","A chronological record of significant actions in your Owlat organization, so you can see who did what and when.",{"path":81,"title":82,"description":83},"\u002Fguide\u002Fshare-links","Share Links","Create temporary preview links to share email designs with stakeholders who don't have dashboard access.",{"path":85,"title":86,"description":87},"\u002Fguide\u002Fpostbox","Postbox — Personal Email","Per-user mailboxes with a webmail interface and native IMAP\u002FSMTP support. Run your own Gmail-equivalent personal mailbox on your Owlat instance.",{"path":89,"title":90,"description":91},"\u002Fguide\u002Fmigrate-from-google","Migrate from Google","Import your full Gmail history into Owlat over IMAP, and let your AI assistant learn from every imported conversation.",{"path":93,"title":94,"description":95},"\u002Fguide\u002Fteam-inbox","Team Inbox","Triage inbound email as a team: read AI-classified threads, approve, edit or reject agent drafts, work the review queue, and manage quarantine.",{"path":97,"title":98,"description":99},"\u002Fguide\u002Femail-editor","Email Editor","A block-based visual editor for building responsive emails that render consistently across desktop, mobile, Outlook, Gmail, and Apple Mail.",{"path":101,"title":102,"description":103},"\u002Fguide\u002Fai-agent","AI Agent & Autonomy","Configure the AI agent that classifies and drafts replies to inbound mail: auto-reply settings, the health dashboard, circuit breakers, autonomy rules, and the knowledge backfill.",{"path":105,"title":106,"description":107},"\u002Fguide\u002Fknowledge-graph","Knowledge Graph","Browse, search, and manage Owlat's typed organizational knowledge — the 7 entry types, source attribution, confidence decay, relations, and how entries are extracted from mail.",{"path":109,"title":110,"description":111},"\u002Fguide\u002Ffiles","Files","Upload, browse, search, tag, and version documents in the file library.",{"path":113,"title":114,"description":115},"\u002Fguide\u002Fchat","Team Chat","Use Owlat's built-in team chat: public and private channels, direct messages, mentions, attachments, and channels linked to an inbox conversation.",{"path":117,"title":118,"description":119},"\u002Fguide\u002Fcode-tasks","Code Tasks","Queue coding-agent tasks, watch them move from queued through review, and run the code-worker sidecar that opens the pull requests.",{"path":121,"title":122,"description":123},"\u002Fguide\u002Faudience-data","Audience Data: Identities, Relationships & Timeline","Unify a contact across email, phone, and messaging channels, merge duplicates, map relationships, and read the cross-channel interaction timeline.",{"path":125,"title":126,"description":127},"\u002Fguide\u002Fimporting-contacts","Importing & Exporting Contacts","Bring contacts into Owlat from a CSV or from Mailchimp and Stripe, export them back out, and run bulk operations on your audience.",{"path":129,"title":130,"description":131},"\u002Fguide\u002Faccount","Your Account & Data","Export your data as JSON or CSV, request account deletion with a 30-day grace period, and use the onboarding checklist and the public preference center.",{"path":133,"title":134,"description":135},"\u002Fguide\u002Fchannels","Communication Channels","Configure SMS, WhatsApp, and generic-webhook channels, monitor channel health, and understand which channels are fully live today.",{"path":137,"title":138,"description":139},"\u002Fguide\u002Fdesktop-app","Desktop App","Install the Owlat desktop app, connect one or more workspaces, switch between them, and use native notifications, tray badges, shortcuts, and deep links.",{"path":141,"title":142,"description":143},"\u002Fguide\u002Femail-templates","Email Templates","Reusable email designs that define the structure, content, and personalization of every campaign and transactional message you send in Owlat.",{"path":145,"title":146,"description":147},"\u002Fguide\u002Fai-assistant","AI Assistant","Owlat's multi-turn, streaming, tool-calling AI assistant — a private chat surface that can search your workspace and draft copy, plus @assistant replies inside team chat.",{"path":149,"title":150,"description":151},"\u002Fguide\u002Fsecurity-scanning","Sending Security & Scanning","Owlat's security scanning: a content check for spam and phishing, an attachment scan for malware, and a Google Safe Browsing URL check. Suspicious content goes to a review queue.",{"path":153,"title":154,"description":155},"\u002Fguide\u002Fsystem-updates","System & Updates","The owner-only System & Updates screen: your current Owlat version, container health, LLM spend, and the in-app one-click updater with history.",{"path":157,"title":158,"description":159},"\u002Fguide\u002Foperating-modes","Operating Modes","The different ways to run Owlat at a company — read external mailboxes over IMAP, send transactional or marketing email through a delivery provider, host your own mail server, or run a team inbox with AI — and the rules that keep each combination coherent.",{"path":161,"title":162,"description":163},"\u002Fguide\u002Fsaved-blocks","Saved Blocks","Create reusable, linked content blocks you can drop into any email — edit one and every email that uses it updates automatically.",{"path":165,"title":166,"description":167},"\u002Fguide\u002Fmedia-library","Media Library","Manage, organize, search, and reuse images and files across your emails from one centralized hub.",{"path":169,"title":170,"description":171},"\u002Fguide\u002Femail-theme","Email Theme","Set your organization's default colors, font, and email width so every new template starts from a consistent baseline.",{"path":173,"title":174,"description":175},"\u002Fguide\u002Ftranslations","Translations","Send one email in multiple languages: add per-language translations to a single template and Owlat picks the right version for each recipient.",{"path":177,"title":178,"description":179},"\u002Fguide\u002Fcontacts","Contacts","How to add, view, organize, and manage contacts in Owlat, including sources, the contact detail tabs, and subscription compliance.",{"path":181,"title":182,"description":183},"\u002Fapi","API Overview","Owlat exposes authenticated API endpoints under your Convex site URL.",{"path":185,"title":186,"description":187},"\u002Fapi\u002Fwebhooks","Webhooks","Owlat supports both outbound customer webhooks and inbound provider webhooks.",{"path":189,"title":190,"description":191},"\u002Fapi\u002Fpublic-endpoints","Public Endpoints","These routes are public-facing and usually accessed from email links or embedded forms.",{"path":193,"title":194,"description":195},"\u002Fapi\u002Fwebhook-payloads","Webhook Payloads","The authoritative wire contract for outbound webhooks: envelope, signature headers, per-event data shapes, and payload versioning.",{"path":197,"title":198,"description":199},"\u002Fapi\u002Finbound-channels","Inbound Channel Webhooks","Provider webhook reference for inbound SMS, WhatsApp, and generic-channel messages, plus the MTA mailbox and credential callbacks.",{"path":201,"title":202,"description":203},"\u002Fapi\u002Fauthentication","Authentication","Secure API access with organization-scoped API keys.",{"path":205,"title":206,"description":207},"\u002Fapi\u002Fsdk","TypeScript SDK","Typed client for the Owlat API, usable from Node.js, Bun, Deno, or any server-side JavaScript runtime.",{"path":209,"title":210,"description":211},"\u002Fapi\u002Fsdk-java","Java SDK","The official `owlat-sdk` package provides a typed client for interacting with the Owlat API from any JVM application. Requires Java 11+.",{"path":213,"title":214,"description":215},"\u002Fapi\u002Fcontacts","Contacts API","Manage contacts for your organization.",{"path":217,"title":218,"description":219},"\u002Fapi\u002Ftopics","Topics API","Manage topic membership through authenticated endpoints.",{"path":221,"title":222,"description":223},"\u002Fapi\u002Fevents","Events API","Send contact events to drive segmentation and automation triggers.",{"path":225,"title":226,"description":227},"\u002Fapi\u002Ftransactional","Transactional API","Send published transactional templates to a recipient.",{"path":229,"title":230,"description":231},"\u002Fapi\u002Fforms","Forms API","Capture subscribers through public form endpoints.",{"path":233,"title":234,"description":235},"\u002Fdeveloper","Developer Guide","Technical architecture, feature-flag model, and provider abstractions used by Owlat.",{"path":237,"title":238,"description":239},"\u002Fdeveloper\u002Fmta-system","MTA System","Owlat's custom Mail Transfer Agent for direct SMTP delivery with intelligent rate limiting, bounce processing, and IP warming.",{"path":241,"title":242,"description":243},"\u002Fdeveloper\u002Ffeature-flags","Feature flags — developer reference","How the Owlat feature flag system works: single source of truth, dependency resolution, docker profile mapping, and how to add a new flag.",{"path":245,"title":246,"description":247},"\u002Fdeveloper\u002Fhow-email-works","How Email Works","A technical deep-dive into how email actually works — from SMTP and DNS to authentication, deliverability, and the differences between marketing and private email.",{"path":249,"title":250,"description":251},"\u002Fdeveloper\u002Femail-security","Email Security","Content scanning, attachment validation, URL reputation checking, and malware detection for outbound emails.",{"path":253,"title":254,"description":255},"\u002Fdeveloper\u002Fpostbox-architecture","Postbox Architecture","How the Postbox personal-mail feature is wired — schema, IMAP server, app-password auth, outbound relay, inbound delivery, and external mailboxes.",{"path":257,"title":258,"description":259},"\u002Fdeveloper\u002Fproviders","Providers","Pluggable provider abstractions for LLM, email sending, notifications, vector stores, and analytics, selected per-deployment so self-hosters can swap implementations without code changes.",{"path":261,"title":262,"description":263},"\u002Fdeveloper\u002Fcampaign-internals","Campaign Internals","How the campaign backend works: two status machines, send pre-flight, the send orchestrator, emailSends records, and the priority workpools.",{"path":265,"title":266,"description":267},"\u002Fdeveloper\u002Faudience-internals","Audience Internals","Backend reference for contact resolution, the double opt-in lifecycle, topic subscription, the conditions registry, and segment evaluation.",{"path":269,"title":270,"description":271},"\u002Fdeveloper\u002Fautomation-internals","Automation Internals","How the automation run engine works: the step walker, the lifecycle state machine, trigger fanout, the three step types, and the resilience cron.",{"path":273,"title":274,"description":275},"\u002Fdeveloper\u002Fdeliverability-infrastructure","Deliverability Infrastructure","The Convex-side deliverability backend: provider routing, health-aware failover, sending reputation with auto-enforcement, IP warming cache, the blocklist, and the content-scan gate.",{"path":277,"title":278,"description":279},"\u002Fdeveloper\u002Farchitecture","Architecture Overview","Owlat follows a modern serverless architecture with real-time capabilities.",{"path":281,"title":282,"description":283},"\u002Fdeveloper\u002Fplatform-operations","Platform Operations","Operator reference for abuse status and the sending gate, the platform-admin roster, content review, org deletion, in-app self-update, dev endpoints, crons, and migrations.",{"path":285,"title":286,"description":287},"\u002Fdeveloper\u002Fscopes","Scopes","What each app and package in the Owlat monorepo is responsible for.",{"path":289,"title":290,"description":291},"\u002Fdeveloper\u002Fself-hosting","Self-Hosting","Deploy Owlat on your own infrastructure with Docker Compose. Complete guide from first boot to production.",{"path":293,"title":294,"description":295},"\u002Fdeveloper\u002Fself-hosting-config","Self-Hosting Configuration","Complete reference for Docker environment variables, Convex backend variables, service topology, and volume persistence.",{"path":297,"title":298,"description":299},"\u002Fdeveloper\u002Fself-hosting-dns-email","DNS & Email Setup","Configure DNS records, DKIM signing, SPF, DMARC, and bounce handling for reliable email delivery.",{"path":301,"title":302,"description":303},"\u002Fdeveloper\u002Fself-hosting-production","Production Deployment","Secure your self-hosted Owlat instance with TLS, firewall rules, backups, and monitoring.",{"path":305,"title":306,"description":307},"\u002Fdeveloper\u002Fself-hosting-maintenance","Maintenance & Updates","Keep your self-hosted Owlat instance up to date, manage backups, scale performance, and troubleshoot common issues.",{"path":309,"title":310,"description":311},"\u002Fdeveloper\u002Fself-hosting-desktop","Desktop Installer","Install Owlat on a bare Linux VPS straight from the desktop app over SSH — no terminal — with a live, animated provisioning timeline.",{"path":313,"title":314,"description":315},"\u002Fdeveloper\u002Fsetup-cli","Setup CLI & Installer","Operator reference for the Owlat self-host tooling: the install.sh one-liner, the owlat-setup CLI, the convex-deploy flow, and admin bootstrap.",{"path":317,"title":318,"description":319},"\u002Fdeveloper\u002Fconvex","Convex Backend","Owlat uses Convex as its serverless backend, providing real-time subscriptions, ACID transactions, and TypeScript-first development.",{"path":321,"title":202,"description":322},"\u002Fdeveloper\u002Fauthentication","Owlat uses BetterAuth with the Convex adapter for authentication and organization (team) management.",{"path":324,"title":325,"description":326},"\u002Fdeveloper\u002Femail-system","Email System","Owlat's email system consists of a visual editor, template management, and multi-provider sending infrastructure.",{"path":328,"title":329,"description":330},"\u002Fdeveloper\u002Femail-renderer","Email Renderer","The @owlat\u002Femail-renderer package converts editor JSON blocks into production-ready HTML emails with cross-client compatibility, CSS inlining, dark mode, and Outlook VML fallbacks.",{"path":332,"title":333,"description":334},"\u002Fdeveloper\u002Fenvironment-variables","Environment Variables","Reference for every environment variable Owlat reads across the Convex backend, web app, MTA, IMAP server, and mail-sync worker.",{"path":336,"title":337,"description":338},"\u002Fdeveloper\u002Fcomponents","Component Library","Reference for the reusable, auto-imported Vue UI components shipped in the packages\u002Fui layer.",{"path":340,"title":341,"description":342},"\u002Fdeveloper\u002Fdecisions","Architectural Decision Records","The architectural decision records for the Owlat project, each capturing the context, the decision, and the trade-offs involved.",{"path":344,"title":345,"description":346},"\u002Fdeveloper\u002Fdecisions\u002F009-model-routing","ADR-009: Task-Based Model Routing","Why Owlat supports per-task LLM model selection instead of using a single model for all pipeline steps.",{"path":348,"title":349,"description":350},"\u002Fdeveloper\u002Fdecisions\u002F010-listing-engine","ADR-010: Listing Engine","Why Owlat replaced four incompatible list-query contracts with one generic listing engine driven by per-entity descriptors.",{"path":352,"title":353,"description":354},"\u002Fdeveloper\u002Fdecisions\u002F001-custom-email-renderer","ADR-001: Custom Email Renderer Over MJML","Why Owlat built a custom table-based HTML email renderer instead of using MJML, gaining full control over VML, dark mode, and per-client rendering.",{"path":356,"title":357,"description":358},"\u002Fdeveloper\u002Fdecisions\u002F002-convex-backend","ADR-002: Convex as Backend","Why Owlat chose Convex over PostgreSQL and Firebase for real-time reactivity, co-located TypeScript logic, and zero-config scaling.",{"path":360,"title":361,"description":362},"\u002Fdeveloper\u002Fdecisions\u002F003-notion-like-builder","ADR-003: Notion-like Email Builder","Why Owlat replaced the traditional 3-panel email editor with a Notion-like single-column canvas for inline WYSIWYG editing.",{"path":364,"title":365,"description":366},"\u002Fdeveloper\u002Fdecisions\u002F004-monorepo-bun-workspaces","ADR-004: Monorepo with Bun Workspaces","Why Owlat uses a monorepo with Bun workspaces and Turborepo for fast installs, atomic cross-package changes, and cached CI.",{"path":368,"title":369,"description":370},"\u002Fdeveloper\u002Fdecisions\u002F005-custom-mta","ADR-005: Custom MTA","Why Owlat built a custom Mail Transfer Agent instead of relying solely on third-party email providers.",{"path":372,"title":373,"description":374},"\u002Fdeveloper\u002Fdecisions\u002F006-self-hosted-convex","ADR-006: Self-Hosted Convex","Why Owlat uses the open-source Convex backend for self-hosting instead of migrating to a different database.",{"path":376,"title":377,"description":378},"\u002Fdeveloper\u002Fdecisions\u002F007-pluggable-llm","ADR-007: Pluggable LLM Provider","Why Owlat uses the Vercel AI SDK with a provider abstraction layer instead of hardcoding a single LLM vendor.",{"path":380,"title":381,"description":382},"\u002Fdeveloper\u002Fdecisions\u002F008-process-architecture","ADR-008: Agent Process Architecture","Why Owlat processes inbound messages with a self-scheduling step walker plus a lifecycle coordinator instead of one sequential function.",{"path":384,"title":385,"description":386},"\u002Fexamples","Examples","Copy-pasteable integration patterns for common Owlat use cases.",{"path":388,"title":389,"description":390},"\u002Fexamples\u002Fwelcome-email","Welcome Email","Send a personalized welcome email when a new user signs up.",{"path":392,"title":393,"description":394},"\u002Fexamples\u002Fbilling-email","Billing Email","Send a billing receipt with an invoice PDF attached after a successful payment.",{"path":396,"title":397,"description":398},"\u002Fexamples\u002Fevent-automation","Event Automation","Trigger automations with custom events for trial lifecycle, feature adoption, and more.",{"path":400,"title":401,"description":402},"\u002Fexamples\u002Fcontact-sync","Contact Sync","Sync contacts from your database to Owlat using upsert patterns and bulk operations.",{"path":404,"title":405,"description":406},"\u002Fexamples\u002Fwebhook-handler","Webhook Handler","Handle Owlat delivery webhooks with signature verification and event routing.",{"path":408,"title":409,"description":410},"\u002Fexamples\u002Fmultilingual-email","Multilingual Email","Send emails in the recipient's preferred language using template translations.",{"path":412,"title":413,"description":414},"\u002Fvision","Vision","Where Owlat is heading — from email platform to unified communication intelligence powered by AI agents.",{"path":416,"title":417,"description":418},"\u002Fvision\u002Fself-hosting","Self-Hosting Architecture","How Owlat runs as a fully self-hosted stack using Docker Compose — open-source Convex backend, custom MTA, and a pluggable LLM provider.",{"path":420,"title":421,"description":422},"\u002Fvision\u002Fagent-pipeline","Agent Pipeline","Technical architecture for the inbound email agent pipeline — step modules, the walker, security scanning, threading, and human review.",{"path":424,"title":106,"description":425},"\u002Fvision\u002Fknowledge-graph","Technical architecture for Owlat's typed knowledge storage — how organizational knowledge is stored, searched, decayed, and maintained.",{"path":427,"title":428,"description":429},"\u002Fvision\u002Fmulti-channel","Multi-Channel & CRM","Technical architecture for channel adapters, unified messaging, contact identity unification, and the CRM hub.",{"path":431,"title":432,"description":433},"\u002Fvision\u002Ffile-system","Semantic File System","Technical architecture for Owlat's semantic file storage — version tracking with provenance today, plus the planned embedding-based retrieval and auto-tagging layer.",{"path":435,"title":436,"description":437},"\u002Fvision\u002Fdesktop-app","Desktop App & Advanced Agents","Architecture of the Owlat desktop shell, visualization agent, adaptive dashboard, agent health, graduated autonomy, and coding agents.",{"path":439,"title":440,"description":441},"\u002Fvision\u002Froadmap","Roadmap","What's planned next for Owlat — the documented-but-unbuilt pieces still being wired, and the enhancements on our radar.",{"id":443,"title":70,"body":444,"description":71,"extension":1603,"meta":1604,"navigation":576,"path":69,"seo":1605,"stem":1606,"__hash__":1607},"content\u002F1.guide\u002F23.feature-flags.md",{"type":445,"value":446,"toc":1591},"minimark",[447,451,455,484,490,495,498,503,509,513,524,606,629,642,670,683,687,701,712,716,719,820,823,827,830,876,977,1010,1014,1017,1138,1142,1544,1567,1571,1574,1587],[448,449,70],"h1",{"id":450},"feature-flags",[452,453,454],"p",{},"Owlat ships as a single codebase but you choose which features run on your install. Marketing campaigns, the team inbox, AI assistance, Postbox personal mail — every one of those is a feature you opt into, not a product you have to commit to up front.",[456,457,460],"callout",{"title":458,"type":459},"Some flags imply infrastructure","info",[452,461,462,463,467,468,467,471,474,475,479,480,483],{},"The sending flags (",[464,465,466],"code",{},"campaigns",", ",[464,469,470],{},"transactional",[464,472,473],{},"automations",") only work with a configured ",[476,477,478],"strong",{},"delivery provider"," (MTA, Resend, or SES) — a connected external mailbox is not one. See ",[481,482,158],"a",{"href":157}," for the coherent combinations and the rules Owlat enforces.",[452,485,486,487,489],{},"This page is the operator's reference. For the underlying mechanics (single source of truth, dependency resolution, docker profiles) see ",[481,488,242],{"href":241},".",[491,492,494],"h2",{"id":493},"where-to-toggle","Where to toggle",[452,496,497],{},"There are three places to flip a flag: the admin UI, the host CLI, and the first-run setup wizard.",[499,500,502],"h3",{"id":501},"admin-ui","Admin UI",[452,504,505,508],{},[476,506,507],{},"Settings → Features"," in the dashboard. Each flag has a description, dependency hints, and a toggle. Disabling a flag with dependants pops a confirmation listing what will also turn off.",[499,510,512],{"id":511},"setup-cli","Setup CLI",[452,514,515,516,519,520,523],{},"On a VPS install the host wrapper (",[464,517,518],{},"scripts\u002Fowlat",", installed as ",[464,521,522],{},"owlat",") exposes the flag commands:",[525,526,531],"pre",{"className":527,"code":528,"language":529,"meta":530,"style":530},"language-sh shiki shiki-themes github-light github-dark-dimmed","# Turn one flag on or off:\nowlat feature postbox on\nowlat feature ai off\n\n# Set a required env var, then apply:\nowlat env LLM_API_KEY sk-...\nowlat restart\n","sh","",[464,532,533,542,558,571,578,584,598],{"__ignoreMap":530},[534,535,538],"span",{"class":536,"line":537},"line",1,[534,539,541],{"class":540},"sDN9O","# Turn one flag on or off:\n",[534,543,545,548,552,555],{"class":536,"line":544},2,[534,546,522],{"class":547},"sOLd2",[534,549,551],{"class":550},"s-HuK"," feature",[534,553,554],{"class":550}," postbox",[534,556,557],{"class":550}," on\n",[534,559,561,563,565,568],{"class":536,"line":560},3,[534,562,522],{"class":547},[534,564,551],{"class":550},[534,566,567],{"class":550}," ai",[534,569,570],{"class":550}," off\n",[534,572,574],{"class":536,"line":573},4,[534,575,577],{"emptyLinePlaceholder":576},true,"\n",[534,579,581],{"class":536,"line":580},5,[534,582,583],{"class":540},"# Set a required env var, then apply:\n",[534,585,587,589,592,595],{"class":536,"line":586},6,[534,588,522],{"class":547},[534,590,591],{"class":550}," env",[534,593,594],{"class":550}," LLM_API_KEY",[534,596,597],{"class":550}," sk-...\n",[534,599,601,603],{"class":536,"line":600},7,[534,602,522],{"class":547},[534,604,605],{"class":550}," restart\n",[452,607,608,609,612,613,616,617,620,621,624,625,628],{},"These run the containerized TS CLI (",[464,610,611],{},"owlat-setup",") inside the ",[464,614,615],{},"wolvesdotink\u002Fsetup"," image. Each toggle rewrites the CLI-side flag mirror (",[464,618,619],{},".owlat-flags.json","), regenerates ",[464,622,623],{},"docker-compose.override.yml"," so the right background workers are selected, and tells you to run ",[464,626,627],{},"owlat restart"," to apply.",[452,630,631,632,635,636,638,639,641],{},"The inner CLI also has a ",[464,633,634],{},"pack"," command for toggling several flags at once — it is only available on ",[464,637,611],{}," directly, not via the ",[464,640,522],{}," wrapper:",[525,643,645],{"className":527,"code":644,"language":529,"meta":530,"style":530},"owlat-setup pack marketing on\nowlat-setup pack emailClient on\n",[464,646,647,659],{"__ignoreMap":530},[534,648,649,651,654,657],{"class":536,"line":537},[534,650,611],{"class":547},[534,652,653],{"class":550}," pack",[534,655,656],{"class":550}," marketing",[534,658,557],{"class":550},[534,660,661,663,665,668],{"class":536,"line":544},[534,662,611],{"class":547},[534,664,653],{"class":550},[534,666,667],{"class":550}," emailClient",[534,669,557],{"class":550},[452,671,672,673,675,676,678,679,682],{},"To inspect the current state, read ",[464,674,619],{}," in your install directory or open ",[476,677,507],{}," in the dashboard. There is no ",[464,680,681],{},"--show","\u002Flist command.",[499,684,686],{"id":685},"setup-wizard","Setup wizard",[452,688,689,690,693,694,696,697,700],{},"The first-run ",[476,691,692],{},"web wizard"," (served by the ",[464,695,615],{}," container, reached via ",[464,698,699],{},"owlat setup"," or the install one-liner) has a \"Pick what to enable\" step (the first step, after the welcome screen) that presents the three feature packs plus every individual flag grouped by category. Toggle a pack or flip flags one at a time; dependency cascades apply as you go. You can always change the answers later with the admin UI or the CLI above.",[452,702,703,704,707,708,711],{},"The older ",[464,705,706],{},"bash scripts\u002Fsetup.sh"," wizard (",[464,709,710],{},"owlat setup --legacy",") does not configure feature flags — it only handles deployment mode, env vars, and the email provider.",[491,713,715],{"id":714},"feature-packs","Feature packs",[452,717,718],{},"A pack is just a button that toggles several related flags at once. Three packs ship with Owlat:",[720,721,722,738],"table",{},[723,724,725],"thead",{},[726,727,728,732,735],"tr",{},[729,730,731],"th",{},"Pack",[729,733,734],{},"Flags",[729,736,737],{},"Use when",[739,740,741,760,781],"tbody",{},[726,742,743,749,757],{},[744,745,746],"td",{},[476,747,748],{},"Marketing",[744,750,751,467,753,467,755],{},[464,752,466],{},[464,754,473],{},[464,756,470],{},[744,758,759],{},"You want to send marketing emails and trigger-based flows.",[726,761,762,767,778],{},[744,763,764],{},[476,765,766],{},"Email Client",[744,768,769,467,772,467,775],{},[464,770,771],{},"inbox",[464,773,774],{},"chat",[464,776,777],{},"postbox",[744,779,780],{},"You want a shared team mailbox, chat surface, and personal mail (Postbox).",[726,782,783,788,817],{},[744,784,785],{},[476,786,787],{},"AI",[744,789,790,467,793,467,796,467,799,467,802,467,805,467,808,467,811,467,814],{},[464,791,792],{},"ai",[464,794,795],{},"ai.agent",[464,797,798],{},"ai.autonomy",[464,800,801],{},"ai.knowledge",[464,803,804],{},"ai.knowledge.autoLink",[464,806,807],{},"ai.knowledge.graphRetrieval",[464,809,810],{},"ai.knowledge.analytics",[464,812,813],{},"ai.assistant",[464,815,816],{},"ai.visualizations",[744,818,819],{},"You want every AI feature on at once.",[452,821,822],{},"Toggling a pack walks each member flag through the normal dependency cascade, so you can't get into an invalid state.",[491,824,826],{"id":825},"dependencies-and-cascades","Dependencies and cascades",[452,828,829],{},"Some flags require others. The rules:",[831,832,833,848],"ul",{},[834,835,836,839,840,842,843,845,846,489],"li",{},[476,837,838],{},"Turning on a dependent flag"," auto-turns-on its prerequisites. Enabling ",[464,841,795],{}," also enables ",[464,844,792],{}," and ",[464,847,771],{},[834,849,850,853,854,856,857,467,859,467,861,863,864,467,866,467,868,870,871,873,874,489],{},[476,851,852],{},"Turning off a flag"," turns off everything that depended on it. Disabling ",[464,855,792],{}," cascades off ",[464,858,795],{},[464,860,798],{},[464,862,801],{}," (and its ",[464,865,804],{},[464,867,807],{},[464,869,810],{}," sub-flags), ",[464,872,813],{},", and ",[464,875,816],{},[720,877,878,891],{},[723,879,880],{},[726,881,882,885,888],{},[729,883,884],{},"Flag",[729,886,887],{},"Requires",[729,889,890],{},"Notes",[739,892,893,907,923,938,953,965],{},[726,894,895,900,904],{},[744,896,897],{},[464,898,899],{},"campaigns.archive",[744,901,902],{},[464,903,466],{},[744,905,906],{},"Archive links need campaigns",[726,908,909,914,920],{},[744,910,911],{},[464,912,913],{},"inbox.codeTasks",[744,915,916,467,918],{},[464,917,771],{},[464,919,795],{},[744,921,922],{},"Needs the inbox and the AI agent",[726,924,925,929,935],{},[744,926,927],{},[464,928,795],{},[744,930,931,467,933],{},[464,932,792],{},[464,934,771],{},[744,936,937],{},"Agent classifies + drafts for inbox mail",[726,939,940,944,950],{},[744,941,942],{},[464,943,798],{},[744,945,946,467,948],{},[464,947,792],{},[464,949,795],{},[744,951,952],{},"Autonomy extends the agent",[726,954,955,959,963],{},[744,956,957],{},[464,958,801],{},[744,960,961],{},[464,962,792],{},[744,964],{},[726,966,967,971,975],{},[744,968,969],{},[464,970,816],{},[744,972,973],{},[464,974,792],{},[744,976],{},[456,978,981],{"title":979,"type":980},"The bare `ai` flag also powers Postbox in-inbox AI","note",[452,982,983,984,845,987,990,991,994,995,999,1000,1002,1003,1005,1006,1009],{},"Postbox's ",[476,985,986],{},"Summarize thread",[476,988,989],{},"Suggest replies"," (",[481,992,993],{"href":85},"Reading mail",") gate on the top-level ",[476,996,997],{},[464,998,792],{}," flag (not ",[464,1001,795],{},"). Turn ",[464,1004,792],{}," off and those buttons stop working — the actions are also rate-limited per user. As with all AI, you need an LLM provider configured (",[464,1007,1008],{},"LLM_API_KEY",").",[491,1011,1013],{"id":1012},"what-turning-a-flag-on-changes","What turning a flag on changes",[452,1015,1016],{},"Toggling a flag has three concrete effects:",[1018,1019,1020,1026,1095],"ol",{},[834,1021,1022,1025],{},[476,1023,1024],{},"The UI hides or shows"," sidebar nav, settings panels, and onboarding tasks for the feature.",[834,1027,1028,1031,1032,1034,1035,1038,1039,1034,1042,1038,1045,1034,1048,1038,1051,1034,1053,1038,1056,1034,1058,1060,1061,1064,1065,1068,1069,1071,1072,1074,1075,1078,1079,990,1082,1085,1086,1089,1090,1092,1093,489],{},[476,1029,1030],{},"Background workers start or stop"," — but only on the wizard and CLI paths. Each flag can declare Docker Compose profiles. Examples: ",[464,1033,777],{}," → ",[464,1036,1037],{},"personal-mail","; ",[464,1040,1041],{},"mail.external",[464,1043,1044],{},"external-mail",[464,1046,1047],{},"scan.files",[464,1049,1050],{},"clamav",[464,1052,913],{},[464,1054,1055],{},"inbox-codetasks",[464,1057,792],{},[464,1059,792],{},". The setup wizard and the ",[464,1062,1063],{},"owlat feature","\u002F",[464,1066,1067],{},"owlat-setup pack"," commands recompute the active profile set and regenerate ",[464,1070,623],{},", so an ",[464,1073,627],{}," actually starts or stops the worker. Toggling a flag in the ",[476,1076,1077],{},"admin UI"," only persists the flag in ",[464,1080,1081],{},"apps\u002Fapi",[464,1083,1084],{},"instanceSettings.featureFlags","); it does ",[476,1087,1088],{},"not"," regenerate the override or restart containers. To bring a worker up or down from the dashboard, re-run the relevant ",[464,1091,1063],{}," command (or the wizard) on the host and ",[464,1094,627],{},[834,1096,1097,1100,1101,1103,1104,845,1107,1038,1109,1103,1112,1038,1115,1103,1118,845,1121,1124,1125,1128,1129,1131,1132,1135,1136,1009],{},[476,1098,1099],{},"Required env vars are surfaced."," Some flags need extra environment variables (e.g. ",[464,1102,792],{}," requires ",[464,1105,1106],{},"LLM_PROVIDER",[464,1108,1008],{},[464,1110,1111],{},"scan.urls",[464,1113,1114],{},"GOOGLE_SAFE_BROWSING_API_KEY",[464,1116,1117],{},"analytics.posthog",[464,1119,1120],{},"POSTHOG_API_KEY",[464,1122,1123],{},"POSTHOG_HOST","). The setup wizard prompts for them. The admin UI can't read your ",[464,1126,1127],{},".env",", so it does ",[476,1130,1088],{}," block the toggle — it shows an advisory modal reminding you which vars to set with ",[464,1133,1134],{},"owlat env \u003CKEY> \u003CVALUE>"," (then ",[464,1137,627],{},[491,1139,1141],{"id":1140},"all-flags","All flags",[720,1143,1144,1159],{},[723,1145,1146],{},[726,1147,1148,1150,1153,1156],{},[729,1149,884],{},[729,1151,1152],{},"Category",[729,1154,1155],{},"Default",[729,1157,1158],{},"What it enables",[739,1160,1161,1176,1189,1202,1216,1230,1243,1256,1269,1282,1295,1308,1321,1334,1349,1364,1379,1392,1405,1420,1434,1448,1462,1477,1490,1503,1516,1530],{},[726,1162,1163,1167,1170,1173],{},[744,1164,1165],{},[464,1166,466],{},[744,1168,1169],{},"Sending",[744,1171,1172],{},"On",[744,1174,1175],{},"Marketing campaigns to contacts and segments",[726,1177,1178,1182,1184,1186],{},[744,1179,1180],{},[464,1181,899],{},[744,1183,1169],{},[744,1185,1172],{},[744,1187,1188],{},"Public \"View in browser\" links",[726,1190,1191,1195,1197,1199],{},[744,1192,1193],{},[464,1194,470],{},[744,1196,1169],{},[744,1198,1172],{},[744,1200,1201],{},"Programmatic sends via the API",[726,1203,1204,1208,1210,1213],{},[744,1205,1206],{},[464,1207,473],{},[744,1209,1169],{},[744,1211,1212],{},"Off",[744,1214,1215],{},"Multi-step trigger workflows",[726,1217,1218,1222,1225,1227],{},[744,1219,1220],{},[464,1221,771],{},[744,1223,1224],{},"Receiving",[744,1226,1212],{},[744,1228,1229],{},"Shared team inbox with threading",[726,1231,1232,1236,1238,1240],{},[744,1233,1234],{},[464,1235,913],{},[744,1237,1224],{},[744,1239,1212],{},[744,1241,1242],{},"Bug-report extraction from inbound mail",[726,1244,1245,1249,1251,1253],{},[744,1246,1247],{},[464,1248,774],{},[744,1250,1224],{},[744,1252,1212],{},[744,1254,1255],{},"Real-time chat alongside inbox",[726,1257,1258,1262,1264,1266],{},[744,1259,1260],{},[464,1261,777],{},[744,1263,1224],{},[744,1265,1212],{},[744,1267,1268],{},"Personal mailboxes with IMAP\u002FSMTP",[726,1270,1271,1275,1277,1279],{},[744,1272,1273],{},[464,1274,1041],{},[744,1276,1224],{},[744,1278,1212],{},[744,1280,1281],{},"Connect a user's own external Gmail\u002FFastmail\u002Fcompany mailbox over IMAP+SMTP (no sending domain required)",[726,1283,1284,1288,1290,1292],{},[744,1285,1286],{},[464,1287,792],{},[744,1289,787],{},[744,1291,1212],{},[744,1293,1294],{},"Master toggle (needs LLM provider)",[726,1296,1297,1301,1303,1305],{},[744,1298,1299],{},[464,1300,795],{},[744,1302,787],{},[744,1304,1212],{},[744,1306,1307],{},"Classify + draft replies",[726,1309,1310,1314,1316,1318],{},[744,1311,1312],{},[464,1313,798],{},[744,1315,787],{},[744,1317,1212],{},[744,1319,1320],{},"Agent sends without human approval",[726,1322,1323,1327,1329,1331],{},[744,1324,1325],{},[464,1326,801],{},[744,1328,787],{},[744,1330,1212],{},[744,1332,1333],{},"Semantic knowledge graph",[726,1335,1336,1340,1342,1344],{},[744,1337,1338],{},[464,1339,804],{},[744,1341,787],{},[744,1343,1212],{},[744,1345,1346,1347],{},"LLM-inferred typed edges between entries (on top of the always-on rule-based linker); requires ",[464,1348,801],{},[726,1350,1351,1355,1357,1359],{},[744,1352,1353],{},[464,1354,807],{},[744,1356,787],{},[744,1358,1212],{},[744,1360,1361,1362],{},"Expand search results along graph edges before grounding drafts (kill switch); requires ",[464,1363,801],{},[726,1365,1366,1370,1372,1374],{},[744,1367,1368],{},[464,1369,810],{},[744,1371,787],{},[744,1373,1212],{},[744,1375,1376,1377],{},"Centrality\u002Fcluster cron + knowledge-graph dashboard; requires ",[464,1378,801],{},[726,1380,1381,1385,1387,1389],{},[744,1382,1383],{},[464,1384,813],{},[744,1386,787],{},[744,1388,1212],{},[744,1390,1391],{},"Multi-turn streaming tool-calling AI assistant + @assistant replies in team chat",[726,1393,1394,1398,1400,1402],{},[744,1395,1396],{},[464,1397,816],{},[744,1399,787],{},[744,1401,1212],{},[744,1403,1404],{},"NL-prompt-to-chart dashboards",[726,1406,1407,1412,1415,1417],{},[744,1408,1409],{},[464,1410,1411],{},"webhooks",[744,1413,1414],{},"Integrations",[744,1416,1212],{},[744,1418,1419],{},"Outbound event delivery",[726,1421,1422,1427,1429,1431],{},[744,1423,1424],{},[464,1425,1426],{},"forms",[744,1428,1414],{},[744,1430,1172],{},[744,1432,1433],{},"Embeddable signup\u002Fcapture forms",[726,1435,1436,1441,1443,1445],{},[744,1437,1438],{},[464,1439,1440],{},"imports.mailchimp",[744,1442,1414],{},[744,1444,1212],{},[744,1446,1447],{},"One-click Mailchimp import",[726,1449,1450,1455,1457,1459],{},[744,1451,1452],{},[464,1453,1454],{},"imports.stripe",[744,1456,1414],{},[744,1458,1212],{},[744,1460,1461],{},"Stripe customer sync",[726,1463,1464,1469,1472,1474],{},[744,1465,1466],{},[464,1467,1468],{},"scan.content",[744,1470,1471],{},"Security",[744,1473,1172],{},[744,1475,1476],{},"Spam \u002F phishing \u002F homoglyph pre-send check",[726,1478,1479,1483,1485,1487],{},[744,1480,1481],{},[464,1482,1047],{},[744,1484,1471],{},[744,1486,1172],{},[744,1488,1489],{},"ClamAV attachment malware scan",[726,1491,1492,1496,1498,1500],{},[744,1493,1494],{},[464,1495,1111],{},[744,1497,1471],{},[744,1499,1212],{},[744,1501,1502],{},"Google Safe Browsing URL reputation",[726,1504,1505,1509,1511,1513],{},[744,1506,1507],{},[464,1508,1117],{},[744,1510,62],{},[744,1512,1212],{},[744,1514,1515],{},"PostHog product analytics",[726,1517,1518,1523,1525,1527],{},[744,1519,1520],{},[464,1521,1522],{},"domains.verification",[744,1524,62],{},[744,1526,1172],{},[744,1528,1529],{},"SPF\u002FDKIM\u002FDMARC validation gate",[726,1531,1532,1537,1539,1541],{},[744,1533,1534],{},[464,1535,1536],{},"domains.dkimRotation",[744,1538,62],{},[744,1540,1172],{},[744,1542,1543],{},"Scheduled DKIM key rotation",[456,1545,1548,1551],{"title":1546,"type":1547},"Some flagged behaviors aren't fully live yet","warning",[452,1549,1550],{},"A few flags gate features whose surface is shipped but whose deeper automation isn't wired end to end:",[831,1552,1553,1560],{},[834,1554,1555,1557,1558,489],{},[464,1556,798],{}," — the agent config (auto-reply, confidence threshold, tone, signature, daily cap) is real, but graduated autonomy rules and the autonomy feedback loop have no production callers yet. See ",[481,1559,102],{"href":101},[834,1561,1562,1564,1565,489],{},[464,1563,913],{}," — code tasks can be created and managed manually, but auto-creation of a task from an inbound email is not wired. See ",[481,1566,118],{"href":117},[491,1568,1570],{"id":1569},"when-in-doubt","When in doubt",[452,1572,1573],{},"You can always turn a flag on, look around, decide it's not for you, and turn it back off — there's no migration penalty for either direction. Data attached to a feature (mailboxes, campaigns, automations) is preserved when you toggle a flag off; turning it back on restores access.",[452,1575,1576,1577,467,1580,467,1583,1586],{},"Hosted-cloud flags (",[464,1578,1579],{},"billing.stripe",[464,1581,1582],{},"multiTenancy",[464,1584,1585],{},"tier.autoProvision",") are hidden in self-host mode and don't appear in the admin UI.",[1588,1589,1590],"style",{},"html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":530,"searchDepth":544,"depth":544,"links":1592},[1593,1598,1599,1600,1601,1602],{"id":493,"depth":544,"text":494,"children":1594},[1595,1596,1597],{"id":501,"depth":560,"text":502},{"id":511,"depth":560,"text":512},{"id":685,"depth":560,"text":686},{"id":714,"depth":544,"text":715},{"id":825,"depth":544,"text":826},{"id":1012,"depth":544,"text":1013},{"id":1140,"depth":544,"text":1141},{"id":1569,"depth":544,"text":1570},"md",{},{"title":70,"description":71},"1.guide\u002F23.feature-flags","hB6DO7scs-cuXkFsXzVe5eJ812D6fKbWiLb3OiTnKNA",[1609,1611],{"title":66,"path":65,"stem":1610,"children":-1},"1.guide\u002F22.api-keys-webhooks",{"title":74,"path":73,"stem":1612,"children":-1},"1.guide\u002F24.team-permissions",1782846431358]