Ak Dev New Messaging Integration
yaalalabs/agent-kernel
Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
$ npx skills add dandaka/traul --skill traul -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dandaka/traul traul --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
Claude Code skills documentation · loads skills from .claude/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .claude/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dandaka/traul --skill traul -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dandaka/traul traul --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .agents/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dandaka/traul --skill traul -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dandaka/traul traul --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .cursor/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dandaka/traul --skill traul -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dandaka/traul traul --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .gemini/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dandaka/traul traulInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dandaka/traul --skill traul -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .github/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dandaka/traul --skill traul -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dandaka/traul traul --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "traul" agent skill from https://github.com/dandaka/traul/tree/main into .opencode/skills/traul/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "traul", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
traulDrives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
Traul is a command-line personal intelligence engine that indexes communication streams into a local searchable database, and this skill documents its commands for the agent. Sync pulls new messages incrementally from Slack, Telegram, Discord, Linear, Gmail, Claude Code sessions, Markdown files or WhatsApp using cursors, and reports messages added and contacts found per source. The runtime is Bun with TypeScript and a SQLite database with full-text and vector search.
Search is hybrid by default, combining semantic similarity with keyword matching through rank fusion and falling back to keyword-only when embeddings are unavailable. Embeddings come from a local model that downloads on first use, with Ollama as a fallback. Flags switch to keyword-only, OR matching or a plain substring search for phrases that tokenization breaks. Other commands cover signals that detect patterns, briefings and browsing chat history.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4de8dc8. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadEditWriteGlobGrepFrom allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python and TypeScript, from the files we listed), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
SLACK_BOT_TOKENSLACK_USER_TOKENLINEAR_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Traul Message Search loads about 3.9k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 1,443 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Edit, Write, Glob, GrepAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from dandaka/traul at commit 4de8dc8, republished under its AGPL-3.0 licence (© dandaka). 1,443 words, ~3,912 tokens.
.claude/skills/traul/SKILL.md (or your agent's skills folder). This skill also uses 82 other files; get the full folder from GitHub.CLI tool that watches communication streams (Slack, Telegram, Discord, Linear, Gmail, Claude Code sessions, Markdown files, WhatsApp), indexes messages, detects patterns via signals, and surfaces actionable insights.
Runtime: Bun + TypeScript | DB: SQLite (WAL mode, FTS5, sqlite-vec) | Embeddings: node-llama-cpp (Qwen3-Embedding-0.6B), Ollama fallback | Version: 0.2.0
Project: /Users/dandaka/projects/traul
traul sync [source]Sync messages from communication sources incrementally.
| Argument | Description |
|---|---|
source | Optional. slack, telegram, discord, linear, gmail, claudecode, markdown, or whatsapp. Omit to sync all. |
tg.py (Telethon), 1-hour cooldown skip per chat, progress reporting every 10s~/.claude/projects/, extracts user+assistant messages.md files, tracks changes by content hashtraul search <query>Hybrid search combining vector similarity (semantic) and FTS5 keyword matching with Reciprocal Rank Fusion. Falls back to FTS-only if embedding is unavailable.
Search modes:
88% vector, 12% FTS).--fts) — keyword matching with BM25 ranking. Faster, but requires ALL terms to match (implicit AND). Brittle with multi-word queries, especially combined with source/channel filters.--or) — joins search terms with OR instead of AND. Works with both --fts and hybrid. Use for broad exploratory queries where any term is relevant.--like) — bypasses FTS entirely, uses SQL LIKE. Useful for exact phrases that FTS tokenization breaks (e.g. "how do I").Tip: Prefer hybrid (default) for broad queries like "metrics mixpanel registration". Use --fts --or for exploratory keyword searches matching ANY term. Use --like for exact phrase matching.
| Option | Description |
|---|---|
-s, --source <source> | Filter by source |
-c, --channel <channel> | Filter by channel name |
-a, --after <date> | Messages after ISO date (aliases: --from, --start) |
-b, --before <date> | Messages before ISO date (aliases: --to, --end) |
-l, --limit <n> | Max results (default: 20) |
--json | Output as JSON |
--fts | Keyword-only search (skip vector search) |
--or | Join terms with OR instead of AND (works with --fts and hybrid) |
--like | Substring match (LIKE) — bypasses FTS, useful for exact phrases |
traul get [thread-id]Retrieve a full conversation thread by its thread ID, or list all threads from a given date. Search results display thread IDs in the output so you can copy them for use with get.
| Option | Description |
|---|---|
thread-id (positional) | Thread ID (e.g. Claude Code session UUID) |
-d, --date <date> | Get all threads from a date (ISO 8601) |
--json | Output as JSON |
# Search shows thread IDs in results
traul search "mixpanel metrics"
# → 2026-03-10 13:06 #base claude [thread:abc-123-uuid]: Let me try...
# Get full conversation by thread ID
traul get abc-123-session-uuid
# List all threads from a specific date
traul get --date 2026-03-10
# JSON output
traul get abc-123-session-uuid --jsontraul messages [channel]Browse messages chronologically (no FTS required).
| Option | Description |
|---|---|
channel (positional) | Exact channel name match |
-c, --channel <name> | Substring match on channel name |
-a, --author <name> | Filter by author name (substring) |
-s, --source <source> | Filter by source |
--after <date> | Messages after ISO date (alias: --from) |
--before <date> | Messages before ISO date (alias: --to) |
-l, --limit <n> | Max results (default: 50) |
--json | Output as JSON |
--asc | Oldest first (default: newest first) |
traul channelsList known channels with message counts and last activity.
| Option | Description |
|---|---|
-s, --source <source> | Filter by source |
--search <term> | Substring search in channel name |
--json | Output as JSON |
traul sql <query>Execute arbitrary read-only SQL against the database. Only SELECT, PRAGMA, WITH, and EXPLAIN queries are allowed by default.
| Option | Description |
|---|---|
--json | Output as JSON (default) |
--write | Allow write operations (INSERT, UPDATE, DELETE, etc.) |
# Ad-hoc analytics
traul sql "SELECT source, COUNT(*) as cnt FROM messages GROUP BY source"
# Check sync cursors
traul sql "SELECT * FROM sync_cursors WHERE source='gmail'"
# Modify data (requires --write flag)
traul sql "UPDATE messages SET channel_name='renamed' WHERE channel_name='old'" --writetraul schemaShow database tables with column names, types, and constraints. Excludes FTS shadow tables.
| Option | Description |
|---|---|
--json | Output as JSON |
traul signalsView active signal results (not dismissed), ordered by severity then date.
| Option | Description |
|---|---|
--json | Output as JSON |
traul signals runEvaluate all enabled signal definitions against the database. Seeds built-in signals automatically. Replaces :my_user_id placeholder with configured Slack user ID.
traul signals dismiss <id>Dismiss a signal result by its numeric ID.
traul briefingStructured overview with three sections:
traul resetReset a data layer to force regeneration. Useful when you need to re-sync, re-chunk, or re-embed data.
| Subcommand | Description |
|---|---|
traul reset sync [--source <source>] | Clear sync cursors; full refetch on next sync. Optional --source flag filters to a specific connector (e.g., markdown, slack). |
traul reset chunks | Delete all chunks and embeddings; rechunk on next sync. |
traul reset embed | Drop and recreate vector tables; re-embed with traul embed. |
traul reset all | Reset everything: sync cursors + chunks + embeddings. |
Auto-migration: Traul automatically detects version changes on startup. If the chunking algorithm or embedding model/dimensions change between versions, affected data layers are reset automatically. No manual action needed after upgrading.
| Option | Description |
|---|---|
-v, --verbose | Debug logging to stderr |
All --json outputs use clean, normalized field names (not raw SQL column names).
channels --json| Field | Type | Description |
|---|---|---|
source | string | Source connector name |
name | string | Channel name |
message_count | number | Total messages in channel |
last_activity | string | ISO 8601 timestamp of last message |
messages --json| Field | Type | Description |
|---|---|---|
sent_at | string | ISO 8601 timestamp |
author | string | Author display name |
content | string | Message content |
channel | string | Channel name |
source | string | Source connector name |
search --json| Field | Type | Description |
|---|---|---|
sent_at | string | ISO 8601 timestamp |
author | string | Author display name |
content | string | Message content |
channel | string | Channel name |
source | string | Source connector name |
thread_id | string | Thread/session ID (optional, present when available) |
rank | number | Search relevance score (optional) |
SLACK_BOT_TOKEN or SLACK_USER_TOKEN env var (+ optional SLACK_COOKIE_* for user tokens)token, cookie, my_user_id, channels[]TELEGRAM_API_ID, TELEGRAM_API_HASH env varsapi_id, api_hash, session_path, chats[]~/.claude/skills/telegram-telethon/scripts/tg.py (Telethon)LINEAR_API_KEY env var for single workspace, or LINEAR_API_KEY_<NAME> for multiple workspaces (e.g. LINEAR_API_KEY_TRENDLE, LINEAR_API_KEY_AIFC)linear.api_key, linear.teams[], linear.workspaces[] (each with name, api_key, teams[])<workspace>:team:<id> or <workspace>:allLINEAR_API_KEY_* env vars are auto-discovered as separate workspaces~/.claude/projects/ (all project subdirectories)-Users-dandaka-projects-traul → traul)markdown.dirs[] — list of directories to scan (supports ~ expansion).md file discovery, content-hash-based change detection, re-syncs on file modification.md extension)SQL-based pattern detection engine.
| Field | Description |
|---|---|
name | Unique identifier |
query | SQL returning: message_id, severity, title, detail |
severity_expression | "info" (static) or "dynamic" (from query CASE) |
enabled | Boolean toggle |
stale-threads — Detects threads you participated in with no reply for 3+ days.
| Severity | Condition |
|---|---|
urgent | No reply 14+ days |
warning | No reply 7+ days |
info | No reply 3+ days |
Location: ~/.local/share/traul/traul.db (configurable)
| Table | Purpose |
|---|---|
messages | Primary message store (source, channel, author, content, sent_at, metadata JSON) |
messages_fts | FTS5 virtual table (content, author_name, channel_name) with porter tokenizer |
vec_messages | sqlite-vec virtual table for vector embeddings (float[1024]) |
contacts | Unified contact directory (display_name unique) |
contact_identities | Multi-source user mapping (source + source_user_id unique) |
sync_cursors | Incremental sync state per source+key |
signal_definitions | Signal rules with SQL queries |
signal_results | Signal matches with severity, dismissal tracking |
FTS5 is auto-synced via INSERT/UPDATE/DELETE triggers on messages.
File: ~/.config/traul/config.json
{
"sync_start": "2025-01-01",
"database": { "path": "~/.local/share/traul/traul.db" },
"slack": {
"token": "",
"cookie": "",
"my_user_id": "",
"channels": []
},
"telegram": {
"api_id": "",
"api_hash": "",
"session_path": "",
"chats": []
},
"linear": {
"api_key": "",
"teams": [],
"workspaces": []
},
"markdown": {
"dirs": ["~/projects/dn-kb"]
}
}ENV vars override config values. Empty channels/chats arrays = sync all.
src/
index.ts # CLI entry (Commander.js)
commands/ # Command handlers
sync.ts, search.ts, messages.ts, channels.ts, get.ts, signals.ts, briefing.ts, sql.ts
connectors/ # Source adapters
types.ts, slack.ts, telegram.ts, linear.ts, claude-code.ts, markdown.ts
db/ # Data layer
schema.ts, database.ts, queries.ts
lib/ # Utilities
config.ts, logger.ts, formatter.ts
signals/ # Signal engine
types.ts, evaluator.ts, definitions/stale-threads.tsNever assume a source doesn't exist just because a search returns no results. The config and connectors evolve — always verify by listing actual data:
traul channels -s <source> to check if a source has synced datatraul messages -s <source> -l 10 to browse recent messages from a sourceDo NOT use traul channels --search "discord" to check if Discord is a source — that searches channel names for the word "discord", not source types.
traul sync is very slow — can take up to 1 hour. Do NOT run sync before operations like search, messages, signals, or briefing. Always work with the data already in the database. Only run sync when the user explicitly asks for it.
# Initial sync of all sources
traul sync
# Sync only Slack
traul sync slack
# Browse recent messages in a channel
traul messages "general" --limit 20
# Find channels matching a keyword
traul channels --search "dev"
# Search for a topic (results include thread IDs)
traul search "deployment issue" --after 2026-03-01
# Get a full thread/conversation
traul get <thread-id>
traul get --date 2026-03-10
# Exploratory search matching ANY term
traul search "deposit withdraw broken" --fts --or
# Exact phrase search (bypasses FTS tokenization)
traul search "how do I" --like -s discord -l 20
# Run signal evaluation and view results
traul signals run
traul signals
# Get a full briefing
traul briefing
# Dismiss a signal
traul signals dismiss 42
# Ad-hoc SQL queries (read-only by default)
traul sql "SELECT source, COUNT(*) as cnt FROM messages GROUP BY source"
traul sql "SELECT * FROM sync_cursors" --json
# Modify data with --write flag
traul sql "UPDATE messages SET channel_name='new' WHERE channel_name='old'" --write
# Explore database schema
traul schema
traul schema --json© dandaka, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 82 other files (scripts) in the repository root of dandaka/traul.
Open the folder on GitHubat commit 4de8dc8
Traul Message Search next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Traul Message Search this skilldandaka/traul | 113 | — | ~3.9k | Automated safety check: Notes | AGPL-3.0 | |
| Ak Dev New Messaging Integrationyaalalabs/agent-kernel | 191 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Ak Add Integrationyaalalabs/agent-kernel | 191 | — | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Openloomi Connectorsmelandlabs/openloomi | 1k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Wire First NanoClaw Agentnanocoai/nanoclaw | 31k | — | ~2.5k | Automated safety check: Notes | MIT | |
| Ops Inboxdavepoon/buildwithclaude | 3.6k | — | ~7.2k | Automated safety check: Notes | MIT |
yaalalabs/agent-kernel
Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
yaalalabs/agent-kernel
Add a messaging platform integration to an existing Agent Kernel project.
melandlabs/openloomi
openloomi Connectors tools - manage the native 7 messaging integrations and pair with the composio skill for the 1000+ apps OAuth layer (Slack, Discord, X, Gmail, Outlook, Google…
nanocoai/nanoclaw
Connects the first NanoClaw agent to a chat channel and proves delivery by having it send the operator a welcome direct message.
davepoon/buildwithclaude
Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned…
letta-ai/lettabot
Set up and run LettaBot - a multi-channel AI assistant for Telegram, Slack, Discord, WhatsApp, and Signal.
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files. Traul is a command-line personal intelligence engine that indexes communication streams into a local searchable database, and this skill documents its commands for the agent. Sync pulls new messages incrementally from Slack, Telegram, Discord, Linear, Gmail, Claude Code sessions, Markdown files or WhatsApp using cursors, and reports messages added and contacts found per source.
Traul Message Search fits situations like: syncing new messages from Slack, Telegram or Gmail into the local index; searching past conversations by meaning or keyword across sources; browsing chat history or generating a briefing from indexed messages.
Run `npx skills add dandaka/traul --skill traul -a claude-code`. Or copy the skill folder (the dandaka/traul repository) into .claude/skills/traul in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dandaka/traul --skill traul -a codex`. Or copy the skill folder (the dandaka/traul repository) into .agents/skills/traul in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dandaka/traul --skill traul -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/traul, .gemini/skills/traul, .github/skills/traul and .opencode/skills/traul in your project.
Going by SKILL.md and its folder, Traul Message Search needs Python and TypeScript for the scripts in its folder and credentials named SLACK_BOT_TOKEN, SLACK_USER_TOKEN and LINEAR_API_KEY. Our summary lists: The traul CLI, which runs on Bun with TypeScript. Its frontmatter pre-approves these tools: Bash, Read, Edit, Write, Glob, Grep.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Traul Message Search is published under the AGPL-3.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Traul Message Search: Ak Dev New Messaging Integration (yaalalabs/agent-kernel, 191 stars), Ak Add Integration (yaalalabs/agent-kernel, 191 stars), Openloomi Connectors (melandlabs/openloomi, 1k stars) and Wire First NanoClaw Agent (nanocoai/nanoclaw, 31k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dandaka (a GitHub user) maintains it in dandaka/traul, which has 113 GitHub stars. The repository was last updated on May 6, 2026.
Source: dandaka/traul on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.