[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94527":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":25,"discoverSource":26},94527,"VoCat","MengMengCode\u002FVoCat","MengMengCode","Vocat is an open-source web control panel and engineering toolkit for Quectel EC20\u002FEC25-class cellular modems. It combines modem discovery, live radio status, AT and USSD terminals, SMS, WiFi Calling, eSIM management, network selection, proxy routing, notifications, audit logs, and release automation in one self-contained service.","",null,"Go",382,139,2,0,237,56.44,"Other",false,"master",[],"2026-08-24 04:01:22","\u003Cp align=\"center\">\n  \u003Cimg src=\"web\u002Fpublic\u002Ffavicon.svg\" width=\"96\" alt=\"Vocat\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">VoCat\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cimg alt=\"Go\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-1.25-00ADD8?style=flat-square&logo=go&logoColor=white\">\n  \u003Cimg alt=\"React\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-19-61DAFB?style=flat-square&logo=react&logoColor=111111\">\n  \u003Cimg alt=\"TypeScript\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5.8-3178C6?style=flat-square&logo=typescript&logoColor=white\">\n  \u003Cimg alt=\"Vite\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVite-7-646CFF?style=flat-square&logo=vite&logoColor=white\">\n  \u003Cimg alt=\"Tailwind CSS\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTailwind_CSS-3-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white\">\n  \u003Cimg alt=\"SQLite\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSQLite-Embedded-003B57?style=flat-square&logo=sqlite&logoColor=white\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg alt=\"Linux\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLinux-amd64_%7C_386_%7C_arm64_%7C_aarch64_%7C_armv7-FCC624?style=flat-square&logo=linux&logoColor=111111\">\n  \u003Cimg alt=\"Docker\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-Multi--Arch-2496ED?style=flat-square&logo=docker&logoColor=white\">\n  \u003Cimg alt=\"WiFi Calling\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWiFi_Calling-IMS_SMS-7B1FA2?style=flat-square\">\n  \u003Cimg alt=\"eSIM\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FeSIM-LPA_%2F_eUICC-009688?style=flat-square\">\n  \u003Cimg alt=\"Telegram\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTelegram-Bot-26A5E4?style=flat-square&logo=telegram&logoColor=white\">\n  \u003Cimg alt=\"GitHub Actions\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitHub_Actions-Release-2088FF?style=flat-square&logo=githubactions&logoColor=white\">\n\u003C\u002Fp>\n\n**English** | [简体中文](docs\u002FREADME.zh-CN.md)\n\nVocat is an open-source web control panel and engineering toolkit for Quectel EC20\u002FEC25-class cellular modems. It combines modem discovery, live radio status, AT and USSD terminals, SMS, WiFi Calling, eSIM management, network selection, proxy routing, notifications, audit logs, and release automation in one self-contained service.\n\nThe backend is written in Go, the interface is built with React and TypeScript, and the production frontend is embedded into the Go binary. A single executable contains the web application and uses SQLite for persistent state.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"img\\image.png\">\n  \u003Cimg src=\"img\\image-1.png\">\n\u003C\u002Fp>\n\n## Features\n\n| Area | What Vocat provides |\n| --- | --- |\n| Device management | Automatic serial\u002FUSB discovery, multiple modem support, friendly device names, live overview updates, module restart, flight mode, and USB networking mode controls. |\n| Radio and network | Registration status, operator, signal metrics, RSRP\u002FRSRQ\u002FSINR, network mode, band, channel, operator scanning, and automatic or manual network selection. |\n| AT and USSD | Interactive AT terminal, command history, raw modem responses, USSD start\u002Fcontinue\u002Fcancel flows, and clear modem error reporting. |\n| SMS | Direct cellular and IMS SMS transmission, inbound synchronization, multipart handling, delivery reports, conversation history, unread state, timestamps, and per-message delivery status. |\n| WiFi Calling | IKEv2\u002FePDG tunnel setup, EAP-AKA authentication, IMS registration, IMS SMS, reconnect controls, status diagnostics, and per-device routing. |\n| eSIM and eUICC | eUICC discovery, EID and production information, certificate metadata, multi-eUICC inventory, installed profile listing, enable\u002Fdisable\u002Fswitch operations, download, rename, and delete operations when supported by the card. |\n| Card policy | ICCID-based WiFi Calling and flight-mode behavior with immediate policy application. |\n| Proxy routing | Upstream SOCKS routing, device bindings, country rules, TCP reachability checks, and UDP Associate checks for WiFi Calling data paths. |\n| Notifications | New inbound SMS forwarding through Telegram, Bark, email, Pushplus, and signed webhooks. Each SMS is delivered as an individual notification. |\n| Telegram bot | Device status, installed-profile listing and switching, WiFi Calling controls, SMS sending, timed dialing with automatic hang-up, call status, answer, and hang-up commands. Sensitive actions require administrator confirmation. |\n| Operations | Authentication, CSRF protection, access policies, audit events, live logs, log retention, health checks, responsive layout, dark mode, and English\u002FChinese application UI. |\n| Distribution | Static Linux binaries, systemd installation script, self-update with SHA-256 verification, Docker image, GHCR publishing, and GitHub Actions release builds. |\n\n## Supported hardware\n\nVocat targets Qualcomm-based Quectel modules that expose compatible AT, QMI, serial, and USB networking interfaces, including:\n\n- Quectel EC20\n- Quectel EC25\n- Quectel EG25 family\n- Compatible EG600 and related modules\n\nAvailable features depend on the module firmware, USB composition, SIM\u002FeSIM capabilities, host drivers, radio network, and carrier configuration.\n\n## Installation\n\n### One-click Linux installation\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FMengMengCode\u002FVoCat\u002Fmaster\u002Fscripts\u002Finstall.sh | sudo bash\n```\n\nInstall a specific version:\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FMengMengCode\u002FVoCat\u002Fmaster\u002Fscripts\u002Finstall.sh -o install.sh\nsudo bash install.sh 0.0.2\n```\n\nThe installer:\n\n- detects `amd64`, `386`, `arm64`, `aarch64`, or `armv7`;\n- downloads the matching GitHub Release binary;\n- verifies it against `SHA256SUMS`;\n- installs Vocat under `\u002Fopt\u002Fvocat`;\n- creates a hardened systemd service with the hardware and network access required by Vocat;\n- stores runtime configuration in `\u002Fetc\u002Fvocat\u002Fenv`;\n- generates a random initial administrator password on first installation.\n\nAfter installation, open:\n\n```text\nhttp:\u002F\u002F\u003Cserver-address>:7575\n```\n\n### Manual binary installation\n\nDownload the matching binary and `SHA256SUMS` from GitHub Releases:\n\n| Platform | Release file |\n| --- | --- |\n| Linux x86-64 | `vocat-linux-amd64` |\n| Linux x86 32-bit | `vocat-linux-386` |\n| Linux ARM64 | `vocat-linux-arm64` |\n| Linux AArch64 | `vocat-linux-aarch64` |\n| Linux ARMv7 | `vocat-linux-armv7` |\n\nVerify and install it:\n\n```bash\nsha256sum -c SHA256SUMS --ignore-missing\nsudo install -d -m 0755 \u002Fopt\u002Fvocat\u002Fbin \u002Fopt\u002Fvocat\u002Fdata\nsudo install -m 0755 vocat-linux-amd64 \u002Fopt\u002Fvocat\u002Fbin\u002Fvocat\nsudo env \\\n  VOCAT_DATABASE_PATH=\u002Fopt\u002Fvocat\u002Fdata\u002Fvocat.db \\\n  VOCAT_ADMIN_PASSWORD=change-this-password \\\n  \u002Fopt\u002Fvocat\u002Fbin\u002Fvocat serve\n```\n\nThis manual command runs Vocat in the foreground. Use `vocat serve` so the\nprocess starts the server directly; running `vocat` without arguments as root\non a TTY opens the interactive management menu instead. Use the one-click\ninstaller when a managed systemd service and automatic restart are required.\n\n### Docker\n\nFor a Linux host that must discover every attached supported Quectel modem and\ncontinue seeing USB hot-plug events, run Vocat in hardware-access mode:\n\n```bash\ndocker pull ghcr.io\u002Fmengmengcode\u002Fvocat:latest\n\ndocker run -d \\\n  --name vocat \\\n  --restart unless-stopped \\\n  --network host \\\n  --privileged \\\n  --user 0:0 \\\n  -e VOCAT_ADMIN_PASSWORD=change-this-password \\\n  -v vocat-data:\u002Fopt\u002Fvocat\u002Fdata \\\n  -v \u002Fdev:\u002Fdev \\\n  -v \u002Fsys:\u002Fsys:ro \\\n  ghcr.io\u002Fmengmengcode\u002Fvocat:latest\n```\n\nOpen `http:\u002F\u002F\u003Cserver-address>:7575` after the container starts. Host networking\nis required so QMI network interfaces remain visible to Vocat, while privileged\ndevice access is required for serial ports, QMI control nodes, TUN interfaces,\nnetwork configuration, and devices added after the container starts. The\n`\u002Fdev` bind mount makes new `ttyUSB*`, `ttyACM*`, and `cdc-wdm*` nodes visible\nwithout recreating the container.\n\nThis mode intentionally gives Vocat broad access to the host's devices and\nnetwork stack. Use it only on a trusted Linux host. The automatic discovery\ncurrently identifies supported Quectel USB modems (USB vendor ID `2c7c`), not\narbitrary modem brands. Mapping only individual nodes with `--device`, such as\n`\u002Fdev\u002FttyUSB2` and `\u002Fdev\u002Fcdc-wdm0`, limits the container to those fixed nodes\nand does not provide complete multi-device or hot-plug discovery.\n\nThe GHCR image is published for `linux\u002Famd64` and `linux\u002Farm64`.\n\n## Configuration\n\nVocat reads an optional JSON configuration file from `VOCAT_CONFIG`, then applies `VOCAT_*` environment variables. Environment variables take precedence.\n\n| Environment variable | Default | Description |\n| --- | --- | --- |\n| `VOCAT_ADDR` | `0.0.0.0:7575` | HTTP listen address. |\n| `VOCAT_DATABASE_PATH` | `.\u002Fdata\u002Fvocat.db` | SQLite database path. |\n| `VOCAT_ADMIN_USERNAME` | `admin` | Initial administrator username. |\n| `VOCAT_ADMIN_PASSWORD` | `admin` | Initial administrator password. Change it before exposing the service. |\n| `VOCAT_SESSION_TTL` | `24h` | Authentication session lifetime. |\n| `VOCAT_SECURE_COOKIES` | `false` | Marks session cookies as secure when HTTPS is used. |\n| `VOCAT_SHUTDOWN_TIMEOUT` | `10s` | Graceful shutdown timeout. |\n| `VOCAT_MAX_REQUEST_BODY_BYTES` | `1048576` | Maximum API request body size. |\n| `VOCAT_REPO` | `MengMengCode\u002FVoCat` | Trusted GitHub repository used by the self-updater, in `owner\u002Fname` form. |\n| `GITHUB_TOKEN` | empty | Optional GitHub token for private repositories or higher API limits. |\n\nDo not store Telegram tokens, SMTP passwords, webhook secrets, SIM credentials, or other private data in the repository. Configure them through the application settings or protected environment files.\n\n## Telegram bot\n\nWhen Telegram notifications are enabled and both Chat ID and Admin ID are configured, the bot supports:\n\n```text\n\u002Fstatus [device]\n\u002Fesim \u003Cdevice>\n\u002Fswitch \u003Cdevice> \u003Ciccid>\n\u002Fwfc \u003Cdevice> \u003Cstatus|on|off|reconnect>\n\u002Fsms \u003Cdevice> \u003Cnumber> \u003Cmessage>\n\u002Fcall \u003Cdevice> \u003Cnumber> \u003Cseconds>\n\u002Fcalls \u003Cdevice>\n\u002Fanswer \u003Cdevice>\n\u002Fhangup \u003Cdevice>\n```\n\nProfile switching, SMS submission, and dialing use one-time confirmation buttons. Timed dialing performs the modem call action and automatically hangs up after 1–600 seconds; it does not capture or process call audio. The bot does not expose eSIM download, delete, or rename commands.\n\n## Updating\n\nCheck for a newer GitHub Release:\n\n```bash\nvocat update --check --repo MengMengCode\u002FVoCat\n```\n\nInstall the latest release:\n\n```bash\nsudo vocat update --repo MengMengCode\u002FVoCat\n```\n\nThe updater downloads the binary matching the current Linux architecture, verifies it with the published `SHA256SUMS`, replaces the executable atomically, and restarts the `vocat` systemd service when available.\n\nFor Docker installations:\n\n```bash\ndocker pull ghcr.io\u002Fmengmengcode\u002Fvocat:latest\n```\n\nRecreate the container after pulling the new image.\n\n## Development\n\nRequirements:\n\n- Go 1.25 or newer\n- Node.js 20 or newer\n- npm\n\nRun the frontend development server:\n\n```bash\ncd web\nnpm install\nnpm run dev\n```\n\nBuild the embedded frontend and start the backend:\n\n```bash\ncd web\nnpm run build\ncd ..\ngo run .\u002Fcmd\u002Fvocat\n```\n\nRun all tests:\n\n```bash\ngo test .\u002F...\n```\n\nBuild a production binary:\n\n```bash\ngo build -trimpath -ldflags \"-s -w\" -o vocat .\u002Fcmd\u002Fvocat\n```\n\n## Release automation\n\nPushing a version tag starts two GitHub Actions workflows:\n\n- `release-binaries` builds and publishes `amd64`, `386`, `arm64`, `aarch64`, and `armv7` binaries plus `SHA256SUMS`.\n- `docker` builds and publishes a multi-architecture image to GitHub Container Registry.\n\n```bash\ngit tag v0.2.0\ngit push origin v0.2.0\n```\n\n## Project layout\n\n```text\ncmd\u002Fvocat\u002F                  Application entry point and CLI\ninternal\u002Fdevice\u002F            Modem discovery and device control\ninternal\u002Fmodem\u002F             AT session and response handling\ninternal\u002Fserver\u002F            HTTP API, notifications, and embedded web server\ninternal\u002Fstore\u002F             SQLite persistence\ninternal\u002Fupdate\u002F            GitHub Release self-updater\ninternal\u002Fvowifi\u002F            IKE, EAP-AKA, IMS, and WiFi Calling runtime\nscripts\u002Finstall.sh          Linux installer and updater\nweb\u002Fsrc\u002F                    React and TypeScript frontend\n.github\u002Fworkflows\u002F          Binary and Docker release automation\n```\n\n## Responsible use\n\nCellular modem and eSIM operations can affect subscriber service, stored profiles, network registration, and hardware state. Keep backups, review destructive actions carefully, and use the software only in lawful environments where you are permitted to operate the connected hardware and network resources.\n\nVocat does not bypass carrier authentication, network policy, hardware security, or eSIM trust requirements. Support for an operation means that Vocat can request it from the modem or eUICC; the device, profile, network, or carrier may still reject it.\n\n## Contributing\n\nIssues and pull requests are welcome. Keep changes focused, include tests where practical, avoid committing credentials or subscriber data, and document hardware-specific behavior clearly.\n\nBefore submitting a change:\n\n```bash\ngo test .\u002F...\ncd web && npm run build\n```\n\n## Thanks\n- [Nodeseek.com](https:\u002F\u002Fwww.nodeseek.com) — A community dedicated to servers\n- [Linux.do](https:\u002F\u002Flinux.do) — An inspiring tech community\n- [iniwex5](https:\u002F\u002Fgithub.com\u002Finiwex5) - Style and Functionality Guidelines\n\n## Buy me a coffee\n\n| Network | Address |\n| ------- | ------- |\n| USDT-TRON (TRC20) | `TQQAbboBoU8h5xX4YCA1rqWJU2WjK3seSg` |\n| USDT-BSC (BEP20) | `0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4` |\n| USDT-Polygon | `0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4` |\n\n## License\n\nSee [LICENSE](LICENSE).\n\n[![MengMengCode\u002FVoCat Star History](https:\u002F\u002Fmengmeng.meteor-history.com\u002Fapi\u002Fembed\u002FMengMengCode\u002FVoCat.svg?sig=sdeXRVxAoY3yLWgXL7JViY2USYIN3t9neJ6ScPvgUAo&theme=light&style=xkcd&color=dd4528&background=ffffff&textColor=000000&width=900&height=600&lineWidth=3&showTitle=true&showLegend=true&showDots=false&v=0.0.14)](https:\u002F\u002Fmeteor-history.com)\n","VoCat 是一款面向 Quectel EC20\u002FEC25 系列蜂窝模组的开源 Web 控制面板与工程调试工具。它提供模组自动发现、实时射频状态监控、交互式 AT\u002FUSSD 终端、SMS 收发（含 IMS\u002FWiFi Calling）、eSIM 远程配置（LPA）、网络选择、代理路由、通知推送、操作审计日志及自动化发布能力，所有功能集成于单个 Go 可执行文件中，前端嵌入并使用 SQLite 持久化。适用于物联网设备调试、嵌入式通信网关运维、eSIM 部署验证及蜂窝连接故障排查等工程场景。","2026-08-11 02:30:06","CREATED_QUERY"]