By default every channel is bound to one Qor. Routing rules let you override that per-sender, per-keyword, per-group, per-time-window — without writing any code.
Where rules live
Routing rules are TOML or YAML in/etc/qorven/routing.yml (or the equivalent under ~/.qorven/). The file is hot-reloaded; no restart required.
Match operators
| Key | Type | Matches |
|---|---|---|
channel | string | Channel ID (telegram, slack, whatsapp, …) |
from | string | Sender identity (email, phone, username, user ID) |
from_username | string | Provider-specific username |
group | string | Group name / ID for multi-party channels |
keyword | string[] | Any of these substrings in the message |
regex | string | Match against message content (PCRE) |
time | string | Time range in operator’s timezone ("22:00-08:00 IST") |
schedule | string | Cron expression for dates/days |
language | string | Detected language code |
match: all as the final rule is the idiomatic fallback.
Rule actions
Beyond routing to a different Qor, rules can:Priority Qors
When multiple specialists are viable,priority: high makes the message skip the queue:
Per-channel defaults
If you don’t want a wholerouting.yml, each channel binding has three built-in overrides in the UI:
- Primary Qor — who handles this channel
- Fallback Qor — if primary is busy or down
- Silent mode — don’t reply unless mentioned
Testing rules
Where next
Groups vs DMs
How group-scoped routing interacts with memory scopes.
Approvals
When a routed message triggers a destructive action.
Debounce
Batching rapid messages before routing.
Quotas
Per-tenant and per-channel rate limits.