Skip to content

Config: channels, tools & integrations

The channels_config namespace plus tool and integration config sections in one reference.

This page is the field reference for the parts of ~/.revka/config.toml that decide how the agent talks to the outside world: the [channels_config] namespace that wires up messaging platforms, the web and browser tool sections, the third-party integration sections (Composio, Google Workspace, Microsoft 365, Notion, Jira, LinkedIn), and the media and operational tool sections. Every key lists its type, default, and meaning so you can edit config.toml directly.

Use this page when you are turning channels and tools on or off, scoping their reach, or hardening a deployment. For the conceptual walkthrough of connecting a channel, see Connect a messaging channel; for the tool catalog, see the Tools overview. For provider, agent, and routing keys see Config: provider, agent & routing; for gateway, memory, and security keys see Config: gateway, memory, security & platform.

[channels_config] holds one top-level timeout plus one [channels_config.<name>] sub-table per channel. Channels are deny-by-default: a channel with no allowlist entries accepts nothing. A single entry "*" allows all.

[channels_config]
message_timeout_secs = 300
[channels_config.telegram]
bot_token = "123456:TELEGRAM-TOKEN"
allowed_users = ["123456789"] # [] = deny all, "*" = allow all
stream_mode = "off" # off | partial
mention_only = false
interrupt_on_new_message = false
[channels_config.discord]
bot_token = "DISCORD-BOT-TOKEN"
guild_id = "123456789012345678" # optional
allowed_users = ["*"]
stream_mode = "multi_message" # off | partial | multi_message
KeyTypeDefaultMeaning
message_timeout_secsu64300Base per-message processing budget. Scaled by tool-loop depth up to the cap in [pacing].message_timeout_scale_max.
clibooltrueCLI terminal stdin/stdout channel (also revka chat). Enabled by default; set cli = false to disable it.

Most channels share these fields (names vary per platform):

FieldMeaning
bot_token / api_keyChannel credential.
allowed_users / allowed_numbers / allowed_senders / allowed_from / allowed_pubkeys / allowed_contacts / allowed_destinationsSender allowlist. [] = deny all, "*" = allow all. The exact field name varies — see the table below.
mention_onlyOnly respond when @mentioned (group chats).
stream_mode"off", "partial" (live draft edits), or "multi_message" (paragraph splits) where supported.
proxy_urlPer-channel HTTP/SOCKS5 proxy.
notification_chat_id / notification_channel_idTarget for unsolicited notifications.
interrupt_on_new_messageCancel in-flight generation when the same sender sends again. Supported on Telegram, Slack, Discord, Mattermost, and Matrix.

The allowlist field name differs by platform. An empty list denies all; "*" allows all.

ChannelAllowlist field
Telegram, Discord, Slack, Mattermost, Matrix, IRC, Lark, Feishu, DingTalk, QQ, Nextcloud Talk, WeCom, Mochat, Twitterallowed_users
Signalallowed_from
WhatsApp (Cloud & Web), WATIallowed_numbers
Email, Linq, Gmail Pushallowed_senders
iMessageallowed_contacts
Nostrallowed_pubkeys
ClawdTalkallowed_destinations

Selected channels need extra keys. See Channels overview and the per-platform pages for full setup runbooks.

Mode is auto-negotiated from which keys you set: phone_number_id → Cloud API; session_path → Web mode.

# Cloud API (Meta webhook mode — needs a public HTTPS callback)
[channels_config.whatsapp]
access_token = "EAAB..."
phone_number_id = "123456789012345"
verify_token = "your-verify-token"
app_secret = "your-app-secret" # HMAC payload signature (recommended)
allowed_numbers = ["*"]
# Web mode (wa-rs) — requires the `whatsapp-web` build feature
[channels_config.whatsapp]
session_path = "~/.revka/whatsapp-session.db"
pair_phone = "15551234567" # omit for QR-code flow
mode = "business" # or "personal"
allowed_numbers = ["*"]

