Sendium is an open-source, headless SMS gateway engineered for high-throughput delivery. Designed to sit seamlessly between your internal applications (CRMs, websites, IoT platforms) and your SMS connectivity (carriers, SMPP providers), it puts you firmly in control of your messaging infrastructure.
Eliminate vendor lock-in, manage your own routing logic, and scale your messaging horizontally across any on-premise or cloud environment.
- Modern Stack: A practical, container-native Kannel replacement built on Java & Quarkus.
- Total Control: Manage connections, adjust routing on the fly, and dictate fail-over rules.
- Protocol Agnostic: Bridge the gap between modern HTTP webhooks and legacy SMPP infrastructure.
- High Throughput: Designed for low latency and massive scale.
Sendium is proudly created and maintained by Cytech.
With over 20 years of experience building high-performance telecommunications software, we open-sourced Sendium to provide the community with a modern, reliable Kannel alternative. Sendium is also the underlying routing engine that powers mcore, our complete enterprise business platform.
| Feature | Description |
|---|---|
| SMPP Server & Client | Full TX/RX/TRX bind support for downstream clients and upstream carriers. |
| Granular TPS Control | Protect your links with Transactions-Per-Second rate limiting per connection. |
| Advanced Routing | Route by destination prefix, sender ID, or content with automatic failover. |
| Protocol Translation | HTTP-to-SMPP for outbound; SMPP-to-HTTP webhooks for inbound (MO). |
| Real-time DLRs | Normalized delivery receipt management propagated back to your originating systems. |
- Request: Your application sends a message to Sendium via HTTP OR SMPP.
- Logic: Sendium applies routing rules (Country, Prefix, Sender ID, Priority).
- Delivery: Sendium delivers via one or more SMPP connections to upstream providers.
- Verification: Asynchronous Delivery Receipts (DLRs) are received and normalized.
- Callback: Sendium forwards the status back to your system via HTTP Webhooks.
- Docker installed on your host machine.
- Create three empty directories in your current working folder:
./conf,./data, and./logs. - Before starting the container, Sendium requires three configuration files inside your newly created ./conf directory. These files control your binds, authentication, and routing logic.
Create the following three files inside ./conf and paste the sample configurations:
- Setting smpp and http credentials on sendium
credentials:
- type: SMPP
systemId: "test1"
password: "test1"
- type: HTTP
systemId: "test2"
password: "test2"- Setting a smpp client connection and the smpp server.
# sample smpp client worker
outSms.instance.testRoute.enable = true
outSms.instance.testRoute.type = smppclient
outSms.instance.testRoute.username = testSystemId
outSms.instance.testRoute.password = testPass
outSms.instance.testRoute.host = smpp.test.com
outSms.instance.testRoute.port = 2775
outSms.instance.testRoute.tps = 0
outSms.instance.testRoute.connections.transceivers = 1
# smpp server
outSms.instance.smpp.enable = true
outSms.instance.smpp.type = smppserver
outSms.instance.smpp.tps = 0
outSms.instance.smpp.srv.port = 27777
outSms.instance.smpp.srv.defaultWindowSize = 1000
outSms.instance.smpp.srv.maxConnections = 1000
outSms.instance.smpp.srv.maxConnectionsPerIP = 4
outSms.instance.smpp.conf.maxConnectionsPerUser.default = 4
outSms.instance.smpp.conf.maxRate.default = 0- Routing configuration for sending all the traffic by default on the smpp client named testRoute
[default]
MESSAGE:type:==:0
MESSAGE:type:==:11
MESSAGE:type:==:14
MESSAGE:type:==:17
MESSAGE:type:==:10
smppserver.smpp:type:==:18
[MESSAGE]
testRoute::default:
Sendium publishes two Docker image variants:
| Image | Runtime |
|---|---|
cytechmobile/sendium:latest |
JVM image based on Eclipse Temurin 25 JRE. |
cytechmobile/sendium:latest-native |
Native executable image. |
Run the following command to start the default JVM image in the background:
docker run -d --name sendium \
-e QUARKUS_LOG_FILE_ENABLE=true \
-e QUARKUS_LOG_CONSOLE_ENABLE=false \
-e QUARKUS_LOG_FILE_PATH=/work/logs/smsg.log \
-e QUARKUS_LOG_FILE_SMPPCLIENT_PATH=/work/logs/smppclient.log \
-e QUARKUS_LOG_FILE_SMPPSERVER_PATH=/work/logs/smppserver.log \
-e QUARKUS_HTTP_ACCESS_LOG_DIRECTORY=/work/logs \
-p 8080:8080 \
-p 27777:27777 \
-v ./conf:/work/conf \
-v ./data:/work/data \
-v ./logs:/work/logs \
cytechmobile/sendium:latestTo run the native image instead, use cytechmobile/sendium:latest-native.
The documentation entry point is docs/DocumentationMap.md. It includes the recommended reading order, current docs index, runtime files, API discovery endpoints, and community resources.
Key docs:
- Architecture Overview: Understand runtime components, queues, routing flow, workers, DLRs with diagrams.
- Docker Deployment: Run Sendium with Docker, volumes, ports, logs, and startup checks.
- Authentication & Security: Configure HTTP and SMPP credentials.
- SMPP Configuration: Configure SMPP server, SMPP client, worker behavior, TLS, retries, and logging.
- Routing Engine: Configure routing tables, rules, operators, and fallbacks.
- HTTP API: Submit SMS through the Kannel-compatible
/sendsmsendpoint. - Webhooks: Configure DLR callbacks and MO forwarding.
- Monitoring & Observability: Expose Prometheus metrics and configure Prometheus/Grafana.
- Configuration Reference: Review paths, Docker environment variables, logging, and OpenAPI endpoints.
- Troubleshooting: Diagnose common setup and runtime issues.
When Sendium is running, API discovery is available at /swagger-ui and /openapi.json.
If you run into issues, have questions, or want to share what you're building, we'd love to hear from you! We use GitHub Discussions for our community hub.
To help us help you faster, please use the appropriate category:
- π Q&A: Stuck on the Quick Start? Need help with your routing config? Ask your questions here.
- π‘ Ideas: Have a feature request or a suggestion to make Sendium better? Let's discuss it.
- π Show and tell: Are you using Sendium in production? Did you build a cool integration? Share it with the community!
- π¬ General: For all other chats and discussions about the project.
Note: If you are confident you have found a bug, please open a formal GitHub Issue so we can track it.