x011/smtp-tunnel-proxyPublic

A high-speed covert tunnel that disguises TCP traffic as SMTP email communication to bypass Deep Packet Inspection (DPI) firewalls.

AI summary: A secure, transparent proxy for routing SMTP traffic over encrypted tunnels.

Stars
1.7K
+3 today
Forks
156
Watchers
9
Open issues
2
Open PRs
1
Contributors
~1
Commits
25
Branches
1

PythonGPL-3.0Created Jan 6, 2026Last push 7mo agoLatest release v1.3.0+16 stars this week+16 this month

Star history

since Jan 4, 2026
05001K1.5KJan 2026Mar 2026May 2026Aug 2026
1.7K stars as of Aug 6, 2026, tracked back to Jan 4, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

What smtp-tunnel-proxy does

smtp-tunnel-proxy is a specialized networking tool designed to securely route legacy email traffic through modern encrypted tunnels like WireGuard or SSH. It intercepts unencrypted SMTP traffic on a local network, encapsulates it, and forwards it to a remote secure mail server. This allows legacy applications, IoT devices, or old printers that only support basic SMTP to send emails securely over untrusted networks without modifying the devices themselves.

Network administrators and systems engineers responsible for integrating legacy hardware and software with modern, secure email infrastructure. Requires solid knowledge of networking and mail protocols.

  • Transparent interception: catches outgoing SMTP traffic without requiring explicit proxy configuration on clients.
  • Tunnel encapsulation: seamlessly wraps traffic in TLS or routes it through established VPN tunnels.
  • Authentication spoofing: handles complex SASL authentication on behalf of dumb legacy devices.
  • Rate limiting: protects upstream mail servers from being flooded by misconfigured local devices.
  • Detailed logging: provides deep visibility into email delivery attempts and failures for debugging.

Where teams use it

Legacy device support

Sysadmins use it to allow old printers and scanners to send scan-to-email securely.

IoT notification routing

Secures alert emails sent from embedded devices on untrusted factory networks.

Application modernization

Allows old enterprise software to send email through modern, strict cloud providers.

Network segmentation

Acts as a controlled gateway between an isolated internal network and the public internet.

Getting started: cargo build --release && ./smtp-tunnel-proxy --config config.toml

README

main branch

πŸ“§ SMTP Tunnel Proxy

A high-speed covert tunnel that disguises TCP traffic as SMTP email communication to bypass Deep Packet Inspection (DPI) firewalls.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application │─────▢│   Client    │─────▢│   Server    │─────▢│  Internet    β”‚
β”‚  (Browser)  β”‚ TCP  β”‚ SOCKS5:1080 β”‚ SMTP β”‚  Port 587   β”‚ TCP  β”‚              β”‚
β”‚             │◀─────│             │◀─────│             │◀─────│              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚                    β”‚
                            β”‚   Looks like       β”‚
                            β”‚   Email Traffic    β”‚
                            β–Ό                    β–Ό
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚     DPI Firewall               β”‚
                     β”‚  βœ… Sees: Normal SMTP Session  β”‚
                     β”‚  ❌ Cannot see: Tunnel Data    β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🎯 Features

Feature Description
πŸ”’ TLS Encryption All traffic encrypted with TLS 1.2+ after STARTTLS
🎭 DPI Evasion Initial handshake mimics real SMTP servers (Postfix)
⚑ High Speed Binary streaming protocol after handshake - minimal overhead
πŸ‘₯ Multi-User Per-user secrets, IP whitelists, and logging settings
πŸ”‘ Authentication Per-user pre-shared keys with HMAC-SHA256
🌐 SOCKS5 Proxy Standard proxy interface - works with any application
πŸ“‘ Multiplexing Multiple connections over single tunnel
πŸ›‘οΈ IP Whitelist Per-user access control by IP address/CIDR
πŸ“¦ Easy Install One-liner server installation with systemd service
🎁 Client Packages Auto-generated ZIP files for each user
πŸ”„ Auto-Reconnect Client automatically reconnects on connection loss

πŸ“š For in-depth technical details, protocol specifications, and security analysis, see TECHNICAL.md.


⚑ Quick Start