The [transcription], [tts], [media_pipeline], and [multimodal] sections below are also consumed by channels (voice notes, audio attachments, image handling).

These sections gate the agent’s outbound web access. When absent from your config, all four default to enabled = true with allowed_domains = ["*"] (all public domains). See the note in the Aside above.

Backs the browser and browser_open tools. Supports pluggable backends.

[browser]
enabled = true
allowed_domains = ["example.com"] # "*" = all public domains (local/private still blocked)
backend = "agent_browser" # agent_browser | rust_native | computer_use | auto
native_headless = true
[browser.computer_use]
endpoint = "http://127.0.0.1:8787/v1/actions"
allow_remote_endpoint = false
KeyTypeDefaultMeaning
enabledbooltrueEnable the browser tools (effective default when section is absent).
allowed_domainslist["*"]Domain allowlist. "*" = all public domains; local/private hosts always blocked. Effective default when section is absent.
backendstring"agent_browser"agent_browser, rust_native (needs the browser-native feature), computer_use, or auto.
native_headlessbooltrueHeadless mode for the rust-native backend.
native_webdriver_urlstringhttp://127.0.0.1:9515WebDriver endpoint for the native backend.
native_chrome_pathstring?unsetChrome/Chromium binary path.
computer_use.allow_remote_endpointboolfalseGuards against exposing the computer-use sidecar publicly.

[browser_delegate] — delegate to a browser CLI

Section titled “[browser_delegate] — delegate to a browser CLI”

Backs the browser_delegate tool, which hands browser tasks to a CLI subprocess (e.g. Claude Code with the claude-in-chrome MCP). Requires shell access.

[browser_delegate]
enabled = true
cli_binary = "claude"
chrome_profile_dir = "~/.config/chrome-corp-profile"
allowed_domains = ["teams.microsoft.com", "outlook.office.com"]
blocked_domains = []
task_timeout_secs = 120

Backs the http_request tool (full GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS).

[http_request]
enabled = true
allowed_domains = ["api.example.com", "api.github.com"]
max_response_size = 1000000
timeout_secs = 30
# allow_private_hosts = false
KeyDefaultMeaning
enabledtrueEnable the tool (effective default when section is absent).
allowed_domains["*"]Domain allowlist. "*" = any public domain; local/private still blocked unless allow_private_hosts. Effective default when section is absent.
max_response_sizeCap response bytes.
timeout_secsPer-request timeout.
allow_private_hostsfalsePermit private/loopback targets.

Backs the web_fetch tool (GET-only, HTML → readable text, with optional Firecrawl fallback for JS-heavy sites).

[web_fetch]
enabled = true
allowed_domains = ["docs.anthropic.com", "*"]
blocked_domains = []
max_response_size = 1000000
timeout_secs = 30
[web_fetch.firecrawl]
# api_key = "fc-..." # enables the JS-rendering fallback

Other keys: allowed_private_hosts (per-host exception to the private-host block) and web_fetch.firecrawl.* (Firecrawl fallback). Distinguish from http_request: web_fetch is opinionated GET-only-to-text; http_request is full HTTP.

Backs the web_search_tool. Web search is enabled by default with DuckDuckGo (no API key).

[web_search]
enabled = true
provider = "duckduckgo" # duckduckgo (free) | brave | searxng
max_results = 5
timeout_secs = 15
# brave_api_key = "..." # for Brave
# searxng_instance_url = "https://searx.example.com" # for SearXNG
KeyDefaultMeaning
enabledtrueEnable web search.
provider"duckduckgo"duckduckgo, brave, or searxng.
max_results5Result count.
timeout_secs15Search timeout.
brave_api_keyunsetRequired for the Brave provider (env BRAVE_API_KEY).
searxng_instance_urlunsetRequired for self-hosted SearXNG (env SEARXNG_INSTANCE_URL).

