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