Supported Protocols
SMPP 3.3/3.4/5.0
HTTP API
EMI/UCP
AT Commands
Features
Admin Dashboard
Built-in web UI for monitoring traffic, SMSCs and message queues in real-time.
JSON API
/status.json, /health, and /api/sendsms endpoints for easy integration.
DLR Storage
Redis/Valkey, MySQL, PostgreSQL, SQLite backends for delivery reports.
High Performance
16,000+ msg/sec throughput with sub-80ms latency on commodity hardware.
Health Checks
/health endpoint for load balancers and Kubernetes readiness probes.
Production Ready
Systemd units, RPM packages, Docker images, reproducible builds.
Prometheus Metrics
/metrics endpoint for Grafana dashboards. SMS rates, queue depths, SMSC status.
JSON Structured Logs
log-format = json for ELK, Loki, Splunk integration.
Config Hot-Reload
SIGHUP reloads config, adds/removes SMSCs without restart.
Environment Variables
${VAR} syntax in config for Docker/K8s secrets injection.
UTF-8 Access Log
Cyrillic, Georgian and other non-Latin message bodies logged readably
instead of as hex or a row of dots.
Multi-Bind DLR
Point several binds at one operator and delivery receipts still match,
whichever bind returns them.
IPv6
Opt-in dual-stack listeners and AAAA resolution. Off by default, so
existing IPv4 deployments are untouched until you enable it.
Verified TLS
SNI on outbound connections, plus optional certificate hostname
verification for SMPP over TLS and dlr-url callbacks.
Directional Rate Limits
throughput-mt and throughput-mo cap submissions
and inbound traffic per SMSC independently.
Async Logging
Non-blocking logging with dedicated writer thread. Zero I/O blocking.
Enterprise Ready
SBOM, reproducible builds, config validation, structured logs. Compliance-friendly.
Quick Start
Enterprise image based on Red Hat UBI 10:
mkdir kamex && cd kamex
# Create docker-compose.yml
cat > docker-compose.yml <<'EOF'
services:
bearerbox:
image: ghcr.io/vaska94/kamex:latest
container_name: kamex-bearerbox
command: ["/usr/sbin/bearerbox", "/etc/kamex/kamex.conf"]
volumes:
- ./kamex.conf:/etc/kamex/kamex.conf:ro
- kamex-spool:/var/spool/kamex
- kamex-logs:/var/log/kamex
ports:
- "13000:13000"
networks:
- kamex
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:13000/health"]
interval: 10s
timeout: 5s
start_period: 10s
restart: unless-stopped
smsbox:
image: ghcr.io/vaska94/kamex:latest
container_name: kamex-smsbox
command: ["/usr/sbin/smsbox", "/etc/kamex/kamex.conf"]
volumes:
- ./kamex.conf:/etc/kamex/kamex.conf:ro
- kamex-logs:/var/log/kamex
ports:
- "13013:13013"
networks:
- kamex
depends_on:
bearerbox:
condition: service_healthy
restart: unless-stopped
valkey:
image: valkey/valkey:9-alpine
container_name: kamex-valkey
volumes:
- valkey-data:/data
networks:
- kamex
restart: unless-stopped
volumes:
kamex-spool:
kamex-logs:
valkey-data:
networks:
kamex:
driver: bridge
EOF
# Download example config
curl -LO https://raw.githubusercontent.com/vaska94/Kamex/main/doc/examples/kannel.conf
mv kannel.conf kamex.conf
# Edit kamex.conf with your SMSC settings
docker compose up -d
Lightweight image based on Alpine Linux (~20MB):
mkdir kamex && cd kamex
# Create docker-compose.yml
cat > docker-compose.yml <<'EOF'
services:
bearerbox:
image: ghcr.io/vaska94/kamex:alpine
container_name: kamex-bearerbox
command: ["/usr/sbin/bearerbox", "/etc/kamex/kamex.conf"]
volumes:
- ./kamex.conf:/etc/kamex/kamex.conf:ro
- kamex-spool:/var/spool/kamex
- kamex-logs:/var/log/kamex
ports:
- "13000:13000"
networks:
- kamex
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:13000/health"]
interval: 10s
timeout: 5s
start_period: 10s
restart: unless-stopped
smsbox:
image: ghcr.io/vaska94/kamex:alpine
container_name: kamex-smsbox
command: ["/usr/sbin/smsbox", "/etc/kamex/kamex.conf"]
volumes:
- ./kamex.conf:/etc/kamex/kamex.conf:ro
- kamex-logs:/var/log/kamex
ports:
- "13013:13013"
networks:
- kamex
depends_on:
bearerbox:
condition: service_healthy
restart: unless-stopped
valkey:
image: valkey/valkey:9-alpine
container_name: kamex-valkey
volumes:
- valkey-data:/data
networks:
- kamex
restart: unless-stopped
volumes:
kamex-spool:
kamex-logs:
valkey-data:
networks:
kamex:
driver: bridge
EOF
# Download example config
curl -LO https://raw.githubusercontent.com/vaska94/Kamex/main/doc/examples/kannel.conf
mv kannel.conf kamex.conf
# Edit kamex.conf with your SMSC settings
docker compose up -d
Admin panel: http://localhost:13000/ | HTTP API: http://localhost:13013/
For Rocky Linux 10, RHEL 10, AlmaLinux 10:
# Resolve the current release, so this stays correct after every update
VER=$(curl -s https://api.github.com/repos/vaska94/Kamex/releases/latest \
| sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p')
# Download RPMs from releases
curl -LO https://github.com/vaska94/Kamex/releases/latest/download/kamex-${VER}-1.el10.x86_64.rpm
curl -LO https://github.com/vaska94/Kamex/releases/latest/download/kamex-sqlbox-${VER}-1.el10.x86_64.rpm
curl -LO https://github.com/vaska94/Kamex/releases/latest/download/kamex-opensmppbox-${VER}-1.el10.x86_64.rpm
# Install core (required)
sudo dnf install -y ./kamex-${VER}-*.rpm
# Install optional modules
sudo dnf install -y ./kamex-sqlbox-*.rpm # Database queue storage
sudo dnf install -y ./kamex-opensmppbox-*.rpm # SMPP proxy/load balancer
# Configure
sudo cp /usr/share/doc/kamex/examples/kannel.conf /etc/kamex/kamex.conf
# Edit /etc/kamex/kamex.conf with your SMSC settings
# Start services
sudo systemctl enable --now kamex-bearerbox kamex-smsbox
Admin panel: http://localhost:13000/ | HTTP API: http://localhost:13013/
Build from source for custom configurations:
# Install dependencies (RHEL/Rocky)
sudo dnf install epel-release && sudo crb enable
sudo dnf install gcc make autoconf automake libtool \
openssl-devel mariadb-devel libpq-devel hiredis-devel
# Clone and build
git clone https://github.com/vaska94/Kamex.git
cd Kamex
autoreconf -fi
./configure --enable-ssl --with-mysql --with-pgsql --with-redis
make -j$(nproc)
sudo make install-strip
# Configure and run
sudo mkdir -p /etc/kamex
sudo cp doc/examples/kannel.conf /etc/kamex/kamex.conf
# Edit config with your SMSC settings
bearerbox /etc/kamex/kamex.conf &
smsbox /etc/kamex/kamex.conf &
Admin panel: http://localhost:13000/ | HTTP API: http://localhost:13013/
Send SMS
# JSON API
curl -X POST http://localhost:13013/cgi-bin/sendsms \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-token" \
-d '{"from":"Kamex","to":"+1234567890","text":"Hello"}'
# Query string (legacy)
curl "http://localhost:13013/cgi-bin/sendsms?user=test&pass=test&from=Kamex&to=+1234567890&text=Hello"
Production Use
Kamex powers SENDER.GE - tested on millions of SMS messages in production.
About
Kamex is a fork of Kannel, the open-source SMS gateway. The codebase has been cleaned up and optimized for modern systems.
Removed Legacy Code
- WAP - Obsolete mobile protocol
- RADIUS - Legacy authentication
- libxml2 - Replaced with lightweight alternatives
- Dead protocols - CIMD, OIS, SEMA, EMI/X.25