Each integration section gates one tool and supplies its credentials. All are enabled = false by default. Several read credentials from env vars as well as config.

Backs the composio tool. Requires a Composio API key (config api_key or env COMPOSIO_API_KEY).

[composio]
enabled = true
api_key = "comp_..."
entity_id = "default"

Connect an app’s OAuth via composio connect. If Composio returns a missing connected-account error, call the tool’s list_accounts action and pass the returned connected_account_id to execute.

[google_workspace] — Gmail, Drive, Calendar, etc.

Section titled “[google_workspace] — Gmail, Drive, Calendar, etc.”

Backs the google_workspace tool via the gws CLI. Requires gws installed (npm install -g @googleworkspace/cli) and authenticated, plus shell access.

[google_workspace]
enabled = true
default_account = "[email protected]"
allowed_services = ["gmail", "drive"]
audit_log = true
[[google_workspace.allowed_operations]]
service = "gmail"
resource = "users"
sub_resource = "messages" # Gmail needs the 4th segment
methods = ["list", "get"]
KeyMeaning
enabledEnable the tool.
default_account / credentials_pathAccount selection and credentials.
allowed_servicesService allowlist (gmail, drive, calendar, sheets, docs, …).
allowed_operations[]Fine-grained service/resource/sub_resource/methods scoping. Gmail commands are 4-segment (include sub_resource); Drive/Calendar are 3-segment (omit it).
rate_limit_per_minute / timeout_secsThrottle and timeout.
audit_logLog each operation.

[microsoft365] — Outlook, Teams, Calendar, OneDrive, SharePoint

Section titled “[microsoft365] — Outlook, Teams, Calendar, OneDrive, SharePoint”

Backs the microsoft365 tool via Microsoft Graph. Requires an Azure AD app registration.

[microsoft365]
enabled = true
tenant_id = "..."
client_id = "..."
client_secret = "..." # required for client_credentials flow
auth_flow = "client_credentials" # or device_code
scopes = ["Mail.Read", "Chat.ReadWrite"]
token_cache_encrypted = true
# user_id = "..." # target user for app-only flows

The token cache is written to the config directory (not the workspace). Choose client_credentials (app-only) or device_code auth per your registration.

[notion] / [jira] — project integrations

Section titled “[notion] / [jira] — project integrations”
[notion]
enabled = true
api_key = "secret_..." # or NOTION_API_KEY
[jira]
enabled = true
base_url = "https://your-org.atlassian.net"
api_token = "..." # or JIRA_API_TOKEN
allowed_actions = ["get_ticket", "search", "add_comment"]
timeout_secs = 30

jira.allowed_actions restricts the operations the tool may perform. Works against Atlassian Cloud or Server.

Backs the linkedin tool. Credentials come from LINKEDIN_* env vars in .env.

[linkedin]
enabled = true
api_version = "202602"
[linkedin.content]
# automated-posting strategy settings
[linkedin.image]
# image-publishing settings

These configure speech, audio, image, and inbound-media handling. [transcription] and [tts] are shared by every channel that accepts or emits audio.

[transcription]
enabled = true
default_provider = "groq" # groq | openai | deepgram | assemblyai | google | local_whisper
api_key = "..." # falls back to GROQ_API_KEY for Groq
model = "whisper-large-v3-turbo"
language = "en" # optional ISO-639-1 hint
max_duration_secs = 120
KeyDefaultMeaning
enabledfalseEnable transcription.
default_provider"groq"groq, openai, deepgram, assemblyai, google, local_whisper.
api_keyunsetProvider key; resolution falls back to URL-based env var → TRANSCRIPTION_API_KEYGROQ_API_KEYOPENAI_API_KEY.
model"whisper-large-v3-turbo"Groq default.
languageunsetISO-639-1 hint.
initial_promptunsetBias transcription toward expected vocabulary.
max_duration_secs120Skip longer audio.
transcribe_non_ptt_audiofalseAlso transcribe non-voice-note audio on WhatsApp.

