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.

Feature flags

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.

Some flags imply infrastructure

The sending flags (campaigns, transactional, automations) only work with a configured delivery provider (MTA, Resend, or SES) — a connected external mailbox is not one. See Operating Modes for the coherent combinations and the rules Owlat enforces.

This page is the operator's reference. For the underlying mechanics (single source of truth, dependency resolution, docker profiles) see Feature flags — developer reference.

Where to toggle

There are three places to flip a flag: the admin UI, the host CLI, and the first-run setup wizard.

Admin UI

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.

Setup CLI

On a VPS install the host wrapper (scripts/owlat, installed as owlat) exposes the flag commands:

# Turn one flag on or off:
owlat feature postbox on
owlat feature ai off

# Set a required env var, then apply:
owlat env LLM_API_KEY sk-...
owlat restart

These run the containerized TS CLI (owlat-setup) inside the wolvesdotink/setup image. Each toggle rewrites the CLI-side flag mirror (.owlat-flags.json), regenerates docker-compose.override.yml so the right background workers are selected, and tells you to run owlat restart to apply.

The inner CLI also has a pack command for toggling several flags at once — it is only available on owlat-setup directly, not via the owlat wrapper:

owlat-setup pack marketing on
owlat-setup pack emailClient on

To inspect the current state, read .owlat-flags.json in your install directory or open Settings → Features in the dashboard. There is no --show/list command.

Setup wizard

The first-run web wizard (served by the wolvesdotink/setup container, reached via 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.

The older bash scripts/setup.sh wizard (owlat setup --legacy) does not configure feature flags — it only handles deployment mode, env vars, and the email provider.

Feature packs

A pack is just a button that toggles several related flags at once. Three packs ship with Owlat:

PackFlagsUse when
Marketingcampaigns, automations, transactionalYou want to send marketing emails and trigger-based flows.
Email Clientinbox, chat, postboxYou want a shared team mailbox, chat surface, and personal mail (Postbox).
AIai, ai.agent, ai.autonomy, ai.knowledge, ai.knowledge.autoLink, ai.knowledge.graphRetrieval, ai.knowledge.analytics, ai.assistant, ai.visualizationsYou want every AI feature on at once.

Toggling a pack walks each member flag through the normal dependency cascade, so you can't get into an invalid state.

Dependencies and cascades

Some flags require others. The rules:

  • Turning on a dependent flag auto-turns-on its prerequisites. Enabling ai.agent also enables ai and inbox.
  • Turning off a flag turns off everything that depended on it. Disabling ai cascades off ai.agent, ai.autonomy, ai.knowledge (and its ai.knowledge.autoLink, ai.knowledge.graphRetrieval, ai.knowledge.analytics sub-flags), ai.assistant, and ai.visualizations.
FlagRequiresNotes
campaigns.archivecampaignsArchive links need campaigns
inbox.codeTasksinbox, ai.agentNeeds the inbox and the AI agent
ai.agentai, inboxAgent classifies + drafts for inbox mail
ai.autonomyai, ai.agentAutonomy extends the agent
ai.knowledgeai
ai.visualizationsai
The bare `ai` flag also powers Postbox in-inbox AI

Postbox's Summarize thread and Suggest replies (Reading mail) gate on the top-level ai flag (not ai.agent). Turn ai off and those buttons stop working — the actions are also rate-limited per user. As with all AI, you need an LLM provider configured (LLM_API_KEY).

What turning a flag on changes

Toggling a flag has three concrete effects:

  1. The UI hides or shows sidebar nav, settings panels, and onboarding tasks for the feature.
  2. Background workers start or stop — but only on the wizard and CLI paths. Each flag can declare Docker Compose profiles. Examples: postboxpersonal-mail; mail.externalexternal-mail; scan.filesclamav; inbox.codeTasksinbox-codetasks; aiai. The setup wizard and the owlat feature/owlat-setup pack commands recompute the active profile set and regenerate docker-compose.override.yml, so an owlat restart actually starts or stops the worker. Toggling a flag in the admin UI only persists the flag in apps/api (instanceSettings.featureFlags); it does not regenerate the override or restart containers. To bring a worker up or down from the dashboard, re-run the relevant owlat feature command (or the wizard) on the host and owlat restart.
  3. Required env vars are surfaced. Some flags need extra environment variables (e.g. ai requires LLM_PROVIDER and LLM_API_KEY; scan.urls requires GOOGLE_SAFE_BROWSING_API_KEY; analytics.posthog requires POSTHOG_API_KEY and POSTHOG_HOST). The setup wizard prompts for them. The admin UI can't read your .env, so it does not block the toggle — it shows an advisory modal reminding you which vars to set with owlat env <KEY> <VALUE> (then owlat restart).

All flags

FlagCategoryDefaultWhat it enables
campaignsSendingOnMarketing campaigns to contacts and segments
campaigns.archiveSendingOnPublic "View in browser" links
transactionalSendingOnProgrammatic sends via the API
automationsSendingOffMulti-step trigger workflows
inboxReceivingOffShared team inbox with threading
inbox.codeTasksReceivingOffBug-report extraction from inbound mail
chatReceivingOffReal-time chat alongside inbox
postboxReceivingOffPersonal mailboxes with IMAP/SMTP
mail.externalReceivingOffConnect a user's own external Gmail/Fastmail/company mailbox over IMAP+SMTP (no sending domain required)
aiAIOffMaster toggle (needs LLM provider)
ai.agentAIOffClassify + draft replies
ai.autonomyAIOffAgent sends without human approval
ai.knowledgeAIOffSemantic knowledge graph
ai.knowledge.autoLinkAIOffLLM-inferred typed edges between entries (on top of the always-on rule-based linker); requires ai.knowledge
ai.knowledge.graphRetrievalAIOffExpand search results along graph edges before grounding drafts (kill switch); requires ai.knowledge
ai.knowledge.analyticsAIOffCentrality/cluster cron + knowledge-graph dashboard; requires ai.knowledge
ai.assistantAIOffMulti-turn streaming tool-calling AI assistant + @assistant replies in team chat
ai.visualizationsAIOffNL-prompt-to-chart dashboards
webhooksIntegrationsOffOutbound event delivery
formsIntegrationsOnEmbeddable signup/capture forms
imports.mailchimpIntegrationsOffOne-click Mailchimp import
imports.stripeIntegrationsOffStripe customer sync
scan.contentSecurityOnSpam / phishing / homoglyph pre-send check
scan.filesSecurityOnClamAV attachment malware scan
scan.urlsSecurityOffGoogle Safe Browsing URL reputation
analytics.posthogDeliverabilityOffPostHog product analytics
domains.verificationDeliverabilityOnSPF/DKIM/DMARC validation gate
domains.dkimRotationDeliverabilityOnScheduled DKIM key rotation
Some flagged behaviors aren't fully live yet

A few flags gate features whose surface is shipped but whose deeper automation isn't wired end to end:

  • ai.autonomy — 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 AI Agent & Autonomy.
  • inbox.codeTasks — code tasks can be created and managed manually, but auto-creation of a task from an inbound email is not wired. See Code Tasks.

When in doubt

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.

Hosted-cloud flags (billing.stripe, multiTenancy, tier.autoProvision) are hidden in self-host mode and don't appear in the admin UI.