| Crates.io | smskit |
| lib.rs | smskit |
| version | 0.2.0 |
| created_at | 2025-08-13 22:09:00.068876+00 |
| updated_at | 2025-08-13 22:09:00.068876+00 |
| description | Universal multi-provider SMS toolkit for Rust with framework-agnostic webhook processing |
| homepage | https://github.com/ciresnave/smskit |
| repository | https://github.com/ciresnave/smskit |
| max_upload_size | |
| id | 1794181 |
| size | 223,223 |
Status: v0.2.0 (beta) β Complete framework-agnostic SMS abstraction with support for every major Rust web framework.
Give your users the freedom to bring their own SMS provider while you code to a single, unified interface. Switch between Plivo, Twilio, AWS SNS, or any provider without changing your application code.
π₯ NEW in v0.2.0: Universal web framework support! Works with Axum, Warp, Actix-web, Rocket, Tide, Hyper, or ANY framework you can imagine.
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββββββ
β Your App β β sms-core β β SMS Providers β
β ββββββ (traits & types)ββββββ β’ Plivo β
β β’ Business Logicβ β β β β’ Twilio (soon) β
β β’ Web Routes β ββββββββββββββββββββ β β’ AWS SNS (soon) β
βββββββββββββββββββ β βββββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β Web Framework β β sms-web-generic β
β Adapters ββββββ (core logic) β
β β’ Axum β β β
β β’ Warp β β Framework- β
β β’ Actix-web β β agnostic β
β β’ Rocket β β processing β
β β’ Tide β β β
β β’ Hyper β β β
β β’ + ANY other β β β
βββββββββββββββββββ ββββββββββββββββββββ
[dependencies]
sms-core = "0.2"
sms-plivo = "0.2"
sms-web-axum = "0.2"
axum = "0.7"
tokio = { version = "1.0", features = ["full"] }
use std::sync::Arc;
use axum::{routing::post, Router};
use sms_core::InboundRegistry;
use sms_plivo::PlivoClient;
use sms_web_axum::{unified_webhook, AppState};
#[tokio::main]
async fn main() {
let plivo = PlivoClient::new("your_auth_id", "your_auth_token");
let registry = InboundRegistry::new().with(Arc::new(plivo));
let state = AppState { registry };
let app = Router::new()
.route("/webhooks/:provider", post(unified_webhook))
.with_state(state);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Works with ANY web framework - just adapt the request/response types:
use sms_web_generic::WebhookProcessor;
// This works with ANY web framework!
async fn handle_sms_webhook(provider: String, headers: Vec<(String, String)>, body: &[u8]) -> YourFrameworkResponse {
let processor = WebhookProcessor::new(your_registry);
let response = processor.process_webhook(&provider, headers, body);
// Convert to your framework's response type
response.into()
}
| Framework | Crate | Status | Example |
|---|---|---|---|
| Axum | sms-web-axum |
β Complete | Example |
| Warp | sms-web-warp |
β Complete | Example |
| Actix-web | sms-web-actix |
β Complete | Example |
| Rocket | sms-web-rocket |
β Complete | Example |
| Tide | sms-web-tide |
β Complete | Example |
| Hyper | sms-web-hyper |
β Complete | Example |
| Generic | sms-web-generic |
β Complete | DIY Integration |
| Your Framework | DIY | β Supported | Use sms-web-generic! |
| Provider | Crate | Send SMS | Webhooks | Status |
|---|---|---|---|---|
| Plivo | sms-plivo |
β | β | Complete |
| Twilio | sms-twilio |
π | π | Coming Soon |
| AWS SNS | sms-aws-sns |
π | π | Coming Soon |
use sms_core::{SendRequest, SmsClient};
use sms_plivo::PlivoClient;
let client = PlivoClient::new("auth_id", "auth_token");
let response = client.send(SendRequest {
to: "+1234567890",
from: "+0987654321",
text: "Hello from smskit!"
}).await?;
println!("Message sent with ID: {}", response.id);
All frameworks receive the same normalized InboundMessage:
{
"id": "abc-123",
"from": "+1234567890",
"to": "+0987654321",
"text": "Hello World",
"timestamp": "2024-12-30T12:34:56Z",
"provider": "plivo",
"raw": { /* original provider payload */ }
}
Webhook URLs:
http://yourserver.com/webhooks/plivohttp://yourserver.com/webhooks/twiliohttp://yourserver.com/webhooks/{any_provider}# Test the generic integration (works everywhere!)
cargo run --example generic_integration
# Try with specific frameworks
cargo run --example warp_server --features warp
cargo run --example actix_server --features actix-web
cargo run --example hyper_server --features hyper
# Original Axum example
cargo run --example unified_webhook