vext integrates with three major version control systems through intelligent hook detection:
- Integration Point:
post-receivehook (server-side) - Data Extracted:
- Commit hash and abbreviated hash
- Author name and email
- Commit date and timezone
- Commit message (subject and body)
- Changed files and statistics (additions/deletions)
- Branch name and push information
- Hook Invocation: Triggered once per push (not per commit, for efficiency)
- Format Options: Customizable message template
- Integration Points: Python hooks or shell scripts
- Data Extracted:
- Changeset hash
- Author information
- Commit date
- Commit description
- Files modified/added/removed
- Compatibility: Python 2 and Python 3 (with caveats)
- Trigger: Post-commit hook per changeset
- Integration Point:
post-commithook - Data Extracted:
- Revision number
- Author name
- Commit date
- Commit log message
- Changed paths summary
- Requirements: Repository path and revision number parameters
- Invocation: Once per committed transaction
Problem Solved: Eliminates the "join/leave spam" problem
- Single Connection: One IRC connection per channel maintained by daemon
- Connection Pooling: Multiple channels share server connections efficiently
- Reconnection Logic: Automatic reconnection on network failures
- Connection Timeout: Configurable idle timeout to prevent stale connections
- Resource Efficiency: Reuses connections across hundreds of messages
vext supports multiple transport methods for delivering notifications:
# Reliable, ordered delivery
IRKERD_USE_TCP=true irkerd- Guaranteed message delivery
- Ordered delivery
- Higher latency (~5-10ms vs UDP)
- Suitable for critical notifications
# Fast, fire-and-forget
IRKERD_USE_TCP=false irkerd- Lowest latency (<1ms)
- Lower bandwidth overhead
- Best effort delivery
- Suitable for high-volume scenarios
# Email-based notifications for offline access
IRKERD_EMAIL_ADDR=commits@example.com irkerd- Sends notifications via SMTP
- Persistent offline record
- Suitable for compliance and audit trails
- Fallback for IRC unavailability
Standardized Notification Format
{
"to": "irc://irc.libera.chat/commits",
"privmsg": "[abc123d] Alice: Implement new feature",
"nick": "myproject-bot",
"userinfo": "git@example.com",
"color": "ANSI"
}Key Advantages:
- Language-agnostic (any language can generate notifications)
- Easy to parse and validate
- Extensible for custom fields
- Human-readable for debugging
- Works across network boundaries
Route single commits to multiple channels for different audiences:
{
"to": [
"irc://irc.libera.chat/commits",
"irc://irc.libera.chat/releases",
"irc://irc.libera.chat/developers"
],
"privmsg": "[v1.2.0] Release: Version 1.2.0 shipped"
}Use Cases:
- Separate channels for different teams
- Release announcements in dedicated channels
- Backup notification channels
- Multi-server notification
Enhance visibility with optional color codes:
export IRKERD_COLOR_MODE=mIRC- Supports clients: mIRC, XChat, KVirc, Konversation, weechat
- Highlights commit hash, author, and message
- Backward compatible with non-color clients
export IRKERD_COLOR_MODE=ANSI- Supports clients: Chatzilla, irssi, ircle, BitchX
- Unix/Linux terminal-friendly
- Better for modern IRC clients
export IRKERD_COLOR_MODE=none- Maximum compatibility
- Clean, plain text output
- Suitable for all clients
Customize message appearance to match your team's style:
# Example: Custom notification template
{
"format": "[{hash}] {author}: {message} ({branch})",
"max_length": 512,
"truncation": "..."
}Customizable Elements:
- Author format (full name, email, username)
- Hash display (full, abbreviated)
- Message truncation length
- Branch/tag display
- File change statistics
- URL generation for web viewers
Protect IRC servers from being overwhelmed:
# Configuration
IRKERD_FLOOD_LIMIT=1000 # Max messages per minute
IRKERD_RATE_LIMIT=2 # Messages per second per channelFeatures:
- Per-channel rate limiting
- Global burst protection
- Automatic queue management
- Graceful degradation under load
Built-in logging for monitoring and debugging:
IRKERD_LOGFILE=/var/log/vext/vext.log
IRKERD_LOGLEVEL=INFO # DEBUG, INFO, WARNING, ERRORLog Includes:
- Connection events (connect, disconnect, error)
- Message sent/received
- Configuration changes
- Performance metrics
- Error stack traces
Direct different commits to different channels based on criteria:
{
"to": {
"main": "irc://irc.libera.chat/releases",
"dev": "irc://irc.libera.chat/commits",
"hotfix": "irc://irc.libera.chat/urgent"
},
"route_by": "branch"
}Routing Options:
- Branch name matching
- Author filtering
- Commit message patterns
- File path patterns
- Commit size thresholds
Features designed for efficiency:
- Connection Multiplexing: 1000+ channels per daemon
- Message Batching: Group rapid commits
- Memory Pooling: Efficient string and object reuse
- Lazy Connection: Channels connected only when needed
- Cleanup: Automatic removal of stale connections
Built-in security mechanisms:
# Run as unprivileged user
sudo chown irker:irker /var/run/vext.pid
sudo systemctl start vext # Runs as 'irker' user
# Restrict listener port
IRKERD_LISTEN=127.0.0.1 # Local-only accessSecurity Measures:
- Unprivileged user execution
- Input validation and sanitization
- Rate limiting against abuse
- Optional TLS for IRC connections
- Configurable access controls
Modify notification behavior without changing core code:
# Custom hook for commit annotations
class CustomHook:
def enrich_notification(self, commit_data):
# Add custom fields
commit_data['ticket_url'] = extract_ticket_id(commit_data['message'])
return commit_dataExport metrics for infrastructure monitoring:
# Prometheus metrics endpoint
curl http://localhost:8888/metricsAvailable Metrics:
- Messages sent/received
- Connection state
- Message queue depth
- Error rates
- Latency histograms
Future version will include:
- Real-time connection status dashboard
- Channel management UI
- Log viewer
- Statistics and graphs
- Configuration editor
Connect to multiple IRC servers simultaneously:
{
"servers": [
"irc://irc.libera.chat/commits",
"irc://irc.freenode.net/backup",
"irc://internal.corp.com/team"
]
}Professional, team-standard message formatting:
# Template: default.jinja2
[{{ commit.hash_short }}] {{ commit.author }}: {{ commit.subject }}
{% if commit.files_changed < 10 %}
Files: {{ commit.files_changed }} | +{{ commit.additions }}-{{ commit.deletions }}
{% endif %}Trigger notifications from CI pipelines:
# From CI job
curl -X POST http://localhost:6659/notify \
-H "Content-Type: application/json" \
-d '{"to":"irc://irc.libera.chat/builds","privmsg":"Build #42 passed"}'| Feature | vext | irker | Slack | |
|---|---|---|---|---|
| Git support | ✓ | ✓ | ✓ | ✓ |
| Hg support | ✓ | ✓ | ✗ | ✗ |
| SVN support | ✓ | ✓ | ✗ | ✗ |
| Multi-channel | ✓ | ✓ | ✗ | ✓ |
| Color codes | ✓ | ✓ | ✗ | ✓ |
| Rate limiting | ✓ | Limited | ✓ | ✓ |
| Logging | ✓ | Basic | ✓ | ✓ |
| TLS/SSL | ✓ | ✓ | ✓ | ✓ |
| Custom formatting | ✓ | Partial | ✓ | ✓ |
| Metrics export | ✓ | ✗ | ✗ | ✓ |
| Web UI | Planned | ✗ | ✗ | ✓ |
| No join/leave spam | ✓ | ✓ | N/A | N/A |
| Self-hosted | ✓ | ✓ | ✓ | ✗ |
- Complete VCS Support: Works with Git, Mercurial, and Subversion
- Zero Join/Leave Spam: Persistent connections eliminate channel noise
- Lightweight: Minimal resource usage suitable for any size organization
- Self-Hosted: No external dependencies or cloud requirements
- Well-Documented: Comprehensive guides and examples
- Modern Python: Fully compatible with Python 3.6+
- Production-Ready: Used in enterprise environments
- Extensible: Hook system allows customization
- Monitored: Logging and metrics for troubleshooting
- Community-Driven: Active maintenance and contributions