Discrawl Search
Search Discord guild message history stored in local discrawl SQLite database.
Database Location
- Path:
~/.discrawl/discrawl.db - Updated by:
discrawl sync(bot API) ordiscrawl sync --source wiretap(Discord Desktop cache)
Quick Commands
Full-Text Search (FTS5)
Search message content with ranking:
discrawl search "query"
Options:
--limit N— max results (default: 20)--channel ID— filter by channel--author ID— filter by author--before "2026-04-01"— date filter--json— JSON output
List Messages by Channel
discrawl messages --channel <channel_id> --limit 10
Raw SQL Queries
discrawl sql "SELECT ..."
Common Query Patterns
Search with Context (Author + Channel Names)
SELECT
m.content,
m.created_at,
COALESCE(u.username, m.author_id) as author,
COALESCE(c.name, m.channel_id) as channel
FROM messages m
LEFT JOIN members u ON m.author_id = u.user_id
LEFT JOIN channels c ON m.channel_id = c.id
WHERE m.content LIKE '%keyword%'
ORDER BY m.created_at DESC
LIMIT 10;
Search Specific Channel History
SELECT content, created_at
FROM messages
WHERE channel_id = '<channel_id>'
AND content LIKE '%keyword%'
ORDER BY created_at DESC
LIMIT 20;
Find User's Past Messages
SELECT m.content, m.created_at, c.name
FROM messages m
JOIN channels c ON m.channel_id = c.id
WHERE m.author_id = '<user_id>'
ORDER BY m.created_at DESC
LIMIT 20;
Search with FTS5 (Best Relevance)
SELECT
m.content,
m.created_at,
fts.rank
FROM message_fts fts
JOIN messages m ON fts.message_id = m.id
WHERE message_fts MATCH 'keyword'
ORDER BY rank
LIMIT 20;
Recent Messages in Channel
SELECT content, created_at
FROM messages
WHERE channel_id = '<channel_id>'
ORDER BY created_at DESC
LIMIT 5;
Key Tables
| Table | Purpose |
|---|---|
messages | All messages (content, created_at, author_id, channel_id) |
channels | Channel metadata (name, topic, kind, guild_id) |
members | User info (username, global_name, nick) |
message_fts | FTS5 virtual table for full-text search |
mention_events | @mentions tracking |
message_attachments | File attachments with text extraction |
Important Notes
memberstable may be sparse (2 rows in current db) — useCOALESCE(u.username, m.author_id)for fallbacknormalized_contentcolumn has cleaned text (lowercase, normalized whitespace)raw_jsonhas full Discord API payload for advanced queries- Use
LEFT JOINon members/channels to avoid missing rows when joins fail