Logging & Search
repartee includes a built-in logging system backed by SQLite with optional encryption and full-text search.
Configuration
[logging]
enabled = true
encrypt = false
retention_days = 0 # 0 = keep forever
exclude_types = [] # e.g. ["join", "part", "quit"]
Storage
Logs are stored in ~/.repartee/logs/messages.db using SQLite with WAL (Write-Ahead Logging) mode for concurrent read/write performance.
Database schema
Each message is stored with:
| Column | Type | Description |
|---|---|---|
msg_id |
TEXT | Unique UUID |
network |
TEXT | Connection/network ID |
buffer |
TEXT | Channel or query name |
timestamp |
INTEGER | Unix timestamp |
msg_type |
TEXT | Message type (privmsg, join, etc.) |
nick |
TEXT | Sender nick |
text |
TEXT | Message content |
highlight |
INTEGER | 1 if message is a highlight |
ref_id |
TEXT | Reference to primary row (for fan-out dedup) |
Fan-out deduplication
Events like QUIT and NICK affect multiple channels. repartee stores a single full row for the first channel and reference rows (with empty text and a ref_id pointing to the primary) for subsequent channels. This saves storage while preserving per-channel history.
Encryption
When encrypt = true, message text is encrypted with AES-256-GCM before storage. The encryption key is derived from a passphrase stored in ~/.repartee/.env:
# ~/.repartee/.env
REPARTEE_LOG_KEY=your-secret-passphrase
Encrypted logs can only be searched/read with the correct key.
Full-text search
repartee uses SQLite FTS5 for fast full-text search across all logs:
/log search <query>
Search supports standard FTS5 syntax including phrase matching ("exact phrase"), prefix matching (prefix*), and boolean operators (AND, OR, NOT).
Commands
/log status
Show logging status, database size, and message count.
/log search <query>
Search across all logged messages.
Chat history backlog
When you open a channel, query, or DCC chat buffer, repartee automatically loads the most recent messages from the log database — so you immediately see recent context without scrolling.
/set display.backlog_lines 20 # default — load last 20 messages
/set display.backlog_lines 50 # load more history
/set display.backlog_lines 0 # disable backlog
Backlog messages appear at the top of the buffer, followed by a separator:
─── End of backlog (20 lines) ───
Backlog messages do not trigger highlights or notifications, and are not re-logged to the database (they already exist). This works for autoconnect channels, manual /join, queries opened via incoming messages, and DCC chat reconnections.
Batched writes
Messages are written to the database in batches (50 rows or every 1 second) using an async writer task connected via a tokio mpsc channel. This minimizes SQLite lock contention and ensures the UI never blocks on disk I/O.