Per-provider sub-sections exist: [transcription.openai], [transcription.deepgram], [transcription.assemblyai], [transcription.google], [transcription.local_whisper] (url required, plus bearer_token, max_audio_bytes default 25 MB, timeout_secs default 300). Max audio size is 25 MB; supported formats include flac, mp3, mp4, m4a, ogg, opus, wav, webm.

[tts]
enabled = true
default_provider = "openai" # openai | elevenlabs | google | edge | piper
default_voice = "alloy"
default_format = "mp3" # mp3 | opus | wav
max_text_length = 4096
[tts.openai]
model = "tts-1"
speed = 1.0
[tts.elevenlabs]
model_id = "eleven_monolingual_v1"
stability = 0.5
similarity_boost = 0.5

Per-provider sub-sections: [tts.openai] (model, speed), [tts.elevenlabs] (model_id, stability, similarity_boost), [tts.google] (language_code), [tts.edge] (binary_path, free, subprocess-based), [tts.piper] (api_url, local). Provider keys fall back to OPENAI_API_KEY, ELEVENLABS_API_KEY, GOOGLE_TTS_API_KEY.

[media_pipeline] — automatic media understanding

Section titled “[media_pipeline] — automatic media understanding”

Pre-processes inbound attachments before the agent sees them, prepending [Audio transcription: ...], [Image: <description>], or [Video summary: ...]. Uses [transcription] for audio and the active provider’s vision capability for images.

[media_pipeline]
enabled = true
transcribe_audio = true
describe_images = true
summarize_video = true

Falls back gracefully when the provider lacks vision ([Image: attached]). Defaults to enabled = false.

[multimodal] — image attachment handling

Section titled “[multimodal] — image attachment handling”

Controls how images are attached to agent messages.

[multimodal]
max_images = 4 # clamped 1–16
max_image_size_mb = 5 # clamped 1–20
allow_remote_fetch = false
vision_provider = "ollama" # optional: route images to a dedicated vision model
vision_model = "llava:7b"

Supported image markers: [IMAGE:/path/to/file.png] or [IMAGE:data:image/png;base64,...]. Remote URLs are only fetched when allow_remote_fetch = true.

Backs the image_gen tool (fal.ai Flux models by default; the standalone section also supports DALL-E, Stability, and Imagen providers).

[image_gen]
enabled = true
default_model = "fal-ai/flux/schnell"
api_key_env = "FAL_API_KEY" # name of the env var holding the provider key
KeyMeaning
enabledEnable the tool.
default_modelDefault provider model ID.
api_key_envName of the environment variable that holds the provider API key.

These gate the analysis, pipeline, and workspace-maintenance tools.

Backs the execute_pipeline meta-tool.

[pipeline]
enabled = true
max_steps = 20
allowed_tools = ["file_read", "file_write", "shell"]

Steps run sequentially with {{step[N].result}} interpolation, or concurrently with parallel: true (no interpolation in parallel mode). allowed_tools restricts which tools a pipeline step may call.

Backs the backup tool (create / list / verify / restore). Enabled by default.

[backup]
enabled = true
include_dirs = ["state", "sessions"]
max_keep = 10
KeyDefaultMeaning
enabledtrueEnable backup operations.
include_dirsDirectories included in each backup.
max_keepRetention count; older backups are pruned.

[data_retention] — purge & storage stats

Section titled “[data_retention] — purge & storage stats”

Backs the data_management tool (stats / purge / list). Disabled by default; purge is destructive.

[data_retention]
enabled = true
retention_days = 90

Backs the read-only cloud_ops and cloud_patterns tools (IaC review, migration assessment, cost analysis, Well-Architected review). These never create or modify cloud resources.

[cloud_ops]
enabled = true

Backs the security_ops tool (alert triage, playbook execution, vulnerability parsing, reporting).

[security_ops]
enabled = true