Demo snapshot of Oaken Core's console. Sample data; the controls do nothing. Back to the Core demo
OakenMail

Getting started

Welcome. This walks the config.toml settings, top to bottom. You only set what you change (every section has defaults), so skip what you don't need. Edit it all in the browser on the Config page, then hit Reload. Secrets never go in this file (passwords and tokens live in your OS keyring).

One rule worth saying once: nothing leaves your machine unless you turn it on. The sections below are in the order most people set them.

Mail providers

Each mail provider says how to set itself up, below, in its own words and with a config.toml snippet to start from. Use the ones you need. The password or sign-in for each goes through the provider's own command (oaken PROVIDER auth) and lands in your OS keyring, never in this file.

[plugins.fake]

Check: the account shows up on the Status page under Connected accounts.

Local AI [plugins.ollama] and [ai]

Oaken runs a local Ollama by default, so analysis stays on the machine. Pull the models first (ollama pull nomic-embed-text and your chat model), then name them in [ai]. The default chat model is small on purpose; set a bigger one for better analysis if your machine can carry it. [plugins.ollama] only tunes the connection, and allow_remote stays false unless you really mean to reach off-machine.

[ai]
embed_model = "nomic-embed-text"
llm_model = "qwen2.5:3b"   # bump this for better analysis
allow_remote = false

Check: the Jobs page shows the embed and enrich stages moving, not stuck.

Sync schedule [sync]

How often a new account pulls. The default is every 15 minutes. Mind your provider's quota (that is what min_interval_seconds guards). Set timezone to your own if you use quiet hours or cron schedules.

[sync]
interval_seconds = 900     # every 15 minutes
timezone = "UTC"
max_concurrent = 2

Local API [api]

How the CLI and other local clients reach core. It binds loopback only. Leave port = 0 and it picks a free one. Turn mcp = true on to let a model talk to your mail over MCP on the same listener (its own token).

[api]
port = 0        # 0 = pick a free port
mcp = false     # true mounts the MCP server at /mcp

External agents [swarm]

Off by default, and the one switch to think twice about. Handing a job to an external agent sends that job's mail text to it (and to its provider, if it is hosted). So you opt in one job kind at a time: it stays off until both enabled = true and allowed_kinds is non-empty.

[swarm]
enabled = false
allowed_kinds = []   # e.g. ["ingest.enrich"]

Read state [read_state] and [ui]

Whether opening or summarizing a message marks it read. Leave auto_mark on for normal behavior; turn it off and only explicit mark read/unread counts.

[read_state]
auto_mark = true

[ui]
mark_read_delay_ms = 2000   # how long a message stays open before it counts as read

Logging [log]

Start at INFO. If you run the daemon detached it has no terminal, so set a file to keep its logs. Drop to DEBUG when something is wrong and you want to see the why.

[log]
level = "INFO"      # DEBUG when debugging
format = "console"  # or "json"
file = "oaken.log"

That is the whole file. Edit it on Config, Test, Save, Reload. The full guide (install, keyring, the daemon) lives in the docs.