πŸ“‹ Prerequisites

  • Server: Linux VPS with Python 3.8+, port 587 open
  • Client: Windows/macOS/Linux with Python 3.8+
  • Domain name: Required for TLS certificate verification (free options: DuckDNS, No-IP, FreeDNS)

πŸš€ Server Setup (VPS)

Step 1️⃣: Get a Domain Name

Get a free domain pointing to your VPS:

  • πŸ¦† DuckDNS - Recommended, simple and free
  • 🌐 No-IP - Free tier available
  • πŸ†“ FreeDNS - Many domain options

Example: myserver.duckdns.org β†’ 203.0.113.50 (your VPS IP)

Step 2️⃣: Run the Installer

curl -sSL https://raw.githubusercontent.com/x011/smtp-tunnel-proxy/main/install.sh | sudo bash

The installer will:

  1. πŸ“₯ Download and install everything
  2. ❓ Ask for your domain name
  3. πŸ” Generate TLS certificates automatically
  4. πŸ‘€ Offer to create your first user
  5. πŸ”₯ Configure firewall
  6. πŸš€ Start the service

That's it! Your server is ready.

βž• Add More Users Later

smtp-tunnel-adduser bob      # Add user + generate client ZIP
smtp-tunnel-listusers        # List all users
smtp-tunnel-deluser bob      # Remove a user

πŸ”„ Update Server

smtp-tunnel-update           # Updates code, preserves config/certs/users

πŸ’» Client Setup

Option A: Easy Way (Recommended)

  1. Get your username.zip file from the server admin
  2. Extract the ZIP file
  3. Run the launcher:
Platform How to Run
πŸͺŸ Windows Double-click start.bat
🐧 Linux Run ./start.sh
🍎 macOS Run ./start.sh

The launcher will automatically install dependencies and start the client.

βœ… You should see:

SMTP Tunnel Proxy Client
User: alice

[INFO] Starting SMTP Tunnel...
[INFO] SOCKS5 proxy will be available at 127.0.0.1:1080

Connecting to myserver.duckdns.org:587
Connected - binary mode active
SOCKS5 proxy on 127.0.0.1:1080

Option B: Manual Way

cd alice
pip install -r requirements.txt
python client.py

Option C: Custom Configuration

# Download files
scp root@myserver.duckdns.org:/etc/smtp-tunnel/ca.crt .

# Create config.yaml:
cat > config.yaml << EOF
client:
  server_host: "myserver.duckdns.org"
  server_port: 587
  socks_port: 1080
  username: "alice"
  secret: "your-secret-from-admin"
  ca_cert: "ca.crt"
EOF

# Run client
python client.py -c config.yaml

πŸ“– Usage

🌐 Configure Your Applications

Set SOCKS5 proxy to: 127.0.0.1:1080

🦊 Firefox

  1. Settings β†’ Network Settings β†’ Settings
  2. Manual proxy configuration
  3. SOCKS Host: 127.0.0.1, Port: 1080
  4. Select SOCKS v5
  5. βœ… Check "Proxy DNS when using SOCKS v5"

🌐 Chrome

  1. Install "Proxy SwitchyOmega" extension
  2. Create profile with SOCKS5: 127.0.0.1:1080

πŸͺŸ Windows (System-wide)

Settings β†’ Network & Internet β†’ Proxy β†’ Manual setup β†’ socks=127.0.0.1:1080

🍎 macOS (System-wide)

System Preferences β†’ Network β†’ Advanced β†’ Proxies β†’ SOCKS Proxy β†’ 127.0.0.1:1080

🐧 Linux (System-wide)

export ALL_PROXY=socks5://127.0.0.1:1080

πŸ’» Command Line

# curl
curl -x socks5h://127.0.0.1:1080 https://ifconfig.me

# git
git config --global http.proxy socks5://127.0.0.1:1080

# Environment variable
export ALL_PROXY=socks5://127.0.0.1:1080

βœ… Test Connection

# Should show your VPS IP
curl -x socks5://127.0.0.1:1080 https://ifconfig.me

βš™οΈ Configuration Reference

πŸ–₯️ Server Options (config.yaml)

