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 when using the binary directly. The Docker image includesModemManagerand starts it inside the container. - 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/sigmoSigmo can start without a config file. If --config is not provided, it creates
$HOME/.config/sigmo/config.toml with safe defaults. You can also pass an
explicit config path if you prefer managing the file yourself.
Start the service.
/usr/local/bin/sigmoVisit http://localhost:9527 to access the UI.
The Docker image includes the embedded Vue frontend and installs dbus, ModemManager, qmi-utils, and libmbim-tools in the runtime image.
-
Config:
The compose setup mounts
./configto the container config directory. Sigmo creates./config/config.tomlon first start if it does not exist. -
Start:
docker compose pull docker compose up -d
-
Open UI: Visit
http://localhost:9527, or the port configured by[app].listen_address.
The compose setup uses network_mode: host because Sigmo's internet connection feature configures the modem network interface and host routes. Docker port publishing is disabled in this mode; use [app].listen_address in config.toml to choose the listening address and port.
The container runs with privileged: true so Sigmo and ModemManager can access modem devices. /run is mounted as tmpfs so stale D-Bus sockets cannot survive container restarts. On hosts with strict Docker or udev policies, keep /dev, /run/udev, and /sys mounted as shown in compose.yaml.
Sigmo runs using a TOML configuration file. When --config is omitted, the default is $HOME/.config/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: Each channel supports
enabled. Existing configs without this option are treated as enabled. Setenabled = falseto keep channel settings while disabling OTP and SMS delivery for that channel.
[channels.telegram]
enabled = true
bot_token = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
recipients = ["123456789", "987654321"]enabled: Enable this channel. Set tofalseto keep the settings but stop using it.bot_token: The token received from @BotFather.recipients: Array of Strings Chat IDs authorized to receive messages.
[channels.bark]
endpoint = "https://api.day.app"
recipients = ["device_key_1", "device_key_2"]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.
[channels.gotify]
endpoint = "https://push.example.com"
recipients = ["AsDh82..."]
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"endpoint: The full URL including the SendKey.
[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 envelope like{"kind":"otp","payload":{...}}or{"kind":"sms","payload":{...}}.
[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"]
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:
go run ./ -config config.toml
Or for frontend hot-reload:
cd web && bun run dev -
Build Docker Image:
docker build -t sigmo:local .
Released under the MIT License.