Sigmo is a modern, self-hosted web UI and API for managing ModemManager-based cellular modems. It ships as a single binary with an embedded Vue 3 frontend, designed to be lightweight and easy to deploy.
Sigmo focuses on advanced eSIM operations, SMS management, and network control.
- π± eSIM Management: List, download (SM-DP+), enable, rename, and delete eSIM profiles.
- π© SMS Center: Full conversational view for SMS, send/delete capability, and USSD session support.
- βοΈ Modem Control: SIM slot switching, network scanning, manual registration, and preference configuration (Alias, MSS).
- π Secure Access: OTP-based login system via Telegram, HTTP, Email, and more.
- π Notifications: Forward incoming SMS and login tokens to Telegram, Bark, Gotify, Email, etc.
- π Portable: Single Go binary with no external runtime dependencies (except ModemManager).
Support the project and get reliable hardware for your setup.
-
Need an eUICC? We recommend eSTK.me. It is highly reliable for iOS profile downloads.
π Use code
esimcyoufor 10% off. -
Need more storage? If you require >1MB storage to install multiple eSIM profiles, we recommend 9eSIM.
π Use code
DAMONfor 10% off.
Architecture:
- Backend: Go serving
/api/v1and static assets. - Frontend: Vue 3 + Vite (Embedded in the binary).
System Requirements:
- OS: Linux.
- Service:
ModemManagerrunning on the system D-Bus. - Permissions: Root access or proper
udevrules to access modem device nodes.
Sigmo is distributed as a static binary. You do not need to install Node.js or Go to run it.
Grab the latest release for your architecture from the GitHub Releases.
# Example for Linux AMD64
curl -LO https://github.com/damonto/sigmo/releases/latest/download/sigmo-linux-amd64
chmod +x sigmo-linux-amd64
sudo install -m 0755 sigmo-linux-amd64 /usr/local/bin/sigmoCreate the configuration directory and file.
sudo mkdir -p /etc/sigmo
# Download example config
curl -L https://raw.githubusercontent.com/damonto/sigmo/main/configs/config.example.toml | sudo tee /etc/sigmo/config.toml >/dev/nullStart the service.
/usr/local/bin/sigmo -config /etc/sigmo/config.tomlVisit http://localhost:9527 to access the UI.
Sigmo runs using a TOML configuration file (default: /etc/sigmo/config.toml).
β οΈ Important: This file is Read-Write. When you update modem aliases or settings via the Web UI, Sigmo writes the changes back to this file. Ensure the Sigmo process has write permissions to the config file.
Controls the core application behavior, network binding, and security policies.
[app]
environment = "production"
listen_address = "0.0.0.0:9527"
auth_providers = ["telegram", "email"]
otp_required = true| Parameter | Type | Description |
|---|---|---|
environment |
String | The running environment. Set to "production" to minimize logs (recommended). Set to "development" to enable verbose debug logging. |
listen_address |
String | The IP and Port to bind the HTTP server. 0.0.0.0:9527 listens on all interfaces.127.0.0.1:9527 restricts access to localhost. |
auth_providers |
Array | Allowed login channels. The values listed here must match the configuration block names in [channels] (e.g., telegram, bark, email). |
otp_required |
Boolean | Enforce OTP (One-Time Password) for login. true: Secure mode (Recommended).false: No login required (Insecure, for isolated internal networks only). |
Configures channels used for receiving Login OTPs and Forwarded SMS.
Note: If no channels are configured, OTP login and SMS forwarding features will be automatically disabled.
[channels.telegram]
bot_token = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
recipients = [123456789, 987654321]bot_token: The token received from @BotFather.recipients: Array of Integer Chat IDs authorized to receive messages.
[channels.bark]
endpoint = "https://api.day.app"
recipients = ["device_key_1", "device_key_2"]
subject = "Sigmo Alert"endpoint: Bark server URL. Leave empty to use the officialhttps://api.day.app. Sigmo automatically appends/push.recipients: List of Device Keys from the Bark App.subject: The title of the push notification.
[channels.gotify]
endpoint = "https://push.example.com"
recipients = ["AsDh82..."]
subject = "Sigmo Notification"
priority = 5endpoint: Base URL of your Gotify server (do not add/message; it is appended automatically).recipients: List of Gotify Application Tokens.priority: Message priority (Integer), default is 5.
[channels.sc3]
endpoint = "https://<uid>.push.ft07.com/send/<sendkey>.send"
subject = "Sigmo Login"endpoint: The full URL including the SendKey.subject: Message title.
[channels.http]
endpoint = "https://httpbin.org/post"
[channels.http.headers]
Authorization = "Bearer secret_token"
Content-Type = "application/json"endpoint: The target Webhook URL.headers: Key-Value pairs for custom HTTP headers. Sigmo sends a JSON payload containing the message body.
[channels.email]
smtp_host = "smtp.gmail.com"
smtp_port = 587
smtp_username = "yourname@gmail.com"
smtp_password = "app_password"
from = "Sigmo <yourname@gmail.com>"
recipients = ["admin@example.com"]
subject = "Sigmo Alert"
tls_policy = "mandatory"
ssl = falsesmtp_host/smtp_port: Server address and port.smtp_username/smtp_password: Credentials (App Passwords are recommended).recipients: List of email addresses to receive notifications.tls_policy: STARTTLS enforcement.mandatory: Enforce TLS (Default, Recommended).opportunistic: Try TLS, fall back to plain text if unavailable.none: No TLS.
ssl: Use implicit SSL (usually for port 465). Settruefor port 465. Setfalsefor port 587 (when usingtls_policy).
This section is auto-generated by Sigmo when you save settings in the Web UI. You generally do not need to write this manually.
Entries are keyed by the ModemManager Equipment Identifier.
[modems]
[modems."123456789012345"]
alias = "Office 5G Stick"
compatible = false
mss = 240| Parameter | Type | Default | Description |
|---|---|---|---|
alias |
String | (None) | Custom Name. Displayed in the Web UI to help identify specific modems/SIMs. |
compatible |
Boolean | false |
Compatibility Mode. Some older modems lose network connectivity after switching eSIM profiles unless fully rebooted. If enabled, Sigmo will try to restart the modem device after profile operations. |
mss |
Int | 240 |
Max Segment Size. Controls the APDU payload size (range 64-254) for SIM communication. β’ If you experience errors during profile download, try lowering this value (e.g., 128 or 64). β’ Most modern modems work fine with the default 240. |
To run Sigmo as a background service, use Systemd.
- Install Unit File:
sudo install -m 0644 init/systemd/sigmo.service /etc/systemd/system/sigmo.service
- Enable & Start:
sudo systemctl daemon-reload sudo systemctl enable --now sigmo
Note: The default service runs as
rootto ensure access to ModemManager. If running as a non-root user, verifyudevrules for the modem and file permissions for/etc/sigmo/config.toml.
If you wish to contribute or modify the source:
- Prerequisites: Go 1.25+, Bun (for Vue).
- Setup Config:
cp configs/config.example.toml config.toml - Build Frontend:
cd web && bun install && bun run build
- Run Backend:
Or for frontend hot-reload:
go run ./ -config config.toml
cd web && bun run dev
Released under the MIT License.