Option Description Default
host Listen interface 0.0.0.0
port Listen port 587
hostname SMTP hostname (must match certificate) mail.example.com
cert_file TLS certificate path server.crt
key_file TLS private key path server.key
users_file Path to users configuration users.yaml
log_users Global logging setting true

πŸ‘₯ User Options (users.yaml)

Each user can have individual settings:

users:
  alice:
    secret: "auto-generated-secret"
    # whitelist:              # Optional: restrict to specific IPs
    #   - "192.168.1.100"
    #   - "10.0.0.0/8"        # CIDR notation supported
    # logging: true           # Optional: disable to stop logging this user

  bob:
    secret: "another-secret"
    whitelist:
      - "203.0.113.50"        # Bob can only connect from this IP
    logging: false            # Don't log Bob's activity
Option Description Default
secret User's authentication secret Required
whitelist Allowed IPs for this user (CIDR supported) All IPs
logging Enable activity logging for this user true

πŸ’» Client Options

Option Description Default
server_host Server domain name Required
server_port Server port 587
socks_port Local SOCKS5 port 1080
socks_host Local SOCKS5 interface 127.0.0.1
username Your username Required
secret Your authentication secret Required
ca_cert CA certificate for verification Recommended

πŸ“‹ Service Management

# Check status
sudo systemctl status smtp-tunnel

# Restart after config changes
sudo systemctl restart smtp-tunnel

# View logs
sudo journalctl -u smtp-tunnel -n 100

# Uninstall
sudo /opt/smtp-tunnel/uninstall.sh

πŸ”§ Command Line Options

πŸ–₯️ Server

python server.py [-c CONFIG] [-d]

  -c, --config    Config file (default: config.yaml)
  -d, --debug     Enable debug logging

πŸ’» Client

python client.py [-c CONFIG] [--server HOST] [--server-port PORT]
                 [-p SOCKS_PORT] [-u USERNAME] [-s SECRET] [--ca-cert FILE] [-d]

  -c, --config      Config file (default: config.yaml)
  --server          Override server domain
  --server-port     Override server port
  -p, --socks-port  Override local SOCKS port
  -u, --username    Your username
  -s, --secret      Override secret
  --ca-cert         CA certificate path
  -d, --debug       Enable debug logging

πŸ‘₯ User Management

smtp-tunnel-adduser <username> [-u USERS_FILE] [-c CONFIG] [--no-zip]
    Add a new user and generate client package

smtp-tunnel-deluser <username> [-u USERS_FILE] [-f]
    Remove a user (use -f to skip confirmation)

smtp-tunnel-listusers [-u USERS_FILE] [-v]
    List all users (use -v for detailed info)

smtp-tunnel-update
    Update server to latest version (preserves config/certs/users)

πŸ“ File Structure

smtp_proxy/
β”œβ”€β”€ πŸ“„ server.py               # Server (runs on VPS)
β”œβ”€β”€ πŸ“„ client.py               # Client (runs locally)
β”œβ”€β”€ πŸ“„ common.py               # Shared utilities
β”œβ”€β”€ πŸ“„ generate_certs.py       # Certificate generator
β”œβ”€β”€ πŸ“„ config.yaml             # Server/client configuration
β”œβ”€β”€ πŸ“„ users.yaml              # User database
β”œβ”€β”€ πŸ“„ requirements.txt        # Python dependencies
β”œβ”€β”€ πŸ“„ install.sh              # One-liner server installer
β”œβ”€β”€ πŸ“„ smtp-tunnel.service     # Systemd unit file
β”œβ”€β”€ πŸ”§ smtp-tunnel-adduser     # Add user script
β”œβ”€β”€ πŸ”§ smtp-tunnel-deluser     # Remove user script
β”œβ”€β”€ πŸ”§ smtp-tunnel-listusers   # List users script
β”œβ”€β”€ πŸ”§ smtp-tunnel-update      # Update server script
β”œβ”€β”€ πŸ“„ README.md               # This file
└── πŸ“„ TECHNICAL.md            # Technical documentation

πŸ“¦ Installation Paths (after install.sh)

