vext is a high-performance IRC notification daemon for version control systems. It provides real-time commit notifications from Git repositories to IRC channels, with connection pooling to eliminate join/leave spam.
This is a modernized rewrite of the original irker by Eric S. Raymond, built with:
-
Rust - High-performance async daemon with memory safety
-
Deno/TypeScript - Modern hook scripts and CLI tools
-
Async I/O: Built on Tokio for efficient handling of thousands of connections
-
Connection Pooling: Maintains persistent IRC connections, eliminating join/leave spam
-
TLS Support: Secure connections to IRC servers (enabled by default)
-
Rate Limiting: Built-in flood protection with token bucket algorithm
-
Multi-Target: Send notifications to multiple channels/servers simultaneously
-
JSON Protocol: Simple, language-agnostic notification format
-
Color Support: Optional mIRC color codes for enhanced visibility
┌─────────────────┐ JSON/TCP ┌─────────────────┐
│ Git Hook │ ───────────────▶ │ vextd │
│ (Deno/TS) │ │ (Rust) │
└─────────────────┘ └────────┬────────┘
│
┌─────────┴─────────┐
│ Connection Pool │
└─────────┬─────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ IRC #ch1 │ │ IRC #ch2 │ │ IRC #ch3 │
└──────────┘ └──────────┘ └──────────┘# Clone the repository
git clone https://github.com/Hyperpolymath/vext.git
cd vext
# Build everything
just build
# Or build components separately
cargo build --release # Rust daemon
cd vext-tools && deno check src/**/*.ts # Deno tools# Start daemon (listens on 127.0.0.1:6659 by default)
./target/release/vextd
# Start with custom settings
./target/release/vextd --listen 0.0.0.0:6659 --default-server irc.libera.chat
# Debug mode
./target/release/vextd -vv# Install hook to a repository
cd /path/to/your/repo
deno run --allow-read --allow-write \
https://raw.githubusercontent.com/Hyperpolymath/vext/main/vext-tools/src/hooks/install.ts
# Configure the hook
export VEXT_TARGETS="ircs://irc.libera.chat/your-channel"
export VEXT_PROJECT="your-project"| Option | Description | Default |
|---|---|---|
|
Listen address |
|
|
Default IRC server |
|
|
Default IRC port |
|
|
Enable TLS |
|
|
Max connections per server |
|
|
Bot nick prefix |
|
|
Verbose logging |
INFO |
Send JSON notifications to the daemon over TCP:
{
"to": ["ircs://irc.libera.chat/channel1", "irc://irc.oftc.net/channel2"],
"privmsg": "[project] main abc1234 dev: Add new feature",
"project": "myproject",
"branch": "main",
"commit": "abc1234",
"author": "developer",
"url": "https://github.com/user/repo/commit/abc1234",
"colors": "mirc"
}# Run tests
just test
# Format code
just format
# Lint
just lint
# Full validation
just validatevext/
├── vext-core/ # Rust daemon
│ ├── src/
│ │ ├── main.rs # Entry point
│ │ ├── config.rs # Configuration
│ │ ├── irc_client.rs# IRC protocol
│ │ ├── listener.rs # TCP/UDP listener
│ │ ├── pool.rs # Connection pooling
│ │ └── protocol.rs # Notification types
│ └── Cargo.toml
├── vext-tools/ # Deno hooks & tools
│ ├── src/
│ │ └── hooks/
│ │ ├── git.ts # Git post-receive hook
│ │ └── install.ts
│ └── deno.json
└── justfile # Build automationDual-licensed under MIT OR AGPL-3.0-or-later (Palimpsest licensing).
Choose the license that works best for your use case.
-
Original irker by Eric S. Raymond
-
Modernized by the vext contributors