Release v1.4.1
Downloads
macOS (Universal) - Supports both Apple Silicon and Intel
Option 1: Installation Script (Recommended)
Install with a single command (version v1.4.1):
curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v1.4.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.4.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.4.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.4.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
⚠️ Linux build temporarily unavailable - мы ищем тестировщика для ручного тестирования перед включением автоматической сборки.
Checksums
See checksums.txt for SHA256 checksums of all files.
v1.4.1
EN
Highlights
- Debug API now covers the whole remote-machines feature set (SPEC 100): pair/re-pair/remove machines, health, start/stop/rollback of the machine's core, deploy (resources + config in one call), per-machine wizard state mirrors (
/remote/machines/{id}/state/*), observability (proxies, switch, url-test, pool, rules, connections, DNS/log windows, host telemetry, LAN clients), and the machine's resource store. - Debug API: local lxd-daemon group
/daemon/*(macOS) — status, pair/unpair, address/secret, engine switch (classic|daemon), and ready-to-run sudo commands (the API never executes them). - Debug API: raw passthrough to any paired daemon —
POST …/raw/rest(arbitrary admin-REST call) andPOST …/raw/grpc(arbitrarydaemon.*gRPC call resolved via protoregistry; unary + server-stream windows), plusGET /grpc/methodsdiscovery. The tunnel only reaches the paired daemon's control channel — it is not an open proxy. - Debug API manifest (
GET /) now carriescapabilities(remote/daemon/raw_grpc) so agents know up front which groups this build exposes. - Debug API: UI remote-override control —
GET /remote/ui,POST /remote/machines/{id}/ui/connect,POST /remote/ui/disconnectdo exactly what the Remote tab's Connect/Disconnect buttons do (switch the Servers tab to a machine and back). Health-gated;503when the launcher runs headless. - Detour through a single server (SPEC 101): the Source dialog's "Detour server" picker now offers other single-server sources (marked
») alongside groups. The hop is referenced by node identity hash, so it survives renames/prefixes; if the hop disappears, the dependent source's nodes are dropped from the config (fail-closed) instead of silently dialing direct. WireGuard endpoints can now be chained too (detour is applied to them; onlylisten_portendpoints stay direct — the core rejects that combination). - WireGuard share-URI/.conf keys (private/public/preshared) are validated at parse time: non-32-byte/non-base64 values (e.g. Proton's masked
*****placeholder) degrade that node with a warning instead of emitting a config that failssing-box checkwholesale; URL-safe/unpadded key variants are normalized to the std form the core requires. - Node identity hashes for WireGuard nodes now cover the full endpoint (keys, addresses): previously all WG nodes on one server:port collapsed into one identity, so a per-node disable mark covered all of them. Existing disable marks on WG nodes reset once.
Fixed
- Renaming a template-derived outbound group no longer breaks the config: on save the entry is materialized as a standalone one, and already-orphaned template references are dropped from the build with a warning instead of emitting an empty-type outbound that failed the whole config (
unknown outbound type: ""). - A dangling node/endpoint detour (its target group renamed or removed) is stripped at final assembly with a warning instead of failing the whole deploy with
dependency not found. - Traffic profiler shows the connection path as two labeled lines —
Outbound:(selection chain, root→leaf) andVia:(transport/detour tail in packet hop order) — instead of one garbled merged chain; per-client grouping now uses the true root outbound. - Remote machine gRPC subscriptions (connections, DNS, status, group selection) survive Deploy/Start/Stop: streams resubscribe automatically instead of dying silently until Disconnect/Connect.
- The server list recovers on its own after the machine's core restarts: the selected group is re-asserted and the auto-refresh tick re-reads the machine's groups — no more permanent "Reading the machine's selector groups…".
- Remote tab: protocol/transport subtitles are resolved against the connected machine's own config — nodes that exist only on that machine (its endpoints, its local sources) show their subtitle again.
- Machine row: new Restart button (↻) — Stop + Start with a single confirmation.
- Config Wizard, Outbounds tab: mouse-wheel scrolling works over the outbounds list.
Technical / Internal
- Deploy chain (resources-before-config) extracted from
ui/machine_list_panel.gointoservices.(*RemoteRegistry).Deploy— UI and API call the same function. services.TransportPool: cached per-machine gRPC transports for the API (lazy dial, 90s idle close, invalidation on remove/re-pair/addr change).lxdclient.(*Client).Do: raw admin-REST passthrough primitive.- debugapi
Serverbuilds its router atStart()(notNew()), so optional endpoint groups registered in between land in routing and/help. runResilientStream(lxd remote transport): shared resubscribe-with-backoff loop for all machine gRPC streams.- Parsed-config cache for server-list subtitles is per-path — the Local and Remote panels no longer evict each other's cache on every row redraw.
RU
Основное
- Debug API покрывает весь remote-функционал (SPEC 100): сопряжение/пере-сопряжение/удаление машин, health, start/stop/rollback ядра машины, deploy (ресурсы + конфиг одним вызовом), зеркала состояния визарда per-machine (
/remote/machines/{id}/state/*), наблюдаемость (узлы, переключение, url-test, пул, правила, соединения, окна DNS/лога, телеметрия хоста, клиенты сети) и ресурс-стор машины. - Debug API: группа локального демона
/daemon/*(macOS) — статус, pair/unpair, адрес/секрет, переключение движка (classic|daemon) и готовые sudo-команды (API их не исполняет). - Debug API: произвольные вызовы к сопряжённому демону —
POST …/raw/rest(любой admin-REST запрос) иPOST …/raw/grpc(любойdaemon.*gRPC-метод через protoregistry; unary + окна server-stream), плюс discoveryGET /grpc/methods. Туннель ведёт только на управляющий канал сопряжённого демона — это не открытый прокси. - Манифест Debug API (
GET /) несётcapabilities(remote/daemon/raw_grpc) — агент заранее видит, какие группы есть в этой сборке. - Debug API: управление remote-override UI —
GET /remote/ui,POST /remote/machines/{id}/ui/connect,POST /remote/ui/disconnectделают ровно то же, что кнопки Connect/Disconnect вкладки Remote (переводят вкладку Servers на машину и обратно). С health-гейтом;503при headless-запуске. - Detour через одиночный сервер (SPEC 101): пикер «Detour server» в диалоге источника теперь предлагает и другие server-источники (с маркером
»), не только группы. Хоп адресуется identity-хешем узла — переживает переименования и префиксы; если хоп пропал, ноды зависимого источника выкидываются из конфига (fail-closed), а не уходят молча напрямую. WireGuard-endpoint'ы теперь тоже можно пускать цепочкой (detour к ним применяется; напрямую остаются только endpoints сlisten_port— ядро отвергает эту комбинацию). - Ключи WireGuard из share-URI/.conf (private/public/preshared) валидируются при парсинге: значение не из 32 байт base64 (например, маскированный
*****у Proton) деградирует только эту ноду с warning, а не валит весьsing-box check; URL-safe/беспаддинговые варианты нормализуются в std-форму, которую требует ядро. - Identity-хеш WireGuard-узлов теперь считается от полного endpoint (ключи, адреса): раньше все WG-ноды одного server:port схлопывались в одну идентичность, и отметка «выключить ноду» накрывала их все. Существующие отметки на WG-нодах сбросятся один раз.
Исправлено
- Переименование группы, взятой из шаблона, больше не ломает конфиг: при сохранении запись материализуется в самостоятельную, а уже осиротевшие ссылки на шаблон дропаются при сборке с warning — вместо outbound'а с пустым type, валившего весь конфиг (
unknown outbound type: ""). - Висячий detour ноды/endpoint'а (целевую группу переименовали или удалили) зачищается при финальной сборке с warning — вместо отказа всего деплоя с
dependency not found. - Профайлер трафика показывает путь соединения двумя подписанными строками —
Outbound:(цепочка выбора, корень→лист) иVia:(транспортный хвост в порядке следования пакета) — вместо одной перемешанной цепочки; группировка by-client берёт честный корневой outbound. - gRPC-подписки удалённой машины (соединения, DNS, статус, выбор группы) переживают Deploy/Start/Stop: стримы переподписываются сами, а не умирали молча до Disconnect/Connect.
- Список серверов восстанавливается сам после перезапуска ядра машины: выбранная группа переутверждается, тик автообновления перечитывает группы — вечное «Reading the machine's selector groups…» ушло.
- Вкладка Remote: подписи «протокол·транспорт» берутся из конфига подключённой машины — ноды, существующие только на ней (её endpoint'ы, локальные источники), снова с подписью.
- Строка машины: новая кнопка Restart (↻) — Stop + Start одним подтверждением.
- Визард, вкладка Outbounds: колесо мыши работает над списком outbound'ов.
Техническое / Внутреннее
- Deploy-цепочка (ресурсы строго раньше конфига) вынесена из
ui/machine_list_panel.goвservices.(*RemoteRegistry).Deploy— UI и API зовут одну функцию. services.TransportPool: кеш gRPC-транспортов per-machine для API (ленивый dial, закрытие по 90s простоя, инвалидация при remove/re-pair/смене адреса).lxdclient.(*Client).Do: примитив raw admin-REST passthrough.- debugapi
Serverсобирает роутер вStart()(а не вNew()) — опциональные группы, включённые между ними, попадают в роутинг и/help. runResilientStream(lxd remote transport): общий цикл переподписки для всех gRPC-стримов машины.- Кэш разбора config.json для подписей списка — per-path: панели Local и Remote больше не выбивают кэш друг друга на каждой перерисовке.