release v1.2.1
Release v1.2.1
Downloads
macOS (Universal) - Supports both Apple Silicon and Intel
Option 1: Installation Script (Recommended)
Install with a single command (version v1.2.1):
curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v1.2.1The script will:
- Download the release archive
- Extract and install to
/Applications/ - Fix macOS quarantine attributes and permissions
- Launch the application automatically
Option 2: Manual Installation
- Download:
singbox-launcher-v1.2.1-macos.zip - Extract the ZIP file
- Remove quarantine attribute (required):
xattr -cr "singbox-launcher.app" && chmod +x "singbox-launcher.app/Contents/MacOS/singbox-launcher"
- Double-click
singbox-launcher.appto run- If macOS blocks the app, go to System Settings → Privacy & Security and click "Open Anyway"
- Alternatively, right-click the app and select "Open" (first time only)
Windows (amd64)
- Download:
singbox-launcher-v1.2.1-win64.zip - Extract the ZIP file to a folder, for example:
C:\Program Files\singbox-launcher\ - Run
singbox-launcher.exefrom that folder- You may need administrator rights to install to Program Files
- The launcher will automatically download
sing-boxandwintun.dllon first launch
Windows 7 (x86, legacy)
- Download:
singbox-launcher-v1.2.1-win7-32.zip - Extract the ZIP file to a folder and run
singbox-launcher-win7-32.exe- For Windows 7 / 32-bit or legacy compatibility only
Linux Support
Checksums
See checksums.txt for SHA256 checksums of all files.
v1.2.1 — hotfix: MASQUE / AnyTLS / SSH nodes lost their fields in config.json
Core pinned: sing-box-lx 1.14.0-lx.4 (unchanged). No config migration needed — update the launcher and hit Update/Rebuild; existing wizard state and sources are reused as is.
EN
Highlights
- Wizard-generated WARP (MASQUE) works again. The config generator emitted MASQUE nodes without any of their protocol fields — only
tag/type/server/server_portsurvived — sosing-box checkrejected the config withmasque: at least one of ip/ipv6 is requiredand the VPN never started. The full field set (keys, tunnel ip/ipv6, profile, network, sni, mtu, timeouts) now reaches config.json. Existing state is fine: the wizard source kept the complete URI all along, so after updating no re-registration is needed. - AnyTLS nodes authenticate again. The same emitter gap dropped the AnyTLS
password(and session-pool tuning) from config.json — nodes connected to the server but failed auth. - SSH nodes carry their credentials. SSH outbounds were emitted bare (
tag/type/server/server_port), losing user, password, private key, and host-key material.
Technical / Internal
- Root cause:
GenerateNodeJSON(core/config/outbound_generator.go) builds each outbound through a per-scheme switch and had no branches formasque,anytls,ssh— everything their parsers put intonode.Outboundwas silently dropped. WireGuard was unaffected because it goes throughGenerateEndpointJSON, which marshals the whole map. Both the wizardserver-source path and the subscription path converge on this emitter, so one fix covers both. - Added URI→JSON emission tests for all three schemes (
generator_masque_test.go,generator_anytls_ssh_test.go); the pre-existing tests covered only the share-URI parsers, which is why the truncation went unnoticed. Emitted nodes verified against awith_quiclx core:sing-box checkpasses.
RU
Основное
- WARP (MASQUE) из мастера снова работает. Генератор конфига эмитил MASQUE-ноды без протокольных полей — доезжали только
tag/type/server/server_port, — поэтомуsing-box checkотклонял конфиг с ошибкойmasque: at least one of ip/ipv6 is required, и VPN не стартовал. Теперь в config.json попадает полный набор полей (ключи, туннельные ip/ipv6, profile, network, sni, mtu, таймауты). Ваши данные целы: источник в мастере всё это время хранил полный URI, после обновления перерегистрация WARP не нужна. - AnyTLS-ноды снова проходят аутентификацию. Та же дыра в эмиттере выкидывала из config.json пароль AnyTLS (и настройки пула сессий) — нода подключалась к серверу, но не проходила auth.
- SSH-ноды несут свои учётные данные. SSH-outbound эмитился голым (
tag/type/server/server_port) — терялись user, password, приватный ключ и host-key.
Техническое / Внутреннее
- Корневая причина:
GenerateNodeJSON(core/config/outbound_generator.go) собирает outbound через per-scheme switch, и веток дляmasque,anytls,sshв нём не было — всё, что их парсеры клали вnode.Outbound, молча выпадало. WireGuard не пострадал: он идёт черезGenerateEndpointJSON, который маршалит весь map целиком. Путь wizard-источника и путь подписок сходятся в одном эмиттере, так что фикс закрывает оба. - Добавлены эмиссионные тесты URI→JSON для всех трёх схем (
generator_masque_test.go,generator_anytls_ssh_test.go); прежние тесты покрывали только парсеры share-URI — потому усечение и оставалось незамеченным. Эмитированные ноды проверены на ядре сwith_quic:sing-box checkпроходит.