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.
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:
| Pack | Flags | Use when |
|---|---|---|
| Marketing | campaigns, automations, transactional | You want to send marketing emails and trigger-based flows. |
| Email Client | inbox, chat, postbox | You want a shared team mailbox, chat surface, and personal mail (Postbox). |
| AI | ai, ai.agent, ai.autonomy, ai.knowledge, ai.knowledge.autoLink, ai.knowledge.graphRetrieval, ai.knowledge.analytics, ai.assistant, ai.visualizations | You 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.agentalso enablesaiandinbox. - Turning off a flag turns off everything that depended on it. Disabling
aicascades offai.agent,ai.autonomy,ai.knowledge(and itsai.knowledge.autoLink,ai.knowledge.graphRetrieval,ai.knowledge.analyticssub-flags),ai.assistant, andai.visualizations.
| Flag | Requires | Notes |
|---|---|---|
campaigns.archive | campaigns | Archive links need campaigns |
inbox.codeTasks | inbox, ai.agent | Needs the inbox and the AI agent |
ai.agent | ai, inbox | Agent classifies + drafts for inbox mail |
ai.autonomy | ai, ai.agent | Autonomy extends the agent |
ai.knowledge | ai | |
ai.visualizations | 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:
- The UI hides or shows sidebar nav, settings panels, and onboarding tasks for the feature.
- Background workers start or stop — but only on the wizard and CLI paths. Each flag can declare Docker Compose profiles. Examples:
postbox→personal-mail;mail.external→external-mail;scan.files→clamav;inbox.codeTasks→inbox-codetasks;ai→ai. The setup wizard and theowlat feature/owlat-setup packcommands recompute the active profile set and regeneratedocker-compose.override.yml, so anowlat restartactually starts or stops the worker. Toggling a flag in the admin UI only persists the flag inapps/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 relevantowlat featurecommand (or the wizard) on the host andowlat restart. - Required env vars are surfaced. Some flags need extra environment variables (e.g.
airequiresLLM_PROVIDERandLLM_API_KEY;scan.urlsrequiresGOOGLE_SAFE_BROWSING_API_KEY;analytics.posthogrequiresPOSTHOG_API_KEYandPOSTHOG_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 withowlat env <KEY> <VALUE>(thenowlat restart).
All flags
| Flag | Category | Default | What it enables |
|---|---|---|---|
campaigns | Sending | On | Marketing campaigns to contacts and segments |
campaigns.archive | Sending | On | Public "View in browser" links |
transactional | Sending | On | Programmatic sends via the API |
automations | Sending | Off | Multi-step trigger workflows |
inbox | Receiving | Off | Shared team inbox with threading |
inbox.codeTasks | Receiving | Off | Bug-report extraction from inbound mail |
chat | Receiving | Off | Real-time chat alongside inbox |
postbox | Receiving | Off | Personal mailboxes with IMAP/SMTP |
mail.external | Receiving | Off | Connect a user's own external Gmail/Fastmail/company mailbox over IMAP+SMTP (no sending domain required) |
ai | AI | Off | Master toggle (needs LLM provider) |
ai.agent | AI | Off | Classify + draft replies |
ai.autonomy | AI | Off | Agent sends without human approval |
ai.knowledge | AI | Off | Semantic knowledge graph |
ai.knowledge.autoLink | AI | Off | LLM-inferred typed edges between entries (on top of the always-on rule-based linker); requires ai.knowledge |
ai.knowledge.graphRetrieval | AI | Off | Expand search results along graph edges before grounding drafts (kill switch); requires ai.knowledge |
ai.knowledge.analytics | AI | Off | Centrality/cluster cron + knowledge-graph dashboard; requires ai.knowledge |
ai.assistant | AI | Off | Multi-turn streaming tool-calling AI assistant + @assistant replies in team chat |
ai.visualizations | AI | Off | NL-prompt-to-chart dashboards |
webhooks | Integrations | Off | Outbound event delivery |
forms | Integrations | On | Embeddable signup/capture forms |
imports.mailchimp | Integrations | Off | One-click Mailchimp import |
imports.stripe | Integrations | Off | Stripe customer sync |
scan.content | Security | On | Spam / phishing / homoglyph pre-send check |
scan.files | Security | On | ClamAV attachment malware scan |
scan.urls | Security | Off | Google Safe Browsing URL reputation |
analytics.posthog | Deliverability | Off | PostHog product analytics |
domains.verification | Deliverability | On | SPF/DKIM/DMARC validation gate |
domains.dkimRotation | Deliverability | On | Scheduled DKIM key rotation |
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.