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] — messaging channels
Section titled “[channels_config] — messaging channels”[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 allstream_mode = "off" # off | partialmention_only = falseinterrupt_on_new_message = false
[channels_config.discord]bot_token = "DISCORD-BOT-TOKEN"guild_id = "123456789012345678" # optionalallowed_users = ["*"]stream_mode = "multi_message" # off | partial | multi_messageTop-level and common keys
Section titled “Top-level and common keys”| Key | Type | Default | Meaning |
|---|---|---|---|
message_timeout_secs | u64 | 300 | Base per-message processing budget. Scaled by tool-loop depth up to the cap in [pacing].message_timeout_scale_max. |
cli | bool | true | CLI 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):
| Field | Meaning |
|---|---|
bot_token / api_key | Channel credential. |
allowed_users / allowed_numbers / allowed_senders / allowed_from / allowed_pubkeys / allowed_contacts / allowed_destinations | Sender allowlist. [] = deny all, "*" = allow all. The exact field name varies — see the table below. |
mention_only | Only respond when @mentioned (group chats). |
stream_mode | "off", "partial" (live draft edits), or "multi_message" (paragraph splits) where supported. |
proxy_url | Per-channel HTTP/SOCKS5 proxy. |
notification_chat_id / notification_channel_id | Target for unsolicited notifications. |
interrupt_on_new_message | Cancel in-flight generation when the same sender sends again. Supported on Telegram, Slack, Discord, Mattermost, and Matrix. |
Allowlist field by channel
Section titled “Allowlist field by channel”The allowlist field name differs by platform. An empty list denies all; "*" allows all.
| Channel | Allowlist field |
|---|---|
| Telegram, Discord, Slack, Mattermost, Matrix, IRC, Lark, Feishu, DingTalk, QQ, Nextcloud Talk, WeCom, Mochat, Twitter | allowed_users |
| Signal | allowed_from |
| WhatsApp (Cloud & Web), WATI | allowed_numbers |
| Email, Linq, Gmail Push | allowed_senders |
| iMessage | allowed_contacts |
| Nostr | allowed_pubkeys |
| ClawdTalk | allowed_destinations |
Platform-specific fields
Section titled “Platform-specific fields”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 flowmode = "business" # or "personal"allowed_numbers = ["*"][channels_config.slack]bot_token = "xoxb-..."app_token = "xapp-..." # app-level token for Socket Modechannel_ids = ["C123...", "D456..."] # takes precedence over channel_idallowed_users = ["*"]thread_replies = trueuse_markdown_blocks = true # 12k-char messages vs 3kcancel_reaction = "x" # emoji that cancels in-flight workRequires the channel-matrix build feature. E2EE works transparently with the right device_id.
[channels_config.matrix]homeserver = "https://matrix.example.com"access_token = "syt_..."user_id = "@revka:matrix.example.com"device_id = "DEVICEID123"room_id = "!room:matrix.example.com"allowed_rooms = [] # extra rooms to acceptallowed_users = ["*"]stream_mode = "partial"recovery_key = "" # cross-signing recovery# Nostr — requires the `channel-nostr` build feature; key is a high-value secret[channels_config.nostr]private_key = "nsec1..."relays = ["wss://relay.damus.io", "wss://nos.lol"]allowed_pubkeys = ["hex-or-npub-key"] # [] = deny all, "*" = allow all
# Signal — bridges to a local signal-cli daemon[channels_config.signal]http_url = "http://127.0.0.1:8686"account = "+1234567890"group_id = "" # "dm" for DM-onlyallowed_from = ["*"]# Linq (iMessage / RCS / SMS via Linq Partner API) — webhook mode[channels_config.linq]api_token = "linq-partner-api-token"from_phone = "+15551234567"signing_secret = "optional-signing-secret" # env: REVKA_LINQ_SIGNING_SECRETallowed_senders = ["*"]
# Nextcloud Talk — webhook mode, HMAC-signed[channels_config.nextcloud_talk]base_url = "https://cloud.example.com"app_token = "nextcloud-talk-app-token"bot_name = "revka"webhook_secret = "optional-webhook-secret" # env: REVKA_NEXTCLOUD_TALK_WEBHOOK_SECRETallowed_users = ["*"]The [transcription], [tts], [media_pipeline], and [multimodal] sections below are also consumed by channels (voice notes, audio attachments, image handling).
Web & browser tools
Section titled “Web & browser tools”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.
[browser] — browser automation
Section titled “[browser] — browser automation”Backs the browser and browser_open tools. Supports pluggable backends.
[browser]enabled = trueallowed_domains = ["example.com"] # "*" = all public domains (local/private still blocked)backend = "agent_browser" # agent_browser | rust_native | computer_use | autonative_headless = true
[browser.computer_use]endpoint = "http://127.0.0.1:8787/v1/actions"allow_remote_endpoint = false| Key | Type | Default | Meaning |
|---|---|---|---|
enabled | bool | true | Enable the browser tools (effective default when section is absent). |
allowed_domains | list | ["*"] | Domain allowlist. "*" = all public domains; local/private hosts always blocked. Effective default when section is absent. |
backend | string | "agent_browser" | agent_browser, rust_native (needs the browser-native feature), computer_use, or auto. |
native_headless | bool | true | Headless mode for the rust-native backend. |
native_webdriver_url | string | http://127.0.0.1:9515 | WebDriver endpoint for the native backend. |
native_chrome_path | string? | unset | Chrome/Chromium binary path. |
computer_use.allow_remote_endpoint | bool | false | Guards 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 = truecli_binary = "claude"chrome_profile_dir = "~/.config/chrome-corp-profile"allowed_domains = ["teams.microsoft.com", "outlook.office.com"]blocked_domains = []task_timeout_secs = 120[http_request] — arbitrary HTTP
Section titled “[http_request] — arbitrary HTTP”Backs the http_request tool (full GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS).
[http_request]enabled = trueallowed_domains = ["api.example.com", "api.github.com"]max_response_size = 1000000timeout_secs = 30# allow_private_hosts = false| Key | Default | Meaning |
|---|---|---|
enabled | true | Enable 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_size | — | Cap response bytes. |
timeout_secs | — | Per-request timeout. |
allow_private_hosts | false | Permit private/loopback targets. |
[web_fetch] — fetch a page as text
Section titled “[web_fetch] — fetch a page as text”Backs the web_fetch tool (GET-only, HTML → readable text, with optional Firecrawl fallback for JS-heavy sites).
[web_fetch]enabled = trueallowed_domains = ["docs.anthropic.com", "*"]blocked_domains = []max_response_size = 1000000timeout_secs = 30
[web_fetch.firecrawl]# api_key = "fc-..." # enables the JS-rendering fallbackOther 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.
[web_search] — web search
Section titled “[web_search] — web search”Backs the web_search_tool. Web search is enabled by default with DuckDuckGo (no API key).
[web_search]enabled = trueprovider = "duckduckgo" # duckduckgo (free) | brave | searxngmax_results = 5timeout_secs = 15# brave_api_key = "..." # for Brave# searxng_instance_url = "https://searx.example.com" # for SearXNG| Key | Default | Meaning |
|---|---|---|
enabled | true | Enable web search. |
provider | "duckduckgo" | duckduckgo, brave, or searxng. |
max_results | 5 | Result count. |
timeout_secs | 15 | Search timeout. |
brave_api_key | unset | Required for the Brave provider (env BRAVE_API_KEY). |
searxng_instance_url | unset | Required for self-hosted SearXNG (env SEARXNG_INSTANCE_URL). |
Integration sections
Section titled “Integration sections”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.
[composio] — managed OAuth (1000+ apps)
Section titled “[composio] — managed OAuth (1000+ apps)”Backs the composio tool. Requires a Composio API key (config api_key or env COMPOSIO_API_KEY).
[composio]enabled = trueapi_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 = truedefault_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 segmentmethods = ["list", "get"]| Key | Meaning |
|---|---|
enabled | Enable the tool. |
default_account / credentials_path | Account selection and credentials. |
allowed_services | Service 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_secs | Throttle and timeout. |
audit_log | Log 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 = truetenant_id = "..."client_id = "..."client_secret = "..." # required for client_credentials flowauth_flow = "client_credentials" # or device_codescopes = ["Mail.Read", "Chat.ReadWrite"]token_cache_encrypted = true# user_id = "..." # target user for app-only flowsThe 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 = trueapi_key = "secret_..." # or NOTION_API_KEY
[jira]enabled = truebase_url = "https://your-org.atlassian.net"email = "[email protected]"api_token = "..." # or JIRA_API_TOKENallowed_actions = ["get_ticket", "search", "add_comment"]timeout_secs = 30jira.allowed_actions restricts the operations the tool may perform. Works against Atlassian Cloud or Server.
[linkedin] — content publishing
Section titled “[linkedin] — content publishing”Backs the linkedin tool. Credentials come from LINKEDIN_* env vars in .env.
[linkedin]enabled = trueapi_version = "202602"
[linkedin.content]# automated-posting strategy settings
[linkedin.image]# image-publishing settingsMedia & vision sections
Section titled “Media & vision sections”These configure speech, audio, image, and inbound-media handling. [transcription] and [tts] are shared by every channel that accepts or emits audio.
[transcription] — speech-to-text
Section titled “[transcription] — speech-to-text”[transcription]enabled = truedefault_provider = "groq" # groq | openai | deepgram | assemblyai | google | local_whisperapi_key = "..." # falls back to GROQ_API_KEY for Groqmodel = "whisper-large-v3-turbo"language = "en" # optional ISO-639-1 hintmax_duration_secs = 120| Key | Default | Meaning |
|---|---|---|
enabled | false | Enable transcription. |
default_provider | "groq" | groq, openai, deepgram, assemblyai, google, local_whisper. |
api_key | unset | Provider key; resolution falls back to URL-based env var → TRANSCRIPTION_API_KEY → GROQ_API_KEY → OPENAI_API_KEY. |
model | "whisper-large-v3-turbo" | Groq default. |
language | unset | ISO-639-1 hint. |
initial_prompt | unset | Bias transcription toward expected vocabulary. |
max_duration_secs | 120 | Skip longer audio. |
transcribe_non_ptt_audio | false | Also 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] — text-to-speech
Section titled “[tts] — text-to-speech”[tts]enabled = truedefault_provider = "openai" # openai | elevenlabs | google | edge | piperdefault_voice = "alloy"default_format = "mp3" # mp3 | opus | wavmax_text_length = 4096
[tts.openai]model = "tts-1"speed = 1.0
[tts.elevenlabs]model_id = "eleven_monolingual_v1"stability = 0.5similarity_boost = 0.5Per-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 = truetranscribe_audio = truedescribe_images = truesummarize_video = trueFalls 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–16max_image_size_mb = 5 # clamped 1–20allow_remote_fetch = falsevision_provider = "ollama" # optional: route images to a dedicated vision modelvision_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.
[image_gen] — image generation
Section titled “[image_gen] — image generation”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 = truedefault_model = "fal-ai/flux/schnell"api_key_env = "FAL_API_KEY" # name of the env var holding the provider key| Key | Meaning |
|---|---|
enabled | Enable the tool. |
default_model | Default provider model ID. |
api_key_env | Name of the environment variable that holds the provider API key. |
Operational tool sections
Section titled “Operational tool sections”These gate the analysis, pipeline, and workspace-maintenance tools.
[pipeline] — multi-step tool pipelines
Section titled “[pipeline] — multi-step tool pipelines”Backs the execute_pipeline meta-tool.
[pipeline]enabled = truemax_steps = 20allowed_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.
[backup] — workspace backups
Section titled “[backup] — workspace backups”Backs the backup tool (create / list / verify / restore). Enabled by default.
[backup]enabled = trueinclude_dirs = ["state", "sessions"]max_keep = 10| Key | Default | Meaning |
|---|---|---|
enabled | true | Enable backup operations. |
include_dirs | — | Directories included in each backup. |
max_keep | — | Retention 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 = trueretention_days = 90[cloud_ops] — cloud advisory tools
Section titled “[cloud_ops] — cloud advisory tools”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[security_ops] — managed cybersecurity
Section titled “[security_ops] — managed cybersecurity”Backs the security_ops tool (alert triage, playbook execution, vulnerability parsing, reporting).
[security_ops]enabled = true