/opt/smtp-tunnel/              # Application files
/etc/smtp-tunnel/              # Configuration files
  β”œβ”€β”€ config.yaml
  β”œβ”€β”€ users.yaml
  β”œβ”€β”€ server.crt
  β”œβ”€β”€ server.key
  └── ca.crt
/usr/local/bin/                # Management commands
  β”œβ”€β”€ smtp-tunnel-adduser
  β”œβ”€β”€ smtp-tunnel-deluser
  β”œβ”€β”€ smtp-tunnel-listusers
  └── smtp-tunnel-update

πŸ”§ Troubleshooting

❌ "Connection refused"

  • Check server is running: systemctl status smtp-tunnel or ps aux | grep server.py
  • Check port is open: netstat -tlnp | grep 587
  • Check firewall: ufw status

❌ "Auth failed"

  • Verify username and secret match in users.yaml
  • Check server time is accurate (within 5 minutes)
  • Run smtp-tunnel-listusers -v to verify user exists

❌ "IP not whitelisted"

  • Check user's whitelist in users.yaml
  • Your current IP must match a whitelist entry
  • CIDR notation is supported (e.g., 10.0.0.0/8)

❌ "Certificate verify failed"

  • Ensure you're using a domain name, not IP address
  • Verify server_host matches the certificate hostname
  • Ensure you have the correct ca.crt from the server

πŸ› Debug Mode

# Enable detailed logging
python server.py -d
python client.py -d

# View systemd logs
journalctl -u smtp-tunnel -f

πŸ” Security Notes

  • βœ… Always use a domain name for proper TLS verification
  • βœ… Always use ca_cert to prevent man-in-the-middle attacks
  • βœ… Use smtp-tunnel-adduser to generate strong secrets automatically
  • βœ… Use per-user IP whitelists if you know client IPs
  • βœ… Protect users.yaml - contains all user secrets (chmod 600)
  • βœ… Disable logging for sensitive users with logging: false

πŸ“š For detailed security analysis and threat model, see TECHNICAL.md.


πŸ“„ License

This project is provided for educational and authorized use only. Use responsibly and in accordance with applicable laws.


⚠️ Disclaimer

This tool is designed for legitimate privacy and censorship circumvention purposes. Users are responsible for ensuring their use complies with applicable laws and regulations.


Made with ❀️ for internet freedom

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

1 total
  1. v1.3.0v1.3.0Jan 7, 2026

    ## Release Notes - v1.3.0 ### New Features - **Auto-Reconnect**: Client automatically reconnects on connection loss with exponential backoff (2s β†’ 30s max) - **smtp-tunnel-update**: New command to update server without losing config, certificates, or users ### Improvements - Better session cleanup on disconnect - Faster connection loss detection (60s timeout) - Improved users.yaml format with commented whitelist examples - Client rejects SOCKS requests while disconnected instead of crashing ### Bug Fixes - Fixed HKDF backend compatibility for older cryptography library (Ubuntu 20.04) - Fixed management scripts default paths to use /etc/smtp-tunnel/ - Fixed newline handling in Windows batch file generation ### Documentation - Updated README with auto-reconnect feature - Added smtp-tunnel-update to all documentation - Improved Client Setup section with easy launcher instructions

Code frequency

additions and deletions
+5.6K-5.6KWeek of 2026-01-04: +5,641 linesWeek of 2026-01-04: -284 linesWeek of 2026-01-11: +0 linesWeek of 2026-01-11: -0 linesWeek of 2026-01-18: +0 linesWeek of 2026-01-18: -0 linesWeek of 2026-01-25: +0 linesWeek of 2026-01-25: -0 linesWeek of 2026-02-01: +0 linesWeek of 2026-02-01: -0 linesWeek of 2026-02-08: +0 linesWeek of 2026-02-08: -0 linesWeek of 2026-02-15: +0 linesWeek of 2026-02-15: -0 linesWeek of 2026-02-22: +0 linesWeek of 2026-02-22: -0 linesWeek of 2026-03-01: +0 linesWeek of 2026-03-01: -0 linesWeek of 2026-03-08: +0 linesWeek of 2026-03-08: -0 linesWeek of 2026-03-15: +0 linesWeek of 2026-03-15: -0 linesWeek of 2026-03-22: +0 linesWeek of 2026-03-22: -0 linesWeek of 2026-03-29: +0 linesWeek of 2026-03-29: -0 linesWeek of 2026-04-05: +0 linesWeek of 2026-04-05: -0 linesWeek of 2026-04-12: +0 linesWeek of 2026-04-12: -0 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +0 linesWeek of 2026-04-26: -0 linesWeek of 2026-05-03: +0 linesWeek of 2026-05-03: -0 linesWeek of 2026-05-10: +0 linesWeek of 2026-05-10: -0 linesWeek of 2026-05-17: +0 linesWeek of 2026-05-17: -0 linesWeek of 2026-05-24: +0 linesWeek of 2026-05-24: -0 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +0 linesWeek of 2026-06-07: -0 linesWeek of 2026-06-14: +0 linesWeek of 2026-06-14: -0 linesWeek of 2026-06-21: +0 linesWeek of 2026-06-21: -0 linesWeek of 2026-06-28: +0 linesWeek of 2026-06-28: -0 linesWeek of 2026-07-05: +0 linesWeek of 2026-07-05: -0 linesWeek of 2026-07-12: +0 linesWeek of 2026-07-12: -0 linesWeek of 2026-07-19: +0 linesWeek of 2026-07-19: -0 linesWeek of 2026-07-26: +0 linesWeek of 2026-07-26: -0 linesJan 4, 2026Jul 26, 2026
+5.6K lines added, -284 removed over the last year.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 β€” 0 commitsSun 1:00 β€” 0 commitsSun 2:00 β€” 0 commitsSun 3:00 β€” 0 commitsSun 4:00 β€” 0 commitsSun 5:00 β€” 0 commitsSun 6:00 β€” 0 commitsSun 7:00 β€” 0 commitsSun 8:00 β€” 0 commitsSun 9:00 β€” 0 commitsSun 10:00 β€” 0 commitsSun 11:00 β€” 0 commitsSun 12:00 β€” 0 commitsSun 13:00 β€” 0 commitsSun 14:00 β€” 0 commitsSun 15:00 β€” 0 commitsSun 16:00 β€” 0 commitsSun 17:00 β€” 0 commitsSun 18:00 β€” 0 commitsSun 19:00 β€” 0 commitsSun 20:00 β€” 0 commitsSun 21:00 β€” 0 commitsSun 22:00 β€” 0 commitsSun 23:00 β€” 0 commitsMon 0:00 β€” 0 commitsMon 1:00 β€” 0 commitsMon 2:00 β€” 0 commitsMon 3:00 β€” 0 commitsMon 4:00 β€” 0 commitsMon 5:00 β€” 0 commitsMon 6:00 β€” 0 commitsMon 7:00 β€” 0 commitsMon 8:00 β€” 0 commitsMon 9:00 β€” 0 commitsMon 10:00 β€” 0 commitsMon 11:00 β€” 0 commitsMon 12:00 β€” 0 commitsMon 13:00 β€” 0 commitsMon 14:00 β€” 0 commitsMon 15:00 β€” 0 commitsMon 16:00 β€” 0 commitsMon 17:00 β€” 0 commitsMon 18:00 β€” 0 commitsMon 19:00 β€” 0 commitsMon 20:00 β€” 0 commitsMon 21:00 β€” 0 commitsMon 22:00 β€” 0 commitsMon 23:00 β€” 0 commitsTue 0:00 β€” 0 commitsTue 1:00 β€” 0 commitsTue 2:00 β€” 0 commitsTue 3:00 β€” 0 commitsTue 4:00 β€” 0 commitsTue 5:00 β€” 0 commitsTue 6:00 β€” 0 commitsTue 7:00 β€” 0 commitsTue 8:00 β€” 0 commitsTue 9:00 β€” 0 commitsTue 10:00 β€” 0 commitsTue 11:00 β€” 0 commitsTue 12:00 β€” 0 commitsTue 13:00 β€” 0 commitsTue 14:00 β€” 0 commitsTue 15:00 β€” 0 commitsTue 16:00 β€” 0 commitsTue 17:00 β€” 0 commitsTue 18:00 β€” 0 commitsTue 19:00 β€” 0 commitsTue 20:00 β€” 0 commitsTue 21:00 β€” 0 commitsTue 22:00 β€” 5 commitsTue 23:00 β€” 8 commitsWed 0:00 β€” 2 commitsWed 1:00 β€” 4 commitsWed 2:00 β€” 4 commitsWed 3:00 β€” 2 commitsWed 4:00 β€” 0 commitsWed 5:00 β€” 0 commitsWed 6:00 β€” 0 commitsWed 7:00 β€” 0 commitsWed 8:00 β€” 0 commitsWed 9:00 β€” 0 commitsWed 10:00 β€” 0 commitsWed 11:00 β€” 0 commitsWed 12:00 β€” 0 commitsWed 13:00 β€” 0 commitsWed 14:00 β€” 0 commitsWed 15:00 β€” 0 commitsWed 16:00 β€” 0 commitsWed 17:00 β€” 0 commitsWed 18:00 β€” 0 commitsWed 19:00 β€” 0 commitsWed 20:00 β€” 0 commitsWed 21:00 β€” 0 commitsWed 22:00 β€” 0 commitsWed 23:00 β€” 0 commitsThu 0:00 β€” 0 commitsThu 1:00 β€” 0 commitsThu 2:00 β€” 0 commitsThu 3:00 β€” 0 commitsThu 4:00 β€” 0 commitsThu 5:00 β€” 0 commitsThu 6:00 β€” 0 commitsThu 7:00 β€” 0 commitsThu 8:00 β€” 0 commitsThu 9:00 β€” 0 commitsThu 10:00 β€” 0 commitsThu 11:00 β€” 0 commitsThu 12:00 β€” 0 commitsThu 13:00 β€” 0 commitsThu 14:00 β€” 0 commitsThu 15:00 β€” 0 commitsThu 16:00 β€” 0 commitsThu 17:00 β€” 0 commitsThu 18:00 β€” 0 commitsThu 19:00 β€” 0 commitsThu 20:00 β€” 0 commitsThu 21:00 β€” 0 commitsThu 22:00 β€” 0 commitsThu 23:00 β€” 0 commitsFri 0:00 β€” 0 commitsFri 1:00 β€” 0 commitsFri 2:00 β€” 0 commitsFri 3:00 β€” 0 commitsFri 4:00 β€” 0 commitsFri 5:00 β€” 0 commitsFri 6:00 β€” 0 commitsFri 7:00 β€” 0 commitsFri 8:00 β€” 0 commitsFri 9:00 β€” 0 commitsFri 10:00 β€” 0 commitsFri 11:00 β€” 0 commitsFri 12:00 β€” 0 commitsFri 13:00 β€” 0 commitsFri 14:00 β€” 0 commitsFri 15:00 β€” 0 commitsFri 16:00 β€” 0 commitsFri 17:00 β€” 0 commitsFri 18:00 β€” 0 commitsFri 19:00 β€” 0 commitsFri 20:00 β€” 0 commitsFri 21:00 β€” 0 commitsFri 22:00 β€” 0 commitsFri 23:00 β€” 0 commitsSat 0:00 β€” 0 commitsSat 1:00 β€” 0 commitsSat 2:00 β€” 0 commitsSat 3:00 β€” 0 commitsSat 4:00 β€” 0 commitsSat 5:00 β€” 0 commitsSat 6:00 β€” 0 commitsSat 7:00 β€” 0 commitsSat 8:00 β€” 0 commitsSat 9:00 β€” 0 commitsSat 10:00 β€” 0 commitsSat 11:00 β€” 0 commitsSat 12:00 β€” 0 commitsSat 13:00 β€” 0 commitsSat 14:00 β€” 0 commitsSat 15:00 β€” 0 commitsSat 16:00 β€” 0 commitsSat 17:00 β€” 0 commitsSat 18:00 β€” 0 commitsSat 19:00 β€” 0 commitsSat 20:00 β€” 0 commitsSat 21:00 β€” 0 commitsSat 22:00 β€” 0 commitsSat 23:00 β€” 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits25 (100%)
Community commits0 (0%)

25 commits in total over the last year.

DateListRankStars gained
Jan 10, 2026daily#19+149